From 6afb0fd1acaaf2ad3d3da9f4ea6bf65c3953639f Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Tue, 4 Nov 2025 14:53:58 -0500 Subject: [PATCH 1/4] test: add coverage for endTimedEvent and eventWithName --- UnitTests/Mocks/MPKitContainerMock.swift | 18 +++ .../MParticle/MParticleTimedEventTests.swift | 110 ++++++++++++++++++ 2 files changed, 128 insertions(+) diff --git a/UnitTests/Mocks/MPKitContainerMock.swift b/UnitTests/Mocks/MPKitContainerMock.swift index a63d4f713..a0a92e219 100644 --- a/UnitTests/Mocks/MPKitContainerMock.swift +++ b/UnitTests/Mocks/MPKitContainerMock.swift @@ -17,6 +17,16 @@ class MPKitContainerMock: MPKitContainerProtocol { forwardCommerceEventCallCalled = true forwardCommerceEventCallCommerceEventParam = commerceEvent } + + struct ForwardCall { + let selector: Selector + let event: MPBaseEvent? + let parameters: MPForwardQueueParameters? + let messageType: MPMessageType + let userInfo: [AnyHashable: Any]? + } + + private(set) var forwardSDKCalls: [ForwardCall] = [] var forwardSDKCallCalled = false var forwardSDKCallSelectorParam: Selector? @@ -41,6 +51,14 @@ class MPKitContainerMock: MPKitContainerProtocol { forwardSDKCallMessageTypeParam = messageType forwardSDKCallUserInfoParam = userInfo forwardSDKCallExpectation?.fulfill() + + forwardSDKCalls.append( + ForwardCall(selector: selector, + event: event, + parameters: parameters, + messageType: messageType, + userInfo: userInfo) + ) } var forwardSDKCallBatchParam: [AnyHashable: Any]? diff --git a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift index 5d1454224..91cb9e5b2 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift @@ -39,4 +39,114 @@ final class MParticleTimedEventTests: MParticleTestBase { backendController.beginTimedEventCompletionHandler?(event, .success) XCTAssertNotNil(receivedMessage) } + + func test_endTimedEvent_invokesDependencies_andExecutesCompletionHandler() { + dataPlanFilter.transformEventReturnValue = transformedEvent + + mparticle.endTimedEvent(event) + + wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) + + XCTAssertNil(event.duration) + XCTAssertNil(event.endTime) + + XCTAssertTrue(executor.executeOnMessageQueueAsync) + XCTAssertEqual(listenerController.onAPICalledApiName?.description, "endTimedEvent:") + XCTAssertTrue(listenerController.onAPICalledParameter1 === event) + + XCTAssertTrue(backendController.logEventCalled) + XCTAssertTrue(backendController.logEventEventParam === event) + XCTAssertNotNil(backendController.logEventCompletionHandler) + + backendController.logEventCompletionHandler?(event, .success) + + XCTAssertTrue(dataPlanFilter.transformEventCalled) + XCTAssertTrue(dataPlanFilter.transformEventEventParam === event) + XCTAssertTrue(executor.executeOnMainAsync) + + XCTAssertEqual(kitContainer.forwardSDKCalls.count, 2) + + let expectedSelectors = ["endTimedEvent:", "logEvent:"] + let actualSelectors = kitContainer.forwardSDKCalls.map { $0.selector.description } + XCTAssertEqual(actualSelectors, expectedSelectors) + + for call in kitContainer.forwardSDKCalls { + XCTAssertTrue(call.event === transformedEvent) + XCTAssertNil(call.parameters) + XCTAssertEqual(call.messageType, .event) + XCTAssertNil(call.userInfo) + } + + XCTAssertNil(receivedMessage) + } + + func test_endTimedEvent_blocksEvent_whenTransformEventReturnsNil() { + dataPlanFilter.transformEventReturnValue = nil + + mparticle.endTimedEvent(event) + + wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) + + XCTAssertNil(event.duration) + XCTAssertNil(event.endTime) + + XCTAssertTrue(executor.executeOnMessageQueueAsync) + XCTAssertEqual(listenerController.onAPICalledApiName?.description, "endTimedEvent:") + XCTAssertTrue(listenerController.onAPICalledParameter1 === event) + + XCTAssertTrue(backendController.logEventCalled) + XCTAssertTrue(backendController.logEventEventParam === event) + XCTAssertNotNil(backendController.logEventCompletionHandler) + + backendController.logEventCompletionHandler?(event, .success) + + XCTAssertTrue(dataPlanFilter.transformEventCalled) + XCTAssertTrue(dataPlanFilter.transformEventEventParam === event) + + XCTAssertFalse(executor.executeOnMainAsync) + XCTAssertFalse(kitContainer.forwardSDKCallCalled) + XCTAssertTrue(kitContainer.forwardSDKCalls.isEmpty) + + assertReceivedMessage("Blocked timed event end from kits", event: event) + } + + func test_endTimedEvent_forwardsOriginalEvent_whenDataPlanFilterIsNil() { + dataPlanFilter = nil + mparticle.dataPlanFilter = dataPlanFilter + + mparticle.endTimedEvent(event) + + wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) + + XCTAssertNil(event.duration) + XCTAssertNil(event.endTime) + + XCTAssertTrue(executor.executeOnMessageQueueAsync) + XCTAssertEqual(listenerController.onAPICalledApiName?.description, "endTimedEvent:") + XCTAssertTrue(listenerController.onAPICalledParameter1 === event) + + XCTAssertTrue(backendController.logEventCalled) + XCTAssertTrue(backendController.logEventEventParam === event) + XCTAssertNotNil(backendController.logEventCompletionHandler) + + backendController.logEventCompletionHandler?(event, .success) + + XCTAssertTrue(executor.executeOnMainAsync) + + XCTAssertEqual(kitContainer.forwardSDKCalls.count, 2) + + let expectedSelectors = ["endTimedEvent:", "logEvent:"] + let actualSelectors = kitContainer.forwardSDKCalls.map { $0.selector.description } + XCTAssertEqual(actualSelectors, expectedSelectors) + + for call in kitContainer.forwardSDKCalls { + XCTAssertTrue(call.event === event) + XCTAssertNil(call.parameters) + XCTAssertEqual(call.messageType, .event) + XCTAssertNil(call.userInfo) + } + + XCTAssertNil(receivedMessage) + } + } From b202c3d54401086aad2a1af403ce4e60353975b1 Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Tue, 4 Nov 2025 15:19:10 -0500 Subject: [PATCH 2/4] covered eventWithName --- .../MParticle/MParticleEventTests.swift | 20 +++++++++++++++++++ .../MParticle/MParticleTimedEventTests.swift | 1 - 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift index 7eef60f74..befd9567b 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift @@ -100,4 +100,24 @@ final class MParticleEventTests: MParticleTestBase { assertReceivedMessage("Blocked timed event end from kits", event: event) } + + func test_eventWithName_returnsEvent_whenBackendProvidesEvent() { + backendController.eventWithNameReturnValue = event + + let result = mparticle.event(withName: event.name) + + XCTAssertTrue(backendController.eventWithNameCalled) + XCTAssertEqual(backendController.eventWithNameEventNameParam, event.name) + XCTAssertTrue(result === event) + } + + func test_eventWithName_returnsNil_whenBackendReturnsNil() { + backendController.eventWithNameReturnValue = nil + + let result = mparticle.event(withName: event.name) + + XCTAssertTrue(backendController.eventWithNameCalled) + XCTAssertEqual(backendController.eventWithNameEventNameParam, event.name) + XCTAssertNil(result) + } } diff --git a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift index 91cb9e5b2..12e0ac66a 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift @@ -148,5 +148,4 @@ final class MParticleTimedEventTests: MParticleTestBase { XCTAssertNil(receivedMessage) } - } From e46d6b46dbec585e71c29b81adc040cce8e4b8d0 Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Wed, 5 Nov 2025 13:11:22 -0500 Subject: [PATCH 3/4] remove full trace test from endTimedEvent [skip actions] --- .../MParticle/MParticleTimedEventTests.swift | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift index 12e0ac66a..6c505d854 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift @@ -57,27 +57,7 @@ final class MParticleTimedEventTests: MParticleTestBase { XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) XCTAssertNotNil(backendController.logEventCompletionHandler) - backendController.logEventCompletionHandler?(event, .success) - - XCTAssertTrue(dataPlanFilter.transformEventCalled) - XCTAssertTrue(dataPlanFilter.transformEventEventParam === event) - XCTAssertTrue(executor.executeOnMainAsync) - - XCTAssertEqual(kitContainer.forwardSDKCalls.count, 2) - - let expectedSelectors = ["endTimedEvent:", "logEvent:"] - let actualSelectors = kitContainer.forwardSDKCalls.map { $0.selector.description } - XCTAssertEqual(actualSelectors, expectedSelectors) - - for call in kitContainer.forwardSDKCalls { - XCTAssertTrue(call.event === transformedEvent) - XCTAssertNil(call.parameters) - XCTAssertEqual(call.messageType, .event) - XCTAssertNil(call.userInfo) - } - - XCTAssertNil(receivedMessage) } func test_endTimedEvent_blocksEvent_whenTransformEventReturnsNil() { @@ -97,17 +77,7 @@ final class MParticleTimedEventTests: MParticleTestBase { XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) XCTAssertNotNil(backendController.logEventCompletionHandler) - backendController.logEventCompletionHandler?(event, .success) - - XCTAssertTrue(dataPlanFilter.transformEventCalled) - XCTAssertTrue(dataPlanFilter.transformEventEventParam === event) - - XCTAssertFalse(executor.executeOnMainAsync) - XCTAssertFalse(kitContainer.forwardSDKCallCalled) - XCTAssertTrue(kitContainer.forwardSDKCalls.isEmpty) - - assertReceivedMessage("Blocked timed event end from kits", event: event) } func test_endTimedEvent_forwardsOriginalEvent_whenDataPlanFilterIsNil() { @@ -128,24 +98,6 @@ final class MParticleTimedEventTests: MParticleTestBase { XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) XCTAssertNotNil(backendController.logEventCompletionHandler) - backendController.logEventCompletionHandler?(event, .success) - - XCTAssertTrue(executor.executeOnMainAsync) - - XCTAssertEqual(kitContainer.forwardSDKCalls.count, 2) - - let expectedSelectors = ["endTimedEvent:", "logEvent:"] - let actualSelectors = kitContainer.forwardSDKCalls.map { $0.selector.description } - XCTAssertEqual(actualSelectors, expectedSelectors) - - for call in kitContainer.forwardSDKCalls { - XCTAssertTrue(call.event === event) - XCTAssertNil(call.parameters) - XCTAssertEqual(call.messageType, .event) - XCTAssertNil(call.userInfo) - } - - XCTAssertNil(receivedMessage) } } From 7981c53d2117bd381ad8d6f72218fd86e42aa32c Mon Sep 17 00:00:00 2001 From: Nickolas Dimitrakas Date: Wed, 5 Nov 2025 13:26:36 -0500 Subject: [PATCH 4/4] address @denischilik comments --- .../MParticle/MParticleEventTests.swift | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift index befd9567b..944b1166b 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift @@ -84,20 +84,48 @@ final class MParticleEventTests: MParticleTestBase { XCTAssertTrue(kitContainer.forwardSDKCallEventParam === transformedBaseEvent) } - func test_logEventCallback_doesNotLogMessage_whenDataFilterIsNil() { - mparticle.dataPlanFilter = nil - XCTAssertNil(mparticle.dataPlanFilter) - mparticle.logEventCallback(event, execStatus: .success) + func test_logEventCallback_doesNothing_whenExecStatusIsFail() { + mparticle.logEventCallback(event, execStatus: .fail) + + XCTAssertFalse(dataPlanFilter.transformEventCalled) + XCTAssertFalse(executor.executeOnMainAsync) + XCTAssertFalse(kitContainer.forwardSDKCallCalled) XCTAssertNil(receivedMessage) } + func test_logEventCallback_invokesKitContainer_whenDataPlanFilterIsNil() { + dataPlanFilter = nil + mparticle.dataPlanFilter = dataPlanFilter + + mparticle.logEventCallback(event, execStatus: .success) + + XCTAssertTrue(executor.executeOnMainAsync) + + XCTAssertEqual(kitContainer.forwardSDKCalls.count, 2) + let expectedSelectors = ["endTimedEvent:", "logEvent:"] + let actualSelectors = kitContainer.forwardSDKCalls.map { $0.selector.description } + XCTAssertEqual(actualSelectors, expectedSelectors) + + for call in kitContainer.forwardSDKCalls { + XCTAssertTrue(call.event === event) + XCTAssertNil(call.parameters) + XCTAssertEqual(call.messageType, .event) + XCTAssertNil(call.userInfo) + } + } + func test_logEventCallback_blocksEvent_whenFilterReturnsNil() { + dataPlanFilter.transformEventReturnValue = nil + mparticle.logEventCallback(event, execStatus: .success) XCTAssertTrue(dataPlanFilter.transformEventCalled) XCTAssertEqual(dataPlanFilter.transformEventEventParam, event) + XCTAssertFalse(executor.executeOnMainAsync) + XCTAssertFalse(kitContainer.forwardSDKCallCalled) + assertReceivedMessage("Blocked timed event end from kits", event: event) }