Skip to content

Commit 6343211

Browse files
Merge pull request #309 from Iterable/test/mob-1540-vc-vm
[MOB-1540] - Convert InboxViewControllerViewModelTests to not use IterableAPI stat…
2 parents 26333fc + c631d99 commit 6343211

File tree

3 files changed

+54
-91
lines changed

3 files changed

+54
-91
lines changed

swift-sdk/Internal/DataFieldsHelper.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// the dataFields dictionary.
77

88
import Foundation
9+
import UIKit
910

1011
struct DataFieldsHelper {
1112
static func createDataFields(sdkVersion: String?, deviceId: String, device: UIDevice, bundle: Bundle, notificationsEnabled: Bool, deviceAttributes: [String: String]) -> [String: Any] {

swift-sdk/Internal/InboxViewControllerViewModel.swift

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@ class InboxViewControllerViewModel: InboxViewControllerViewModelProtocol {
4545
sectionedMessages = sortAndFilter(messages: allMessagesInSections())
4646
}
4747

48-
init() {
48+
init(internalAPIProvider: @escaping @autoclosure () -> IterableAPIInternal? = IterableAPI.internalImplementation) {
4949
ITBInfo()
5050

51-
if let _ = IterableAPI.internalImplementation {
51+
self.internalAPIProvider = internalAPIProvider
52+
53+
if let _ = internalAPI {
5254
sectionedMessages = sortAndFilter(messages: getMessages())
5355
}
5456

@@ -89,15 +91,11 @@ class InboxViewControllerViewModel: InboxViewControllerViewModelProtocol {
8991
}
9092

9193
func set(read: Bool, forMessage message: InboxMessageViewModel) {
92-
IterableAPI.inAppManager.set(read: read, forMessage: message.iterableMessage)
94+
internalInAppManager?.set(read: read, forMessage: message.iterableMessage)
9395
}
9496

9597
func refresh() -> Future<Bool, Error> {
96-
guard let inAppManager = IterableAPI.inAppManager as? InAppManager else {
97-
return Promise(error: IterableError.general(description: "Did not find inAppManager"))
98-
}
99-
100-
return inAppManager.scheduleSync()
98+
return internalInAppManager?.scheduleSync() ?? Promise(error: IterableError.general(description: "Did not find inAppManager"))
10199
}
102100

103101
func createInboxMessageViewController(for message: InboxMessageViewModel, withInboxMode inboxMode: IterableInboxViewController.InboxMode) -> UIViewController? {
@@ -147,7 +145,7 @@ class InboxViewControllerViewModel: InboxViewControllerViewModelProtocol {
147145
}
148146

149147
private func loadImage(forMessageId messageId: String, fromUrl url: URL) {
150-
if let networkSession = IterableAPI.internalImplementation?.networkSession {
148+
if let networkSession = internalAPI?.networkSession {
151149
NetworkHelper.getData(fromUrl: url, usingSession: networkSession).onSuccess { [weak self] in
152150
self?.setImageData($0, forMessageId: messageId)
153151
}.onError {
@@ -214,11 +212,11 @@ class InboxViewControllerViewModel: InboxViewControllerViewModelProtocol {
214212
sessionEndTime: Date(),
215213
startTotalMessageCount: sessionInfo.startInfo.totalMessageCount,
216214
startUnreadMessageCount: sessionInfo.startInfo.unreadMessageCount,
217-
endTotalMessageCount: IterableAPI.inAppManager.getInboxMessages().count,
218-
endUnreadMessageCount: IterableAPI.inAppManager.getUnreadInboxMessagesCount(),
215+
endTotalMessageCount: internalInAppManager?.getInboxMessages().count ?? 0,
216+
endUnreadMessageCount: internalInAppManager?.getUnreadInboxMessagesCount() ?? 0,
219217
impressions: sessionInfo.impressions.map { $0.toIterableInboxImpression() })
220218

221-
IterableAPI.internalImplementation?.track(inboxSession: inboxSession)
219+
internalAPI?.track(inboxSession: inboxSession)
222220
}
223221

224222
@objc private func onInboxChanged(notification _: NSNotification) {
@@ -242,7 +240,6 @@ class InboxViewControllerViewModel: InboxViewControllerViewModelProtocol {
242240

243241
@objc private func onAppWillEnterForeground(notification _: NSNotification) {
244242
ITBInfo()
245-
246243
if sessionManager.startSessionWhenAppMovesToForeground {
247244
startSession()
248245
sessionManager.startSessionWhenAppMovesToForeground = false
@@ -260,7 +257,7 @@ class InboxViewControllerViewModel: InboxViewControllerViewModelProtocol {
260257
}
261258

262259
private func getMessages() -> [InboxMessageViewModel] {
263-
IterableAPI.inAppManager.getInboxMessages().map { InboxMessageViewModel(message: $0) }
260+
return internalAPI?.inAppManager.getMessages().map { InboxMessageViewModel(message: $0) } ?? []
264261
}
265262

266263
private func sortAndFilter(messages: [InboxMessageViewModel]) -> SectionedValues<Int, InboxMessageViewModel> {
@@ -298,20 +295,21 @@ class InboxViewControllerViewModel: InboxViewControllerViewModelProtocol {
298295
sectionedMessages.values
299296
}
300297

298+
private var internalAPI: IterableAPIInternal? {
299+
return internalAPIProvider()
300+
}
301+
301302
var comparator: ((IterableInAppMessage, IterableInAppMessage) -> Bool)?
302303
var filter: ((IterableInAppMessage) -> Bool)?
303304
var sectionMapper: ((IterableInAppMessage) -> Int)?
304305

305306
private var sectionedMessages = SectionedValues<Int, InboxMessageViewModel>()
306307
private var newSectionedMessages = SectionedValues<Int, InboxMessageViewModel>()
307308
private var sessionManager = InboxSessionManager()
309+
private var internalAPIProvider: () -> IterableAPIInternal?
308310

309311
private var internalInAppManager: IterableInternalInAppManagerProtocol? {
310-
guard let internalInAppManager = IterableAPI.inAppManager as? IterableInternalInAppManagerProtocol else {
311-
ITBError("Unexpected inAppManager type")
312-
return nil
313-
}
314-
return internalInAppManager
312+
return internalAPI?.inAppManager
315313
}
316314
}
317315

tests/swift-sdk-swift-tests/InboxViewControllerViewModelTests.swift

Lines changed: 36 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,10 @@ class InboxViewControllerViewModelTests: XCTestCase {
2222
func testDescendingSorting() {
2323
let expectation1 = expectation(description: "testDescendingSorting")
2424

25-
let model = InboxViewControllerViewModel()
26-
model.comparator = IterableInboxViewController.DefaultComparator.descending
27-
2825
let fetcher = MockInAppFetcher()
29-
30-
IterableAPI.initializeForTesting(
31-
inAppFetcher: fetcher
32-
)
26+
let internalAPI = IterableAPIInternal.initializeForTesting(inAppFetcher: fetcher)
27+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
28+
model.comparator = IterableInboxViewController.DefaultComparator.descending
3329

3430
let date1 = Date()
3531
let date2 = date1.addingTimeInterval(5.0)
@@ -51,7 +47,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
5147
inboxMetadata: nil,
5248
customPayload: nil),
5349
]
54-
fetcher.mockMessagesAvailableFromServer(messages: messages)
50+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
5551

5652
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
5753
model.beganUpdates()
@@ -66,14 +62,10 @@ class InboxViewControllerViewModelTests: XCTestCase {
6662
func testAscendingSorting() {
6763
let expectation1 = expectation(description: "testAscendingSorting")
6864

69-
let model = InboxViewControllerViewModel()
70-
model.comparator = IterableInboxViewController.DefaultComparator.ascending
71-
7265
let fetcher = MockInAppFetcher()
73-
74-
IterableAPI.initializeForTesting(
75-
inAppFetcher: fetcher
76-
)
66+
let internalAPI = IterableAPIInternal.initializeForTesting(inAppFetcher: fetcher)
67+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
68+
model.comparator = IterableInboxViewController.DefaultComparator.ascending
7769

7870
let date1 = Date()
7971
let date2 = date1.addingTimeInterval(5.0)
@@ -95,7 +87,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
9587
inboxMetadata: nil,
9688
customPayload: nil),
9789
]
98-
fetcher.mockMessagesAvailableFromServer(messages: messages)
90+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
9991

10092
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
10193
model.beganUpdates()
@@ -110,13 +102,9 @@ class InboxViewControllerViewModelTests: XCTestCase {
110102
func testNoSortingIsDescending() {
111103
let expectation1 = expectation(description: "testNoSorting")
112104

113-
let model = InboxViewControllerViewModel()
114-
115105
let fetcher = MockInAppFetcher()
116-
117-
IterableAPI.initializeForTesting(
118-
inAppFetcher: fetcher
119-
)
106+
let internalAPI = IterableAPIInternal.initializeForTesting(inAppFetcher: fetcher)
107+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
120108

121109
let date1 = Date()
122110
let date2 = date1.addingTimeInterval(5.0)
@@ -138,7 +126,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
138126
inboxMetadata: nil,
139127
customPayload: nil),
140128
]
141-
fetcher.mockMessagesAvailableFromServer(messages: messages)
129+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
142130

143131
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
144132
model.beganUpdates()
@@ -153,13 +141,9 @@ class InboxViewControllerViewModelTests: XCTestCase {
153141
func testWithNoFiltering() {
154142
let expectation1 = expectation(description: "testWithNoFiltering")
155143

156-
let model = InboxViewControllerViewModel()
157-
158144
let fetcher = MockInAppFetcher()
159-
160-
IterableAPI.initializeForTesting(
161-
inAppFetcher: fetcher
162-
)
145+
let internalAPI = IterableAPIInternal.initializeForTesting(inAppFetcher: fetcher)
146+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
163147

164148
let date1 = Date()
165149
let date2 = date1.addingTimeInterval(5.0)
@@ -181,7 +165,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
181165
inboxMetadata: nil,
182166
customPayload: nil),
183167
]
184-
fetcher.mockMessagesAvailableFromServer(messages: messages)
168+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
185169

186170
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
187171
model.beganUpdates()
@@ -197,14 +181,10 @@ class InboxViewControllerViewModelTests: XCTestCase {
197181
func testCustomFiltering() {
198182
let expectation1 = expectation(description: "testCustomFiltering")
199183

200-
let model = InboxViewControllerViewModel()
201-
model.filter = { $0.messageId == "message1" }
202-
203184
let fetcher = MockInAppFetcher()
204-
205-
IterableAPI.initializeForTesting(
206-
inAppFetcher: fetcher
207-
)
185+
let internalAPI = IterableAPIInternal.initializeForTesting(inAppFetcher: fetcher)
186+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
187+
model.filter = { $0.messageId == "message1" }
208188

209189
let date1 = Date()
210190
let date2 = date1.addingTimeInterval(5.0)
@@ -226,7 +206,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
226206
inboxMetadata: nil,
227207
customPayload: nil),
228208
]
229-
fetcher.mockMessagesAvailableFromServer(messages: messages)
209+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
230210

231211
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
232212
model.beganUpdates()
@@ -241,14 +221,10 @@ class InboxViewControllerViewModelTests: XCTestCase {
241221
func testSampleFilter() {
242222
let expectation1 = expectation(description: "testSampleFilter")
243223

244-
let model = InboxViewControllerViewModel()
245-
model.filter = SampleInboxViewDelegateImplementations.Filter.usingCustomPayloadMessageType(in: "promotional")
246-
247224
let fetcher = MockInAppFetcher()
248-
249-
IterableAPI.initializeForTesting(
250-
inAppFetcher: fetcher
251-
)
225+
let internalAPI = IterableAPIInternal.initializeForTesting(inAppFetcher: fetcher)
226+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
227+
model.filter = SampleInboxViewDelegateImplementations.Filter.usingCustomPayloadMessageType(in: "promotional")
252228

253229
let date1 = Date()
254230
let date2 = date1.addingTimeInterval(5.0)
@@ -270,7 +246,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
270246
inboxMetadata: nil,
271247
customPayload: ["messageType": "promotional"]),
272248
]
273-
fetcher.mockMessagesAvailableFromServer(messages: messages)
249+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
274250

275251
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
276252
model.beganUpdates()
@@ -285,7 +261,10 @@ class InboxViewControllerViewModelTests: XCTestCase {
285261
func testImageLoadingForExistingImage() {
286262
let expectation1 = expectation(description: "testImageLoadingForExistingImage")
287263

288-
let model = InboxViewControllerViewModel()
264+
let mockNetworkSession = MockNetworkSession(statusCode: 200, data: Data(repeating: 0, count: 100))
265+
let fetcher = MockInAppFetcher()
266+
let internalAPI = IterableAPIInternal.initializeForTesting(networkSession: mockNetworkSession, inAppFetcher: fetcher)
267+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
289268

290269
let mockView = MockViewModelView()
291270
mockView.onImageLoadedCallback = { indexPath in
@@ -294,13 +273,6 @@ class InboxViewControllerViewModelTests: XCTestCase {
294273
}
295274
model.view = mockView
296275

297-
let mockNetworkSession = MockNetworkSession(statusCode: 200, data: Data(repeating: 0, count: 100))
298-
let fetcher = MockInAppFetcher()
299-
IterableAPI.initializeForTesting(
300-
networkSession: mockNetworkSession,
301-
inAppFetcher: fetcher
302-
)
303-
304276
let imageLocation = Bundle(for: type(of: self)).url(forResource: "image", withExtension: "jpg")!.absoluteString
305277

306278
let messages = [
@@ -312,7 +284,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
312284
inboxMetadata: IterableInboxMetadata(title: "inbox title", subtitle: "inbox subtitle", icon: imageLocation),
313285
customPayload: ["messageType": "transactional"]),
314286
]
315-
fetcher.mockMessagesAvailableFromServer(messages: messages)
287+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
316288

317289
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
318290
model.beganUpdates()
@@ -327,7 +299,10 @@ class InboxViewControllerViewModelTests: XCTestCase {
327299
let expectation1 = expectation(description: "testImageLoadingForNonExistingImage")
328300
expectation1.isInverted = true
329301

330-
let model = InboxViewControllerViewModel()
302+
let mockNetworkSession = MockNetworkSession(statusCode: 404, data: nil)
303+
let fetcher = MockInAppFetcher()
304+
let internalAPI = IterableAPIInternal.initializeForTesting(networkSession: mockNetworkSession, inAppFetcher: fetcher)
305+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
331306

332307
let mockView = MockViewModelView()
333308
mockView.onImageLoadedCallback = { indexPath in
@@ -336,13 +311,6 @@ class InboxViewControllerViewModelTests: XCTestCase {
336311
}
337312
model.view = mockView
338313

339-
let mockNetworkSession = MockNetworkSession(statusCode: 404, data: nil)
340-
let fetcher = MockInAppFetcher()
341-
IterableAPI.initializeForTesting(
342-
networkSession: mockNetworkSession,
343-
inAppFetcher: fetcher
344-
)
345-
346314
let imageLocation = "file:///something.png"
347315

348316
let messages = [
@@ -354,7 +322,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
354322
inboxMetadata: IterableInboxMetadata(title: "inbox title", subtitle: "inbox subtitle", icon: imageLocation),
355323
customPayload: ["messageType": "transactional"]),
356324
]
357-
fetcher.mockMessagesAvailableFromServer(messages: messages)
325+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
358326

359327
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
360328
model.beganUpdates()
@@ -368,14 +336,10 @@ class InboxViewControllerViewModelTests: XCTestCase {
368336
func testSampleSectionMapper() {
369337
let expectation1 = expectation(description: "testSampleSectionMapper")
370338

371-
let model = InboxViewControllerViewModel()
372-
model.sectionMapper = SampleInboxViewDelegateImplementations.SectionMapper.usingCustomPayloadMessageSection
373-
374339
let fetcher = MockInAppFetcher()
375-
376-
IterableAPI.initializeForTesting(
377-
inAppFetcher: fetcher
378-
)
340+
let internalAPI = IterableAPIInternal.initializeForTesting(inAppFetcher: fetcher)
341+
let model = InboxViewControllerViewModel(internalAPIProvider: internalAPI)
342+
model.sectionMapper = SampleInboxViewDelegateImplementations.SectionMapper.usingCustomPayloadMessageSection
379343

380344
let date1 = Date()
381345
let date2 = date1.addingTimeInterval(5.0)
@@ -397,7 +361,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
397361
inboxMetadata: nil,
398362
customPayload: nil),
399363
]
400-
fetcher.mockMessagesAvailableFromServer(messages: messages)
364+
fetcher.mockMessagesAvailableFromServer(internalApi: internalAPI, messages: messages)
401365

402366
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
403367
model.beganUpdates()

0 commit comments

Comments
 (0)