From d7cb032ea259b4fedcad00ebb93f0559fef65a8c Mon Sep 17 00:00:00 2001 From: Gergely Hegedus Date: Mon, 24 Jan 2022 15:40:38 +0200 Subject: [PATCH] Issue#16 Swap white box logout and login state into ui interaction based --- .../statesetup/SetupAuthenticationState.kt | 52 +++++++++++++++++++ .../statesetup/SetupLoggedInState.kt | 31 ----------- .../test/showcase/ui/login/LoginRobot.kt | 4 ++ .../test/showcase/ui/splash/SplashRobot.kt | 20 +++++++ .../statesetup/SetupLoggedInState.kt | 30 ----------- .../test/showcase/ui/home/MainActivityTest.kt | 10 +--- .../showcase/ui/splash/SplashActivityTest.kt | 16 ++---- .../statesetup/SetupLoggedInState.kt | 31 ----------- .../test/showcase/ui/home/MainActivityTest.kt | 9 ++-- .../showcase/ui/splash/SplashActivityTest.kt | 15 ++---- 10 files changed, 90 insertions(+), 128 deletions(-) create mode 100644 app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupAuthenticationState.kt delete mode 100644 app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt delete mode 100644 app/src/sharedTestHilt/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt delete mode 100644 app/src/sharedTestKoin/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupAuthenticationState.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupAuthenticationState.kt new file mode 100644 index 0000000..a5049ae --- /dev/null +++ b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupAuthenticationState.kt @@ -0,0 +1,52 @@ +package org.fnives.test.showcase.testutils.statesetup + +import androidx.lifecycle.Lifecycle +import androidx.test.core.app.ActivityScenario +import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup +import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario +import org.fnives.test.showcase.testutils.configuration.MainDispatcherTestRule +import org.fnives.test.showcase.ui.ActivityClassHolder +import org.fnives.test.showcase.ui.home.HomeRobot +import org.fnives.test.showcase.ui.login.LoginRobot +import org.koin.test.KoinTest + +object SetupAuthenticationState : KoinTest { + + fun setupLogin( + mainDispatcherTestRule: MainDispatcherTestRule, + mockServerScenarioSetup: MockServerScenarioSetup + ) { + mockServerScenarioSetup.setScenario( + AuthScenario.Success( + username = "a", + password = "b" + ) + ) + val activityScenario = ActivityScenario.launch(ActivityClassHolder.authActivity().java) + activityScenario.moveToState(Lifecycle.State.RESUMED) + val loginRobot = LoginRobot() + loginRobot.setupIntentResults() + loginRobot + .setPassword("b") + .setUsername("a") + .clickOnLogin() + + mainDispatcherTestRule.advanceUntilIdleOrActivityIsDestroyed() + + activityScenario.moveToState(Lifecycle.State.DESTROYED) + } + + fun setupLogout( + mainDispatcherTestRule: MainDispatcherTestRule + ) { + val activityScenario = ActivityScenario.launch(ActivityClassHolder.mainActivity().java) + activityScenario.moveToState(Lifecycle.State.RESUMED) + val homeRobot = HomeRobot() + homeRobot + .clickSignOut() + + mainDispatcherTestRule.advanceUntilIdleOrActivityIsDestroyed() + + activityScenario.moveToState(Lifecycle.State.DESTROYED) + } +} diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt b/app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt deleted file mode 100644 index ce25260..0000000 --- a/app/src/sharedTest/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt +++ /dev/null @@ -1,31 +0,0 @@ -// package org.fnives.test.showcase.testutils.statesetup -// -// import kotlinx.coroutines.runBlocking -// import org.fnives.test.showcase.core.login.IsUserLoggedInUseCase -// import org.fnives.test.showcase.core.login.LoginUseCase -// import org.fnives.test.showcase.core.login.LogoutUseCase -// import org.fnives.test.showcase.model.auth.LoginCredentials -// import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup -// import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario -// import org.koin.test.KoinTest -// import org.koin.test.get -// -// object SetupLoggedInState : KoinTest { -// -// private val logoutUseCase get() = get() -// private val loginUseCase get() = get() -// private val isUserLoggedInUseCase get() = get() -// -// fun setupLogin(mockServerScenarioSetup: MockServerScenarioSetup) { -// mockServerScenarioSetup.setScenario(AuthScenario.Success("a", "b")) -// runBlocking { -// loginUseCase.invoke(LoginCredentials("a", "b")) -// } -// } -// -// fun isLoggedIn() = isUserLoggedInUseCase.invoke() -// -// fun setupLogout() { -// runBlocking { logoutUseCase.invoke() } -// } -// } diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/ui/login/LoginRobot.kt b/app/src/sharedTest/java/org/fnives/test/showcase/ui/login/LoginRobot.kt index 37b0bef..b00b62a 100644 --- a/app/src/sharedTest/java/org/fnives/test/showcase/ui/login/LoginRobot.kt +++ b/app/src/sharedTest/java/org/fnives/test/showcase/ui/login/LoginRobot.kt @@ -37,6 +37,10 @@ class LoginRobot( override fun init() { Intents.init() + setupIntentResults() + } + + fun setupIntentResults() { intending(hasComponent(ActivityClassHolder.mainActivity().java.canonicalName)) .respondWith(Instrumentation.ActivityResult(Activity.RESULT_OK, Intent())) } diff --git a/app/src/sharedTest/java/org/fnives/test/showcase/ui/splash/SplashRobot.kt b/app/src/sharedTest/java/org/fnives/test/showcase/ui/splash/SplashRobot.kt index c612228..683203f 100644 --- a/app/src/sharedTest/java/org/fnives/test/showcase/ui/splash/SplashRobot.kt +++ b/app/src/sharedTest/java/org/fnives/test/showcase/ui/splash/SplashRobot.kt @@ -3,7 +3,10 @@ package org.fnives.test.showcase.ui.splash import android.app.Instrumentation import androidx.test.espresso.intent.Intents import androidx.test.espresso.intent.matcher.IntentMatchers +import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup +import org.fnives.test.showcase.testutils.configuration.MainDispatcherTestRule import org.fnives.test.showcase.testutils.robot.Robot +import org.fnives.test.showcase.testutils.statesetup.SetupAuthenticationState import org.fnives.test.showcase.testutils.viewactions.notIntended import org.fnives.test.showcase.ui.ActivityClassHolder @@ -21,6 +24,23 @@ class SplashRobot : Robot { Intents.release() } + fun setupLoggedInState( + mainDispatcherTestRule: MainDispatcherTestRule, + mockServerScenarioSetup: MockServerScenarioSetup + ) { + SetupAuthenticationState.setupLogin(mainDispatcherTestRule, mockServerScenarioSetup) + release() + init() + } + + fun setupLoggedOutState( + mainDispatcherTestRule: MainDispatcherTestRule + ) { + SetupAuthenticationState.setupLogout(mainDispatcherTestRule) + release() + init() + } + fun assertHomeIsStarted() = apply { Intents.intended(IntentMatchers.hasComponent(ActivityClassHolder.mainActivity().java.canonicalName)) } diff --git a/app/src/sharedTestHilt/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt b/app/src/sharedTestHilt/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt deleted file mode 100644 index 04d165d..0000000 --- a/app/src/sharedTestHilt/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.fnives.test.showcase.testutils.statesetup - -import kotlinx.coroutines.runBlocking -import org.fnives.test.showcase.core.login.IsUserLoggedInUseCase -import org.fnives.test.showcase.core.login.LoginUseCase -import org.fnives.test.showcase.core.login.LogoutUseCase -import org.fnives.test.showcase.model.auth.LoginCredentials -import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup -import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario -import javax.inject.Inject - -class SetupLoggedInState @Inject constructor( - private val logoutUseCase: LogoutUseCase, - private val loginUseCase: LoginUseCase, - private val isUserLoggedInUseCase: IsUserLoggedInUseCase -) { - - fun setupLogin(mockServerScenarioSetup: MockServerScenarioSetup) { - mockServerScenarioSetup.setScenario(AuthScenario.Success("a", "b")) - runBlocking { - loginUseCase.invoke(LoginCredentials("a", "b")) - } - } - - fun isLoggedIn() = isUserLoggedInUseCase.invoke() - - fun setupLogout() { - runBlocking { logoutUseCase.invoke() } - } -} diff --git a/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt b/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt index 1731124..6cfee42 100644 --- a/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt +++ b/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt @@ -17,9 +17,8 @@ import org.fnives.test.showcase.testutils.idling.NetworkSynchronization import org.fnives.test.showcase.testutils.idling.loopMainThreadFor import org.fnives.test.showcase.testutils.idling.loopMainThreadUntilIdleWithIdlingResources import org.fnives.test.showcase.testutils.robot.RobotTestRule -import org.fnives.test.showcase.testutils.statesetup.SetupLoggedInState +import org.fnives.test.showcase.testutils.statesetup.SetupAuthenticationState import org.junit.After -import org.junit.Assert import org.junit.Before import org.junit.Rule import org.junit.Test @@ -58,9 +57,6 @@ class MainActivityTest { @JvmField val hiltRule = HiltAndroidRule(this) - @Inject - lateinit var setupLoggedInState: SetupLoggedInState - @Inject lateinit var networkSynchronization: NetworkSynchronization @@ -72,8 +68,8 @@ class MainActivityTest { .invoke(mockServerScenarioSetupTestRule.mockServerScenarioSetup) hiltRule.inject() - setupLoggedInState.setupLogin(mockServerScenarioSetupTestRule.mockServerScenarioSetup) disposable = networkSynchronization.registerNetworkingSynchronization() + SetupAuthenticationState.setupLogin(mainDispatcherTestRule, mockServerScenarioSetupTestRule.mockServerScenarioSetup) } @After @@ -94,7 +90,6 @@ class MainActivityTest { mainDispatcherTestRule.advanceUntilIdleOrActivityIsDestroyed() homeRobot.assertNavigatedToAuth() - Assert.assertEquals(false, setupLoggedInState.isLoggedIn()) } /** GIVEN success response WHEN data is returned THEN it is shown on the ui */ @@ -253,6 +248,5 @@ class MainActivityTest { mainDispatcherTestRule.advanceUntilIdleWithIdlingResources() homeRobot.assertNavigatedToAuth() - Assert.assertEquals(false, setupLoggedInState.isLoggedIn()) } } diff --git a/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt b/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt index 33c3be2..f90d661 100644 --- a/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt +++ b/app/src/sharedTestHilt/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt @@ -11,7 +11,6 @@ import org.fnives.test.showcase.testutils.configuration.SpecificTestConfiguratio import org.fnives.test.showcase.testutils.idling.Disposable import org.fnives.test.showcase.testutils.idling.NetworkSynchronization import org.fnives.test.showcase.testutils.robot.RobotTestRule -import org.fnives.test.showcase.testutils.statesetup.SetupLoggedInState import org.junit.After import org.junit.Before import org.junit.Rule @@ -49,9 +48,6 @@ class SplashActivityTest : KoinTest { @JvmField val hiltRule = HiltAndroidRule(this) - @Inject - lateinit var setupLoggedInState: SetupLoggedInState - @Inject lateinit var networkSynchronization: NetworkSynchronization @@ -74,7 +70,7 @@ class SplashActivityTest : KoinTest { /** GIVEN loggedInState WHEN opened THEN MainActivity is started */ @Test fun loggedInStateNavigatesToHome() { - setupLoggedInState.setupLogin(mockServerScenarioSetupTestRule.mockServerScenarioSetup) + splashRobot.setupLoggedInState(mainDispatcherTestRule, mockServerScenarioSetupTestRule.mockServerScenarioSetup) activityScenario = ActivityScenario.launch(HiltSplashActivity::class.java) @@ -82,14 +78,12 @@ class SplashActivityTest : KoinTest { splashRobot.assertHomeIsStarted() .assertAuthIsNotStarted() - - setupLoggedInState.setupLogout() } /** GIVEN loggedOffState WHEN opened THEN AuthActivity is started */ @Test fun loggedOutStatesNavigatesToAuthentication() { - setupLoggedInState.setupLogout() + splashRobot.setupLoggedOutState(mainDispatcherTestRule) activityScenario = ActivityScenario.launch(HiltSplashActivity::class.java) @@ -101,7 +95,7 @@ class SplashActivityTest : KoinTest { @Test fun loggedOutStatesNotEnoughTime() { - setupLoggedInState.setupLogout() + splashRobot.setupLoggedOutState(mainDispatcherTestRule) activityScenario = ActivityScenario.launch(HiltSplashActivity::class.java) @@ -114,7 +108,7 @@ class SplashActivityTest : KoinTest { /** GIVEN loggedInState and not enough time WHEN opened THEN no activity is started */ @Test fun loggedInStatesNotEnoughTime() { - setupLoggedInState.setupLogin(mockServerScenarioSetupTestRule.mockServerScenarioSetup) + splashRobot.setupLoggedInState(mainDispatcherTestRule, mockServerScenarioSetupTestRule.mockServerScenarioSetup) activityScenario = ActivityScenario.launch(HiltSplashActivity::class.java) @@ -122,7 +116,5 @@ class SplashActivityTest : KoinTest { splashRobot.assertHomeIsNotStarted() .assertAuthIsNotStarted() - - setupLoggedInState.setupLogout() } } diff --git a/app/src/sharedTestKoin/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt b/app/src/sharedTestKoin/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt deleted file mode 100644 index 4e978ee..0000000 --- a/app/src/sharedTestKoin/java/org/fnives/test/showcase/testutils/statesetup/SetupLoggedInState.kt +++ /dev/null @@ -1,31 +0,0 @@ -package org.fnives.test.showcase.testutils.statesetup - -import kotlinx.coroutines.runBlocking -import org.fnives.test.showcase.core.login.IsUserLoggedInUseCase -import org.fnives.test.showcase.core.login.LoginUseCase -import org.fnives.test.showcase.core.login.LogoutUseCase -import org.fnives.test.showcase.model.auth.LoginCredentials -import org.fnives.test.showcase.network.mockserver.MockServerScenarioSetup -import org.fnives.test.showcase.network.mockserver.scenario.auth.AuthScenario -import org.koin.test.KoinTest -import org.koin.test.get - -object SetupLoggedInState : KoinTest { - - private val logoutUseCase get() = get() - private val loginUseCase get() = get() - private val isUserLoggedInUseCase get() = get() - - fun setupLogin(mockServerScenarioSetup: MockServerScenarioSetup) { - mockServerScenarioSetup.setScenario(AuthScenario.Success("a", "b")) - runBlocking { - loginUseCase.invoke(LoginCredentials("a", "b")) - } - } - - fun isLoggedIn() = isUserLoggedInUseCase.invoke() - - fun setupLogout() { - runBlocking { logoutUseCase.invoke() } - } -} diff --git a/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt b/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt index 17ed314..7ecef06 100644 --- a/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt +++ b/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/home/MainActivityTest.kt @@ -16,9 +16,8 @@ import org.fnives.test.showcase.testutils.idling.NetworkSynchronization import org.fnives.test.showcase.testutils.idling.loopMainThreadFor import org.fnives.test.showcase.testutils.idling.loopMainThreadUntilIdleWithIdlingResources import org.fnives.test.showcase.testutils.robot.RobotTestRule -import org.fnives.test.showcase.testutils.statesetup.SetupLoggedInState +import org.fnives.test.showcase.testutils.statesetup.SetupAuthenticationState import org.junit.After -import org.junit.Assert import org.junit.Before import org.junit.Rule import org.junit.Test @@ -64,8 +63,10 @@ class MainActivityTest : KoinTest { SpecificTestConfigurationsFactory.createServerTypeConfiguration() .invoke(mockServerScenarioSetupTestRule.mockServerScenarioSetup) - SetupLoggedInState.setupLogin(mockServerScenarioSetupTestRule.mockServerScenarioSetup) disposable = NetworkSynchronization.registerNetworkingSynchronization() + SetupAuthenticationState.setupLogin( + mainDispatcherTestRule, + mockServerScenarioSetupTestRule.mockServerScenarioSetup) } @After @@ -86,7 +87,6 @@ class MainActivityTest : KoinTest { mainDispatcherTestRule.advanceUntilIdleOrActivityIsDestroyed() homeRobot.assertNavigatedToAuth() - Assert.assertEquals(false, SetupLoggedInState.isLoggedIn()) } /** GIVEN success response WHEN data is returned THEN it is shown on the ui */ @@ -245,6 +245,5 @@ class MainActivityTest : KoinTest { mainDispatcherTestRule.advanceUntilIdleWithIdlingResources() homeRobot.assertNavigatedToAuth() - Assert.assertEquals(false, SetupLoggedInState.isLoggedIn()) } } diff --git a/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt b/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt index 74e202f..9d865c9 100644 --- a/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt +++ b/app/src/sharedTestKoin/java/org/fnives/test/showcase/ui/splash/SplashActivityTest.kt @@ -9,7 +9,6 @@ import org.fnives.test.showcase.testutils.configuration.SpecificTestConfiguratio import org.fnives.test.showcase.testutils.idling.Disposable import org.fnives.test.showcase.testutils.idling.NetworkSynchronization import org.fnives.test.showcase.testutils.robot.RobotTestRule -import org.fnives.test.showcase.testutils.statesetup.SetupLoggedInState import org.junit.After import org.junit.Before import org.junit.Rule @@ -59,7 +58,7 @@ class SplashActivityTest : KoinTest { /** GIVEN loggedInState WHEN opened after some time THEN MainActivity is started */ @Test fun loggedInStateNavigatesToHome() { - SetupLoggedInState.setupLogin(mockServerScenarioSetupTestRule.mockServerScenarioSetup) + splashRobot.setupLoggedInState(mainDispatcherTestRule, mockServerScenarioSetupTestRule.mockServerScenarioSetup) activityScenario = ActivityScenario.launch(SplashActivity::class.java) activityScenario.moveToState(Lifecycle.State.RESUMED) @@ -68,15 +67,12 @@ class SplashActivityTest : KoinTest { splashRobot.assertHomeIsStarted() .assertAuthIsNotStarted() - - SetupLoggedInState.setupLogout() } /** GIVEN loggedOffState WHEN opened after some time THEN AuthActivity is started */ @Test fun loggedOutStatesNavigatesToAuthentication() { - SetupLoggedInState.setupLogout() - + splashRobot.setupLoggedOutState(mainDispatcherTestRule) activityScenario = ActivityScenario.launch(SplashActivity::class.java) activityScenario.moveToState(Lifecycle.State.RESUMED) @@ -89,8 +85,7 @@ class SplashActivityTest : KoinTest { /** GIVEN loggedOffState and not enough time WHEN opened THEN no activity is started */ @Test fun loggedOutStatesNotEnoughTime() { - SetupLoggedInState.setupLogout() - + splashRobot.setupLoggedOutState(mainDispatcherTestRule) activityScenario = ActivityScenario.launch(SplashActivity::class.java) activityScenario.moveToState(Lifecycle.State.RESUMED) @@ -103,7 +98,7 @@ class SplashActivityTest : KoinTest { /** GIVEN loggedInState and not enough time WHEN opened THEN no activity is started */ @Test fun loggedInStatesNotEnoughTime() { - SetupLoggedInState.setupLogin(mockServerScenarioSetupTestRule.mockServerScenarioSetup) + splashRobot.setupLoggedInState(mainDispatcherTestRule, mockServerScenarioSetupTestRule.mockServerScenarioSetup) activityScenario = ActivityScenario.launch(SplashActivity::class.java) activityScenario.moveToState(Lifecycle.State.RESUMED) @@ -112,7 +107,5 @@ class SplashActivityTest : KoinTest { splashRobot.assertHomeIsNotStarted() .assertAuthIsNotStarted() - - SetupLoggedInState.setupLogout() } }