Tower Guidev2
12/30/2025, 12:55 PMTower Guidev2
12/30/2025, 12:56 PM@Test
fun dishwasherDetailsMainScreen_loadingToData_showsLoadingThenDetails() = runTest {
val testDispatcher = StandardTestDispatcher(testScheduler)
val fakeDataSource = FakeDishwasherDataSource(details = sampleDishwasherDetail)
val useCase = GetDishwasherDetailUseCase(fakeDataSource)
val viewModel = DishwasherDetailViewModel(useCase, testDispatcher)
// Set Compose content
composeTestRule.setContent {
DishwasherTheme {
CompositionLocalProvider(LocalBackButtonVisibility provides true) {
DishwasherDetailsMainScreen(
viewModel = viewModel,
dishwasherDetail = dishwasherDetailInput,
onBack = {}
)
}
}
}
// Start Turbine collection of the ViewModel flow
viewModel.uiState.test {
// 1️⃣ Initial state
assertEquals(UiState.Initial, awaitItem())
// Trigger load
viewModel.loadDishwasherDetails(dishwasherDetailInput)
// Advance dispatcher so Loading is emitted
testScheduler.advanceUntilIdle()
// 2️⃣ Loading state
assertEquals(UiState.Loading, awaitItem())
// Now Compose should have recomposed for loading state
composeTestRule.onNodeWithText(
composeTestRule.activity.getString(R.string.loading_dishwasher)
).assertIsDisplayed()
// 3️⃣ Data state
val dataState = awaitItem() as UiState.Data
val item = dataState.data
// Let Compose recompose with Data
testScheduler.advanceUntilIdle()
// Assert Compose UI shows data
composeTestRule.onNodeWithText(item.title)
.assertIsDisplayed()
cancelAndIgnoreRemainingEvents()
}
}Tower Guidev2
12/30/2025, 12:59 PMAlexandru Caraus
12/30/2025, 3:15 PMAlexandru Caraus
12/30/2025, 3:17 PMTower Guidev2
12/30/2025, 4:34 PMZach Klippenstein (he/him) [MOD]
01/02/2026, 3:46 AM