diff --git a/.idea/androidTestResultsUserPreferences.xml b/.idea/androidTestResultsUserPreferences.xml new file mode 100644 index 0000000..852add7 --- /dev/null +++ b/.idea/androidTestResultsUserPreferences.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bb4912a..f4fc197 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -66,6 +66,7 @@ dependencies { // implementation(libs.androidx.material3.android) testImplementation(libs.junit) 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)) @@ -121,8 +122,21 @@ dependencies { testImplementation("junit:junit:4.13") - testImplementation("org.mockito:mockito-core:5.2.1") + testImplementation("org.mockito:mockito-core:5.7.0") + androidTestImplementation("org.mockito:mockito-core:5.7.0") testImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") + androidTestImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1") + + // Use mockito-android for Android instrumentation tests + androidTestImplementation ("org.mockito:mockito-android:4.4.0") + androidTestImplementation ("androidx.arch.core:core-testing:2.2.0") + + testImplementation("io.mockk:mockk:1.12.0") + androidTestImplementation("io.mockk:mockk-android:1.12.0") + + + + //truth testImplementation ("com.google.truth:truth:1.0.1") diff --git a/app/src/main/java/com/example/kocelainterview/common/di/repositorymodule/RepositoryModule.kt b/app/src/main/java/com/example/kocelainterview/common/di/repositorymodule/RepositoryModule.kt index c6ca33e..83c663a 100644 --- a/app/src/main/java/com/example/kocelainterview/common/di/repositorymodule/RepositoryModule.kt +++ b/app/src/main/java/com/example/kocelainterview/common/di/repositorymodule/RepositoryModule.kt @@ -38,7 +38,8 @@ object RepositoryModule { context.applicationContext, ShipDatabase::class.java, "ship_database" - ).fallbackToDestructiveMigration().build() + ).fallbackToDestructiveMigration() + .build() } @Provides diff --git a/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDetailDto.kt b/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDetailDto.kt index 5eca6ec..e647e0c 100644 --- a/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDetailDto.kt +++ b/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDetailDto.kt @@ -9,7 +9,7 @@ data class ShipDetailDto( val `class`: Int, val course_deg: Any, val home_port: String, - val image: String, + val image: String?, val imo: Int, val mmsi: Int, val roles: List, @@ -27,5 +27,5 @@ data class ShipDetailDto( ) fun ShipDetailDto.toShipDetail():ShipDetail{ - return ShipDetail(active, home_port, ship_id, ship_name, ship_type,image, weight_kg, year_built) + return ShipDetail(active, image, home_port, ship_id, ship_name, ship_type, weight_kg, year_built) } \ No newline at end of file diff --git a/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDto.kt b/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDto.kt index 12a998d..9f837e3 100644 --- a/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDto.kt +++ b/app/src/main/java/com/example/kocelainterview/data/remote/dto/ShipDto.kt @@ -7,26 +7,12 @@ import com.example.kocelainterview.domain.model.Ship data class ShipDto( - // val abs: Int, + val active: Boolean, -// val attempted_landings: Any?, -// val `class`: Int, -// val course_deg: Any, - // val home_port: String, val image: String?, -// val imo: Int, -// val mmsi: Int, -// val roles: List, val ship_id: String, - // val ship_model: Any?, val ship_name: String, -// val ship_type: String, - // val speed_kn: Int, -// val status: String, -// val successful_landings: Any?, -// val url: String, val weight_kg: Int, - // val weight_lbs: Int, val year_built: Int ) 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..a76b777 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 @@ -3,7 +3,6 @@ package com.example.kocelainterview.domain.model data class Ship( - val active: Boolean, val image: String?, val ship_id: String, diff --git a/app/src/main/java/com/example/kocelainterview/domain/model/ShipDetail.kt b/app/src/main/java/com/example/kocelainterview/domain/model/ShipDetail.kt index 553c3be..da9610e 100644 --- a/app/src/main/java/com/example/kocelainterview/domain/model/ShipDetail.kt +++ b/app/src/main/java/com/example/kocelainterview/domain/model/ShipDetail.kt @@ -2,7 +2,7 @@ package com.example.kocelainterview.domain.model data class ShipDetail( val active: Boolean, - val image: String, + val image: String?, val home_port: String, val ship_id: String, val ship_name: String, diff --git a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/SearchBar.kt b/app/src/main/java/com/example/kocelainterview/presentation/search_controller/search_screen/SearchBar.kt similarity index 96% rename from app/src/main/java/com/example/kocelainterview/presentation/ships_screen/SearchBar.kt rename to app/src/main/java/com/example/kocelainterview/presentation/search_controller/search_screen/SearchBar.kt index 82bbd75..bfbfa86 100644 --- a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/SearchBar.kt +++ b/app/src/main/java/com/example/kocelainterview/presentation/search_controller/search_screen/SearchBar.kt @@ -1,4 +1,4 @@ -package com.example.kocelainterview.presentation.ships_screen +package com.example.kocelainterview.presentation.search_controller.search_screen import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.MaterialTheme diff --git a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListItem.kt b/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListItem.kt deleted file mode 100644 index 447ba56..0000000 --- a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListItem.kt +++ /dev/null @@ -1,87 +0,0 @@ -package com.example.kocelainterview.presentation.ships_screen - - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.IntrinsicSize -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Card -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage - -import com.example.kocelainterview.domain.model.Ship - - -@Composable -fun ShipListItem( - modifier:Modifier = Modifier, - ship: Ship, -) { - Card( - modifier = modifier, - //elevation = 4.dp - - ) { - Row ( - modifier = Modifier - .fillMaxWidth() - .height(IntrinsicSize.Max) - .padding(16.dp) - ){ - AsyncImage( - model = ship.image, - contentDescription = ship.ship_name, - modifier = Modifier - .weight(1f) - .height(150.dp) - ) - Spacer(modifier = Modifier.width(16.dp)) - Column( - modifier = Modifier - .weight(3f) - .fillMaxWidth(), - verticalArrangement = Arrangement.Center - ){ - Text( - text = "ShipName: ${ship.ship_name}", - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.fillMaxWidth() - ) - - Spacer(modifier = Modifier.height(8.dp)) - - Text( - text = "YearBuilt: ${ship.year_built}", - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.fillMaxWidth() - ) - - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = "Active Status: ${ship.active}", - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.fillMaxWidth() - ) - Spacer(modifier = Modifier.height(8.dp)) - - Text( - text = "Weight in KG: ${ship.weight_kg}", - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.fillMaxWidth() - ) - } - } - } -} - - - diff --git a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListScreen.kt b/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListScreen.kt index 27972c5..fd177ac 100644 --- a/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListScreen.kt +++ b/app/src/main/java/com/example/kocelainterview/presentation/ships_screen/ShipListScreen.kt @@ -20,8 +20,8 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -34,10 +34,10 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController -import coil.annotation.ExperimentalCoilApi import coil.compose.rememberAsyncImagePainter import com.example.kocelainterview.domain.model.Ship import com.example.kocelainterview.presentation.navigation.Screen +import com.example.kocelainterview.presentation.search_controller.search_screen.SearchBar import com.example.kocelainterview.presentation.search_controller.search_view_model.SearchViewModel @@ -48,9 +48,10 @@ fun ShipListScreen( navController: NavController, viewModel: ShipListViewModel = hiltViewModel(), - view:SearchViewModel = hiltViewModel() + searchViewModel:SearchViewModel = hiltViewModel() ) { val state = viewModel.state.value + val searchState by searchViewModel.state.collectAsState() var searchText by remember { mutableStateOf("") } @@ -71,7 +72,7 @@ fun ShipListScreen( searchQuery = searchText, onSearchQueryChanged = { searchText = it }, // Update the search query onSearchClicked = { - view.searchShip(searchText) + searchViewModel.searchShip(searchText) } ) 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 ->