@@ -28,12 +28,14 @@ import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
28
28
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
29
29
import io.element.android.libraries.mediaviewer.api.MediaViewerEntryPoint
30
30
import io.element.android.libraries.mediaviewer.api.anApkMediaInfo
31
+ import io.element.android.libraries.mediaviewer.impl.R
31
32
import io.element.android.libraries.mediaviewer.impl.details.MediaBottomSheetState
32
33
import io.element.android.libraries.mediaviewer.impl.gallery.FakeMediaGalleryDataSource
33
34
import io.element.android.libraries.mediaviewer.impl.gallery.GroupedMediaItems
34
35
import io.element.android.libraries.mediaviewer.impl.gallery.MediaGalleryDataSource
35
36
import io.element.android.libraries.mediaviewer.impl.gallery.MediaGalleryMode
36
37
import io.element.android.libraries.mediaviewer.impl.gallery.ui.aMediaItemImage
38
+ import io.element.android.libraries.mediaviewer.impl.gallery.ui.aMediaItemLoadingIndicator
37
39
import io.element.android.libraries.mediaviewer.test.FakeLocalMediaActions
38
40
import io.element.android.libraries.mediaviewer.test.FakeLocalMediaFactory
39
41
import io.element.android.services.toolbox.test.systemclock.FakeSystemClock
@@ -54,6 +56,7 @@ private val TESTED_MEDIA_INFO = anApkMediaInfo(
54
56
senderId = A_USER_ID ,
55
57
)
56
58
59
+ @Suppress(" LargeClass" )
57
60
class MediaViewerPresenterTest {
58
61
@get:Rule
59
62
val warmUpRule = WarmUpRule ()
@@ -62,6 +65,16 @@ class MediaViewerPresenterTest {
62
65
private val localMediaFactory = FakeLocalMediaFactory (mockMediaUri)
63
66
private val aUrl = " aUrl"
64
67
68
+ private val anImage = aMediaItemImage(
69
+ mediaSourceUrl = aUrl,
70
+ )
71
+ private val aBackwardLoadingIndicator = aMediaItemLoadingIndicator(
72
+ direction = Timeline .PaginationDirection .BACKWARDS
73
+ )
74
+ private val aForwardLoadingIndicator = aMediaItemLoadingIndicator(
75
+ direction = Timeline .PaginationDirection .FORWARDS
76
+ )
77
+
65
78
@Test
66
79
fun `present - initial state null Event` () = runTest {
67
80
val presenter = createMediaViewerPresenter(
@@ -504,6 +517,187 @@ class MediaViewerPresenterTest {
504
517
}
505
518
}
506
519
520
+ @Test
521
+ fun `present - snackbar displayed when there is no more items forward images and videos` () {
522
+ `present - snackbar displayed when there is no more items forward`(
523
+ mode = MediaViewerEntryPoint .MediaViewerMode .TimelineImagesAndVideos ,
524
+ expectedSnackbarResId = R .string.screen_media_details_no_more_media_to_show,
525
+ )
526
+ }
527
+
528
+ @Test
529
+ fun `present - snackbar displayed when there is no more items forward files and audio` () {
530
+ `present - snackbar displayed when there is no more items forward`(
531
+ mode = MediaViewerEntryPoint .MediaViewerMode .TimelineFilesAndAudios ,
532
+ expectedSnackbarResId = R .string.screen_media_details_no_more_files_to_show,
533
+ )
534
+ }
535
+
536
+ private fun `present - snackbar displayed when there is no more items forward` (
537
+ mode : MediaViewerEntryPoint .MediaViewerMode ,
538
+ expectedSnackbarResId : Int ,
539
+ ) = runTest {
540
+ val mediaGalleryDataSource = FakeMediaGalleryDataSource (
541
+ startLambda = { },
542
+ )
543
+ val presenter = createMediaViewerPresenter(
544
+ mode = mode,
545
+ mediaGalleryDataSource = mediaGalleryDataSource,
546
+ )
547
+ presenter.test {
548
+ awaitFirstItem()
549
+ mediaGalleryDataSource.emitGroupedMediaItems(
550
+ AsyncData .Success (
551
+ if (mode == MediaViewerEntryPoint .MediaViewerMode .TimelineFilesAndAudios ) {
552
+ GroupedMediaItems (
553
+ imageAndVideoItems = persistentListOf(),
554
+ fileItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
555
+ )
556
+ } else {
557
+ GroupedMediaItems (
558
+ imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
559
+ fileItems = persistentListOf(),
560
+ )
561
+ }
562
+ )
563
+ )
564
+ val updatedState = awaitItem()
565
+ // User navigate to the first item (forward loading indicator)
566
+ updatedState.eventSink(
567
+ MediaViewerEvents .OnNavigateTo (0 )
568
+ )
569
+ // data source claims that there is no more items to load forward
570
+ mediaGalleryDataSource.emitGroupedMediaItems(
571
+ AsyncData .Success (
572
+ if (mode == MediaViewerEntryPoint .MediaViewerMode .TimelineFilesAndAudios ) {
573
+ GroupedMediaItems (
574
+ imageAndVideoItems = persistentListOf(),
575
+ fileItems = persistentListOf(anImage, aBackwardLoadingIndicator),
576
+ )
577
+ } else {
578
+ GroupedMediaItems (
579
+ imageAndVideoItems = persistentListOf(anImage, aBackwardLoadingIndicator),
580
+ fileItems = persistentListOf(),
581
+ )
582
+ }
583
+ )
584
+ )
585
+ skipItems(1 )
586
+ val stateWithSnackbar = awaitItem()
587
+ assertThat(stateWithSnackbar.snackbarMessage!! .messageResId).isEqualTo(expectedSnackbarResId)
588
+ }
589
+ }
590
+
591
+ @Test
592
+ fun `present - snackbar displayed when there is no more items backward images and videos` () {
593
+ `present - snackbar displayed when there is no more items backward`(
594
+ mode = MediaViewerEntryPoint .MediaViewerMode .TimelineImagesAndVideos ,
595
+ expectedSnackbarResId = R .string.screen_media_details_no_more_media_to_show,
596
+ )
597
+ }
598
+
599
+ @Test
600
+ fun `present - snackbar displayed when there is no more items backward files and audio` () {
601
+ `present - snackbar displayed when there is no more items backward`(
602
+ mode = MediaViewerEntryPoint .MediaViewerMode .TimelineFilesAndAudios ,
603
+ expectedSnackbarResId = R .string.screen_media_details_no_more_files_to_show,
604
+ )
605
+ }
606
+
607
+ private fun `present - snackbar displayed when there is no more items backward` (
608
+ mode : MediaViewerEntryPoint .MediaViewerMode ,
609
+ expectedSnackbarResId : Int ,
610
+ ) = runTest {
611
+ val mediaGalleryDataSource = FakeMediaGalleryDataSource (
612
+ startLambda = { },
613
+ )
614
+ val presenter = createMediaViewerPresenter(
615
+ mode = mode,
616
+ mediaGalleryDataSource = mediaGalleryDataSource,
617
+ )
618
+ presenter.test {
619
+ awaitFirstItem()
620
+ mediaGalleryDataSource.emitGroupedMediaItems(
621
+ AsyncData .Success (
622
+ if (mode == MediaViewerEntryPoint .MediaViewerMode .TimelineFilesAndAudios ) {
623
+ GroupedMediaItems (
624
+ imageAndVideoItems = persistentListOf(),
625
+ fileItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
626
+ )
627
+ } else {
628
+ GroupedMediaItems (
629
+ imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
630
+ fileItems = persistentListOf(),
631
+ )
632
+ }
633
+ )
634
+ )
635
+ val updatedState = awaitItem()
636
+ // User navigate to the last item (backward loading indicator)
637
+ updatedState.eventSink(
638
+ MediaViewerEvents .OnNavigateTo (2 )
639
+ )
640
+ skipItems(1 )
641
+ // data source claims that there is no more items to load backward
642
+ mediaGalleryDataSource.emitGroupedMediaItems(
643
+ AsyncData .Success (
644
+ if (mode == MediaViewerEntryPoint .MediaViewerMode .TimelineFilesAndAudios ) {
645
+ GroupedMediaItems (
646
+ imageAndVideoItems = persistentListOf(),
647
+ fileItems = persistentListOf(aForwardLoadingIndicator, anImage),
648
+ )
649
+ } else {
650
+ GroupedMediaItems (
651
+ imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage),
652
+ fileItems = persistentListOf(),
653
+ )
654
+ }
655
+ )
656
+ )
657
+ skipItems(1 )
658
+ val stateWithSnackbar = awaitItem()
659
+ assertThat(stateWithSnackbar.snackbarMessage!! .messageResId).isEqualTo(expectedSnackbarResId)
660
+ }
661
+ }
662
+
663
+ @Test
664
+ fun `present - no snackbar displayed when there is no more items but not displaying a loading item` () = runTest {
665
+ val mediaGalleryDataSource = FakeMediaGalleryDataSource (
666
+ startLambda = { },
667
+ )
668
+ val presenter = createMediaViewerPresenter(
669
+ mediaGalleryDataSource = mediaGalleryDataSource,
670
+ )
671
+ presenter.test {
672
+ awaitFirstItem()
673
+ mediaGalleryDataSource.emitGroupedMediaItems(
674
+ AsyncData .Success (
675
+ GroupedMediaItems (
676
+ imageAndVideoItems = persistentListOf(aForwardLoadingIndicator, anImage, aBackwardLoadingIndicator),
677
+ fileItems = persistentListOf(),
678
+ )
679
+ )
680
+ )
681
+ val updatedState = awaitItem()
682
+ // User navigate to the media
683
+ updatedState.eventSink(
684
+ MediaViewerEvents .OnNavigateTo (1 )
685
+ )
686
+ skipItems(1 )
687
+ // data source claims that there is no more items to load at all
688
+ mediaGalleryDataSource.emitGroupedMediaItems(
689
+ AsyncData .Success (
690
+ GroupedMediaItems (
691
+ imageAndVideoItems = persistentListOf(anImage),
692
+ fileItems = persistentListOf(),
693
+ )
694
+ )
695
+ )
696
+ val finalState = awaitItem()
697
+ assertThat(finalState.snackbarMessage).isNull()
698
+ }
699
+ }
700
+
507
701
@Test
508
702
fun `present - load more` () = runTest {
509
703
val loadMoreLambda = lambdaRecorder<Timeline .PaginationDirection , Unit > { }
@@ -565,6 +759,7 @@ class MediaViewerPresenterTest {
565
759
566
760
private fun TestScope.createMediaViewerPresenter (
567
761
eventId : EventId ? = null,
762
+ mode : MediaViewerEntryPoint .MediaViewerMode = MediaViewerEntryPoint .MediaViewerMode .SingleMedia ,
568
763
matrixMediaLoader : FakeMatrixMediaLoader = FakeMatrixMediaLoader (),
569
764
localMediaActions : FakeLocalMediaActions = FakeLocalMediaActions (),
570
765
mediaGalleryDataSource : MediaGalleryDataSource = FakeMediaGalleryDataSource (
@@ -578,7 +773,7 @@ class MediaViewerPresenterTest {
578
773
): MediaViewerPresenter {
579
774
return MediaViewerPresenter (
580
775
inputs = MediaViewerEntryPoint .Params (
581
- mode = MediaViewerEntryPoint . MediaViewerMode . SingleMedia ,
776
+ mode = mode ,
582
777
eventId = eventId,
583
778
mediaInfo = TESTED_MEDIA_INFO ,
584
779
mediaSource = aMediaSource(),
@@ -587,7 +782,11 @@ class MediaViewerPresenterTest {
587
782
),
588
783
navigator = mediaViewerNavigator,
589
784
dataSource = MediaViewerDataSource (
590
- galleryMode = MediaGalleryMode .Images ,
785
+ galleryMode = when (mode) {
786
+ MediaViewerEntryPoint .MediaViewerMode .SingleMedia -> MediaGalleryMode .Images
787
+ MediaViewerEntryPoint .MediaViewerMode .TimelineImagesAndVideos -> MediaGalleryMode .Images
788
+ MediaViewerEntryPoint .MediaViewerMode .TimelineFilesAndAudios -> MediaGalleryMode .Files
789
+ },
591
790
dispatcher = testCoroutineDispatchers().computation,
592
791
galleryDataSource = mediaGalleryDataSource,
593
792
mediaLoader = matrixMediaLoader,
0 commit comments