diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragmentTest.kt index 14a82715c08142c3879fe95ba2bfeb3262a6398c..a63d7dbb9f73319145dd28bc793eab657bde6aec 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragmentTest.kt @@ -13,7 +13,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.R -import de.rki.coronawarnapp.ui.Country import de.rki.coronawarnapp.vaccination.core.VaccinationCertificate import io.mockk.MockKAnnotations import io.mockk.every @@ -104,7 +103,7 @@ class VaccinationDetailsFragmentTest : BaseUITest() { every { vaccineName } returns "Comirnaty (mRNA)" every { vaccineManufacturer } returns "BioNTech" every { certificateIssuer } returns "Landratsamt Musterstadt" - every { certificateCountry } returns Country.DE + every { certificateCountry } returns "Deutschland" every { certificateId } returns "05930482748454836478695764787841" every { expiresAt } returns Instant.parse("2021-05-16T00:00:00.000Z") every { medicalProductName } returns "mRNA" diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt index 98c5018ec7464e0c8301d8cbc1f3287bba641d5e..c0110eb0b0cedcb3ffeb61287ea42431a4db197b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinationCertificate.kt @@ -1,6 +1,5 @@ package de.rki.coronawarnapp.vaccination.core -import de.rki.coronawarnapp.ui.Country import de.rki.coronawarnapp.vaccination.core.qrcode.QrCodeString import org.joda.time.Instant import org.joda.time.LocalDate @@ -20,7 +19,7 @@ interface VaccinationCertificate { val totalSeriesOfDoses: Int val certificateIssuer: String - val certificateCountry: Country + val certificateCountry: String val certificateId: String val personIdentifier: VaccinatedPersonIdentifier diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainer.kt index d9320fb3136e8f1ea406c7f620cc605153b3a077..c286d3d9b4cbd87dc75dfbc8b556b5c6dfc1355d 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainer.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainer.kt @@ -2,7 +2,6 @@ package de.rki.coronawarnapp.vaccination.core.repository.storage import androidx.annotation.Keep import com.google.gson.annotations.SerializedName -import de.rki.coronawarnapp.ui.Country import de.rki.coronawarnapp.vaccination.core.VaccinatedPersonIdentifier import de.rki.coronawarnapp.vaccination.core.VaccinationCertificate import de.rki.coronawarnapp.vaccination.core.certificate.CoseCertificateHeader @@ -16,6 +15,7 @@ import de.rki.coronawarnapp.vaccination.core.server.valueset.VaccinationValueSet import de.rki.coronawarnapp.vaccination.core.server.valueset.getDisplayText import org.joda.time.Instant import org.joda.time.LocalDate +import java.util.Locale @Keep data class VaccinationContainer internal constructor( @@ -81,8 +81,11 @@ data class VaccinationContainer internal constructor( override val certificateIssuer: String get() = vaccination.certificateIssuer - override val certificateCountry: Country - get() = Country.values().singleOrNull { it.code == vaccination.countryOfVaccination } ?: Country.DE + override val certificateCountry: String + get() = Locale( + Locale.getDefault().language, + vaccination.countryOfVaccination.uppercase() + ).displayCountry override val certificateId: String get() = vaccination.uniqueCertificateIdentifier diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragment.kt index c944d7dde805f80855af63332095e61fedb3b9ad..00741c2e220e8de48f1121d1e5274a3a1321d5b3 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/ui/details/VaccinationDetailsFragment.kt @@ -92,7 +92,7 @@ class VaccinationDetailsFragment : Fragment(R.layout.fragment_vaccination_detail vaccineManufacturer.text = certificate.vaccineManufacturer medicalProductName.text = certificate.medicalProductName certificateIssuer.text = certificate.certificateIssuer - certificateCountry.text = certificate.certificateCountry.getLabel(requireContext()) + certificateCountry.text = certificate.certificateCountry certificateId.text = certificate.certificateId title.text = getString( R.string.vaccination_details_title, diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQrCodeTestData.java b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationQrCodeTestData.java similarity index 84% rename from Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQrCodeTestData.java rename to Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationQrCodeTestData.java index 895f159f3203d8ffcfb85775d0d6ca2b1e9b7b97..82558ff23b6f13453b7bfd5f22557633710f2d6f 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQrCodeTestData.java +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationQrCodeTestData.java @@ -1,4 +1,4 @@ -package de.rki.coronawarnapp.vaccination.core.qrcode; +package de.rki.coronawarnapp.vaccination.core; public class VaccinationQrCodeTestData { static public String validVaccinationQrCode = "HC1:6BFOXN*TS0BI$ZD4N9:9S6RCVN5+O30K3/XIV0W23NTDEXWK G2EP4J0BGJLFX3R3VHXK.PJ:2DPF6R:5SVBHABVCNN95SWMPHQUHQN%A0SOE+QQAB-HQ/HQ7IR.SQEEOK9SAI4- 7Y15KBPD34 QWSP0WRGTQFNPLIR.KQNA7N95U/3FJCTG90OARH9P1J4HGZJKBEG%123ZC$0BCI757TLXKIBTV5TN%2LXK-$CH4TSXKZ4S/$K%0KPQ1HEP9.PZE9Q$95:UENEUW6646936HRTO$9KZ56DE/.QC$Q3J62:6LZ6O59++9-G9+E93ZM$96TV6NRN3T59YLQM1VRMP$I/XK$M8PK66YBTJ1ZO8B-S-*O5W41FD$ 81JP%KNEV45G1H*KESHMN2/TU3UQQKE*QHXSMNV25$1PK50C9B/9OK5NE1 9V2:U6A1ELUCT16DEETUM/UIN9P8Q:KPFY1W+UN MUNU8T1PEEG%5TW5A 6YO67N6BBEWED/3LS3N6YU.:KJWKPZ9+CQP2IOMH.PR97QC:ACZAH.SYEDK3EL-FIK9J8JRBC7ADHWQYSK48UNZGG NAVEHWEOSUI2L.9OR8FHB0T5HM7I"; @@ -7,4 +7,5 @@ public class VaccinationQrCodeTestData { static public String certificateMissing = "HC1:NCFNA0%00FFWTWGVLKJ99K83X4C8DTTMMX*4P8B3XK2F3$8JVJG2F3$%IQJG/IC6TAY50.FK6ZK6:ETPCBEC8ZKW.CNWE.Y92OAGY82+8UB8-R7/0A1OA1C9K09UIAW.CE$E7%E7WE KEVKER EB39W4N*6K3/D5$CMPCG/DA8DBB85IAAY8WY8I3DA8D0EC*KE: CZ CO/EZKEZ96446C56GVC*JC1A6NA73W5KF6TF627BSKL*8F.MLCM6$-I99MG$8THRJSCJVM/*V:0EY1QU 77*D9KR$SKIP5S-I2-RA1CC06+CHPYQX96*SUF3WZ36NM3XPK1P8.MAFZ6SHB"; static public String validVaccinationQrCode3 = "HC1:NCFOXN%TS3DH3ZSUZK+.V0ETD%65NL-AH%TAIOOW%I-1W0658WA/UAN9AAT4V22F/8X*G3M9JUPY0BX/KR96R/S09T./0LWTKD33236J3TA3M*4VV2 73-E3ND3DAJ-43%*48YIB73A*G3W19UEBY5:PI0EGSP4*2D$43B+2SEB7:I/2DY73CIBC:G 7376BXBJBAJ UNFMJCRN0H3PQN*E33H3OA70M3FMJIJN523S+0B/S7-SN2H N37J3JFTULJ5CB3ZCIATULV:SNS8F-67N%21Q21$48X2+36D-I/2DBAJDAJCNB-43SZ4RZ4E%5B/9OK53:UCT16DEZIE IE9.M CVCT1+9V*QERU1MK93P5 U02Y9.G9/G9F:QQ28R3U6/V.*NT*QM.SY$N-P1S29 34S0BYBRC.UYS1U%O6QKN*Q5-QFRMLNKNM8JI0EUGP$I/XK$M8-L9KDI:ZH2E4EVS6O0FVAQNJT:EZ6Q%D0*T1.XSDYV0.VI2OKSNODA.BOD:C.OTXS02:M5OGJIF4LHJW7FFJ2NLGFL/EE%CJF+KM%V$AUS:H+NARLK IBMMG"; static public String validVaccinationQrCode4 = "HC1:6BFOXN*TS0BI$ZD.P9UOL97O4-2HH77HRM3DSPTLRR+%3KXH9M9ESIGUBA KWML%6S5B9-+P70Q5VC9:BPCNYKMXEE1JAA/CXGG0JK1WL260X638J3-E3ND3DAJ-43TTTO3HK1H3QBCWNZ83UQJ:T0/8F7V0HKN:Q8.HBV+0SZ4GH00T9UKP0T9WC5PF6846A$Q$76QW6%V98T5$FQMI5DN9QZ5Y0Q$UPE%5MZ5*T57ZA$O7T6LEJOA+MZ55EII-EB1EKC422JBBD0D2K.EJJ14B2MP41WTRZPQEC5L64HX6IAS 8S8FT/MAMXP6QS03L0QIRR97I2HOAXL92L0. KOKG8VG5SI:TU+MMPZ55%PBT1YEGEA7IB65C94JBQ2NLEE:NQ% GC3MXHFLF9OIFN0IZ95LJL80P1FDLW452I8941:HH3M41GTNP8EFUNT$.FTD852IWKP/HLIJL8JF8JF172IMAS EDAHMXFBFBQSKJE72KV$FHJ%3O%6:XM+1QD+T2/VKKER3L3%1THL7MGY.1S:T:GLOX6OCE7+RWYL3.C-L27WNV0G::M74O%K7C50AAEI4"; + static public String qrCodeWithNonsenseCountry = "HC1:NCF3Y28.P-O0PS3JPU7RBWBA2*9VTS/9VZ+PLUOVTJ$EB7W3R9B3VN/3A44E./EZ.6Y8C$.C.IK6MA$00J1TQZ9$9IU+S7HP%X9%*MW09:4WB/5SWB20V5VFBBREWO+GIIUF4+PBZR7MNX/N1JIIML/X3Z.Q67RMB6:BJYE26A5NNL:CIM-A*/UZTM+QO: ACV6212500GUC+KM-5AUYGUD1330PFBA855/SNDPCSOC3KMR9X$DB61.0AESG$:THFGP-M/VI2SG/ 22SS+V8OP3R8LDJ50HR6S94JMN-84Q0C+2/8FUV9HH6N91GB3/YCHN6ALFFZL3M116O/IBU6QKJK/3FMQ0TLK-.UQOO$%A $J%H0%*J:DE6/DOKTG*F605WRK8G7S96JG0 4IF:B9VM0CIBRF/XNBOH9 SGIFJ/2CX593I0GE7FFDEQ6+UO5D+HM/2IDBI.ET/L725IHPKB/T/Q9KRJ* NOWN$6K8VOZIHJ5R29KQWSPYKYSDZRJ+1IVBFGPMXEVY6JIYI/ CVBTJ-FY%MO%RUTF17S:1OL8PVXHRPTUOTK/VF%U%:IR G"; } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt index e5c19e3297000f5c72f776717d2ada42571fa159..ed7422a60be963c8e4ea221ec058229b00887c31 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinationTestData.kt @@ -86,4 +86,11 @@ class VaccinationTestData @Inject constructor( val personAData2Vac1Proof = VaccinatedPersonData( vaccinations = setOf(personAVac1Container, personAVac2Container) ) + + val personWithoutCountryContainer = VaccinationContainer( + scannedAt = Instant.ofEpochMilli(1620062834471), + vaccinationQrCode = VaccinationQrCodeTestData.qrCodeWithNonsenseCountry, + ).apply { + qrCodeExtractor = this@VaccinationTestData.qrCodeExtractor + } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt index 8ac7c076ca5e02c5ac0b93215cb4af2f363a227b..b58dd524e24a8585a079d34e1f10283cb8dfd224 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/qrcode/VaccinationQRCodeExtractorTest.kt @@ -1,6 +1,7 @@ package de.rki.coronawarnapp.vaccination.core.qrcode import de.rki.coronawarnapp.vaccination.core.DaggerVaccinationTestComponent +import de.rki.coronawarnapp.vaccination.core.VaccinationQrCodeTestData import de.rki.coronawarnapp.vaccination.core.certificate.InvalidHealthCertificateException import de.rki.coronawarnapp.vaccination.core.certificate.InvalidHealthCertificateException.ErrorCode.HC_BASE45_DECODING_FAILED import de.rki.coronawarnapp.vaccination.core.certificate.InvalidHealthCertificateException.ErrorCode.HC_ZLIB_DECOMPRESSION_FAILED diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainerTest.kt index 6aaf73ff21566a7612d6f288eb44178045e764f8..4de4d70a1bc0e0c46e29a062df85c07f048a6a29 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainerTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/repository/storage/VaccinationContainerTest.kt @@ -1,6 +1,5 @@ package de.rki.coronawarnapp.vaccination.core.repository.storage -import de.rki.coronawarnapp.ui.Country import de.rki.coronawarnapp.vaccination.core.DaggerVaccinationTestComponent import de.rki.coronawarnapp.vaccination.core.VaccinatedPersonIdentifier import de.rki.coronawarnapp.vaccination.core.VaccinationTestData @@ -8,11 +7,13 @@ import de.rki.coronawarnapp.vaccination.core.server.valueset.VaccinationValueSet import io.kotest.matchers.shouldBe import io.mockk.every import io.mockk.mockk +import io.mockk.mockkObject import org.joda.time.Instant import org.joda.time.LocalDate import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import testhelpers.BaseTest +import java.util.Locale import javax.inject.Inject class VaccinationContainerTest : BaseTest() { @@ -22,6 +23,7 @@ class VaccinationContainerTest : BaseTest() { @BeforeEach fun setup() { DaggerVaccinationTestComponent.factory().create().inject(this) + mockkObject(Locale.getDefault()) } @Test @@ -60,6 +62,7 @@ class VaccinationContainerTest : BaseTest() { @Test fun `mapping to user facing data - valueset is null`() { + every { Locale.getDefault().language } returns "de" testData.personAVac1Container.toVaccinationCertificate(null).apply { firstName shouldBe "Andreas" lastName shouldBe "Astrá Eins" @@ -71,7 +74,7 @@ class VaccinationContainerTest : BaseTest() { doseNumber shouldBe 1 totalSeriesOfDoses shouldBe 2 certificateIssuer shouldBe "Bundesministerium für Gesundheit - Test01" - certificateCountry shouldBe Country.DE + certificateCountry shouldBe "Deutschland" certificateId shouldBe "01DE/00001/1119305005/7T1UG87G61Y7NRXIBQJDTYQ9#S" personIdentifier shouldBe VaccinatedPersonIdentifier( dateOfBirth = LocalDate.parse("1966-11-11"), @@ -107,6 +110,7 @@ class VaccinationContainerTest : BaseTest() { every { mp } returns vpMockk every { ma } returns vpMockk } + every { Locale.getDefault().language } returns "de" testData.personAVac1Container.toVaccinationCertificate(valueSet).apply { firstName shouldBe "Andreas" @@ -119,7 +123,7 @@ class VaccinationContainerTest : BaseTest() { doseNumber shouldBe 1 totalSeriesOfDoses shouldBe 2 certificateIssuer shouldBe "Bundesministerium für Gesundheit - Test01" - certificateCountry shouldBe Country.DE + certificateCountry shouldBe "Deutschland" certificateId shouldBe "01DE/00001/1119305005/7T1UG87G61Y7NRXIBQJDTYQ9#S" personIdentifier shouldBe VaccinatedPersonIdentifier( dateOfBirth = LocalDate.parse("1966-11-11"), @@ -131,4 +135,11 @@ class VaccinationContainerTest : BaseTest() { expiresAt shouldBe Instant.parse("2022-05-11T09:25:00.000Z") } } + + @Test + fun `nonsense country code appears unchanged`() { + testData.personWithoutCountryContainer.toVaccinationCertificate(null).apply { + certificateCountry shouldBe "YY" + } + } }