@@ -14,7 +14,9 @@ import org.junit.Test
1414import org.mockito.Mock
1515import org.mockito.Mockito
1616import org.mockito.kotlin.any
17+ import org.mockito.kotlin.anyOrNull
1718import org.mockito.kotlin.doSuspendableAnswer
19+ import org.mockito.kotlin.mock
1820import org.mockito.kotlin.times
1921import org.mockito.kotlin.verify
2022import org.mockito.kotlin.verifyNoInteractions
@@ -35,12 +37,14 @@ import org.wordpress.android.ui.reader.discover.ReaderPostCardActionsHandler
3537import org.wordpress.android.ui.reader.discover.ReaderPostMoreButtonUiStateBuilder
3638import org.wordpress.android.ui.reader.discover.ReaderPostUiStateBuilder
3739import org.wordpress.android.ui.reader.exceptions.ReaderPostFetchException
40+ import org.wordpress.android.ui.reader.repository.ReaderAnnouncementRepository
3841import org.wordpress.android.ui.reader.repository.ReaderPostRepository
3942import org.wordpress.android.ui.reader.repository.usecases.PostLikeUseCase
4043import org.wordpress.android.ui.reader.tracker.ReaderTracker
4144import org.wordpress.android.ui.reader.viewmodels.tagsfeed.ReaderTagsFeedUiStateMapper
4245import org.wordpress.android.ui.reader.viewmodels.tagsfeed.ReaderTagsFeedViewModel
4346import org.wordpress.android.ui.reader.viewmodels.tagsfeed.ReaderTagsFeedViewModel.ActionEvent
47+ import org.wordpress.android.ui.reader.views.compose.ReaderAnnouncementCardItemData
4448import org.wordpress.android.ui.reader.views.compose.tagsfeed.TagsFeedPostItem
4549import org.wordpress.android.util.DisplayUtilsWrapper
4650import org.wordpress.android.util.NetworkUtilsWrapper
@@ -86,6 +90,9 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() {
8690 @Mock
8791 lateinit var networkUtilsWrapper: NetworkUtilsWrapper
8892
93+ @Mock
94+ lateinit var readerAnnouncementRepository: ReaderAnnouncementRepository
95+
8996 private lateinit var viewModel: ReaderTagsFeedViewModel
9097
9198 private val collectedUiStates: MutableList <ReaderTagsFeedViewModel .UiState > = mutableListOf ()
@@ -116,6 +123,7 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() {
116123 displayUtilsWrapper = displayUtilsWrapper,
117124 readerTracker = readerTracker,
118125 networkUtilsWrapper = networkUtilsWrapper,
126+ readerAnnouncementRepository = readerAnnouncementRepository,
119127 )
120128 whenever(readerPostCardActionsHandler.navigationEvents)
121129 .thenReturn(navigationEvents)
@@ -126,6 +134,69 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() {
126134 observeErrorMessageEvents()
127135 }
128136
137+ @Test
138+ fun `when tags changed, then UI state should update properly` () = testCollectingUiStates {
139+ // Given
140+ val tag = ReaderTestUtils .createTag(" tag" )
141+ mockMapInitialTagFeedItems()
142+
143+ // When
144+ viewModel.onTagsChanged(listOf (tag))
145+ advanceUntilIdle()
146+
147+ // Then
148+ assertThat(collectedUiStates).contains(
149+ ReaderTagsFeedViewModel .UiState .Loaded (
150+ data = listOf (getInitialTagFeedItem(tag)),
151+ )
152+ )
153+ }
154+
155+ @Test
156+ fun `given has announcement, when tags changed, then UI state should update properly` () = testCollectingUiStates {
157+ // Given
158+ val tag = ReaderTestUtils .createTag(" tag" )
159+ val announcementItems = listOf<ReaderAnnouncementCardItemData >(mock(), mock())
160+ mockMapInitialTagFeedItems()
161+ whenever(readerAnnouncementRepository.hasReaderAnnouncement()).thenReturn(true )
162+ whenever(readerAnnouncementRepository.getReaderAnnouncementItems()).thenReturn(announcementItems)
163+
164+ // When
165+ viewModel.onTagsChanged(listOf (tag))
166+ advanceUntilIdle()
167+
168+ // Then
169+ val loadedState = collectedUiStates.last() as ReaderTagsFeedViewModel .UiState .Loaded
170+ assertThat(loadedState.data).isEqualTo(listOf (getInitialTagFeedItem(tag)))
171+ assertThat(loadedState.announcementItem!! .items).isEqualTo(announcementItems)
172+ }
173+
174+ @Test
175+ fun `given has announcement, when done clicked, then UI state should update properly` () = testCollectingUiStates {
176+ // Given
177+ val tag = ReaderTestUtils .createTag(" tag" )
178+ val announcementItems = listOf<ReaderAnnouncementCardItemData >(mock(), mock())
179+ mockMapInitialTagFeedItems()
180+ whenever(readerAnnouncementRepository.hasReaderAnnouncement()).thenReturn(true )
181+ whenever(readerAnnouncementRepository.getReaderAnnouncementItems()).thenReturn(announcementItems)
182+
183+ viewModel.onTagsChanged(listOf (tag))
184+ advanceUntilIdle()
185+
186+ // When
187+ val loadedState = collectedUiStates.last() as ReaderTagsFeedViewModel .UiState .Loaded
188+ loadedState.announcementItem!! .onDoneClicked()
189+ advanceUntilIdle()
190+
191+ // Then
192+ verify(readerAnnouncementRepository).dismissReaderAnnouncement()
193+ assertThat(collectedUiStates.last()).isEqualTo(
194+ ReaderTagsFeedViewModel .UiState .Loaded (
195+ data = listOf (getInitialTagFeedItem(tag)),
196+ )
197+ )
198+ }
199+
129200 @Test
130201 fun `given valid tag, when loaded, then UI state should update properly` () = testCollectingUiStates {
131202 // Given
@@ -899,13 +970,18 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() {
899970 }
900971
901972 private fun mockMapInitialTagFeedItems () {
902- whenever(readerTagsFeedUiStateMapper.mapInitialPostsUiState(any(), any(), any(), any(), any(), any()))
903- .thenAnswer {
904- val tags = it.getArgument<List <ReaderTag >>(0 )
905- ReaderTagsFeedViewModel .UiState .Loaded (
906- tags.map { tag -> getInitialTagFeedItem(tag) }
907- )
908- }
973+ whenever(
974+ readerTagsFeedUiStateMapper.mapInitialPostsUiState(
975+ any(), anyOrNull(), any(), any(), any(), any(), any()
976+ )
977+ ).thenAnswer {
978+ val tags = it.getArgument<List <ReaderTag >>(0 )
979+ val announcementItem = it.getArgument<ReaderTagsFeedViewModel .ReaderAnnouncementItem ?>(1 )
980+ ReaderTagsFeedViewModel .UiState .Loaded (
981+ data = tags.map { tag -> getInitialTagFeedItem(tag) },
982+ announcementItem = announcementItem,
983+ )
984+ }
909985 }
910986
911987 private fun mockMapLoadingTagFeedItems () {
0 commit comments