Add tests for some affected components
This commit is contained in:
@@ -5,9 +5,12 @@ import gq.kirmanak.mealient.data.auth.AuthRepo
|
|||||||
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
|
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
|
||||||
import gq.kirmanak.mealient.datasource.v0.MealieDataSourceV0
|
import gq.kirmanak.mealient.datasource.v0.MealieDataSourceV0
|
||||||
import gq.kirmanak.mealient.datasource.v1.MealieDataSourceV1
|
import gq.kirmanak.mealient.datasource.v1.MealieDataSourceV1
|
||||||
|
import gq.kirmanak.mealient.test.AuthImplTestData.FAVORITE_RECIPES_LIST
|
||||||
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_AUTH_HEADER
|
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_AUTH_HEADER
|
||||||
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_SERVER_VERSION_V0
|
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_SERVER_VERSION_V0
|
||||||
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_SERVER_VERSION_V1
|
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_SERVER_VERSION_V1
|
||||||
|
import gq.kirmanak.mealient.test.AuthImplTestData.USER_INFO_V0
|
||||||
|
import gq.kirmanak.mealient.test.AuthImplTestData.USER_INFO_V1
|
||||||
import gq.kirmanak.mealient.test.BaseUnitTest
|
import gq.kirmanak.mealient.test.BaseUnitTest
|
||||||
import gq.kirmanak.mealient.test.RecipeImplTestData.PORRIDGE_ADD_RECIPE_INFO
|
import gq.kirmanak.mealient.test.RecipeImplTestData.PORRIDGE_ADD_RECIPE_INFO
|
||||||
import gq.kirmanak.mealient.test.RecipeImplTestData.PORRIDGE_ADD_RECIPE_REQUEST_V0
|
import gq.kirmanak.mealient.test.RecipeImplTestData.PORRIDGE_ADD_RECIPE_REQUEST_V0
|
||||||
@@ -36,10 +39,10 @@ class MealieDataSourceWrapperTest : BaseUnitTest() {
|
|||||||
@MockK(relaxUnitFun = true)
|
@MockK(relaxUnitFun = true)
|
||||||
lateinit var authRepo: AuthRepo
|
lateinit var authRepo: AuthRepo
|
||||||
|
|
||||||
@MockK
|
@MockK(relaxUnitFun = true)
|
||||||
lateinit var v0Source: MealieDataSourceV0
|
lateinit var v0Source: MealieDataSourceV0
|
||||||
|
|
||||||
@MockK
|
@MockK(relaxUnitFun = true)
|
||||||
lateinit var v1Source: MealieDataSourceV1
|
lateinit var v1Source: MealieDataSourceV1
|
||||||
|
|
||||||
lateinit var subject: MealieDataSourceWrapper
|
lateinit var subject: MealieDataSourceWrapper
|
||||||
@@ -48,14 +51,14 @@ class MealieDataSourceWrapperTest : BaseUnitTest() {
|
|||||||
override fun setUp() {
|
override fun setUp() {
|
||||||
super.setUp()
|
super.setUp()
|
||||||
subject = MealieDataSourceWrapper(serverInfoRepo, v0Source, v1Source)
|
subject = MealieDataSourceWrapper(serverInfoRepo, v0Source, v1Source)
|
||||||
|
coEvery { v0Source.requestUserInfo() } returns USER_INFO_V0
|
||||||
|
coEvery { v1Source.requestUserInfo() } returns USER_INFO_V1
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `when server version v1 expect requestRecipeInfo to call v1`() = runTest {
|
fun `when server version v1 expect requestRecipeInfo to call v1`() = runTest {
|
||||||
val slug = "porridge"
|
val slug = "porridge"
|
||||||
coEvery {
|
coEvery { v1Source.requestRecipeInfo(eq(slug)) } returns PORRIDGE_RECIPE_RESPONSE_V1
|
||||||
v1Source.requestRecipeInfo(eq(slug))
|
|
||||||
} returns PORRIDGE_RECIPE_RESPONSE_V1
|
|
||||||
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V1
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V1
|
||||||
coEvery { authRepo.getAuthHeader() } returns TEST_AUTH_HEADER
|
coEvery { authRepo.getAuthHeader() } returns TEST_AUTH_HEADER
|
||||||
|
|
||||||
@@ -157,4 +160,70 @@ class MealieDataSourceWrapperTest : BaseUnitTest() {
|
|||||||
|
|
||||||
assertThat(actual).isEqualTo(slug)
|
assertThat(actual).isEqualTo(slug)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when remove favorite recipe info with v0 expect correct sequence`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V0
|
||||||
|
subject.updateIsRecipeFavorite(recipeSlug = "cake", isFavorite = false)
|
||||||
|
coVerify {
|
||||||
|
v0Source.requestUserInfo()
|
||||||
|
v0Source.removeFavoriteRecipe(eq(3), eq("cake"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when remove favorite recipe info with v1 expect correct sequence`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V1
|
||||||
|
subject.updateIsRecipeFavorite(recipeSlug = "cake", isFavorite = false)
|
||||||
|
coVerify {
|
||||||
|
v1Source.requestUserInfo()
|
||||||
|
v1Source.removeFavoriteRecipe(eq("userId"), eq("cake"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when add favorite recipe info with v0 expect correct sequence`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V0
|
||||||
|
subject.updateIsRecipeFavorite(recipeSlug = "cake", isFavorite = true)
|
||||||
|
coVerify {
|
||||||
|
v0Source.requestUserInfo()
|
||||||
|
v0Source.addFavoriteRecipe(eq(3), eq("cake"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when add favorite recipe info with v1 expect correct sequence`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V1
|
||||||
|
subject.updateIsRecipeFavorite(recipeSlug = "cake", isFavorite = true)
|
||||||
|
coVerify {
|
||||||
|
v1Source.requestUserInfo()
|
||||||
|
v1Source.addFavoriteRecipe(eq("userId"), eq("cake"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when get favorite recipes with v1 expect correct call`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V1
|
||||||
|
subject.getFavoriteRecipes()
|
||||||
|
coVerify { v1Source.requestUserInfo() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when get favorite recipes with v0 expect correct call`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V0
|
||||||
|
subject.getFavoriteRecipes()
|
||||||
|
coVerify { v0Source.requestUserInfo() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when get favorite recipes with v1 expect correct result`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V1
|
||||||
|
assertThat(subject.getFavoriteRecipes()).isEqualTo(FAVORITE_RECIPES_LIST)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when get favorite recipes with v0 expect correct result`() = runTest {
|
||||||
|
coEvery { serverInfoRepo.getVersion() } returns TEST_SERVER_VERSION_V0
|
||||||
|
assertThat(subject.getFavoriteRecipes()).isEqualTo(FAVORITE_RECIPES_LIST)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
package gq.kirmanak.mealient.data.recipes.impl
|
package gq.kirmanak.mealient.data.recipes.impl
|
||||||
|
|
||||||
|
import androidx.paging.LoadType
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import gq.kirmanak.mealient.data.recipes.RecipeRepo
|
import gq.kirmanak.mealient.data.recipes.RecipeRepo
|
||||||
import gq.kirmanak.mealient.data.recipes.db.RecipeStorage
|
import gq.kirmanak.mealient.data.recipes.db.RecipeStorage
|
||||||
import gq.kirmanak.mealient.data.recipes.network.RecipeDataSource
|
import gq.kirmanak.mealient.data.recipes.network.RecipeDataSource
|
||||||
|
import gq.kirmanak.mealient.datasource.NetworkError.Unauthorized
|
||||||
import gq.kirmanak.mealient.test.BaseUnitTest
|
import gq.kirmanak.mealient.test.BaseUnitTest
|
||||||
import gq.kirmanak.mealient.test.RecipeImplTestData.CAKE_FULL_RECIPE_INFO
|
import gq.kirmanak.mealient.test.RecipeImplTestData.CAKE_FULL_RECIPE_INFO
|
||||||
import gq.kirmanak.mealient.test.RecipeImplTestData.FULL_CAKE_INFO_ENTITY
|
import gq.kirmanak.mealient.test.RecipeImplTestData.FULL_CAKE_INFO_ENTITY
|
||||||
@@ -15,6 +17,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
@OptIn(ExperimentalCoroutinesApi::class)
|
@OptIn(ExperimentalCoroutinesApi::class)
|
||||||
class RecipeRepoTest : BaseUnitTest() {
|
class RecipeRepoTest : BaseUnitTest() {
|
||||||
@@ -64,4 +67,37 @@ class RecipeRepoTest : BaseUnitTest() {
|
|||||||
subject.updateNameQuery("query")
|
subject.updateNameQuery("query")
|
||||||
verify { pagingSourceFactory.setQuery("query") }
|
verify { pagingSourceFactory.setQuery("query") }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when remove favorite recipe expect correct sequence`() = runTest {
|
||||||
|
subject.updateIsRecipeFavorite("cake", false)
|
||||||
|
coVerify {
|
||||||
|
dataSource.updateIsRecipeFavorite(eq("cake"), eq(false))
|
||||||
|
remoteMediator.onFavoritesChange()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when add favorite recipe expect correct sequence`() = runTest {
|
||||||
|
subject.updateIsRecipeFavorite("porridge", true)
|
||||||
|
coVerify {
|
||||||
|
dataSource.updateIsRecipeFavorite(eq("porridge"), eq(true))
|
||||||
|
remoteMediator.onFavoritesChange()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when add favorite recipe fails expect no mediator call`() = runTest {
|
||||||
|
coEvery {
|
||||||
|
dataSource.updateIsRecipeFavorite(any(), any())
|
||||||
|
} throws Unauthorized(IOException())
|
||||||
|
subject.updateIsRecipeFavorite("porridge", true)
|
||||||
|
coVerify(inverse = true) { remoteMediator.onFavoritesChange() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when refresh recipes expect correct parameters`() = runTest {
|
||||||
|
subject.refreshRecipes()
|
||||||
|
coVerify { remoteMediator.updateRecipes(eq(0), eq(150), eq(LoadType.REFRESH)) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -18,6 +18,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import java.io.IOException
|
||||||
|
|
||||||
@ExperimentalCoroutinesApi
|
@ExperimentalCoroutinesApi
|
||||||
@OptIn(ExperimentalPagingApi::class)
|
@OptIn(ExperimentalPagingApi::class)
|
||||||
@@ -143,6 +144,34 @@ class RecipesRemoteMediatorTest : BaseUnitTest() {
|
|||||||
coVerify { storage.refreshAll(TEST_RECIPE_SUMMARY_ENTITIES) }
|
coVerify { storage.refreshAll(TEST_RECIPE_SUMMARY_ENTITIES) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when favorites change expect network call`() = runTest {
|
||||||
|
coEvery { dataSource.getFavoriteRecipes() } returns listOf("cake", "porridge")
|
||||||
|
subject.onFavoritesChange()
|
||||||
|
coVerify { dataSource.getFavoriteRecipes() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when favorites change expect storage update`() = runTest {
|
||||||
|
coEvery { dataSource.getFavoriteRecipes() } returns listOf("cake", "porridge")
|
||||||
|
subject.onFavoritesChange()
|
||||||
|
coVerify { storage.updateFavoriteRecipes(eq(listOf("cake", "porridge"))) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when favorites change expect factory invalidation`() = runTest {
|
||||||
|
coEvery { dataSource.getFavoriteRecipes() } returns listOf("cake", "porridge")
|
||||||
|
subject.onFavoritesChange()
|
||||||
|
coVerify { pagingSourceFactory.invalidate() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `when recipe update requested but favorite fails expect non-zero updates`() = runTest {
|
||||||
|
coEvery { dataSource.getFavoriteRecipes() } throws Unauthorized(IOException())
|
||||||
|
coEvery { dataSource.requestRecipes(eq(0), eq(6)) } returns TEST_RECIPE_SUMMARIES
|
||||||
|
assertThat(subject.updateRecipes(0, 6, APPEND)).isEqualTo(2)
|
||||||
|
}
|
||||||
|
|
||||||
private fun pagingState(
|
private fun pagingState(
|
||||||
pages: List<PagingSource.LoadResult.Page<Int, RecipeSummaryEntity>> = emptyList(),
|
pages: List<PagingSource.LoadResult.Page<Int, RecipeSummaryEntity>> = emptyList(),
|
||||||
anchorPosition: Int? = null
|
anchorPosition: Int? = null
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package gq.kirmanak.mealient.test
|
package gq.kirmanak.mealient.test
|
||||||
|
|
||||||
import gq.kirmanak.mealient.data.baseurl.ServerVersion
|
import gq.kirmanak.mealient.data.baseurl.ServerVersion
|
||||||
|
import gq.kirmanak.mealient.datasource.v0.models.GetUserInfoResponseV0
|
||||||
|
import gq.kirmanak.mealient.datasource.v1.models.GetUserInfoResponseV1
|
||||||
|
|
||||||
object AuthImplTestData {
|
object AuthImplTestData {
|
||||||
const val TEST_USERNAME = "TEST_USERNAME"
|
const val TEST_USERNAME = "TEST_USERNAME"
|
||||||
@@ -13,4 +15,8 @@ object AuthImplTestData {
|
|||||||
const val TEST_VERSION = "v0.5.6"
|
const val TEST_VERSION = "v0.5.6"
|
||||||
val TEST_SERVER_VERSION_V0 = ServerVersion.V0
|
val TEST_SERVER_VERSION_V0 = ServerVersion.V0
|
||||||
val TEST_SERVER_VERSION_V1 = ServerVersion.V1
|
val TEST_SERVER_VERSION_V1 = ServerVersion.V1
|
||||||
|
|
||||||
|
val FAVORITE_RECIPES_LIST = listOf("cake", "porridge")
|
||||||
|
val USER_INFO_V1 = GetUserInfoResponseV1("userId", FAVORITE_RECIPES_LIST)
|
||||||
|
val USER_INFO_V0 = GetUserInfoResponseV0(3, FAVORITE_RECIPES_LIST)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user