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" }