From e1b29f38067d9e4de83b11a12ddd44b6263b3e33 Mon Sep 17 00:00:00 2001 From: Kirill Kamakin Date: Tue, 29 Nov 2022 20:42:56 +0100 Subject: [PATCH] Add ShareRecipeViewModel tests --- .../kirmanak/mealient/ui/OperationUiState.kt | 24 ++++++- .../ui/share/ShareRecipeViewModelTest.kt | 70 +++++++++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 app/src/test/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModelTest.kt diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/OperationUiState.kt b/app/src/main/java/gq/kirmanak/mealient/ui/OperationUiState.kt index 042f699..5decff9 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/OperationUiState.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/OperationUiState.kt @@ -27,9 +27,29 @@ sealed class OperationUiState { progressBar.isVisible = isProgress } - class Initial : OperationUiState() + class Initial : OperationUiState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + return true + } - class Progress : OperationUiState() + override fun hashCode(): Int { + return javaClass.hashCode() + } + } + + class Progress : OperationUiState() { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + return true + } + + override fun hashCode(): Int { + return javaClass.hashCode() + } + } data class Failure(val exception: Throwable) : OperationUiState() diff --git a/app/src/test/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModelTest.kt b/app/src/test/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModelTest.kt new file mode 100644 index 0000000..4046062 --- /dev/null +++ b/app/src/test/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModelTest.kt @@ -0,0 +1,70 @@ +package gq.kirmanak.mealient.ui.share + +import androidx.lifecycle.asFlow +import com.google.common.truth.Truth.assertThat +import gq.kirmanak.mealient.data.share.ShareRecipeRepo +import gq.kirmanak.mealient.test.BaseUnitTest +import gq.kirmanak.mealient.ui.OperationUiState +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.async +import kotlinx.coroutines.flow.take +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.Timeout + +@OptIn(ExperimentalCoroutinesApi::class) +class ShareRecipeViewModelTest : BaseUnitTest() { + + @MockK(relaxUnitFun = true) + lateinit var shareRecipeRepo: ShareRecipeRepo + + lateinit var subject: ShareRecipeViewModel + + @get:Rule + val timeoutRule: Timeout = Timeout.seconds(5) + + @Before + override fun setUp() { + super.setUp() + subject = ShareRecipeViewModel( + shareRecipeRepo = shareRecipeRepo, + logger = logger, + ) + } + + @Test + fun `when repo throws expect saveRecipeByURL to update saveResult`() { + coEvery { shareRecipeRepo.saveRecipeByURL(any()) } throws RuntimeException() + subject.saveRecipeByURL("") + assertThat(subject.saveResult.value).isInstanceOf(OperationUiState.Failure::class.java) + } + + @Test + fun `when repo returns result expect saveResult to show progress before result`() = runTest { + val deferredActual = async(Dispatchers.Default) { + subject.saveResult.asFlow().take(3).toList(mutableListOf()) + } + coEvery { shareRecipeRepo.saveRecipeByURL(any()) } returns "result" + subject.saveRecipeByURL("") + val actual = deferredActual.await() + assertThat(actual).containsExactly( + OperationUiState.Initial(), + OperationUiState.Progress(), + OperationUiState.Success("result"), + ).inOrder() + } + + @Test + fun `when url is given expect saveRecipeByURL to pass it to repo`() = runTest { + coEvery { shareRecipeRepo.saveRecipeByURL(any()) } returns "result" + subject.saveRecipeByURL("https://www.allrecipes.com/recipe/215447/dads-leftover-turkey-pot-pie/") + coVerify { shareRecipeRepo.saveRecipeByURL(eq("https://www.allrecipes.com/recipe/215447/dads-leftover-turkey-pot-pie/")) } + } +} \ No newline at end of file