Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public protocol IterableEmbeddedManagerProtocol {
func removeUpdateListener(_ listener: IterableEmbeddedUpdateDelegate)

func syncMessages(completion: @escaping () -> Void)
func syncMessages(placementIds: [Int]?, completion: @escaping () -> Void)
func handleEmbeddedClick(message: IterableEmbeddedMessage, buttonIdentifier: String?, clickedUrl: String)
func reset()
}
4 changes: 4 additions & 0 deletions swift-sdk/Internal/EmptyEmbeddedManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@

}

func syncMessages(placementIds: [Int]?, completion: @escaping () -> Void) {

Check warning on line 28 in swift-sdk/Internal/EmptyEmbeddedManager.swift

View check run for this annotation

Codecov / codecov/patch

swift-sdk/Internal/EmptyEmbeddedManager.swift#L28

Added line #L28 was not covered by tests

}

public func handleEmbeddedClick(message: IterableEmbeddedMessage, buttonIdentifier: String?, clickedUrl: String) {

}
Expand Down
11 changes: 8 additions & 3 deletions swift-sdk/Internal/IterableEmbeddedManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,8 @@ class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol
syncMessages { }
}

private func retrieveEmbeddedMessages(completion: @escaping () -> Void) {
apiClient.getEmbeddedMessages()
private func retrieveEmbeddedMessages(placementIds: [Int]?, completion: @escaping () -> Void) {
apiClient.getEmbeddedMessages(placementIds: placementIds ?? [])
.onCompletion(
receiveValue: { embeddedMessagesPayload in
let placements = embeddedMessagesPayload.placements
Expand Down Expand Up @@ -245,8 +245,13 @@ class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol

extension IterableEmbeddedManager: EmbeddedNotifiable {
public func syncMessages(completion: @escaping () -> Void) {
syncMessages(placementIds: nil, completion: completion)

}

public func syncMessages(placementIds: [Int]?, completion: @escaping () -> Void) {
if (enableEmbeddedMessaging) {
retrieveEmbeddedMessages(completion: completion)
retrieveEmbeddedMessages(placementIds: placementIds, completion: completion)
}
}
}
6 changes: 5 additions & 1 deletion swift-sdk/Internal/api-client/ApiClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,11 @@
// MARK: - Embedded Messaging

func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError> {
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest() }
return getEmbeddedMessages(placementIds: [])

Check warning on line 223 in swift-sdk/Internal/api-client/ApiClient.swift

View check run for this annotation

Codecov / codecov/patch

swift-sdk/Internal/api-client/ApiClient.swift#L223

Added line #L223 was not covered by tests
}

func getEmbeddedMessages(placementIds: [Int]?) -> Pending<PlacementsPayload, SendRequestError> {
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest(placementIds: placementIds ?? []) }

Check warning on line 227 in swift-sdk/Internal/api-client/ApiClient.swift

View check run for this annotation

Codecov / codecov/patch

swift-sdk/Internal/api-client/ApiClient.swift#L226-L227

Added lines #L226 - L227 were not covered by tests
return send(iterableRequestResult: result)
}

Expand Down
1 change: 1 addition & 0 deletions swift-sdk/Internal/api-client/ApiClientProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ protocol ApiClientProtocol: AnyObject {
func getRemoteConfiguration() -> Pending<RemoteConfiguration, SendRequestError>

func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError>
func getEmbeddedMessages(placementIds: [Int]?) -> Pending<PlacementsPayload, SendRequestError>

@discardableResult func track(embeddedMessageReceived message: IterableEmbeddedMessage) -> Pending<SendRequestValue, SendRequestError>

Expand Down
8 changes: 8 additions & 0 deletions swift-sdk/Internal/api-client/Request/RequestCreator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,10 @@
// MARK: - Embedded Messaging Request Calls

func createGetEmbeddedMessagesRequest() -> Result<IterableRequest, IterableError> {
return createGetEmbeddedMessagesRequest(placementIds: [])

Check warning on line 427 in swift-sdk/Internal/api-client/Request/RequestCreator.swift

View check run for this annotation

Codecov / codecov/patch

swift-sdk/Internal/api-client/Request/RequestCreator.swift#L427

Added line #L427 was not covered by tests
}

func createGetEmbeddedMessagesRequest(placementIds: [Int]) -> Result<IterableRequest, IterableError> {

Check warning on line 430 in swift-sdk/Internal/api-client/Request/RequestCreator.swift

View check run for this annotation

Codecov / codecov/patch

swift-sdk/Internal/api-client/Request/RequestCreator.swift#L430

Added line #L430 was not covered by tests
if case .none = auth.emailOrUserId {
ITBError(Self.authMissingMessage)
return .failure(IterableError.general(description: Self.authMissingMessage))
Expand All @@ -437,6 +441,10 @@
args[JsonKey.Embedded.packageName] = packageName
}

if !placementIds.isEmpty {
args["placementIds"] = placementIds

Check warning on line 445 in swift-sdk/Internal/api-client/Request/RequestCreator.swift

View check run for this annotation

Codecov / codecov/patch

swift-sdk/Internal/api-client/Request/RequestCreator.swift#L444-L445

Added lines #L444 - L445 were not covered by tests
}

setCurrentUser(inDict: &args)

return .success(.get(createGetRequest(forPath: Const.Path.getEmbeddedMessages, withArgs: args as! [String: String])))
Expand Down
4 changes: 4 additions & 0 deletions tests/unit-tests/BlankApiClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ class BlankApiClient: ApiClientProtocol {
Pending()
}

func getEmbeddedMessages(placementIds: [Int]?) -> Pending<PlacementsPayload, SendRequestError> {
return Pending()
}

func track(embeddedMessageReceived message: IterableEmbeddedMessage) -> Pending<SendRequestValue, SendRequestError> {
Pending()
}
Expand Down
52 changes: 49 additions & 3 deletions tests/unit-tests/EmbeddedManagerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ final class EmbeddedManagerTests: XCTestCase {
XCTAssertEqual(message.metadata.placementId, 2, "Fetched message should have placementId 2")
}
}

// syncMessages
func testSyncMessagesSuccessful() {
let syncMessagesExpectation = expectation(description: "syncMessages should complete")
Expand Down Expand Up @@ -105,6 +105,40 @@ final class EmbeddedManagerTests: XCTestCase {
wait(for: [syncMessagesExpectation, delegateExpectation], timeout: 2)
}

func testSyncMessagesForSpecifiedPlacement() {
let mockApiClient = MockApiClient()
mockApiClient.populateMessages([
1: [IterableEmbeddedMessage(messageId: "1", placementId: 1)],
2: [IterableEmbeddedMessage(messageId: "2", placementId: 2),
IterableEmbeddedMessage(messageId: "3", placementId: 2)],
3: [IterableEmbeddedMessage(messageId: "4", placementId: 3)],
])
let manager = IterableEmbeddedManager(apiClient: mockApiClient,
urlDelegate: nil,
customActionDelegate: nil,
urlOpener: MockUrlOpener(),
allowedProtocols: [],
enableEmbeddedMessaging: true)

// Sync only placement 2
manager.syncMessages(placementIds: [2]) { }

// Verify we got updated messages for placement 2
let messagesForPlacement2 = manager.getMessages(for: 2)
XCTAssertEqual(messagesForPlacement2.count, 2, "Should have 2 messages for placementId 2")
for message in messagesForPlacement2 {
XCTAssertEqual(message.metadata.placementId, 2, "Fetched message should have placementId 2")
}

// Verify other placements are not synced
let messagesForPlacement1 = manager.getMessages(for: 1)
XCTAssertEqual(messagesForPlacement1.count, 0, "Should have no messages for placementId 1")

let messagesForPlacement3 = manager.getMessages(for: 3)
XCTAssertEqual(messagesForPlacement3.count, 0, "Should have no messages for placementId 3")
}


func testManagerReset() {
let syncMessagesExpectation = expectation(description: "syncMessages should complete")

Expand Down Expand Up @@ -352,7 +386,8 @@ final class EmbeddedManagerTests: XCTestCase {
private var newMessages = false
private var invalidApiKey = false
private var mockMessages: [Int: [IterableEmbeddedMessage]] = [:]

private var lastRequestedPlacementIds: [Int]?

func haveNewEmbeddedMessages() {
newMessages = true
}
Expand All @@ -367,13 +402,24 @@ final class EmbeddedManagerTests: XCTestCase {
}

override func getEmbeddedMessages() -> IterableSDK.Pending<IterableSDK.PlacementsPayload, IterableSDK.SendRequestError> {
return getEmbeddedMessages(placementIds: nil)
}

override func getEmbeddedMessages(placementIds: [Int]?) -> IterableSDK.Pending<IterableSDK.PlacementsPayload, IterableSDK.SendRequestError> {
lastRequestedPlacementIds = placementIds

if invalidApiKey {
return FailPending(error: IterableSDK.SendRequestError(reason: "Invalid API Key"))
}

if newMessages {
var filteredMessages = mockMessages
if let placementIds = placementIds, !placementIds.isEmpty {
filteredMessages = mockMessages.filter { placementIds.contains($0.key) }
}

var placements: [Placement] = []
for (placementId, messages) in mockMessages {
for (placementId, messages) in filteredMessages {
let placement = Placement(placementId: placementId, embeddedMessages: messages)
placements.append(placement)
}
Expand Down