From c1af9df40f358854cefeccad9e13d0a208d69f7e Mon Sep 17 00:00:00 2001 From: Juraj Kusnier <jurajkusnier@users.noreply.github.com> Date: Thu, 10 Jun 2021 09:23:15 +0200 Subject: [PATCH] Certificates screenshots (EXPOSUREAPP-7444) (#3390) * CertificatesFragmentTest * CovidCertificateDetailsFragmentTest * update name formatting in CovidCertificateDetailsFragment * Use Max instead of Andrea * Use Max instead of Andrea * date update * Fix test after merge Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../test/ui/CertificatesFragmentTest.kt | 196 ++++++++++++++++++ .../ui/CovidCertificateDetailsFragmentTest.kt | 143 +++++++++++++ .../FragmentTestModuleRegistrar.kt | 4 + .../CovidCertificateDetailsFragment.kt | 2 +- 4 files changed, 344 insertions(+), 1 deletion(-) create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentTest.kt create mode 100644 Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CovidCertificateDetailsFragmentTest.kt diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentTest.kt new file mode 100644 index 000000000..9d1d1223d --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CertificatesFragmentTest.kt @@ -0,0 +1,196 @@ +package de.rki.coronawarnapp.covidcertificate.test.ui + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.test.espresso.Espresso +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.covidcertificate.test.ui.cards.CovidTestCertificateCard +import de.rki.coronawarnapp.covidcertificate.test.ui.cards.CovidTestCertificateErrorCard +import de.rki.coronawarnapp.covidcertificate.test.ui.items.CertificatesItem +import de.rki.coronawarnapp.covidcertificate.vaccination.core.VaccinatedPerson +import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.CreateVaccinationCard +import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.HeaderInfoVaccinationCard +import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.ImmuneVaccinationCard +import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.NoCovidTestCertificatesCard +import de.rki.coronawarnapp.covidcertificate.vaccination.ui.cards.VaccinationCard +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import org.joda.time.DateTime +import org.joda.time.Duration +import org.joda.time.format.DateTimeFormat +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.launchFragment2 +import testhelpers.launchInMainActivity +import testhelpers.selectBottomNavTab +import testhelpers.takeScreenshot + +@RunWith(AndroidJUnit4::class) +class CertificatesFragmentTest : BaseUITest() { + + @MockK lateinit var viewModel: CertificatesViewModel + @MockK lateinit var vaccinatedPerson: VaccinatedPerson + + private val formatter = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm") + private val testDate = DateTime.parse("12.05.2021 19:00", formatter).toInstant() + + @Before + fun setup() { + MockKAnnotations.init(this, relaxed = true) + every { vaccinatedPerson.fullName } returns "Max Mustermann" + every { vaccinatedPerson.getMostRecentVaccinationCertificate.expiresAt } returns + testDate.plus(Duration.standardDays(365)).toInstant() + + setupMockViewModel( + object : CertificatesViewModel.Factory { + override fun create(): CertificatesViewModel = viewModel + } + ) + } + + @After + fun teardown() { + clearAllViewModels() + } + + @Test + fun launch_fragment() { + launchFragment2<CertificatesFragment>() + } + + @Screenshot + @Test + fun capture_screenshot_empty() { + every { viewModel.screenItems } returns getEmptyScreenItems() + + takeScreenshotInMainActivity() + } + + private fun getEmptyScreenItems(): LiveData<List<CertificatesItem>> { + return MutableLiveData( + listOf( + HeaderInfoVaccinationCard.Item, + CreateVaccinationCard.Item {}, + NoCovidTestCertificatesCard.Item + ) + ) + } + + @Screenshot + @Test + fun capture_screenshot_vaccination_incomplete() { + every { vaccinatedPerson.getVaccinationStatus() } returns VaccinatedPerson.Status.INCOMPLETE + every { viewModel.screenItems } returns getVaccinationIncompleteScreenItems() + + takeScreenshotInMainActivity("incomplete") + } + + private fun getVaccinationIncompleteScreenItems(): LiveData<List<CertificatesItem>> { + return MutableLiveData( + listOf( + HeaderInfoVaccinationCard.Item, + VaccinationCard.Item( + vaccinatedPerson = vaccinatedPerson, + onClickAction = {} + ), + NoCovidTestCertificatesCard.Item + ) + ) + } + + @Screenshot + @Test + fun capture_screenshot_vaccination_complete() { + every { vaccinatedPerson.getVaccinationStatus() } returns VaccinatedPerson.Status.IMMUNITY + every { viewModel.screenItems } returns getVaccinationImmuneScreenItems() + + takeScreenshotInMainActivity("immune") + } + + private fun getVaccinationImmuneScreenItems(): LiveData<List<CertificatesItem>> { + return MutableLiveData( + listOf( + HeaderInfoVaccinationCard.Item, + ImmuneVaccinationCard.Item( + vaccinatedPerson = vaccinatedPerson, + onClickAction = {} + ), + NoCovidTestCertificatesCard.Item + ) + ) + } + + @Screenshot + @Test + fun capture_screenshot_green_certificate() { + every { vaccinatedPerson.getVaccinationStatus() } returns VaccinatedPerson.Status.IMMUNITY + every { viewModel.screenItems } returns getVaccinationGreenCertScreenItems() + + takeScreenshotInMainActivity("green") + } + + private fun getVaccinationGreenCertScreenItems(): LiveData<List<CertificatesItem>> { + return MutableLiveData( + listOf( + HeaderInfoVaccinationCard.Item, + ImmuneVaccinationCard.Item( + vaccinatedPerson = vaccinatedPerson, + onClickAction = {} + ), + CovidTestCertificateCard.Item( + testDate = testDate, + testPerson = "Max Mustermann" + ) { } + ) + ) + } + + @Screenshot + @Test + fun capture_screenshot_pending_certificate() { + every { vaccinatedPerson.getVaccinationStatus() } returns VaccinatedPerson.Status.IMMUNITY + every { viewModel.screenItems } returns getVaccinationPendingCertScreenItems() + + takeScreenshotInMainActivity("pending") + } + + private fun getVaccinationPendingCertScreenItems(): LiveData<List<CertificatesItem>> { + return MutableLiveData( + listOf( + HeaderInfoVaccinationCard.Item, + ImmuneVaccinationCard.Item( + vaccinatedPerson = vaccinatedPerson, + onClickAction = {} + ), + CovidTestCertificateErrorCard.Item( + testDate = testDate, + isUpdatingData = false, + onRetryAction = {}, + onDeleteAction = {} + ) + ) + ) + } + + private fun takeScreenshotInMainActivity(suffix: String = "") { + launchInMainActivity<CertificatesFragment>() + Espresso.onView(ViewMatchers.withId(R.id.fake_bottom_navigation)) + .perform(selectBottomNavTab(R.id.green_certificate_graph)) + takeScreenshot<CertificatesFragment>(suffix) + } +} + +@Module +abstract class CertificatesFragmentTestModule { + @ContributesAndroidInjector + abstract fun certificatesFragment(): CertificatesFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CovidCertificateDetailsFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CovidCertificateDetailsFragmentTest.kt new file mode 100644 index 000000000..ec0076572 --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/covidcertificate/test/ui/CovidCertificateDetailsFragmentTest.kt @@ -0,0 +1,143 @@ +package de.rki.coronawarnapp.covidcertificate.test.ui + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.test.core.app.ApplicationProvider +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.swipeUp +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.covidcertificate.common.certificate.CertificatePersonIdentifier +import de.rki.coronawarnapp.covidcertificate.common.qrcode.QrCodeString +import de.rki.coronawarnapp.covidcertificate.test.core.TestCertificate +import de.rki.coronawarnapp.covidcertificate.test.core.storage.TestCertificateIdentifier +import de.rki.coronawarnapp.covidcertificate.test.ui.details.CovidCertificateDetailsFragment +import de.rki.coronawarnapp.covidcertificate.test.ui.details.CovidCertificateDetailsFragmentArgs +import de.rki.coronawarnapp.covidcertificate.test.ui.details.CovidCertificateDetailsViewModel +import io.mockk.MockKAnnotations +import io.mockk.every +import io.mockk.impl.annotations.MockK +import org.joda.time.DateTime +import org.joda.time.Instant +import org.joda.time.LocalDate +import org.joda.time.format.DateTimeFormat +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import testhelpers.BaseUITest +import testhelpers.Screenshot +import testhelpers.launchFragment2 +import testhelpers.launchFragmentInContainer2 +import testhelpers.takeScreenshot + +@RunWith(AndroidJUnit4::class) +class VaccinationDetailsFragmentTest : BaseUITest() { + + @MockK lateinit var vaccinationDetailsViewModel: CovidCertificateDetailsViewModel + @MockK lateinit var certificatePersonIdentifier: CertificatePersonIdentifier + + private val args = CovidCertificateDetailsFragmentArgs("testCertificateIdentifier").toBundle() + + @Before + fun setUp() { + MockKAnnotations.init(this, relaxed = true) + + every { vaccinationDetailsViewModel.qrCode } returns bitmapLiveDate() + + setupMockViewModel( + object : CovidCertificateDetailsViewModel.Factory { + override fun create(testCertificateIdentifier: TestCertificateIdentifier): + CovidCertificateDetailsViewModel = vaccinationDetailsViewModel + } + ) + } + + @Test + fun launch_fragment() { + launchFragment2<CovidCertificateDetailsFragment>(fragmentArgs = args) + } + + @Screenshot + @Test + fun capture_screenshot_incomplete() { + every { vaccinationDetailsViewModel.covidCertificate } returns vaccinationDetailsData() + launchFragmentInContainer2<CovidCertificateDetailsFragment>(fragmentArgs = args) + takeScreenshot<CovidCertificateDetailsFragment>() + onView(withId(R.id.coordinator_layout)).perform(swipeUp()) + takeScreenshot<CovidCertificateDetailsFragment>("_2") + } + + private fun bitmapLiveDate(): LiveData<Bitmap> { + val applicationContext = ApplicationProvider.getApplicationContext<Context>() + return MutableLiveData( + BitmapFactory.decodeResource(applicationContext.resources, R.drawable.test_qr_code) + ) + } + + private fun vaccinationDetailsData(): MutableLiveData<TestCertificate> { + val formatter = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm") + val testDate = DateTime.parse("12.05.2021 19:00", formatter).toInstant() + return MutableLiveData( + object : TestCertificate { + override val targetName: String + get() = "Mustermann, Max" + override val testType: String + get() = "SARS-CoV-2-Test" + override val testResult: String + get() = "negative" + override val testName: String + get() = "Xep" + override val testNameAndManufactor: String + get() = "Xup" + override val sampleCollectedAt: Instant + get() = testDate + override val testResultAt: Instant + get() = testDate + override val testCenter: String + get() = "AB123" + override val issuer: String + get() = "G0593048274845483647869576478784" + override val issuedAt: Instant + get() = testDate + override val expiresAt: Instant + get() = testDate + override val qrCode: QrCodeString + get() = "" + override val firstName: String + get() = "Max" + override val lastName: String + get() = "Mustermann" + override val fullName: String + get() = "Mustermann, Max" + override val dateOfBirth: LocalDate + get() = LocalDate.parse("18.04.1943 00:00", formatter) + override val personIdentifier: CertificatePersonIdentifier + get() = certificatePersonIdentifier + override val certificateIssuer: String + get() = "G0593048274845483647869576478784" + override val certificateCountry: String + get() = "Germany" + override val certificateId: String + get() = "05930482748454836478695764787840" + } + ) + } + + @After + fun tearDown() { + clearAllViewModels() + } +} + +@Module +abstract class CovidCertificateDetailsFragmentTestModule { + @ContributesAndroidInjector + abstract fun covidCertificateDetailsFragment(): CovidCertificateDetailsFragment +} diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt index c8d1be3d5..7291b0c93 100644 --- a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt +++ b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt @@ -3,6 +3,8 @@ package testhelpers import dagger.Module import de.rki.coronawarnapp.bugreporting.DebugLogTestModule import de.rki.coronawarnapp.bugreporting.DebugLogUploadTestModule +import de.rki.coronawarnapp.covidcertificate.test.ui.CertificatesFragmentTestModule +import de.rki.coronawarnapp.covidcertificate.test.ui.CovidCertificateDetailsFragmentTestModule import de.rki.coronawarnapp.covidcertificate.vaccination.ui.details.VaccinationDetailsFragmentTestModule import de.rki.coronawarnapp.covidcertificate.vaccination.ui.list.VaccinationListFragmentTestModule import de.rki.coronawarnapp.ui.contactdiary.ContactDiaryDayFragmentTestModule @@ -91,6 +93,8 @@ import de.rki.coronawarnapp.ui.vaccination.VaccinationConsentFragmentTestModule VaccinationConsentFragmentTestModule::class, VaccinationListFragmentTestModule::class, RequestCovidCertificateFragmentTestModule::class, + CertificatesFragmentTestModule::class, + CovidCertificateDetailsFragmentTestModule::class, ] ) class FragmentTestModuleRegistrar diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt index ae32afd19..3e79944b5 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/covidcertificate/test/ui/details/CovidCertificateDetailsFragment.kt @@ -68,7 +68,7 @@ class CovidCertificateDetailsFragment : Fragment(R.layout.fragment_covid_certifi testCertificate.sampleCollectedAt.toShortDayFormat(), testCertificate.sampleCollectedAt.toShortTimeFormat(), ) - name.text = testCertificate.run { "$firstName $lastName" } + name.text = testCertificate.run { "$lastName, $firstName" } birthDate.text = testCertificate.dateOfBirth.toDayFormat() diseaseType.text = testCertificate.targetName testType.text = testCertificate.testType -- GitLab