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