diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt index 87d5bfa3d..e737c0a85 100644 --- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModel.kt @@ -84,6 +84,9 @@ internal class AvatarPickerViewModel( private fun updateAvatar(avatarId: String, rating: Avatar.Rating? = null, altText: String? = null) { viewModelScope.launch { val oldAvatar: Avatar? = _uiState.value.emailAvatars?.avatars?.find { it.imageId == avatarId } + if (rating != null && rating != oldAvatar?.rating && altText != null && altText != oldAvatar?.altText) { + return@launch + } val updateType = AvatarUpdateType.RATING _uiState.update { currentState -> val emailAvatars = currentState.emailAvatars?.copy( diff --git a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt index a4838ac90..af5d5e380 100644 --- a/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt +++ b/gravatar-quickeditor/src/test/java/com/gravatar/quickeditor/ui/avatarpicker/AvatarPickerViewModelTest.kt @@ -1163,6 +1163,34 @@ class AvatarPickerViewModelTest { } } + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun `given rating and altText not changed when updateAvatar then avatar not updated`() = runTest { + val avatarId = "avatarId" + val rating = Avatar.Rating.PG + val altText = "New Alt" + val oldAvatar = createAvatar(avatarId, isSelected = true, rating = rating, altText = altText) + val emailAvatarsCopy = emailAvatars.copy(avatars = listOf(oldAvatar), selectedAvatarId = avatarId) + coEvery { avatarRepository.getAvatars(email) } returns GravatarResult.Success(emailAvatarsCopy) + coEvery { profileService.retrieveCatching(email) } returns GravatarResult.Success(profile) + coEvery { + avatarRepository.updateAvatar(email, avatarId, rating) + } returns GravatarResult.Success(oldAvatar) + + viewModel = initViewModel() + + advanceUntilIdle() + + viewModel.uiState.test { + expectMostRecentItem() + viewModel.onEvent(AvatarPickerEvent.AvatarRatingSelected(avatarId, rating)) + expectNoEvents() + } + viewModel.actions.test { + expectNoEvents() + } + } + private fun initViewModel(handleExpiredSession: Boolean = true) = AvatarPickerViewModel( email = email, handleExpiredSession = handleExpiredSession, @@ -1173,11 +1201,16 @@ class AvatarPickerViewModelTest { imageDownloader = imageDownloader, ) - private fun createAvatar(id: String, isSelected: Boolean? = null) = Avatar { + private fun createAvatar( + id: String, + isSelected: Boolean? = null, + rating: Avatar.Rating = Avatar.Rating.G, + altText: String = "alt", + ) = Avatar { imageUrl = URI.create("https://gravatar.com/avatar/test") imageId = id - rating = Avatar.Rating.G - altText = "alt" + this.rating = rating + this.altText = altText updatedDate = "" selected = isSelected }