diff --git a/Sources/Common/Background Queue/Queue.swift b/Sources/Common/Background Queue/Queue.swift index 5be0b1fb9..e2b8dafcf 100644 --- a/Sources/Common/Background Queue/Queue.swift +++ b/Sources/Common/Background Queue/Queue.swift @@ -31,7 +31,7 @@ public protocol Queue: AutoMockable { See list of refactors: https://github.com/customerio/issues/issues/6934 */ - func addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric) -> ModifyQueueResult + func addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric, metaData: [String: String]) -> ModifyQueueResult /** Add a task to the queue to be performed sometime in the future. @@ -57,6 +57,10 @@ public protocol Queue: AutoMockable { } public extension Queue { + func addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric, metaData: [String: String] = [:]) -> ModifyQueueResult { + addTrackInAppDeliveryTask(deliveryId: deliveryId, event: event, metaData: metaData) + } + func addTask( type: String, // sourcery:Type=AnyEncodable @@ -122,7 +126,7 @@ public class CioQueue: Queue { self.dateUtil = dateUtil } - public func addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric) -> ModifyQueueResult { + public func addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric, metaData: [String: String]) -> ModifyQueueResult { addTask( type: QueueTaskType.trackDeliveryMetric.rawValue, data: TrackDeliveryEventRequestBody( @@ -130,7 +134,8 @@ public class CioQueue: Queue { payload: DeliveryPayload( deliveryId: deliveryId, event: event, - timestamp: dateUtil.now + timestamp: dateUtil.now, + metaData: metaData ) ) ) diff --git a/Sources/Common/Service/Request/TrackDeliveryEventRequestBody.swift b/Sources/Common/Service/Request/TrackDeliveryEventRequestBody.swift index 423988d22..17d69b37c 100644 --- a/Sources/Common/Service/Request/TrackDeliveryEventRequestBody.swift +++ b/Sources/Common/Service/Request/TrackDeliveryEventRequestBody.swift @@ -14,11 +14,13 @@ internal struct DeliveryPayload: Codable { internal let deliveryId: String internal let event: InAppMetric internal let timestamp: Date + internal let metaData: [String: String] enum CodingKeys: String, CodingKey { case deliveryId = "delivery_id" case event case timestamp + case metaData = "metadata" } } diff --git a/Sources/Common/autogenerated/AutoDependencyInjection.generated.swift b/Sources/Common/autogenerated/AutoDependencyInjection.generated.swift index 3a50f011a..b53360119 100644 --- a/Sources/Common/autogenerated/AutoDependencyInjection.generated.swift +++ b/Sources/Common/autogenerated/AutoDependencyInjection.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/Common/autogenerated/AutoLenses.generated.swift b/Sources/Common/autogenerated/AutoLenses.generated.swift index b42558ae5..65cea2d10 100644 --- a/Sources/Common/autogenerated/AutoLenses.generated.swift +++ b/Sources/Common/autogenerated/AutoLenses.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/Common/autogenerated/AutoMockable.generated.swift b/Sources/Common/autogenerated/AutoMockable.generated.swift index 141bd9dde..10502bf61 100644 --- a/Sources/Common/autogenerated/AutoMockable.generated.swift +++ b/Sources/Common/autogenerated/AutoMockable.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all @@ -1672,9 +1672,9 @@ public class QueueMock: Queue, Mock { } /// The arguments from the *last* time the function was called. - public private(set) var addTrackInAppDeliveryTaskReceivedArguments: (deliveryId: String, event: InAppMetric)? + public private(set) var addTrackInAppDeliveryTaskReceivedArguments: (deliveryId: String, event: InAppMetric, metaData: [String: String])? /// Arguments from *all* of the times that the function was called. - public private(set) var addTrackInAppDeliveryTaskReceivedInvocations: [(deliveryId: String, event: InAppMetric)] = [] + public private(set) var addTrackInAppDeliveryTaskReceivedInvocations: [(deliveryId: String, event: InAppMetric, metaData: [String: String])] = [] /// Value to return from the mocked function. public var addTrackInAppDeliveryTaskReturnValue: ModifyQueueResult! /** @@ -1682,15 +1682,15 @@ public class QueueMock: Queue, Mock { The closure has first priority to return a value for the mocked function. If the closure returns `nil`, then the mock will attempt to return the value for `addTrackInAppDeliveryTaskReturnValue` */ - public var addTrackInAppDeliveryTaskClosure: ((String, InAppMetric) -> ModifyQueueResult)? + public var addTrackInAppDeliveryTaskClosure: ((String, InAppMetric, [String: String]) -> ModifyQueueResult)? - /// Mocked function for `addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric)`. Your opportunity to return a mocked value and check result of mock in test code. - public func addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric) -> ModifyQueueResult { + /// Mocked function for `addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric, metaData: [String: String])`. Your opportunity to return a mocked value and check result of mock in test code. + public func addTrackInAppDeliveryTask(deliveryId: String, event: InAppMetric, metaData: [String: String]) -> ModifyQueueResult { mockCalled = true addTrackInAppDeliveryTaskCallsCount += 1 - addTrackInAppDeliveryTaskReceivedArguments = (deliveryId: deliveryId, event: event) - addTrackInAppDeliveryTaskReceivedInvocations.append((deliveryId: deliveryId, event: event)) - return addTrackInAppDeliveryTaskClosure.map { $0(deliveryId, event) } ?? addTrackInAppDeliveryTaskReturnValue + addTrackInAppDeliveryTaskReceivedArguments = (deliveryId: deliveryId, event: event, metaData: metaData) + addTrackInAppDeliveryTaskReceivedInvocations.append((deliveryId: deliveryId, event: event, metaData: metaData)) + return addTrackInAppDeliveryTaskClosure.map { $0(deliveryId, event, metaData) } ?? addTrackInAppDeliveryTaskReturnValue } // MARK: - addTask @@ -2131,11 +2131,6 @@ public class QueueStorageMock: QueueStorage, Mock { deleteReceivedArguments = nil deleteReceivedInvocations = [] - mockCalled = false // do last as resetting properties above can make this true - deleteTasksMemberOfGroupCallsCount = 0 - deleteTasksMemberOfGroupReceivedArguments = nil - deleteTasksMemberOfGroupReceivedInvocations = [] - mockCalled = false // do last as resetting properties above can make this true deleteExpiredCallsCount = 0 @@ -2322,37 +2317,6 @@ public class QueueStorageMock: QueueStorage, Mock { return deleteClosure.map { $0(storageId) } ?? deleteReturnValue } - // MARK: - deleteTasksMemberOfGroup - - /// Number of times the function was called. - public private(set) var deleteTasksMemberOfGroupCallsCount = 0 - /// `true` if the function was ever called. - public var deleteTasksMemberOfGroupCalled: Bool { - deleteTasksMemberOfGroupCallsCount > 0 - } - - /// The arguments from the *last* time the function was called. - public private(set) var deleteTasksMemberOfGroupReceivedArguments: String? - /// Arguments from *all* of the times that the function was called. - public private(set) var deleteTasksMemberOfGroupReceivedInvocations: [String] = [] - /// Value to return from the mocked function. - public var deleteTasksMemberOfGroupReturnValue: [QueueTaskMetadata]! - /** - Set closure to get called when function gets called. Great way to test logic or return a value for the function. - The closure has first priority to return a value for the mocked function. If the closure returns `nil`, - then the mock will attempt to return the value for `deleteTasksMemberOfGroupReturnValue` - */ - public var deleteTasksMemberOfGroupClosure: ((String) -> [QueueTaskMetadata])? - - /// Mocked function for `deleteTasksMemberOfGroup(groupId: String)`. Your opportunity to return a mocked value and check result of mock in test code. - public func deleteTasksMemberOfGroup(groupId: String) -> [QueueTaskMetadata] { - mockCalled = true - deleteTasksMemberOfGroupCallsCount += 1 - deleteTasksMemberOfGroupReceivedArguments = groupId - deleteTasksMemberOfGroupReceivedInvocations.append(groupId) - return deleteTasksMemberOfGroupClosure.map { $0(groupId) } ?? deleteTasksMemberOfGroupReturnValue - } - // MARK: - deleteExpired /// Number of times the function was called. diff --git a/Sources/MessagingInApp/MessagingInAppImplementation.swift b/Sources/MessagingInApp/MessagingInAppImplementation.swift index e7e449a6c..28ead86ad 100644 --- a/Sources/MessagingInApp/MessagingInAppImplementation.swift +++ b/Sources/MessagingInApp/MessagingInAppImplementation.swift @@ -102,7 +102,7 @@ extension MessagingInAppImplementation: GistDelegate { if action != "gist://close" { if let deliveryId = getDeliveryId(from: message) { // the state of the SDK does not change if adding this queue task isn't successful so ignore result - _ = queue.addTrackInAppDeliveryTask(deliveryId: deliveryId, event: .clicked) + _ = queue.addTrackInAppDeliveryTask(deliveryId: deliveryId, event: .clicked, metaData: ["action_name": name, "action_value": action]) } } diff --git a/Sources/MessagingInApp/autogenerated/AutoDependencyInjection.generated.swift b/Sources/MessagingInApp/autogenerated/AutoDependencyInjection.generated.swift index c814a3043..02914bb40 100644 --- a/Sources/MessagingInApp/autogenerated/AutoDependencyInjection.generated.swift +++ b/Sources/MessagingInApp/autogenerated/AutoDependencyInjection.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingInApp/autogenerated/AutoLenses.generated.swift b/Sources/MessagingInApp/autogenerated/AutoLenses.generated.swift index 7726c6b06..a5cc78ec7 100644 --- a/Sources/MessagingInApp/autogenerated/AutoLenses.generated.swift +++ b/Sources/MessagingInApp/autogenerated/AutoLenses.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingInApp/autogenerated/AutoMockable.generated.swift b/Sources/MessagingInApp/autogenerated/AutoMockable.generated.swift index 8da0828ab..08fd2078d 100644 --- a/Sources/MessagingInApp/autogenerated/AutoMockable.generated.swift +++ b/Sources/MessagingInApp/autogenerated/AutoMockable.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPush/autogenerated/AutoDependencyInjection.generated.swift b/Sources/MessagingPush/autogenerated/AutoDependencyInjection.generated.swift index a5ecd2a8e..92a222a0b 100644 --- a/Sources/MessagingPush/autogenerated/AutoDependencyInjection.generated.swift +++ b/Sources/MessagingPush/autogenerated/AutoDependencyInjection.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPush/autogenerated/AutoLenses.generated.swift b/Sources/MessagingPush/autogenerated/AutoLenses.generated.swift index 613d5608d..d9e905170 100644 --- a/Sources/MessagingPush/autogenerated/AutoLenses.generated.swift +++ b/Sources/MessagingPush/autogenerated/AutoLenses.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPush/autogenerated/AutoMockable.generated.swift b/Sources/MessagingPush/autogenerated/AutoMockable.generated.swift index 9766c16db..737486a94 100644 --- a/Sources/MessagingPush/autogenerated/AutoMockable.generated.swift +++ b/Sources/MessagingPush/autogenerated/AutoMockable.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPushAPN/autogenerated/AutoDependencyInjection.generated.swift b/Sources/MessagingPushAPN/autogenerated/AutoDependencyInjection.generated.swift index f349fe58b..5eb19cc9a 100644 --- a/Sources/MessagingPushAPN/autogenerated/AutoDependencyInjection.generated.swift +++ b/Sources/MessagingPushAPN/autogenerated/AutoDependencyInjection.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPushAPN/autogenerated/AutoLenses.generated.swift b/Sources/MessagingPushAPN/autogenerated/AutoLenses.generated.swift index 084864c52..0c2b48de2 100644 --- a/Sources/MessagingPushAPN/autogenerated/AutoLenses.generated.swift +++ b/Sources/MessagingPushAPN/autogenerated/AutoLenses.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPushAPN/autogenerated/AutoMockable.generated.swift b/Sources/MessagingPushAPN/autogenerated/AutoMockable.generated.swift index 5b098df81..61e004014 100644 --- a/Sources/MessagingPushAPN/autogenerated/AutoMockable.generated.swift +++ b/Sources/MessagingPushAPN/autogenerated/AutoMockable.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPushFCM/autogenerated/AutoDependencyInjection.generated.swift b/Sources/MessagingPushFCM/autogenerated/AutoDependencyInjection.generated.swift index f349fe58b..5eb19cc9a 100644 --- a/Sources/MessagingPushFCM/autogenerated/AutoDependencyInjection.generated.swift +++ b/Sources/MessagingPushFCM/autogenerated/AutoDependencyInjection.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPushFCM/autogenerated/AutoLenses.generated.swift b/Sources/MessagingPushFCM/autogenerated/AutoLenses.generated.swift index 084864c52..0c2b48de2 100644 --- a/Sources/MessagingPushFCM/autogenerated/AutoLenses.generated.swift +++ b/Sources/MessagingPushFCM/autogenerated/AutoLenses.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/MessagingPushFCM/autogenerated/AutoMockable.generated.swift b/Sources/MessagingPushFCM/autogenerated/AutoMockable.generated.swift index cfa98d6e0..9a7fdcd24 100644 --- a/Sources/MessagingPushFCM/autogenerated/AutoMockable.generated.swift +++ b/Sources/MessagingPushFCM/autogenerated/AutoMockable.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/Tracking/autogenerated/AutoDependencyInjection.generated.swift b/Sources/Tracking/autogenerated/AutoDependencyInjection.generated.swift index 3d00c44a4..34b46ada0 100644 --- a/Sources/Tracking/autogenerated/AutoDependencyInjection.generated.swift +++ b/Sources/Tracking/autogenerated/AutoDependencyInjection.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/Tracking/autogenerated/AutoLenses.generated.swift b/Sources/Tracking/autogenerated/AutoLenses.generated.swift index 5da62ee76..7595af030 100644 --- a/Sources/Tracking/autogenerated/AutoLenses.generated.swift +++ b/Sources/Tracking/autogenerated/AutoLenses.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Sources/Tracking/autogenerated/AutoMockable.generated.swift b/Sources/Tracking/autogenerated/AutoMockable.generated.swift index c32f575e9..3c2e051e5 100644 --- a/Sources/Tracking/autogenerated/AutoMockable.generated.swift +++ b/Sources/Tracking/autogenerated/AutoMockable.generated.swift @@ -1,4 +1,4 @@ -// Generated using Sourcery 2.0.1 — https://github.com/krzysztofzablocki/Sourcery +// Generated using Sourcery 2.0.2 — https://github.com/krzysztofzablocki/Sourcery // DO NOT EDIT // swiftlint:disable all diff --git a/Tests/MessagingInApp/MessagingInAppImplementationTest.swift b/Tests/MessagingInApp/MessagingInAppImplementationTest.swift index be5dc6ca8..5c19b054b 100644 --- a/Tests/MessagingInApp/MessagingInAppImplementationTest.swift +++ b/Tests/MessagingInApp/MessagingInAppImplementationTest.swift @@ -12,12 +12,14 @@ class MessagingInAppImplementationTest: UnitTest { private let inAppProviderMock = InAppProviderMock() private let eventListenerMock = InAppEventListenerMock() private let profileStoreMock = ProfileStoreMock() + private let backgroundQueueMock = QueueMock() override func setUp() { super.setUp() diGraph.override(value: inAppProviderMock, forType: InAppProvider.self) diGraph.override(value: profileStoreMock, forType: ProfileStore.self) + diGraph.override(value: backgroundQueueMock, forType: Queue.self) messagingInApp = MessagingInAppImplementation(diGraph: diGraph) messagingInApp.initialize(eventListener: eventListenerMock) @@ -101,6 +103,11 @@ class MessagingInAppImplementationTest: UnitTest { let givenGistMessage = Message.random let expectedInAppMessage = InAppMessage(gistMessage: givenGistMessage) + backgroundQueueMock.addTrackInAppDeliveryTaskReturnValue = ( + success: true, + queueStatus: QueueStatus.successAddingSingleTask + ) + // Message opened XCTAssertFalse(eventListenerMock.messageShownCalled) messagingInApp.messageShown(message: givenGistMessage) @@ -139,6 +146,11 @@ class MessagingInAppImplementationTest: UnitTest { func test_eventListeners_expectCallListenerForEachEvent() { let givenGistMessage = Message.random + backgroundQueueMock.addTrackInAppDeliveryTaskReturnValue = ( + success: true, + queueStatus: QueueStatus.successAddingSingleTask + ) + // Message opened XCTAssertEqual(eventListenerMock.messageShownCallsCount, 0) messagingInApp.messageShown(message: givenGistMessage) @@ -175,6 +187,11 @@ class MessagingInAppImplementationTest: UnitTest { let givenAction = "gist://close" let givenName = String.random + backgroundQueueMock.addTrackInAppDeliveryTaskReturnValue = ( + success: true, + queueStatus: QueueStatus.successAddingSingleTask + ) + XCTAssertEqual(eventListenerMock.messageActionTakenCallsCount, 0) messagingInApp.action( @@ -183,9 +200,38 @@ class MessagingInAppImplementationTest: UnitTest { action: givenAction, name: givenName ) + XCTAssertEqual(eventListenerMock.messageActionTakenCallsCount, 1) XCTAssertEqual(eventListenerMock.messageActionTakenReceivedArguments?.message, expectedInAppMessage) XCTAssertEqual(eventListenerMock.messageActionTakenReceivedArguments?.actionValue, givenAction) XCTAssertEqual(eventListenerMock.messageActionTakenReceivedArguments?.actionName, givenName) + + // make sure there is no click tracking for "close" action + XCTAssertEqual(backgroundQueueMock.addTrackInAppDeliveryTaskCallsCount, 0) + } + + func test_inAppTracking_givenCustomAction_expectBQTrackInAppClicked() { + let givenGistMessage = Message.random + let expectedInAppMessage = InAppMessage(gistMessage: givenGistMessage) + let givenCurrentRoute = String.random + let givenAction = String.random + let givenName = String.random + let givenMetaData = ["action_name": givenName, "action_value": givenAction] + + backgroundQueueMock.addTrackInAppDeliveryTaskReturnValue = ( + success: true, + queueStatus: QueueStatus.successAddingSingleTask + ) + + messagingInApp.action( + message: givenGistMessage, + currentRoute: givenCurrentRoute, + action: givenAction, + name: givenName + ) + + XCTAssertEqual(backgroundQueueMock.addTrackInAppDeliveryTaskReceivedArguments?.deliveryId, expectedInAppMessage.deliveryId) + XCTAssertEqual(backgroundQueueMock.addTrackInAppDeliveryTaskReceivedArguments?.event, .clicked) + XCTAssertEqual(backgroundQueueMock.addTrackInAppDeliveryTaskReceivedArguments?.metaData, givenMetaData) } }