From 53188d1d279b8b18c81c28f7752ed88c1d543d78 Mon Sep 17 00:00:00 2001 From: mutukuian Date: Wed, 15 May 2024 14:24:57 +0300 Subject: [PATCH] add shipListViewModel test case --- .idea/deploymentTargetSelector.xml | 3 - app/build.gradle.kts | 4 ++ .../kocelainterview/ExampleUnitTest.kt | 17 ----- .../ships_screen/ShipListViewModelTest.kt | 72 +++++++++++++++++++ gradle/libs.versions.toml | 2 + 5 files changed, 78 insertions(+), 20 deletions(-) delete mode 100644 app/src/test/java/com/example/kocelainterview/ExampleUnitTest.kt create mode 100644 app/src/test/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 1cd9ddd..f05b47c 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -13,9 +13,6 @@ - - \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f4fc197..c793144 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -61,12 +61,14 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + implementation(libs.compose.preview.renderer) //implementation(libs.androidx.material3.android) //implementation(libs.androidx.paging.compose) // implementation(libs.androidx.material3.android) testImplementation(libs.junit) testImplementation("junit:junit:4.12") testImplementation("junit:junit:4.12") + testImplementation("junit:junit:4.12") androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) @@ -134,6 +136,8 @@ dependencies { testImplementation("io.mockk:mockk:1.12.0") androidTestImplementation("io.mockk:mockk-android:1.12.0") + testImplementation ("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.2") + diff --git a/app/src/test/java/com/example/kocelainterview/ExampleUnitTest.kt b/app/src/test/java/com/example/kocelainterview/ExampleUnitTest.kt deleted file mode 100644 index fa948dd..0000000 --- a/app/src/test/java/com/example/kocelainterview/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.kocelainterview - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/app/src/test/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt b/app/src/test/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt new file mode 100644 index 0000000..922d24e --- /dev/null +++ b/app/src/test/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt @@ -0,0 +1,72 @@ +package com.example.kocelainterview.presentation.ships_screen + +import com.example.kocelainterview.common.core.Resource +import com.example.kocelainterview.domain.model.Ship +import com.example.kocelainterview.domain.use_case.get_ships.GetShipsUseCase +import io.mockk.every +import io.mockk.mockk +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.runBlockingTest +import kotlinx.coroutines.test.setMain +import org.junit.Assert.* +import org.junit.Before +import org.junit.Test + +class ShipListViewModelTest { + + private lateinit var viewModel: ShipListViewModel + private lateinit var getShipsUseCase: GetShipsUseCase + + @Before + fun setup() { + Dispatchers.setMain(Dispatchers.Unconfined) + getShipsUseCase = mockk(relaxed = true) // Use relaxed mode to handle final classes + viewModel = ShipListViewModel(getShipsUseCase) + } + + @Test + fun testLoadingState(): Unit = runBlockingTest { + // Given + val loadingStateFlow = flow>> { emit(Resource.Loading()) } + every { getShipsUseCase() } returns loadingStateFlow + + // When + viewModel.getShips() + + // Then + assertEquals(ShipListState(isLoading = true), viewModel.state.value) + } + + @Test + fun testSuccessState(): Unit = runBlockingTest { + // Given + val mockShips = listOf(Ship( + true, "image1.jpg", "ship_id_1", "Ship 1", 1000, 2020 + )) + val successStateFlow = flow>> { emit(Resource.Success(mockShips)) } + every { getShipsUseCase() } returns successStateFlow + + // When + viewModel.getShips() + + // Then + assertEquals(ShipListState(ships = mockShips), viewModel.state.value) + } + + @Test + fun testErrorState(): Unit = runBlockingTest { + // Given + val errorMessage = "An error occurred" + val errorStateFlow = flow>> { emit(Resource.Error(errorMessage)) } + every { getShipsUseCase() } returns errorStateFlow + + // When + viewModel.getShips() + + // Then + assertEquals(ShipListState(error = errorMessage), viewModel.state.value) + } +} + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1a7e505..4562ae2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,6 +23,7 @@ playServicesLocation = "21.2.0" material3Android = "1.2.1" pagingCompose = "3.2.1" material3AndroidVersion = "1.2.1" +composePreviewRenderer = "0.0.1-alpha01" [libraries] accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanistSystemuicontroller" } @@ -58,6 +59,7 @@ okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } play-services-location = { module = "com.google.android.gms:play-services-location", version.ref = "playServicesLocation" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "converterGson" } androidx-paging-compose = { group = "androidx.paging", name = "paging-compose", version.ref = "pagingCompose" } +compose-preview-renderer = { group = "com.android.tools.compose", name = "compose-preview-renderer", version.ref = "composePreviewRenderer" }