diff --git a/UnitTests/Mocks/MPKitContainerMock.swift b/UnitTests/Mocks/MPKitContainerMock.swift index a63d4f71..a0a92e21 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/MParticleEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift index 7eef60f7..944b1166 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift @@ -84,20 +84,68 @@ 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) } + + 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 5d145422..6c505d85 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift @@ -39,4 +39,65 @@ 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) + } + + 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) + } + + 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) + } }