From 4c35ba2dab231e28168454daba00336bc5ba1441 Mon Sep 17 00:00:00 2001 From: Juraj Kusnier <jurajkusnier@users.noreply.github.com> Date: Fri, 15 Jan 2021 12:10:35 +0100 Subject: [PATCH] Create automated app screenshots - Submission flow QR-Code/TAN (EXPOSUREAPP-2997) #2080 * Make Screenshots from Submission Tests * Fix test crash after language change * Implement missing submission flow screenshot tests * Hide keyboard in SubmissionTanFragmentTest * remove SubmissionQrCodeScanFragmentTest implementation * fix TestApplication implementation * introduce SCREENSHOT_DELAY_TIME * Code refactoring * fix merge error * Implement SubmissionYourConsentFragment screenshots * Implement SubmissionSymptomCalendarFragment screenshots * Implement SubmissionConsentFragmentTest screenshots --- .../SubmissionConsentFragmentTest.kt | 67 +++++++++++++ .../SubmissionContactFragmentTest.kt | 29 +++++- .../SubmissionDispatcherFragmentTest.kt | 38 ++++++-- .../SubmissionSymptomCalendarFragmentTest.kt | 95 +++++++++++++++++++ .../SubmissionSymptomIntroFragmentTest.kt | 44 ++++++++- .../submission/SubmissionTanFragmentTest.kt | 63 +++++++++++- ...bmissionTestResultAvailableFragmentTest.kt | 89 +++++++++++++++++ ...ssionTestResultConsentGivenFragmentTest.kt | 49 +++++++++- .../SubmissionTestResultFragmentTest.kt | 57 ++++++++++- ...ubmissionTestResultNegativeFragmentTest.kt | 86 +++++++++++++++++ ...ionTestResultNoConsentGivenFragmentTest.kt | 77 +++++++++++++++ .../SubmissionYourConsentFragmentTest.kt | 71 ++++++++++++++ .../FragmentTestModuleRegistrar.kt | 12 +++ .../java/testhelpers/TestExtensions.kt | 13 +++ 14 files changed, 769 insertions(+), 21 deletions(-) create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionConsentFragmentTest.kt create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomCalendarFragmentTest.kt create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultAvailableFragmentTest.kt create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNegativeFragmentTest.kt create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionYourConsentFragmentTest.kt diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionConsentFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionConsentFragmentTest.kt new file mode 100644 index 000000000..aa8dbed36 --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionConsentFragmentTest.kt @@ -0,0 +1,67 @@ +package de.rki.coronawarnapp.ui.submission + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import dagger.Module +import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.qrcode.consent.SubmissionConsentFragment +import de.rki.coronawarnapp.ui.submission.qrcode.consent.SubmissionConsentViewModel +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.flow.flowOf +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule + +@RunWith(AndroidJUnit4::class) +class SubmissionConsentFragmentTest : BaseUITest() { + + @MockK lateinit var submissionRepository: SubmissionRepository + @MockK lateinit var interoperabilityRepository: InteroperabilityRepository + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private lateinit var viewModel: SubmissionConsentViewModel + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + every { interoperabilityRepository.countryList } returns flowOf() + viewModel = SubmissionConsentViewModel(submissionRepository, interoperabilityRepository, TestDispatcherProvider) + setupMockViewModel(object : SubmissionConsentViewModel.Factory { + override fun create(): SubmissionConsentViewModel = viewModel + }) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + @Screenshot + fun capture_fragment_results() { + captureScreenshot<SubmissionConsentFragment>() + } +} + +@Module +abstract class SubmissionConsentFragmentTestModule { + @ContributesAndroidInjector + abstract fun submissionConsentScreen(): SubmissionConsentFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragmentTest.kt index 5e262d08e..7c5182bb7 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionContactFragmentTest.kt @@ -12,23 +12,34 @@ import de.rki.coronawarnapp.R import de.rki.coronawarnapp.ui.submission.fragment.SubmissionContactFragment import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionContactViewModel import io.mockk.MockKAnnotations -import io.mockk.impl.annotations.MockK import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule @RunWith(AndroidJUnit4::class) class SubmissionContactFragmentTest : BaseUITest() { - @MockK lateinit var viewModel: SubmissionContactViewModel + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private fun createViewModel() = SubmissionContactViewModel() @Before fun setup() { MockKAnnotations.init(this, relaxed = true) setupMockViewModel(object : SubmissionContactViewModel.Factory { - override fun create(): SubmissionContactViewModel = viewModel + override fun create(): SubmissionContactViewModel = createViewModel() }) } @@ -42,7 +53,8 @@ class SubmissionContactFragmentTest : BaseUITest() { launchFragment<SubmissionContactFragment>() } - @Test fun testContactCallClicked() { + @Test + fun testContactCallClicked() { val scenario = launchFragmentInContainer<SubmissionContactFragment>() onView(withId(R.id.submission_contact_button_call)) .perform(click()) @@ -50,13 +62,20 @@ class SubmissionContactFragmentTest : BaseUITest() { // TODO verify result } - @Test fun testContactEnterTanClicked() { + @Test + fun testContactEnterTanClicked() { val scenario = launchFragmentInContainer<SubmissionContactFragment>() onView(withId(R.id.submission_contact_button_enter)) .perform(click()) // TODO verify result } + + @Test + @Screenshot + fun capture_fragment() { + captureScreenshot<SubmissionContactFragment>() + } } @Module diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragmentTest.kt index fc417a990..6d9559b36 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionDispatcherFragmentTest.kt @@ -13,23 +13,36 @@ import de.rki.coronawarnapp.R import de.rki.coronawarnapp.ui.submission.fragment.SubmissionDispatcherFragment import de.rki.coronawarnapp.ui.submission.viewmodel.SubmissionDispatcherViewModel import io.mockk.MockKAnnotations -import io.mockk.impl.annotations.MockK import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest +import testhelpers.SCREENSHOT_DELAY_TIME +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.Screengrab +import tools.fastlane.screengrab.locale.LocaleTestRule @RunWith(AndroidJUnit4::class) class SubmissionDispatcherFragmentTest : BaseUITest() { - @MockK lateinit var viewModel: SubmissionDispatcherViewModel + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private fun createViewModel() = SubmissionDispatcherViewModel() @Before fun setup() { MockKAnnotations.init(this, relaxed = true) setupMockViewModel(object : SubmissionDispatcherViewModel.Factory { - override fun create(): SubmissionDispatcherViewModel = viewModel + override fun create(): SubmissionDispatcherViewModel = createViewModel() }) } @@ -43,7 +56,8 @@ class SubmissionDispatcherFragmentTest : BaseUITest() { launchFragment<SubmissionDispatcherFragment>() } - @Test fun testEventQRClicked() { + @Test + fun testEventQRClicked() { val scenario = launchFragmentInContainer<SubmissionDispatcherFragment>() onView(withId(R.id.submission_dispatcher_qr)) .perform(scrollTo()) @@ -52,7 +66,8 @@ class SubmissionDispatcherFragmentTest : BaseUITest() { // TODO verify result } - @Test fun testEventTeleClicked() { + @Test + fun testEventTeleClicked() { val scenario = launchFragmentInContainer<SubmissionDispatcherFragment>() onView(withId(R.id.submission_dispatcher_tan_tele)) .perform(scrollTo()) @@ -61,7 +76,8 @@ class SubmissionDispatcherFragmentTest : BaseUITest() { // TODO verify result } - @Test fun testEventTanClicked() { + @Test + fun testEventTanClicked() { val scenario = launchFragmentInContainer<SubmissionDispatcherFragment>() onView(withId(R.id.submission_dispatcher_tan_code)) .perform(scrollTo()) @@ -69,6 +85,16 @@ class SubmissionDispatcherFragmentTest : BaseUITest() { // TODO verify result } + + @Test + @Screenshot + fun capture_fragment() { + captureScreenshot<SubmissionDispatcherFragment>() + onView(withId(R.id.submission_dispatcher_tan_tele)) + .perform(scrollTo()) + Thread.sleep(SCREENSHOT_DELAY_TIME) + Screengrab.screenshot(SubmissionDispatcherFragment::class.simpleName.plus("2")) + } } @Module diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomCalendarFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomCalendarFragmentTest.kt new file mode 100644 index 000000000..a2ad56bdd --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomCalendarFragmentTest.kt @@ -0,0 +1,95 @@ +package de.rki.coronawarnapp.ui.submission + +import androidx.lifecycle.MutableLiveData +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.ext.junit.runners.AndroidJUnit4 +import dagger.Module +import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.submission.Symptoms +import de.rki.coronawarnapp.submission.auto.AutoSubmission +import de.rki.coronawarnapp.ui.submission.symptoms.calendar.SubmissionSymptomCalendarFragment +import de.rki.coronawarnapp.ui.submission.symptoms.calendar.SubmissionSymptomCalendarFragmentArgs +import de.rki.coronawarnapp.ui.submission.symptoms.calendar.SubmissionSymptomCalendarViewModel +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.spyk +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.SCREENSHOT_DELAY_TIME +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.Screengrab +import tools.fastlane.screengrab.locale.LocaleTestRule + +@RunWith(AndroidJUnit4::class) +class SubmissionSymptomCalendarFragmentTest : BaseUITest() { + + @MockK lateinit var submissionRepository: SubmissionRepository + @MockK lateinit var autoSubmission: AutoSubmission + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private lateinit var viewModel: SubmissionSymptomCalendarViewModel + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + viewModel = spyk( + SubmissionSymptomCalendarViewModel( + Symptoms.Indication.POSITIVE, + TestDispatcherProvider, + submissionRepository, + autoSubmission + ) + ) + with(viewModel) { + every { symptomStart } returns MutableLiveData(Symptoms.StartOf.LastSevenDays) + } + setupMockViewModel(object : SubmissionSymptomCalendarViewModel.Factory { + override fun create(symptomIndication: Symptoms.Indication): SubmissionSymptomCalendarViewModel = viewModel + }) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + @Screenshot + fun capture_fragment() { + captureScreenshot<SubmissionSymptomCalendarFragment>( + fragmentArgs = SubmissionSymptomCalendarFragmentArgs( + Symptoms.Indication.POSITIVE + ).toBundle() + ) + + onView(ViewMatchers.withId(R.id.symptom_button_next)) + .perform(ViewActions.scrollTo()) + + Thread.sleep(SCREENSHOT_DELAY_TIME) + Screengrab.screenshot(SubmissionSymptomCalendarFragment::class.simpleName.plus("2")) + } +} + +@Module +abstract class SubmissionSymptomCalendarFragmentTestModule { + @ContributesAndroidInjector + abstract fun submissionSymptomIntroScreen(): SubmissionSymptomCalendarFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomIntroFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomIntroFragmentTest.kt index ed959a210..4b8224920 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomIntroFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionSymptomIntroFragmentTest.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.ui.submission import androidx.fragment.app.testing.launchFragment import androidx.fragment.app.testing.launchFragmentInContainer +import androidx.lifecycle.MutableLiveData import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.scrollTo @@ -10,24 +11,52 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.submission.Symptoms +import de.rki.coronawarnapp.submission.auto.AutoSubmission import de.rki.coronawarnapp.ui.submission.symptoms.introduction.SubmissionSymptomIntroductionFragment import de.rki.coronawarnapp.ui.submission.symptoms.introduction.SubmissionSymptomIntroductionViewModel import io.mockk.MockKAnnotations +import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.spyk import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest +import testhelpers.SCREENSHOT_DELAY_TIME +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.Screengrab +import tools.fastlane.screengrab.locale.LocaleTestRule @RunWith(AndroidJUnit4::class) class SubmissionSymptomIntroFragmentTest : BaseUITest() { - @MockK lateinit var viewModel: SubmissionSymptomIntroductionViewModel + @MockK lateinit var submissionRepository: SubmissionRepository + @MockK lateinit var autoSubmission: AutoSubmission + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private lateinit var viewModel: SubmissionSymptomIntroductionViewModel @Before fun setup() { MockKAnnotations.init(this, relaxed = true) + viewModel = + spyk(SubmissionSymptomIntroductionViewModel(TestDispatcherProvider, submissionRepository, autoSubmission)) + with(viewModel) { + every { symptomIndication } returns MutableLiveData(Symptoms.Indication.POSITIVE) + } setupMockViewModel(object : SubmissionSymptomIntroductionViewModel.Factory { override fun create(): SubmissionSymptomIntroductionViewModel = viewModel }) @@ -43,7 +72,8 @@ class SubmissionSymptomIntroFragmentTest : BaseUITest() { launchFragment<SubmissionSymptomIntroductionFragment>() } - @Test fun testSymptomNextClicked() { + @Test + fun testSymptomNextClicked() { val scenario = launchFragmentInContainer<SubmissionSymptomIntroductionFragment>() onView(withId(R.id.symptom_button_next)) .perform(scrollTo()) @@ -51,6 +81,16 @@ class SubmissionSymptomIntroFragmentTest : BaseUITest() { // TODO verify result } + + @Test + @Screenshot + fun capture_fragment() { + captureScreenshot<SubmissionSymptomIntroductionFragment>() + onView(withId(R.id.symptom_button_next)) + .perform(scrollTo()) + Thread.sleep(SCREENSHOT_DELAY_TIME) + Screengrab.screenshot(SubmissionSymptomIntroductionFragment::class.simpleName.plus("2")) + } } @Module diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragmentTest.kt index b2dc3033d..efe766a2e 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTanFragmentTest.kt @@ -5,33 +5,56 @@ import androidx.fragment.app.testing.launchFragmentInContainer import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.action.ViewActions.scrollTo +import androidx.test.espresso.action.ViewActions.typeText import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.submission.SubmissionRepository import de.rki.coronawarnapp.ui.submission.tan.SubmissionTanFragment import de.rki.coronawarnapp.ui.submission.tan.SubmissionTanViewModel import io.mockk.MockKAnnotations import io.mockk.impl.annotations.MockK import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest +import testhelpers.SCREENSHOT_DELAY_TIME +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.launchFragmentInContainer2 +import tools.fastlane.screengrab.Screengrab +import tools.fastlane.screengrab.locale.LocaleTestRule @RunWith(AndroidJUnit4::class) class SubmissionTanFragmentTest : BaseUITest() { - @MockK lateinit var viewModel: SubmissionTanViewModel + @MockK lateinit var submissionRepository: SubmissionRepository + + private fun createViewModel() = SubmissionTanViewModel( + dispatcherProvider = TestDispatcherProvider, + submissionRepository = submissionRepository + ) + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() @Before fun setup() { MockKAnnotations.init(this, relaxed = true) setupMockViewModel(object : SubmissionTanViewModel.Factory { - override fun create(): SubmissionTanViewModel = viewModel + override fun create(): SubmissionTanViewModel = createViewModel() }) } @@ -45,7 +68,8 @@ class SubmissionTanFragmentTest : BaseUITest() { launchFragment<SubmissionTanFragment>() } - @Test fun testEventTanNextClicked() { + @Test + fun testEventTanNextClicked() { val scenario = launchFragmentInContainer<SubmissionTanFragment>() ViewActions.closeSoftKeyboard() onView(withId(R.id.submission_tan_button_enter)) @@ -54,6 +78,39 @@ class SubmissionTanFragmentTest : BaseUITest() { // TODO verify result } + + @Test + @Screenshot + fun capture_fragment_empty() { + launchFragmentInContainer2<SubmissionTanFragment>() + onView(withId(R.id.tan_input_edittext)) + .perform(click()) + .perform(closeSoftKeyboard()) + Thread.sleep(SCREENSHOT_DELAY_TIME) + Screengrab.screenshot(SubmissionTanFragment::class.simpleName) + } + + @Test + @Screenshot + fun capture_fragment_done() { + launchFragmentInContainer2<SubmissionTanFragment>() + onView(withId(R.id.tan_input_edittext)) + .perform(click()) + .perform(typeText("AC9UHD65AF"), closeSoftKeyboard()) + Thread.sleep(SCREENSHOT_DELAY_TIME) + Screengrab.screenshot(SubmissionTanFragment::class.simpleName.plus("_done")) + } + + @Test + @Screenshot + fun capture_fragment_invalid() { + launchFragmentInContainer2<SubmissionTanFragment>() + onView(withId(R.id.tan_input_edittext)) + .perform(click()) + .perform(typeText("AC9U0"), closeSoftKeyboard()) + Thread.sleep(SCREENSHOT_DELAY_TIME) + Screengrab.screenshot(SubmissionTanFragment::class.simpleName.plus("_invalid")) + } } @Module diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultAvailableFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultAvailableFragmentTest.kt new file mode 100644 index 000000000..b0370de7b --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultAvailableFragmentTest.kt @@ -0,0 +1,89 @@ +package de.rki.coronawarnapp.ui.submission + +import androidx.lifecycle.MutableLiveData +import androidx.test.ext.junit.runners.AndroidJUnit4 +import dagger.Module +import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.submission.auto.AutoSubmission +import de.rki.coronawarnapp.submission.data.tekhistory.TEKHistoryUpdater_AssistedFactory +import de.rki.coronawarnapp.ui.submission.resultavailable.SubmissionTestResultAvailableFragment +import de.rki.coronawarnapp.ui.submission.resultavailable.SubmissionTestResultAvailableViewModel +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.spyk +import kotlinx.coroutines.flow.flowOf +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule + +@RunWith(AndroidJUnit4::class) +class SubmissionTestResultAvailableFragmentTest : BaseUITest() { + + lateinit var viewModel: SubmissionTestResultAvailableViewModel + @MockK lateinit var submissionRepository: SubmissionRepository + @MockK lateinit var tekHistoryUpdaterFactory: TEKHistoryUpdater_AssistedFactory + @MockK lateinit var autoSubmission: AutoSubmission + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + + every { submissionRepository.deviceUIStateFlow } returns flowOf() + every { submissionRepository.testResultReceivedDateFlow } returns flowOf() + + viewModel = spyk( + SubmissionTestResultAvailableViewModel( + TestDispatcherProvider, + tekHistoryUpdaterFactory, + submissionRepository, + autoSubmission + ) + ) + + setupMockViewModel(object : SubmissionTestResultAvailableViewModel.Factory { + override fun create(): SubmissionTestResultAvailableViewModel = viewModel + }) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + @Screenshot + fun capture_fragment_with_consent() { + every { viewModel.consent } returns MutableLiveData(true) + captureScreenshot<SubmissionTestResultAvailableFragment>("_consent") + } + + @Test + @Screenshot + fun capture_fragment_without_consent() { + every { viewModel.consent } returns MutableLiveData(false) + captureScreenshot<SubmissionTestResultAvailableFragment>("_no_consent") + } +} + +@Module +abstract class SubmissionTestResultTestAvailableModule { + @ContributesAndroidInjector + abstract fun submissionTestResultScreen(): SubmissionTestResultAvailableFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultConsentGivenFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultConsentGivenFragmentTest.kt index ff0c72094..87c51b46a 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultConsentGivenFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultConsentGivenFragmentTest.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.ui.submission import androidx.fragment.app.testing.launchFragment import androidx.fragment.app.testing.launchFragmentInContainer +import androidx.lifecycle.MutableLiveData import androidx.navigation.NavController import androidx.navigation.Navigation import androidx.test.espresso.Espresso.onView @@ -11,26 +12,58 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.submission.auto.AutoSubmission +import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState import de.rki.coronawarnapp.ui.submission.testresult.positive.SubmissionTestResultConsentGivenFragment import de.rki.coronawarnapp.ui.submission.testresult.positive.SubmissionTestResultConsentGivenViewModel +import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.NetworkRequestWrapper import io.mockk.MockKAnnotations +import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.mockk +import io.mockk.spyk import io.mockk.verify import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule +import java.util.Date @RunWith(AndroidJUnit4::class) class SubmissionTestResultConsentGivenFragmentTest : BaseUITest() { - @MockK lateinit var viewModel: SubmissionTestResultConsentGivenViewModel + @MockK lateinit var submissionRepository: SubmissionRepository + @MockK lateinit var autoSubmission: AutoSubmission + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private lateinit var viewModel: SubmissionTestResultConsentGivenViewModel @Before fun setup() { MockKAnnotations.init(this, relaxed = true) + viewModel = + spyk( + SubmissionTestResultConsentGivenViewModel( + submissionRepository, + autoSubmission, + TestDispatcherProvider + ) + ) setupMockViewModel(object : SubmissionTestResultConsentGivenViewModel.Factory { override fun create(): SubmissionTestResultConsentGivenViewModel = viewModel }) @@ -61,6 +94,20 @@ class SubmissionTestResultConsentGivenFragmentTest : BaseUITest() { mockNavController.navigate(R.id.action_submissionTestResultConsentGivenFragment_to_submissionSymptomIntroductionFragment) } } + + @Test + @Screenshot + fun capture_fragment() { + every { viewModel.uiState } returns MutableLiveData( + TestResultUIState( + NetworkRequestWrapper.RequestSuccessful( + DeviceUIState.PAIRED_POSITIVE + ), Date() + ) + ) + + captureScreenshot<SubmissionTestResultConsentGivenFragment>() + } } @Module diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragmentTest.kt index 7d7a1032e..fcffa1781 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultFragmentTest.kt @@ -10,32 +10,68 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.notification.TestResultNotificationService +import de.rki.coronawarnapp.submission.SubmissionRepository import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState import de.rki.coronawarnapp.ui.submission.testresult.pending.SubmissionTestResultPendingFragment import de.rki.coronawarnapp.ui.submission.testresult.pending.SubmissionTestResultPendingViewModel +import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.NetworkRequestWrapper import io.mockk.MockKAnnotations +import io.mockk.Runs import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.just +import io.mockk.spyk +import kotlinx.coroutines.flow.flowOf import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule +import java.util.Date @RunWith(AndroidJUnit4::class) class SubmissionTestResultFragmentTest : BaseUITest() { - @MockK lateinit var pendingViewModel: SubmissionTestResultPendingViewModel - @MockK lateinit var uiState: TestResultUIState + lateinit var viewModel: SubmissionTestResultPendingViewModel + @MockK lateinit var submissionRepository: SubmissionRepository + @MockK lateinit var testResultNotificationService: TestResultNotificationService + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() @Before fun setup() { MockKAnnotations.init(this, relaxed = true) - every { pendingViewModel.testState } returns MutableLiveData() + every { submissionRepository.deviceUIStateFlow } returns flowOf() + every { submissionRepository.testResultReceivedDateFlow } returns flowOf() + + viewModel = spyk( + SubmissionTestResultPendingViewModel( + TestDispatcherProvider, + testResultNotificationService, + submissionRepository + ) + ) + + with(viewModel) { + every { observeTestResultToSchedulePositiveTestResultReminder() } just Runs + } setupMockViewModel(object : SubmissionTestResultPendingViewModel.Factory { - override fun create(): SubmissionTestResultPendingViewModel = pendingViewModel + override fun create(): SubmissionTestResultPendingViewModel = viewModel }) } @@ -88,6 +124,19 @@ class SubmissionTestResultFragmentTest : BaseUITest() { // TODO verify result } + + @Test + @Screenshot + fun capture_fragment() { + every { viewModel.testState } returns MutableLiveData( + TestResultUIState( + NetworkRequestWrapper.RequestSuccessful( + DeviceUIState.PAIRED_NO_RESULT + ), Date() + ) + ) + captureScreenshot<SubmissionTestResultPendingFragment>() + } } @Module diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNegativeFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNegativeFragmentTest.kt new file mode 100644 index 000000000..8cee4e05b --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNegativeFragmentTest.kt @@ -0,0 +1,86 @@ +package de.rki.coronawarnapp.ui.submission + +import androidx.lifecycle.MutableLiveData +import androidx.test.ext.junit.runners.AndroidJUnit4 +import dagger.Module +import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState +import de.rki.coronawarnapp.ui.submission.testresult.negative.SubmissionTestResultNegativeFragment +import de.rki.coronawarnapp.ui.submission.testresult.negative.SubmissionTestResultNegativeViewModel +import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.NetworkRequestWrapper +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.spyk +import kotlinx.coroutines.flow.flowOf +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule +import java.util.Date + +@RunWith(AndroidJUnit4::class) +class SubmissionTestResultNegativeFragmentTest : BaseUITest() { + + lateinit var viewModel: SubmissionTestResultNegativeViewModel + @MockK lateinit var submissionRepository: SubmissionRepository + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + + every { submissionRepository.deviceUIStateFlow } returns flowOf() + every { submissionRepository.testResultReceivedDateFlow } returns flowOf() + + viewModel = spyk( + SubmissionTestResultNegativeViewModel( + TestDispatcherProvider, + submissionRepository + ) + ) + + setupMockViewModel(object : SubmissionTestResultNegativeViewModel.Factory { + override fun create(): SubmissionTestResultNegativeViewModel = viewModel + }) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + @Screenshot + fun capture_fragment() { + every { viewModel.testResult } returns MutableLiveData( + TestResultUIState( + NetworkRequestWrapper.RequestSuccessful( + DeviceUIState.PAIRED_NEGATIVE + ), Date() + ) + ) + captureScreenshot<SubmissionTestResultNegativeFragment>() + } +} + +@Module +abstract class SubmissionTestResultTestNegativeModule { + @ContributesAndroidInjector + abstract fun submissionTestResultScreen(): SubmissionTestResultNegativeFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt new file mode 100644 index 000000000..7d975ac18 --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt @@ -0,0 +1,77 @@ +package de.rki.coronawarnapp.ui.submission + +import androidx.lifecycle.MutableLiveData +import androidx.test.ext.junit.runners.AndroidJUnit4 +import dagger.Module +import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState +import de.rki.coronawarnapp.ui.submission.testresult.positive.SubmissionTestResultNoConsentFragment +import de.rki.coronawarnapp.ui.submission.testresult.positive.SubmissionTestResultNoConsentViewModel +import de.rki.coronawarnapp.util.DeviceUIState +import de.rki.coronawarnapp.util.NetworkRequestWrapper +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.spyk +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule +import java.util.Date + +@RunWith(AndroidJUnit4::class) +class SubmissionTestResultNoConsentGivenFragmentTest : BaseUITest() { + + @MockK lateinit var submissionRepository: SubmissionRepository + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private lateinit var viewModel: SubmissionTestResultNoConsentViewModel + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + viewModel = + spyk(SubmissionTestResultNoConsentViewModel(submissionRepository)) + setupMockViewModel(object : SubmissionTestResultNoConsentViewModel.Factory { + override fun create(): SubmissionTestResultNoConsentViewModel = viewModel + }) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + @Screenshot + fun capture_fragment() { + every { viewModel.uiState } returns MutableLiveData( + TestResultUIState( + NetworkRequestWrapper.RequestSuccessful( + DeviceUIState.PAIRED_POSITIVE + ), Date() + ) + ) + + captureScreenshot<SubmissionTestResultNoConsentFragment>() + } +} + +@Module +abstract class SubmissionTestResultNoConsentModel { + @ContributesAndroidInjector + abstract fun submissionTestResultScreen(): SubmissionTestResultNoConsentFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionYourConsentFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionYourConsentFragmentTest.kt new file mode 100644 index 000000000..909eb1c5d --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionYourConsentFragmentTest.kt @@ -0,0 +1,71 @@ +package de.rki.coronawarnapp.ui.submission + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import dagger.Module +import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository +import de.rki.coronawarnapp.submission.SubmissionRepository +import de.rki.coronawarnapp.ui.submission.yourconsent.SubmissionYourConsentFragment +import de.rki.coronawarnapp.ui.submission.yourconsent.SubmissionYourConsentFragmentArgs +import de.rki.coronawarnapp.ui.submission.yourconsent.SubmissionYourConsentViewModel +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.flow.flowOf +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider +import testhelpers.captureScreenshot +import tools.fastlane.screengrab.locale.LocaleTestRule + +@RunWith(AndroidJUnit4::class) +class SubmissionYourConsentFragmentTest : BaseUITest() { + + @MockK lateinit var submissionRepository: SubmissionRepository + @MockK lateinit var interoperabilityRepository: InteroperabilityRepository + + @Rule + @JvmField + val localeTestRule = LocaleTestRule() + + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + + private lateinit var viewModel: SubmissionYourConsentViewModel + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + every { submissionRepository.hasGivenConsentToSubmission } returns flowOf() + viewModel = + SubmissionYourConsentViewModel(TestDispatcherProvider, interoperabilityRepository, submissionRepository) + setupMockViewModel(object : SubmissionYourConsentViewModel.Factory { + override fun create(): SubmissionYourConsentViewModel = viewModel + }) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + @Screenshot + fun capture_fragment_results() { + captureScreenshot<SubmissionYourConsentFragment>( + fragmentArgs = SubmissionYourConsentFragmentArgs(true).toBundle() + ) + } +} + +@Module +abstract class SubmissionYourConsentFragmentTestModule { + @ContributesAndroidInjector + abstract fun submissionYourConsentScreen(): SubmissionYourConsentFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt index 436786aa9..ba8f5e736 100644 --- a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt +++ b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt @@ -8,13 +8,19 @@ import de.rki.coronawarnapp.ui.onboarding.OnboardingNotificationsTestModule import de.rki.coronawarnapp.ui.onboarding.OnboardingPrivacyTestModule import de.rki.coronawarnapp.ui.onboarding.OnboardingTestFragmentModule import de.rki.coronawarnapp.ui.onboarding.OnboardingTracingFragmentTestModule +import de.rki.coronawarnapp.ui.submission.SubmissionConsentFragmentTestModule import de.rki.coronawarnapp.ui.submission.SubmissionContactTestModule import de.rki.coronawarnapp.ui.submission.SubmissionDispatcherTestModule import de.rki.coronawarnapp.ui.submission.SubmissionQRScanFragmentModule +import de.rki.coronawarnapp.ui.submission.SubmissionSymptomCalendarFragmentTestModule import de.rki.coronawarnapp.ui.submission.SubmissionSymptomIntroFragmentTestModule import de.rki.coronawarnapp.ui.submission.SubmissionTanTestModule import de.rki.coronawarnapp.ui.submission.SubmissionTestResultConsentGivenTestModule +import de.rki.coronawarnapp.ui.submission.SubmissionTestResultNoConsentModel +import de.rki.coronawarnapp.ui.submission.SubmissionTestResultTestAvailableModule import de.rki.coronawarnapp.ui.submission.SubmissionTestResultTestModule +import de.rki.coronawarnapp.ui.submission.SubmissionTestResultTestNegativeModule +import de.rki.coronawarnapp.ui.submission.SubmissionYourConsentFragmentTestModule import de.rki.coronawarnapp.ui.tracing.TracingDetailsFragmentTestTestModule @Module( @@ -31,10 +37,16 @@ import de.rki.coronawarnapp.ui.tracing.TracingDetailsFragmentTestTestModule SubmissionDispatcherTestModule::class, SubmissionTanTestModule::class, SubmissionTestResultTestModule::class, + SubmissionTestResultTestNegativeModule::class, + SubmissionTestResultTestAvailableModule::class, + SubmissionTestResultNoConsentModel::class, SubmissionTestResultConsentGivenTestModule::class, SubmissionSymptomIntroFragmentTestModule::class, SubmissionContactTestModule::class, SubmissionQRScanFragmentModule::class, + SubmissionConsentFragmentTestModule::class, + SubmissionYourConsentFragmentTestModule::class, + SubmissionSymptomCalendarFragmentTestModule::class, // Tracing TracingDetailsFragmentTestTestModule::class ] diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/TestExtensions.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/TestExtensions.kt index 9dc088f42..303faa4aa 100644 --- a/Corona-Warn-App/src/androidTest/java/testhelpers/TestExtensions.kt +++ b/Corona-Warn-App/src/androidTest/java/testhelpers/TestExtensions.kt @@ -6,6 +6,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentFactory import androidx.fragment.app.testing.FragmentScenario import de.rki.coronawarnapp.R +import tools.fastlane.screengrab.Screengrab /** Delay time before taking screenshot */ @@ -26,3 +27,15 @@ inline fun <reified F : Fragment> launchFragmentInContainer2( @StyleRes themeResId: Int = R.style.AppTheme, factory: FragmentFactory? = null ) = FragmentScenario.launchInContainer(F::class.java, fragmentArgs, themeResId, factory) + +inline fun <reified F : Fragment> captureScreenshot( + suffix: String = "", + fragmentArgs: Bundle? = null, + @StyleRes themeResId: Int = R.style.AppTheme, + factory: FragmentFactory? = null +) { + val name = F::class.simpleName.plus(suffix) + launchFragmentInContainer2<F>(fragmentArgs, themeResId, factory) + Thread.sleep(SCREENSHOT_DELAY_TIME) + Screengrab.screenshot(name) +} -- GitLab