@@ -264,7 +264,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
264
264
let internalAPI = InternalIterableAPI . initializeForTesting ( networkSession: mockNetworkSession, inAppFetcher: fetcher)
265
265
let model = InboxViewControllerViewModel ( internalAPIProvider: internalAPI)
266
266
267
- let mockView = MockViewModelView ( )
267
+ let mockView = MockViewModelView ( model : model )
268
268
mockView. onImageLoadedCallback = { indexPath in
269
269
XCTAssertNotNil ( model. message ( atIndexPath: indexPath) . imageData)
270
270
expectation1. fulfill ( )
@@ -302,7 +302,7 @@ class InboxViewControllerViewModelTests: XCTestCase {
302
302
let internalAPI = InternalIterableAPI . initializeForTesting ( networkSession: mockNetworkSession, inAppFetcher: fetcher)
303
303
let model = InboxViewControllerViewModel ( internalAPIProvider: internalAPI)
304
304
305
- let mockView = MockViewModelView ( )
305
+ let mockView = MockViewModelView ( model : model )
306
306
mockView. onImageLoadedCallback = { indexPath in
307
307
XCTAssertNotNil ( model. message ( atIndexPath: indexPath) . imageData)
308
308
expectation1. fulfill ( )
@@ -373,15 +373,91 @@ class InboxViewControllerViewModelTests: XCTestCase {
373
373
wait ( for: [ expectation1] , timeout: testExpectationTimeout)
374
374
}
375
375
376
+ func testRowDiff( ) {
377
+ let expectation1 = expectation ( description: " add one section and two rows " )
378
+ let expectation2 = expectation ( description: " update first row " )
379
+
380
+ let firstMessageDate = Date ( )
381
+ let secondMessageDate = firstMessageDate. addingTimeInterval ( - 5.0 )
382
+ let fetcher = MockInAppFetcher ( )
383
+ let internalAPI = InternalIterableAPI . initializeForTesting ( inAppFetcher: fetcher)
384
+ let model = InboxViewControllerViewModel ( internalAPIProvider: internalAPI)
385
+ let mockView = MockViewModelView ( model: model)
386
+ mockView. onViewModelChangedCallback = { diffs in
387
+ if diffs. count == 3 {
388
+ expectation1. fulfill ( )
389
+ let messages = [
390
+ IterableInAppMessage ( messageId: " message1 " ,
391
+ campaignId: 1 ,
392
+ trigger: IterableInAppTrigger ( dict: [ JsonKey . InApp. type: " never " ] ) ,
393
+ createdAt: firstMessageDate,
394
+ content: IterableHtmlInAppContent ( edgeInsets: . zero, html: " " ) ,
395
+ saveToInbox: true ,
396
+ inboxMetadata: nil ,
397
+ customPayload: [ " messageSection " : 1 ] ,
398
+ read: true ) ,
399
+ IterableInAppMessage ( messageId: " message2 " ,
400
+ campaignId: 1 ,
401
+ trigger: IterableInAppTrigger ( dict: [ JsonKey . InApp. type: " never " ] ) ,
402
+ createdAt: secondMessageDate,
403
+ content: IterableHtmlInAppContent ( edgeInsets: . zero, html: " " ) ,
404
+ saveToInbox: true ,
405
+ inboxMetadata: nil ,
406
+ customPayload: nil ) ,
407
+ ]
408
+ fetcher. mockMessagesAvailableFromServer ( internalApi: internalAPI, messages: messages)
409
+ } else {
410
+ if diffs. count == 1 {
411
+ if case RowDiff . update( let indexPath) = diffs [ 0 ] {
412
+ XCTAssertEqual ( indexPath, IndexPath ( row: 0 , section: 0 ) )
413
+ expectation2. fulfill ( )
414
+ }
415
+ }
416
+ }
417
+ }
418
+ model. view = mockView
419
+
420
+ let messages = [
421
+ IterableInAppMessage ( messageId: " message1 " ,
422
+ campaignId: 1 ,
423
+ trigger: IterableInAppTrigger ( dict: [ JsonKey . InApp. type: " never " ] ) ,
424
+ createdAt: firstMessageDate,
425
+ content: IterableHtmlInAppContent ( edgeInsets: . zero, html: " " ) ,
426
+ saveToInbox: true ,
427
+ inboxMetadata: nil ,
428
+ customPayload: [ " messageSection " : 1 ] ) ,
429
+ IterableInAppMessage ( messageId: " message2 " ,
430
+ campaignId: 1 ,
431
+ trigger: IterableInAppTrigger ( dict: [ JsonKey . InApp. type: " never " ] ) ,
432
+ createdAt: secondMessageDate,
433
+ content: IterableHtmlInAppContent ( edgeInsets: . zero, html: " " ) ,
434
+ saveToInbox: true ,
435
+ inboxMetadata: nil ,
436
+ customPayload: nil ) ,
437
+ ]
438
+ fetcher. mockMessagesAvailableFromServer ( internalApi: internalAPI, messages: messages)
439
+
440
+ wait ( for: [ expectation1, expectation2] , timeout: testExpectationTimeout, enforceOrder: true )
441
+ }
442
+
376
443
private class MockViewModelView : InboxViewControllerViewModelView {
377
- let currentlyVisibleRowIndexPaths : [ IndexPath ] = [ ]
444
+ init ( model: InboxViewControllerViewModel ) {
445
+ self . model = model
446
+ }
378
447
448
+ let currentlyVisibleRowIndexPaths : [ IndexPath ] = [ ]
379
449
var onImageLoadedCallback : ( ( IndexPath ) -> Void ) ?
450
+ var onViewModelChangedCallback : ( ( [ RowDiff ] ) -> Void ) ?
380
451
381
- func onViewModelChanged( diff _: [ SectionedDiffStep < Int , InboxMessageViewModel > ] ) { }
452
+ func onViewModelChanged( diffs: [ RowDiff ] ) {
453
+ model. beganUpdates ( )
454
+ onViewModelChangedCallback ? ( diffs)
455
+ }
382
456
383
457
func onImageLoaded( for indexPath: IndexPath ) {
384
458
onImageLoadedCallback ? ( indexPath)
385
459
}
460
+
461
+ private let model : InboxViewControllerViewModel
386
462
}
387
463
}
0 commit comments