Skip to content

Commit 3794160

Browse files
ApiClient should return failure instead of fatalError if authProvider is not present.
1 parent 15ebe86 commit 3794160

File tree

2 files changed

+79
-51
lines changed

2 files changed

+79
-51
lines changed

swift-sdk/Internal/ApiClient.swift

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,14 @@ class ApiClient {
5454

5555
// MARK: - Private
5656

57-
private func createRequestCreator() -> RequestCreator {
57+
private func createRequestCreator() -> Result<RequestCreator, IterableError> {
5858
guard let authProvider = authProvider else {
59-
fatalError("authProvider is missing")
59+
return .failure(IterableError.general(description: "authProvider is missing"))
6060
}
6161

62-
return RequestCreator(apiKey: apiKey, auth: authProvider.auth, deviceMetadata: deviceMetadata)
62+
return .success(RequestCreator(apiKey: apiKey, auth: authProvider.auth, deviceMetadata: deviceMetadata))
6363
}
64+
6465

6566
private func createIterableHeaders() -> [String: String] {
6667
var headers = [JsonKey.contentType.jsonKey: JsonValue.applicationJson.jsonStringValue,
@@ -86,40 +87,52 @@ class ApiClient {
8687

8788
extension ApiClient: ApiClientProtocol {
8889
func register(registerTokenInfo: RegisterTokenInfo, notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError> {
89-
send(iterableRequestResult: createRequestCreator().createRegisterTokenRequest(registerTokenInfo: registerTokenInfo,
90-
notificationsEnabled: notificationsEnabled))
90+
let result = createRequestCreator().flatMap { $0.createRegisterTokenRequest(registerTokenInfo: registerTokenInfo,
91+
notificationsEnabled: notificationsEnabled) }
92+
return send(iterableRequestResult: result)
9193
}
9294

9395
func updateUser(_ dataFields: [AnyHashable: Any], mergeNestedObjects: Bool) -> Future<SendRequestValue, SendRequestError> {
94-
send(iterableRequestResult: createRequestCreator().createUpdateUserRequest(dataFields: dataFields, mergeNestedObjects: mergeNestedObjects))
96+
let result = createRequestCreator().flatMap { $0.createUpdateUserRequest(dataFields: dataFields,
97+
mergeNestedObjects: mergeNestedObjects) }
98+
return send(iterableRequestResult: result)
9599
}
96100

97101
func updateEmail(newEmail: String) -> Future<SendRequestValue, SendRequestError> {
98-
send(iterableRequestResult: createRequestCreator().createUpdateEmailRequest(newEmail: newEmail))
102+
let result = createRequestCreator().flatMap { $0.createUpdateEmailRequest(newEmail: newEmail) }
103+
return send(iterableRequestResult: result)
99104
}
100105

101106
func getInAppMessages(_ count: NSNumber) -> Future<SendRequestValue, SendRequestError> {
102-
send(iterableRequestResult: createRequestCreator().createGetInAppMessagesRequest(count))
107+
let result = createRequestCreator().flatMap { $0.createGetInAppMessagesRequest(count) }
108+
return send(iterableRequestResult: result)
103109
}
104110

105111
func disableDevice(forAllUsers allUsers: Bool, hexToken: String) -> Future<SendRequestValue, SendRequestError> {
106-
send(iterableRequestResult: createRequestCreator().createDisableDeviceRequest(forAllUsers: allUsers, hexToken: hexToken))
112+
let result = createRequestCreator().flatMap { $0.createDisableDeviceRequest(forAllUsers: allUsers,
113+
hexToken: hexToken) }
114+
return send(iterableRequestResult: result)
107115
}
108116

109117
func track(purchase total: NSNumber, items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
110-
send(iterableRequestResult: createRequestCreator().createTrackPurchaseRequest(total, items: items, dataFields: dataFields))
118+
let result = createRequestCreator().flatMap { $0.createTrackPurchaseRequest(total, items: items,
119+
dataFields: dataFields) }
120+
return send(iterableRequestResult: result)
111121
}
112122

113123
func track(pushOpen campaignId: NSNumber, templateId: NSNumber?, messageId: String, appAlreadyRunning: Bool, dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
114-
send(iterableRequestResult: createRequestCreator().createTrackPushOpenRequest(campaignId,
115-
templateId: templateId,
116-
messageId: messageId,
117-
appAlreadyRunning: appAlreadyRunning,
118-
dataFields: dataFields))
124+
let result = createRequestCreator().flatMap { $0.createTrackPushOpenRequest(campaignId,
125+
templateId: templateId,
126+
messageId: messageId,
127+
appAlreadyRunning: appAlreadyRunning,
128+
dataFields: dataFields) }
129+
return send(iterableRequestResult: result)
119130
}
120131

121132
func track(event eventName: String, dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
122-
send(iterableRequestResult: createRequestCreator().createTrackEventRequest(eventName, dataFields: dataFields))
133+
let result = createRequestCreator().flatMap { $0.createTrackEventRequest(eventName,
134+
dataFields: dataFields) }
135+
return send(iterableRequestResult: result)
123136
}
124137

125138
func updateSubscriptions(_ emailListIds: [NSNumber]? = nil,
@@ -128,40 +141,52 @@ extension ApiClient: ApiClientProtocol {
128141
subscribedMessageTypeIds: [NSNumber]? = nil,
129142
campaignId: NSNumber? = nil,
130143
templateId: NSNumber? = nil) -> Future<SendRequestValue, SendRequestError> {
131-
send(iterableRequestResult: createRequestCreator().createUpdateSubscriptionsRequest(emailListIds,
132-
unsubscribedChannelIds: unsubscribedChannelIds,
133-
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
134-
subscribedMessageTypeIds: subscribedMessageTypeIds,
135-
campaignId: campaignId,
136-
templateId: templateId))
144+
let result = createRequestCreator().flatMap { $0.createUpdateSubscriptionsRequest(emailListIds,
145+
unsubscribedChannelIds: unsubscribedChannelIds,
146+
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
147+
subscribedMessageTypeIds: subscribedMessageTypeIds,
148+
campaignId: campaignId,
149+
templateId: templateId) }
150+
return send(iterableRequestResult: result)
137151
}
138152

139153
func track(inAppOpen inAppMessageContext: InAppMessageContext) -> Future<SendRequestValue, SendRequestError> {
140-
send(iterableRequestResult: createRequestCreator().createTrackInAppOpenRequest(inAppMessageContext: inAppMessageContext))
154+
let result = createRequestCreator().flatMap { $0.createTrackInAppOpenRequest(inAppMessageContext: inAppMessageContext) }
155+
return send(iterableRequestResult: result)
141156
}
142157

143158
func track(inAppClick inAppMessageContext: InAppMessageContext, clickedUrl: String) -> Future<SendRequestValue, SendRequestError> {
144-
send(iterableRequestResult: createRequestCreator().createTrackInAppClickRequest(inAppMessageContext: inAppMessageContext, clickedUrl: clickedUrl))
159+
let result = createRequestCreator().flatMap { $0.createTrackInAppClickRequest(inAppMessageContext: inAppMessageContext,
160+
clickedUrl: clickedUrl) }
161+
return send(iterableRequestResult: result)
145162
}
146163

147164
func track(inAppClose inAppMessageContext: InAppMessageContext, source: InAppCloseSource?, clickedUrl: String?) -> Future<SendRequestValue, SendRequestError> {
148-
send(iterableRequestResult: createRequestCreator().createTrackInAppCloseRequest(inAppMessageContext: inAppMessageContext, source: source, clickedUrl: clickedUrl))
165+
let result = createRequestCreator().flatMap { $0.createTrackInAppCloseRequest(inAppMessageContext: inAppMessageContext,
166+
source: source,
167+
clickedUrl: clickedUrl) }
168+
return send(iterableRequestResult: result)
149169
}
150170

151171
func track(inAppDelivery inAppMessageContext: InAppMessageContext) -> Future<SendRequestValue, SendRequestError> {
152-
send(iterableRequestResult: createRequestCreator().createTrackInAppDeliveryRequest(inAppMessageContext: inAppMessageContext))
172+
let result = createRequestCreator().flatMap { $0.createTrackInAppDeliveryRequest(inAppMessageContext: inAppMessageContext) }
173+
return send(iterableRequestResult: result)
153174
}
154175

155176
func track(inboxSession: IterableInboxSession) -> Future<SendRequestValue, SendRequestError> {
156-
send(iterableRequestResult: createRequestCreator().createTrackInboxSessionRequest(inboxSession: inboxSession))
177+
let result = createRequestCreator().flatMap { $0.createTrackInboxSessionRequest(inboxSession: inboxSession) }
178+
return send(iterableRequestResult: result)
157179
}
158180

159181
func inAppConsume(messageId: String) -> Future<SendRequestValue, SendRequestError> {
160-
send(iterableRequestResult: createRequestCreator().createInAppConsumeRequest(messageId))
182+
let result = createRequestCreator().flatMap { $0.createInAppConsumeRequest(messageId) }
183+
return send(iterableRequestResult: result)
161184
}
162185

163186
func inAppConsume(inAppMessageContext: InAppMessageContext, source: InAppDeleteSource?) -> Future<SendRequestValue, SendRequestError> {
164-
send(iterableRequestResult: createRequestCreator().createTrackInAppConsumeRequest(inAppMessageContext: inAppMessageContext, source: source))
187+
let result = createRequestCreator().flatMap { $0.createTrackInAppConsumeRequest(inAppMessageContext: inAppMessageContext,
188+
source: source) }
189+
return send(iterableRequestResult: result)
165190
}
166191
}
167192

@@ -170,11 +195,14 @@ extension ApiClient: ApiClientProtocol {
170195
extension ApiClient {
171196
// deprecated - will be removed in version 6.3.x or above
172197
func track(inAppOpen messageId: String) -> Future<SendRequestValue, SendRequestError> {
173-
send(iterableRequestResult: createRequestCreator().createTrackInAppOpenRequest(messageId))
198+
let value = createRequestCreator().flatMap { $0.createTrackInAppOpenRequest(messageId) }
199+
return send(iterableRequestResult: value)
174200
}
175201

176202
// deprecated - will be removed in version 6.3.x or above
177203
func track(inAppClick messageId: String, clickedUrl: String) -> Future<SendRequestValue, SendRequestError> {
178-
send(iterableRequestResult: createRequestCreator().createTrackInAppClickRequest(messageId, clickedUrl: clickedUrl))
204+
let result = createRequestCreator().flatMap { $0.createTrackInAppClickRequest(messageId,
205+
clickedUrl: clickedUrl) }
206+
return send(iterableRequestResult: result)
179207
}
180208
}

tests/swift-sdk-swift-tests/InAppTests.swift

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -515,26 +515,23 @@ class InAppTests: XCTestCase {
515515

516516
XCTAssertEqual(internalApi.inAppManager.getMessages().count, 0)
517517
}
518-
518+
519519
func testShowInAppWithIterableCustomActionDismiss() {
520-
var internalApi: IterableAPIInternal!
521-
let expectation1 = expectation(description: "messages fetched")
522-
let expectation2 = expectation(description: "custom action dismiss called")
523-
520+
let expectation1 = expectation(description: "message is shown")
521+
524522
let mockInAppFetcher = MockInAppFetcher()
525-
526-
let iterableDismissUrl = "iterable://dismiss"
523+
let iterableDeleteUrl = "iterable://dismiss"
527524
let mockInAppDisplayer = MockInAppDisplayer()
528525
mockInAppDisplayer.onShow.onSuccess { _ in
529-
mockInAppDisplayer.click(url: URL(string: iterableDismissUrl)!)
530-
XCTAssertEqual(internalApi.inAppManager.getMessages().count, 1)
531-
expectation2.fulfill()
526+
mockInAppDisplayer.click(url: URL(string: iterableDeleteUrl)!)
527+
expectation1.fulfill()
532528
}
533529

534530
let config = IterableConfig()
535531
config.inAppDelegate = MockInAppDelegate(showInApp: .show)
532+
config.logDelegate = AllLogDelegate()
536533

537-
internalApi = IterableAPIInternal.initializeForTesting(
534+
let internalApi = IterableAPIInternal.initializeForTesting(
538535
config: config,
539536
inAppFetcher: mockInAppFetcher,
540537
inAppDisplayer: mockInAppDisplayer
@@ -545,7 +542,7 @@ class InAppTests: XCTestCase {
545542
[
546543
{
547544
"saveToInbox": true,
548-
"content": {"contentType": "html", "inAppDisplaySettings": {"bottom": {"displayOption": "AutoExpand"}, "backgroundAlpha": 0.5, "left": {"percentage": 60}, "right": {"percentage": 60}, "top": {"displayOption": "AutoExpand"}}, "html": "<a href=\'\(iterableDismissUrl)'>Click Here</a>"},
545+
"content": {"contentType": "html", "inAppDisplaySettings": {"bottom": {"displayOption": "AutoExpand"}, "backgroundAlpha": 0.5, "left": {"percentage": 60}, "right": {"percentage": 60}, "top": {"displayOption": "AutoExpand"}}, "html": "<a href=\'\(iterableDeleteUrl)'>Click Here</a>"},
549546
"trigger": {"type": "immediate"},
550547
"messageId": "message0",
551548
"campaignId": 1,
@@ -554,15 +551,14 @@ class InAppTests: XCTestCase {
554551
]
555552
}
556553
""".toJsonDict()
557-
mockInAppFetcher.mockInAppPayloadFromServer(internalApi: internalApi, payload).onSuccess { _ in
558-
let messages = internalApi.inAppManager.getMessages()
559-
XCTAssertEqual(messages.count, 1)
560-
expectation1.fulfill()
561-
}
562554

563-
wait(for: [expectation1, expectation2], timeout: testExpectationTimeout)
555+
mockInAppFetcher.mockInAppPayloadFromServer(internalApi: internalApi, payload)
556+
557+
wait(for: [expectation1], timeout: testExpectationTimeout)
558+
559+
XCTAssertEqual(internalApi.inAppManager.getMessages().count, 1)
564560
}
565-
561+
566562
func testShowInAppWithCustomActionBackwardCompatibility() {
567563
let customActionScheme = "itbl"
568564
let customActionName = "my_custom_action"
@@ -1472,7 +1468,11 @@ class InAppTests: XCTestCase {
14721468
}
14731469
""".toJsonDict()
14741470

1475-
mockInAppFetcher.mockInAppPayloadFromServer(internalApi: internalApi, payload).onSuccess { _ in
1471+
mockInAppFetcher.mockInAppPayloadFromServer(internalApi: internalApi, payload).onSuccess { [weak internalApi] _ in
1472+
guard let internalApi = internalApi else {
1473+
XCTFail("Expected internalApi to be not nil")
1474+
return
1475+
}
14761476
let messages = internalApi.inAppManager.getMessages()
14771477
XCTAssertEqual(messages.count, 1)
14781478
expectation2.fulfill()

0 commit comments

Comments
 (0)