diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt index 3878434f7075..5dea6134f1a9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt @@ -9,6 +9,7 @@ import androidx.core.view.isVisible import androidx.fragment.app.commitNow import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider +import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.wordpress.android.R import org.wordpress.android.databinding.ReaderTagFeedFragmentLayoutBinding @@ -29,6 +30,7 @@ import org.wordpress.android.ui.reader.viewmodels.tagsfeed.ReaderTagsFeedViewMod import org.wordpress.android.ui.reader.views.compose.tagsfeed.ReaderTagsFeed import org.wordpress.android.util.extensions.getSerializableCompat import org.wordpress.android.viewmodel.observeEvent +import org.wordpress.android.widgets.WPSnackbar import javax.inject.Inject /** @@ -76,6 +78,7 @@ class ReaderTagsFeedFragment : ViewPagerFragment(R.layout.reader_tag_feed_fragme observeSubFilterViewModel(savedInstanceState) observeActionEvents() observeNavigationEvents() + observeErrorMessageEvents() } private fun observeSubFilterViewModel(savedInstanceState: Bundle?) { @@ -248,9 +251,18 @@ class ReaderTagsFeedFragment : ViewPagerFragment(R.layout.reader_tag_feed_fragme } } + private fun observeErrorMessageEvents() { + viewModel.errorMessageEvents.observeEvent(viewLifecycleOwner) { stringRes -> + activity?.findViewById(android.R.id.content)?.let { view -> + WPSnackbar.make(view, getString(stringRes), Snackbar.LENGTH_LONG).show() + } + } + } + private fun showBookmarkSavedLocallyDialog( bookmarkDialog: ReaderNavigationEvents.ShowBookmarkedSavedOnlyLocallyDialog ) { + // TODO show bookmark saved dialog? bookmarkDialog.buttonLabel // if (bookmarksSavedLocallyDialog == null) { // MaterialAlertDialogBuilder(requireActivity()) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapper.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapper.kt index 341584d3e700..8f6cb3f34e2b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapper.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapper.kt @@ -18,7 +18,7 @@ class ReaderTagsFeedUiStateMapper @Inject constructor( onTagClick: (ReaderTag) -> Unit, onSiteClick: (TagsFeedPostItem) -> Unit, onPostCardClick: (TagsFeedPostItem) -> Unit, - onPostLikeClick: () -> Unit, + onPostLikeClick: (TagsFeedPostItem) -> Unit, onPostMoreMenuClick: () -> Unit, ) = ReaderTagsFeedViewModel.TagFeedItem( tagChip = ReaderTagsFeedViewModel.TagChip( @@ -42,6 +42,7 @@ class ReaderTagsFeedUiStateMapper @Inject constructor( numComments = it.numReplies ) else "", isPostLiked = it.isLikedByCurrentUser, + isLikeButtonEnabled = true, postId = it.postId, blogId = it.blogId, onSiteClick = onSiteClick, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt index 0558624aa9d9..cec69fbe913c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedViewModel.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update +import org.wordpress.android.R import org.wordpress.android.datasets.wrappers.ReaderPostTableWrapper import org.wordpress.android.models.ReaderPost import org.wordpress.android.models.ReaderTag @@ -16,6 +17,7 @@ import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents import org.wordpress.android.ui.reader.discover.ReaderPostCardActionsHandler import org.wordpress.android.ui.reader.exceptions.ReaderPostFetchException import org.wordpress.android.ui.reader.repository.ReaderPostRepository +import org.wordpress.android.ui.reader.repository.usecases.PostLikeUseCase import org.wordpress.android.ui.reader.tracker.ReaderTracker import org.wordpress.android.ui.reader.views.compose.tagsfeed.TagsFeedPostItem import org.wordpress.android.viewmodel.Event @@ -30,6 +32,7 @@ class ReaderTagsFeedViewModel @Inject constructor( private val readerPostRepository: ReaderPostRepository, private val readerTagsFeedUiStateMapper: ReaderTagsFeedUiStateMapper, private val readerPostCardActionsHandler: ReaderPostCardActionsHandler, + private val postLikeUseCase: PostLikeUseCase, private val readerPostTableWrapper: ReaderPostTableWrapper, ) : ScopedViewModel(bgDispatcher) { private val _uiStateFlow: MutableStateFlow = MutableStateFlow(UiState.Initial) @@ -41,6 +44,9 @@ class ReaderTagsFeedViewModel @Inject constructor( private val _navigationEvents = MediatorLiveData>() val navigationEvents: LiveData> = _navigationEvents + private val _errorMessageEvents = MediatorLiveData>() + val errorMessageEvents: LiveData> = _errorMessageEvents + private var hasInitialized = false /** @@ -190,8 +196,125 @@ class ReaderTagsFeedViewModel @Inject constructor( } } - private fun onPostLikeClick() { - // TODO + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + fun onPostLikeClick(postItem: TagsFeedPostItem) { + // Immediately update the UI and disable the like button. If the request fails, show error and revert UI state. + // If the request fails or succeeds, the like button is enabled again. + val isPostLikedUpdated = !postItem.isPostLiked + updatePostItemUI( + postItemToUpdate = postItem, + isPostLikedUpdated = isPostLikedUpdated, + isLikeButtonEnabled = false, + ) + + // After updating the like button UI to the intended state and disabling the like button, send a request to the + // like endpoint by using the PostLikeUseCase + likePostRemote(postItem, isPostLikedUpdated) + } + + private fun updatePostItemUI( + postItemToUpdate: TagsFeedPostItem, + isPostLikedUpdated: Boolean, + isLikeButtonEnabled: Boolean, + ) { + val uiState = _uiStateFlow.value as? UiState.Loaded ?: return + // Finds the TagFeedItem associated with the post that should be updated. Return if the item is + // not found. + val tagFeedItemToUpdate = findTagFeedItemToUpdate(uiState, postItemToUpdate) ?: return + + // Finds the index associated with the TagFeedItem to be updated found above. Return if the index is not found. + val tagFeedItemToUpdateIndex = uiState.data.indexOf(tagFeedItemToUpdate) + if (tagFeedItemToUpdateIndex != -1 && tagFeedItemToUpdate.postList is PostList.Loaded) { + // Creates a new post list items collection with the post item updated values + val updatedTagFeedItemPostListItems = getPostListWithUpdatedPostItem( + postList = tagFeedItemToUpdate.postList, + postItemToUpdate = postItemToUpdate, + isPostLikedUpdated = isPostLikedUpdated, + isLikeButtonEnabled = isLikeButtonEnabled, + ) + // Creates a copy of the TagFeedItem with the updated post list items collection + val updatedTagFeedItem = tagFeedItemToUpdate.copy( + postList = tagFeedItemToUpdate.postList.copy( + items = updatedTagFeedItemPostListItems + ) + ) + // Creates a new TagFeedItem collection with the updated TagFeedItem + val updatedUiStateData = mutableListOf().apply { + addAll(uiState.data) + this[tagFeedItemToUpdateIndex] = updatedTagFeedItem + } + // Updates the UI state value with the updated TagFeedItem collection + _uiStateFlow.value = uiState.copy(data = updatedUiStateData) + } + } + + private fun getPostListWithUpdatedPostItem( + postList: PostList.Loaded, + postItemToUpdate: TagsFeedPostItem, + isPostLikedUpdated: Boolean, + isLikeButtonEnabled: Boolean + ) = + postList.items.toMutableList().apply { + val postItemToUpdateIndex = + indexOfFirst { + it.postId == postItemToUpdate.postId && it.blogId == postItemToUpdate.blogId + } + if (postItemToUpdateIndex != -1) { + this[postItemToUpdateIndex] = postItemToUpdate.copy( + isPostLiked = isPostLikedUpdated, + isLikeButtonEnabled = isLikeButtonEnabled, + ) + } + } + + private fun findTagFeedItemToUpdate(uiState: UiState.Loaded, postItemToUpdate: TagsFeedPostItem) = + uiState.data.firstOrNull { tagFeedItem -> + tagFeedItem.postList is PostList.Loaded && tagFeedItem.postList.items.firstOrNull { + it.postId == postItemToUpdate.postId && it.blogId == postItemToUpdate.blogId + } != null + } + + private fun likePostRemote(postItem: TagsFeedPostItem, isPostLikedUpdated: Boolean) { + launch { + findPost(postItem.postId, postItem.blogId)?.let { + postLikeUseCase.perform(it, !it.isLikedByCurrentUser, ReaderTracker.SOURCE_TAGS_FEED).collect { + when (it) { + is PostLikeUseCase.PostLikeState.Success -> { + // Re-enable like button without changing the current post item UI. + updatePostItemUI( + postItemToUpdate = postItem, + isPostLikedUpdated = isPostLikedUpdated, + isLikeButtonEnabled = true, + ) + } + + is PostLikeUseCase.PostLikeState.Failed.NoNetwork -> { + // Revert post item like button UI to the previous state and re-enable like button. + updatePostItemUI( + postItemToUpdate = postItem, + isPostLikedUpdated = !isPostLikedUpdated, + isLikeButtonEnabled = true, + ) + _errorMessageEvents.postValue(Event(R.string.no_network_message)) + } + + is PostLikeUseCase.PostLikeState.Failed.RequestFailed -> { + // Revert post item like button UI to the previous state and re-enable like button. + updatePostItemUI( + postItemToUpdate = postItem, + isPostLikedUpdated = !isPostLikedUpdated, + isLikeButtonEnabled = true, + ) + _errorMessageEvents.postValue(Event(R.string.reader_error_request_failed_title)) + } + + else -> { + // no-op + } + } + } + } + } } private fun onPostMoreMenuClick() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeed.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeed.kt index eba913b2840e..0b84fb09ed4c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeed.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeed.kt @@ -412,11 +412,12 @@ data class TagsFeedPostItem( val postNumberOfLikesText: String, val postNumberOfCommentsText: String, val isPostLiked: Boolean, + val isLikeButtonEnabled: Boolean, val postId: Long, val blogId: Long, val onSiteClick: (TagsFeedPostItem) -> Unit, val onPostCardClick: (TagsFeedPostItem) -> Unit, - val onPostLikeClick: () -> Unit, + val onPostLikeClick: (TagsFeedPostItem) -> Unit, val onPostMoreMenuClick: () -> Unit, ) @@ -436,6 +437,7 @@ fun ReaderTagsFeedLoaded() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "", isPostLiked = true, + isLikeButtonEnabled = true, postId = 123L, blogId = 123L, onSiteClick = {}, @@ -452,6 +454,7 @@ fun ReaderTagsFeedLoaded() { postNumberOfLikesText = "", postNumberOfCommentsText = "3 comments", isPostLiked = true, + isLikeButtonEnabled = true, postId = 456L, blogId = 456L, onSiteClick = {}, @@ -468,6 +471,7 @@ fun ReaderTagsFeedLoaded() { postNumberOfLikesText = "123 likes", postNumberOfCommentsText = "9 comments", isPostLiked = true, + isLikeButtonEnabled = true, postId = 789L, blogId = 789L, onSiteClick = {}, @@ -484,6 +488,7 @@ fun ReaderTagsFeedLoaded() { postNumberOfLikesText = "1234 likes", postNumberOfCommentsText = "91 comments", isPostLiked = true, + isLikeButtonEnabled = true, postId = 1234L, blogId = 1234L, onSiteClick = {}, @@ -500,6 +505,7 @@ fun ReaderTagsFeedLoaded() { postNumberOfLikesText = "12 likes", postNumberOfCommentsText = "34 comments", isPostLiked = true, + isLikeButtonEnabled = true, postId = 5678L, blogId = 5678L, onSiteClick = {}, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeedPostListItem.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeedPostListItem.kt index 31976415310b..8457cf8083e9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeedPostListItem.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/compose/tagsfeed/ReaderTagsFeedPostListItem.kt @@ -182,7 +182,8 @@ fun ReaderTagsFeedPostListItem( TextButton( modifier = Modifier.defaultMinSize(minWidth = 1.dp), contentPadding = PaddingValues(0.dp), - onClick = { onPostLikeClick() }, + onClick = { onPostLikeClick(item) }, + enabled = isLikeButtonEnabled, ) { Icon( modifier = Modifier.size(24.dp), @@ -200,11 +201,19 @@ fun ReaderTagsFeedPostListItem( R.string.reader_label_like } ), - tint = secondaryElementColor, + tint = if (isPostLiked) { + androidx.compose.material.MaterialTheme.colors.primary + } else { + secondaryElementColor + }, ) Text( text = stringResource(R.string.reader_label_like), - color = secondaryElementColor, + color = if (isPostLiked) { + androidx.compose.material.MaterialTheme.colors.primary + } else { + secondaryElementColor + }, ) } Spacer(Modifier.weight(1f)) @@ -288,6 +297,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, @@ -322,6 +332,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, @@ -342,6 +353,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, @@ -362,6 +374,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, @@ -383,6 +396,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, @@ -404,6 +418,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, @@ -437,6 +452,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, @@ -469,6 +485,7 @@ fun ReaderTagsFeedPostListItemPreview() { postNumberOfLikesText = "15 likes", postNumberOfCommentsText = "4 comments", isPostLiked = true, + isLikeButtonEnabled = true, blogId = 123L, postId = 123L, onSiteClick = {}, diff --git a/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderTagsFeedViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderTagsFeedViewModelTest.kt index b9bda3144e48..f81950465a4e 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderTagsFeedViewModelTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderTagsFeedViewModelTest.kt @@ -3,6 +3,7 @@ package org.wordpress.android.ui.reader.viewmodels import androidx.lifecycle.MediatorLiveData import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList import kotlinx.coroutines.launch import kotlinx.coroutines.test.TestScope @@ -14,6 +15,7 @@ import org.mockito.Mock import org.mockito.Mockito import org.mockito.kotlin.any import org.mockito.kotlin.doSuspendableAnswer +import org.mockito.kotlin.verify import org.mockito.kotlin.verifyNoInteractions import org.mockito.kotlin.whenever import org.wordpress.android.BaseUnitTest @@ -22,11 +24,12 @@ import org.wordpress.android.models.ReaderPost import org.wordpress.android.models.ReaderPostList import org.wordpress.android.models.ReaderTag import org.wordpress.android.models.ReaderTagType +import org.wordpress.android.ui.reader.ReaderTestUtils import org.wordpress.android.ui.reader.discover.ReaderNavigationEvents import org.wordpress.android.ui.reader.discover.ReaderPostCardActionsHandler -import org.wordpress.android.ui.reader.ReaderTestUtils import org.wordpress.android.ui.reader.exceptions.ReaderPostFetchException import org.wordpress.android.ui.reader.repository.ReaderPostRepository +import org.wordpress.android.ui.reader.repository.usecases.PostLikeUseCase import org.wordpress.android.ui.reader.viewmodels.tagsfeed.ReaderTagsFeedUiStateMapper import org.wordpress.android.ui.reader.viewmodels.tagsfeed.ReaderTagsFeedViewModel import org.wordpress.android.ui.reader.viewmodels.tagsfeed.ReaderTagsFeedViewModel.ActionEvent @@ -48,6 +51,9 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() { @Mock lateinit var readerPostTableWrapper: ReaderPostTableWrapper + @Mock + lateinit var postLikeUseCase: PostLikeUseCase + @Mock lateinit var navigationEvents: MediatorLiveData> @@ -74,6 +80,7 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() { readerTagsFeedUiStateMapper = readerTagsFeedUiStateMapper, readerPostCardActionsHandler = readerPostCardActionsHandler, readerPostTableWrapper = readerPostTableWrapper, + postLikeUseCase = postLikeUseCase, ) whenever(readerPostCardActionsHandler.navigationEvents) .thenReturn(navigationEvents) @@ -223,7 +230,21 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() { // When viewModel.onSiteClick(TagsFeedPostItem( - "", "", "", "", "", "", "", true, 123L, 123L, {}, {}, {}, {} + siteName = "", + postDateLine = "", + postTitle = "", + postExcerpt = "", + postImageUrl = "", + postNumberOfLikesText = "", + postNumberOfCommentsText = "", + isPostLiked = true, + isLikeButtonEnabled = true, + postId = 123L, + blogId = 123L, + onSiteClick = {}, + onPostCardClick = {}, + onPostLikeClick = {}, + onPostMoreMenuClick = {} )) // Then @@ -281,6 +302,90 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() { assertThat(collectedUiStates).last().isInstanceOf(ReaderTagsFeedViewModel.UiState.Empty::class.java) } + @Test + fun `Should update UI immediately when like button is tapped`() = testCollectingUiStates { + // Given + val tagsFeedPostItem = TagsFeedPostItem( + siteName = "", + postDateLine = "", + postTitle = "", + postExcerpt = "", + postImageUrl = "", + postNumberOfLikesText = "", + postNumberOfCommentsText = "", + isPostLiked = false, + isLikeButtonEnabled = true, + postId = 123L, + blogId = 123L, + onSiteClick = {}, + onPostCardClick = {}, + onPostLikeClick = {}, + onPostMoreMenuClick = {} + ) + mockMapLoadingTagFeedItems() + mockMapLoadedTagFeedItems(items = listOf(tagsFeedPostItem)) + val posts = ReaderPostList().apply { + add(ReaderPost()) + } + whenever(readerPostRepository.fetchNewerPostsForTag(tag)).doSuspendableAnswer { + delay(100) + posts + } + + // When + viewModel.start(listOf(tag)) + advanceUntilIdle() + viewModel.onPostLikeClick(tagsFeedPostItem) + + // Then + val latestUiState = collectedUiStates.last() as ReaderTagsFeedViewModel.UiState.Loaded + val latestUiStatePostList = (latestUiState.data.first().postList as ReaderTagsFeedViewModel.PostList.Loaded) + assertThat(latestUiStatePostList.items.first().isPostLiked).isEqualTo(!tagsFeedPostItem.isPostLiked) + } + + @Test + fun `Should send update like status request when like button is tapped`() = testCollectingUiStates { + // Given + val tagsFeedPostItem = TagsFeedPostItem( + siteName = "", + postDateLine = "", + postTitle = "", + postExcerpt = "", + postImageUrl = "", + postNumberOfLikesText = "", + postNumberOfCommentsText = "", + isPostLiked = false, + isLikeButtonEnabled = true, + postId = 123L, + blogId = 123L, + onSiteClick = {}, + onPostCardClick = {}, + onPostLikeClick = {}, + onPostMoreMenuClick = {} + ) + mockMapLoadingTagFeedItems() + mockMapLoadedTagFeedItems(items = listOf(tagsFeedPostItem)) + val posts = ReaderPostList().apply { + add(ReaderPost()) + } + whenever(readerPostRepository.fetchNewerPostsForTag(tag)).doSuspendableAnswer { + delay(100) + posts + } + whenever(readerPostTableWrapper.getBlogPost(any(), any(), any())) + .thenReturn(ReaderPost()) + whenever(postLikeUseCase.perform(any(), any(), any())) + .thenReturn(flowOf()) + + // When + viewModel.start(listOf(tag)) + advanceUntilIdle() + viewModel.onPostLikeClick(tagsFeedPostItem) + + // Then + verify(postLikeUseCase).perform(any(), any(), any()) + } + private fun mockMapLoadingTagFeedItems() { whenever(readerTagsFeedUiStateMapper.mapLoadingPostsUiState(any(), any())) .thenAnswer { @@ -299,10 +404,10 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() { } } - private fun mockMapLoadedTagFeedItems() { + private fun mockMapLoadedTagFeedItems(items: List = emptyList()) { whenever(readerTagsFeedUiStateMapper.mapLoadedTagFeedItem(any(), any(), any(), any(), any(), any(), any())) .thenAnswer { - getLoadedTagFeedItem(it.getArgument(0)) + getLoadedTagFeedItem(it.getArgument(0), items) } } @@ -313,10 +418,11 @@ class ReaderTagsFeedViewModelTest : BaseUnitTest() { } } - private fun getLoadedTagFeedItem(tag: ReaderTag) = ReaderTagsFeedViewModel.TagFeedItem( - ReaderTagsFeedViewModel.TagChip(tag, {}), - ReaderTagsFeedViewModel.PostList.Loaded(listOf()) - ) + private fun getLoadedTagFeedItem(tag: ReaderTag, items: List = emptyList()) = + ReaderTagsFeedViewModel.TagFeedItem( + ReaderTagsFeedViewModel.TagChip(tag, {}), + ReaderTagsFeedViewModel.PostList.Loaded(items) + ) private fun getErrorTagFeedItem(tag: ReaderTag) = ReaderTagsFeedViewModel.TagFeedItem( ReaderTagsFeedViewModel.TagChip(tag, {}), diff --git a/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapperTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapperTest.kt index 737cd43ffe37..dd58f3f52b9a 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapperTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/reader/viewmodels/tagsfeed/ReaderTagsFeedUiStateMapperTest.kt @@ -54,7 +54,7 @@ class ReaderTagsFeedUiStateMapperTest : BaseUnitTest() { val onTagClick = { _: ReaderTag -> } val onSiteClick: (TagsFeedPostItem) -> Unit = {} val onPostCardClick: (TagsFeedPostItem) -> Unit = {} - val onPostLikeClick = {} + val onPostLikeClick: (TagsFeedPostItem) -> Unit = {} val onPostMoreMenuClick = {} val dateLine = "dateLine" @@ -97,6 +97,7 @@ class ReaderTagsFeedUiStateMapperTest : BaseUnitTest() { postNumberOfLikesText = numberLikesText, postNumberOfCommentsText = numberCommentsText, isPostLiked = readerPost.isLikedByCurrentUser, + isLikeButtonEnabled = true, postId = 0L, blogId = 0L, onSiteClick = onSiteClick,