From 9dc6b2bb38ea4a843483b95cc40db5477694bf8c Mon Sep 17 00:00:00 2001 From: mutukuian Date: Mon, 13 May 2024 09:15:10 +0300 Subject: [PATCH 1/4] implement ShipsListViewModelTest --- app/build.gradle.kts | 8 ++- .../ships_screen/ShipListViewModelTest.kt | 70 +++++++++++++++++++ .../kocelainterview/domain/model/Ship.kt | 7 -- .../ships_screen/ShipListViewModel.kt | 2 +- .../use_case/get_ships/GetShipsUseCaseTest.kt | 1 - 5 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bb4912a..7b9cbee 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -65,7 +65,8 @@ dependencies { //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)) @@ -122,12 +123,17 @@ dependencies { testImplementation("junit:junit:4.13") testImplementation("org.mockito:mockito-core:5.2.1") + androidTestImplementation("org.mockito:mockito-core:5.2.1") testImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") + androidTestImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") //truth testImplementation ("com.google.truth:truth:1.0.1") + androidTestImplementation ("androidx.arch.core:core-testing:2.1.0") + testImplementation ("org.jetbrains.kotlin:kotlin-test-junit:1.5.21") + diff --git a/app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt b/app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt new file mode 100644 index 0000000..0b5760b --- /dev/null +++ b/app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt @@ -0,0 +1,70 @@ +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 kotlinx.coroutines.flow.flow +import kotlinx.coroutines.test.runBlockingTest +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +class ShipListViewModelTest { + + private lateinit var viewModel: ShipListViewModel + private lateinit var getShipsUseCase: GetShipsUseCase + + @Before + fun setup() { + getShipsUseCase = mock() + viewModel = ShipListViewModel(getShipsUseCase) + } + + @Test + fun testLoadingState() = runBlockingTest { + // Given + val loadingStateFlow = flow>> { emit(Resource.Loading()) } + whenever(getShipsUseCase()).thenReturn(loadingStateFlow) + + // When + viewModel.getShips() + + // Then + assertEquals(ShipListState(isLoading = true), viewModel.state.value) + } + + @Test + fun testSuccessState() = runBlockingTest { + // Given + val mockShips = listOf(Ship( + true, "image1.jpg", "ship_id_1", "Ship 1", 1000, 2020 + )) + val successStateFlow = flow>> { emit(Resource.Success(mockShips)) } + whenever(getShipsUseCase()).thenReturn(successStateFlow) + + // When + viewModel.getShips() + + // Then + assertEquals(ShipListState(ships = mockShips), viewModel.state.value) + } + + @Test + fun testErrorState() = runBlockingTest { + // Given + val errorMessage = "An error occurred" + val errorStateFlow = flow>> { emit(Resource.Error(errorMessage)) } + whenever(getShipsUseCase()).thenReturn(errorStateFlow) + + // When + viewModel.getShips() + + // Then + assertEquals(ShipListState(error = errorMessage), viewModel.state.value) + } +} + + diff --git a/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt b/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt index e97f0d4..f2462da 100644 --- a/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt +++ b/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt @@ -5,16 +5,9 @@ package com.example.kocelainterview.domain.model data class Ship( val active: Boolean, - // val home_port: String, val image: String?, val ship_id: String, - //val ship_model: Any, val ship_name: String, - //val ship_type: String, -// val speed_kn: Int, -// val status: String, val weight_kg: Int, - // val url: String, - //val weight_lbs: Int, val year_built: Int ) diff --git a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt b/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt index 754f5c8..e69bc55 100644 --- a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt +++ b/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt @@ -23,7 +23,7 @@ class ShipListViewModel @Inject constructor( getShips() } - private fun getShips() { + fun getShips() { viewModelScope.launch { getShipsUseCase() // No search query parameter .onEach { result -> diff --git a/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt b/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt index fb2888e..44ff8c3 100644 --- a/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt +++ b/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt @@ -3,7 +3,6 @@ package com.example.kocelainterview.domain.use_case.get_ships import com.example.kocelainterview.common.core.Resource import com.example.kocelainterview.data.remote.dto.ShipDto import com.example.kocelainterview.data.remote.dto.toShip -import com.example.kocelainterview.domain.model.Ship import com.example.kocelainterview.domain.repository_interface.ShipRepository import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking From f331c4f42702be62cf93aea2cbc498d1d4eacf15 Mon Sep 17 00:00:00 2001 From: mutukuian Date: Mon, 13 May 2024 09:18:07 +0300 Subject: [PATCH 2/4] implement ShipsListViewModelTest --- .idea/deploymentTargetSelector.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index f05b47c..1cd9ddd 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -13,6 +13,9 @@ + + \ No newline at end of file From c62a7875de0e06fff1a0525d7ef71ea53ef21c1f Mon Sep 17 00:00:00 2001 From: mutukuian Date: Mon, 13 May 2024 09:36:09 +0300 Subject: [PATCH 3/4] Revert "implement ShipsListViewModelTest" This reverts commit 9dc6b2bb38ea4a843483b95cc40db5477694bf8c. --- app/build.gradle.kts | 8 +-- .../ships_screen/ShipListViewModelTest.kt | 70 ------------------- .../kocelainterview/domain/model/Ship.kt | 7 ++ .../ships_screen/ShipListViewModel.kt | 2 +- .../use_case/get_ships/GetShipsUseCaseTest.kt | 1 + 5 files changed, 10 insertions(+), 78 deletions(-) delete mode 100644 app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7b9cbee..bb4912a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -65,8 +65,7 @@ dependencies { //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)) @@ -123,17 +122,12 @@ dependencies { testImplementation("junit:junit:4.13") testImplementation("org.mockito:mockito-core:5.2.1") - androidTestImplementation("org.mockito:mockito-core:5.2.1") testImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") - androidTestImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") //truth testImplementation ("com.google.truth:truth:1.0.1") - androidTestImplementation ("androidx.arch.core:core-testing:2.1.0") - testImplementation ("org.jetbrains.kotlin:kotlin-test-junit:1.5.21") - diff --git a/app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt b/app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt deleted file mode 100644 index 0b5760b..0000000 --- a/app/src/androidTest/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModelTest.kt +++ /dev/null @@ -1,70 +0,0 @@ -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 kotlinx.coroutines.flow.flow -import kotlinx.coroutines.test.runBlockingTest -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.mockito.kotlin.mock -import org.mockito.kotlin.whenever - -class ShipListViewModelTest { - - private lateinit var viewModel: ShipListViewModel - private lateinit var getShipsUseCase: GetShipsUseCase - - @Before - fun setup() { - getShipsUseCase = mock() - viewModel = ShipListViewModel(getShipsUseCase) - } - - @Test - fun testLoadingState() = runBlockingTest { - // Given - val loadingStateFlow = flow>> { emit(Resource.Loading()) } - whenever(getShipsUseCase()).thenReturn(loadingStateFlow) - - // When - viewModel.getShips() - - // Then - assertEquals(ShipListState(isLoading = true), viewModel.state.value) - } - - @Test - fun testSuccessState() = runBlockingTest { - // Given - val mockShips = listOf(Ship( - true, "image1.jpg", "ship_id_1", "Ship 1", 1000, 2020 - )) - val successStateFlow = flow>> { emit(Resource.Success(mockShips)) } - whenever(getShipsUseCase()).thenReturn(successStateFlow) - - // When - viewModel.getShips() - - // Then - assertEquals(ShipListState(ships = mockShips), viewModel.state.value) - } - - @Test - fun testErrorState() = runBlockingTest { - // Given - val errorMessage = "An error occurred" - val errorStateFlow = flow>> { emit(Resource.Error(errorMessage)) } - whenever(getShipsUseCase()).thenReturn(errorStateFlow) - - // When - viewModel.getShips() - - // Then - assertEquals(ShipListState(error = errorMessage), viewModel.state.value) - } -} - - diff --git a/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt b/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt index f2462da..e97f0d4 100644 --- a/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt +++ b/app/src/main/java/com/example/kocelainterview/domain/model/Ship.kt @@ -5,9 +5,16 @@ package com.example.kocelainterview.domain.model data class Ship( val active: Boolean, + // val home_port: String, val image: String?, val ship_id: String, + //val ship_model: Any, val ship_name: String, + //val ship_type: String, +// val speed_kn: Int, +// val status: String, val weight_kg: Int, + // val url: String, + //val weight_lbs: Int, val year_built: Int ) diff --git a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt b/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt index e69bc55..754f5c8 100644 --- a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt +++ b/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListViewModel.kt @@ -23,7 +23,7 @@ class ShipListViewModel @Inject constructor( getShips() } - fun getShips() { + private fun getShips() { viewModelScope.launch { getShipsUseCase() // No search query parameter .onEach { result -> diff --git a/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt b/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt index 44ff8c3..fb2888e 100644 --- a/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt +++ b/app/src/test/java/com/example/kocelainterview/domain/use_case/get_ships/GetShipsUseCaseTest.kt @@ -3,6 +3,7 @@ package com.example.kocelainterview.domain.use_case.get_ships import com.example.kocelainterview.common.core.Resource import com.example.kocelainterview.data.remote.dto.ShipDto import com.example.kocelainterview.data.remote.dto.toShip +import com.example.kocelainterview.domain.model.Ship import com.example.kocelainterview.domain.repository_interface.ShipRepository import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking From bcd3ae95a4eba2b80b072987e6941f3bb96f4455 Mon Sep 17 00:00:00 2001 From: mutukuian Date: Mon, 13 May 2024 09:36:23 +0300 Subject: [PATCH 4/4] Revert "implement ShipsListViewModelTest" This reverts commit f331c4f42702be62cf93aea2cbc498d1d4eacf15. --- .idea/deploymentTargetSelector.xml | 3 --- 1 file changed, 3 deletions(-) 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