diff --git a/app/src/androidTest/java/org/fnives/test/showcase/ui/AuthComposeInstrumentedTest.kt b/app/src/androidTest/java/org/fnives/test/showcase/ui/AuthComposeInstrumentedTest.kt index 92d67e7..61210a1 100644 --- a/app/src/androidTest/java/org/fnives/test/showcase/ui/AuthComposeInstrumentedTest.kt +++ b/app/src/androidTest/java/org/fnives/test/showcase/ui/AuthComposeInstrumentedTest.kt @@ -2,11 +2,11 @@ package org.fnives.test.showcase.ui import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.fnives.test.showcase.compose.ComposeActivity import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario import org.fnives.test.showcase.testutils.MockServerScenarioSetupResetingTestRule import org.fnives.test.showcase.testutils.idling.MainDispatcherTestRule import org.fnives.test.showcase.testutils.idling.anyResourceIdling -import org.fnives.test.showcase.compose.ComposeActivity import org.junit.Before import org.junit.Rule import org.junit.Test @@ -20,8 +20,6 @@ class AuthComposeInstrumentedTest : KoinTest { @get:Rule val composeTestRule = createAndroidComposeRule() -// private lateinit var activityScenario: ActivityScenario - private val mockServerScenarioSetupTestRule = MockServerScenarioSetupResetingTestRule() private val mockServerScenarioSetup get() = mockServerScenarioSetupTestRule.mockServerScenarioSetup private val mainDispatcherTestRule = MainDispatcherTestRule() @@ -38,11 +36,6 @@ class AuthComposeInstrumentedTest : KoinTest { robot = ComposeLoginRobot(composeTestRule) } -// @After -// fun tearDown() { -// activityScenario.safeClose() -// } - /** GIVEN non empty password and username and successful response WHEN signIn THEN no error is shown and navigating to home */ @Test fun properLoginResultsInNavigationToHome() { @@ -57,8 +50,10 @@ class AuthComposeInstrumentedTest : KoinTest { .setUsername("banan") .assertUsername("banan") .assertPassword("alma") - .clickOnLogin() -// .assertLoadingBeforeRequests() + composeTestRule.mainClock.autoAdvance = false + robot.clickOnLogin() + composeTestRule.mainClock.advanceTimeByFrame() + robot.assertLoading() // mainDispatcherTestRule.advanceUntilIdleWithIdlingResources() // robot.assertNavigatedToHome() diff --git a/app/src/androidTest/java/org/fnives/test/showcase/ui/ComposeLoginRobot.kt b/app/src/androidTest/java/org/fnives/test/showcase/ui/ComposeLoginRobot.kt index bb3db47..c792769 100644 --- a/app/src/androidTest/java/org/fnives/test/showcase/ui/ComposeLoginRobot.kt +++ b/app/src/androidTest/java/org/fnives/test/showcase/ui/ComposeLoginRobot.kt @@ -17,8 +17,10 @@ class ComposeLoginRobot( } fun assertPassword(password: String): ComposeLoginRobot = apply { - composeTestRule.onNodeWithTag(AuthScreenTag.PasswordVisibilityToggle).performClick() - composeTestRule.onNodeWithTag(AuthScreenTag.PasswordInput).assertTextContains(password) + with(composeTestRule) { + onNodeWithTag(AuthScreenTag.PasswordVisibilityToggle).performClick() + onNodeWithTag(AuthScreenTag.PasswordInput).assertTextContains(password) + } } fun assertUsername(username: String): ComposeLoginRobot = apply { @@ -28,4 +30,8 @@ class ComposeLoginRobot( fun clickOnLogin(): ComposeLoginRobot = apply { composeTestRule.onNodeWithTag(AuthScreenTag.LoginButton).performClick() } + + fun assertLoading(): ComposeLoginRobot = apply { + composeTestRule.onNodeWithTag(AuthScreenTag.LoadingIndicator).assertIsDisplayed() + } } \ No newline at end of file diff --git a/app/src/main/java/org/fnives/test/showcase/compose/screen/auth/AuthScreen.kt b/app/src/main/java/org/fnives/test/showcase/compose/screen/auth/AuthScreen.kt index 8fc5cbb..8c9e546 100644 --- a/app/src/main/java/org/fnives/test/showcase/compose/screen/auth/AuthScreen.kt +++ b/app/src/main/java/org/fnives/test/showcase/compose/screen/auth/AuthScreen.kt @@ -8,12 +8,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.getValue -import androidx.compose.runtime.setValue +import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier @@ -47,10 +42,13 @@ fun AuthScreen( bottom.linkTo(login.top) }) if (authScreenState.loading) { - CircularProgressIndicator(Modifier.constrainAs(loading) { - bottom.linkTo(login.top) - centerHorizontallyTo(parent) - }) + CircularProgressIndicator( + Modifier + .testTag(AuthScreenTag.LoadingIndicator) + .constrainAs(loading) { + bottom.linkTo(login.top) + centerHorizontallyTo(parent) + }) } LoginButton( modifier = Modifier @@ -89,7 +87,8 @@ private fun PasswordField(authScreenState: AuthScreenState) { Icon( painter = rememberAnimatedVectorPainter(image, passwordVisible), contentDescription = null, - modifier = Modifier.clickable { passwordVisible = !passwordVisible } + modifier = Modifier + .clickable { passwordVisible = !passwordVisible } .testTag(AuthScreenTag.PasswordVisibilityToggle) ) }, @@ -144,10 +143,12 @@ private fun Snackbar(authScreenState: AuthScreenState, modifier: Modifier = Modi @Composable private fun LoginButton(modifier: Modifier = Modifier, onClick: () -> Unit) { Box(modifier) { - Button(onClick = onClick, + Button( + onClick = onClick, Modifier .fillMaxWidth() - .testTag(AuthScreenTag.LoginButton)) { + .testTag(AuthScreenTag.LoginButton) + ) { Text(text = "Login") } } @@ -172,6 +173,7 @@ private fun AuthScreenState.ErrorType.stringResId() = when (this) { object AuthScreenTag { const val UsernameInput = "AuthScreenTag.UsernameInput" const val PasswordInput = "AuthScreenTag.PasswordInput" + const val LoadingIndicator = "AuthScreenTag.LoadingIndicator" const val LoginButton = "AuthScreenTag.LoginButton" const val PasswordVisibilityToggle = "AuthScreenTag.PasswordVisibilityToggle" } diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt index d2cf705..8294014 100644 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt +++ b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/idling/NetworkSynchronizationTestRule.kt @@ -30,7 +30,7 @@ class NetworkSynchronizationTestRule : TestRule, KoinTest { @CheckResult private fun registerNetworkingSynchronization(): Disposable { - val idlingResources = NetworkTestConfigurationHelper.getOkHttpClients() + val idlingResources = NetworkTestConfigurationHelper.getOkHttpClients()//.filterIndexed { index, okHttpClient -> index == 0 } .associateBy(keySelector = { it.toString() }) .map { (key, client) -> client.asIdlingResource(key) } .map(::IdlingResourceDisposable)