From b84609f24309d037cf1a25ab97fa0f6b57b2f6b0 Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <matthias.urhahn@sap.com>
Date: Tue, 25 May 2021 17:46:56 +0200
Subject: [PATCH] Adjust time till immunity calculation. (#3270)

Was off by 1 day to `toDateTimeAtStartOfDay` not being used on nowUTC.
Reuse `getTimeUntilImmunity` in `getVaccinationStatus`

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../vaccination/core/VaccinatedPerson.kt      | 12 +++------
 .../vaccination/core/VaccinatedPersonTest.kt  | 25 ++++++++-----------
 2 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt
index 9b0a15fd8..240b35bf3 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPerson.kt
@@ -1,5 +1,6 @@
 package de.rki.coronawarnapp.vaccination.core
 
+import de.rki.coronawarnapp.util.TimeAndDateExtensions.toLocalDateUtc
 import de.rki.coronawarnapp.vaccination.core.repository.storage.VaccinatedPersonData
 import de.rki.coronawarnapp.vaccination.core.server.valueset.VaccinationValueSet
 import org.joda.time.Duration
@@ -43,15 +44,10 @@ data class VaccinatedPerson(
         )
 
     fun getVaccinationStatus(nowUTC: Instant = Instant.now()): Status {
-        val newestFullDose = vaccinationCertificates
-            .filter { it.doseNumber == it.totalSeriesOfDoses }
-            .maxByOrNull { it.vaccinatedAt }
-            ?: return Status.INCOMPLETE
-
-        val daysAgo = Duration(newestFullDose.vaccinatedAt.toDateTimeAtStartOfDay(), nowUTC).standardDays
+        val daysToImmunity = getTimeUntilImmunity(nowUTC)?.standardDays ?: return Status.INCOMPLETE
 
         return when {
-            daysAgo >= IMMUNITY_WAITING_PERIOD.standardDays -> Status.IMMUNITY
+            daysToImmunity <= 0 -> Status.IMMUNITY
             else -> Status.COMPLETE
         }
     }
@@ -64,7 +60,7 @@ data class VaccinatedPerson(
 
         val immunityAt = newestFullDose.vaccinatedAt.toDateTimeAtStartOfDay().plus(IMMUNITY_WAITING_PERIOD)
 
-        return Duration(nowUTC, immunityAt)
+        return Duration(nowUTC.toLocalDateUtc().toDateTimeAtStartOfDay(), immunityAt)
     }
 
     enum class Status {
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPersonTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPersonTest.kt
index c10e16738..c63461ce2 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPersonTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/vaccination/core/VaccinatedPersonTest.kt
@@ -76,6 +76,7 @@ class VaccinatedPersonTest : BaseTest() {
 
     @Test
     fun `vaccination status - IMMUNITY`() {
+        // vaccinatedAt "2021-04-27"
         val immunityContainer = testData.personAVac2Container
         val personData = mockk<VaccinatedPersonData>().apply {
             every { vaccinations } returns setOf(testData.personAVac1Container, immunityContainer)
@@ -85,23 +86,22 @@ class VaccinatedPersonTest : BaseTest() {
             valueSet = null
         )
 
-        val vaccinatedAt = immunityContainer.vaccination.vaccinatedAt
-
         vaccinatedPerson.apply {
             getVaccinationStatus(
-                vaccinatedAt.toDateTimeAtStartOfDay().toInstant()
+                Instant.parse("2021-04-27T12:00:00.000Z")
             ) shouldBe VaccinatedPerson.Status.COMPLETE
             getVaccinationStatus(
-                vaccinatedAt.toDateTimeAtStartOfDay().toInstant().plus(Duration.standardDays(13))
+                Instant.parse("2021-05-10T12:00:00.000Z")
             ) shouldBe VaccinatedPerson.Status.COMPLETE
             getVaccinationStatus(
-                vaccinatedAt.toDateTimeAtStartOfDay().toInstant().plus(Duration.standardDays(14))
+                Instant.parse("2021-05-11T12:00:00.000Z")
             ) shouldBe VaccinatedPerson.Status.IMMUNITY
         }
     }
 
     @Test
     fun `time until status IMMUNITY`() {
+        // vaccinatedAt "2021-04-27"
         val immunityContainer = testData.personAVac2Container
         val personData = mockk<VaccinatedPersonData>().apply {
             every { vaccinations } returns setOf(testData.personAVac1Container, immunityContainer)
@@ -110,19 +110,16 @@ class VaccinatedPersonTest : BaseTest() {
             data = personData,
             valueSet = null
         )
-
-        val vaccinatedAt = immunityContainer.vaccination.vaccinatedAt
-
         vaccinatedPerson.apply {
             getTimeUntilImmunity(
-                vaccinatedAt.toDateTimeAtStartOfDay().toInstant()
-            ) shouldBe Duration.standardDays(14)
+                Instant.parse("2021-04-27T12:00:00.000Z")
+            )!!.standardDays shouldBe Duration.standardDays(14).standardDays
             getTimeUntilImmunity(
-                vaccinatedAt.toDateTimeAtStartOfDay().toInstant().plus(Duration.standardDays(13))
-            ) shouldBe Duration.standardDays(1)
+                Instant.parse("2021-05-10T12:00:00.000Z")
+            )!!.standardDays shouldBe Duration.standardDays(1).standardDays
             getTimeUntilImmunity(
-                vaccinatedAt.toDateTimeAtStartOfDay().toInstant().plus(Duration.standardDays(14))
-            ) shouldBe Duration.ZERO
+                Instant.parse("2021-05-11T12:00:00.000Z")
+            )!!.standardDays shouldBe Duration.ZERO.standardDays
         }
     }
 }
-- 
GitLab