Skip to content

Commit

Permalink
Do not fire API call when rating and altText unchanged
Browse files Browse the repository at this point in the history
  • Loading branch information
AdamGrzybkowski committed Dec 16, 2024
1 parent e076169 commit 4b50098
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
}
Expand Down

0 comments on commit 4b50098

Please sign in to comment.