From b25cf2ed889bc65e4f4af6eb9d17e4c482048341 Mon Sep 17 00:00:00 2001
From: chris-cwa <69595386+chris-cwa@users.noreply.github.com>
Date: Fri, 19 Mar 2021 14:24:13 +0100
Subject: [PATCH] Update check in(EXPOSUREAPP-5886) (#2640)

* updated checkin entity

* updated checkin entity

* satisfying tests, detekt, ktlint, circle-ci, ...

* satisfying instrumented tests

* fixed more unit tests, removed unnecessary null-check

* renamed field

* made signature base 64

* fixed tests

* fixed signature tests

* ktlint

* no more use of blob

* updated repository

* fixed unit tests

* fixed instrumented tests

* renamed tests

* fixed merge conflicts
---
 .../1.json                                    | 32 ++++++----
 .../bugreporting/DebugLogFragmentTest.kt      |  3 +-
 .../storage/CheckInDatabaseData.kt            | 14 +++--
 .../FragmentTestModuleRegistrar.kt            |  2 +-
 .../eventregistration/checkins/CheckIn.kt     |  9 ++-
 .../checkins/CheckInRepository.kt             | 13 ++--
 .../checkins/download/CheckInsPackage.kt      | 16 +++--
 .../checkins/split/CheckInSplitter.kt         |  2 +-
 .../entity/TraceLocationCheckInEntity.kt      |  8 ++-
 .../attendee/checkins/CheckInsViewModel.kt    | 16 +++--
 .../checkins/CheckInRepositoryTest.kt         | 42 ++++++++-----
 .../DefaultCheckInsTransformerTest.kt         | 20 ++++---
 .../checkins/split/CheckInSplitterTest.kt     | 59 ++++++-------------
 .../TraceLocationCategoryViewModelTest.kt     |  2 +-
 14 files changed, 135 insertions(+), 103 deletions(-)

diff --git a/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json b/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json
index f5c14553b..0c3879814 100644
--- a/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json
+++ b/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json
@@ -2,11 +2,11 @@
   "formatVersion": 1,
   "database": {
     "version": 1,
-    "identityHash": "48d71b0a00d0c7fe01ffe05d5fecb512",
+    "identityHash": "3130771db80d789cd0ef50b8d24e0354",
     "entities": [
       {
         "tableName": "checkin",
-        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `guid` TEXT NOT NULL, `version` INTEGER NOT NULL, `type` INTEGER NOT NULL, `description` TEXT NOT NULL, `address` TEXT NOT NULL, `traceLocationStart` TEXT, `traceLocationEnd` TEXT, `defaultCheckInLengthInMinutes` INTEGER, `signature` TEXT NOT NULL, `checkInStart` TEXT NOT NULL, `checkInEnd` TEXT, `targetCheckInEnd` TEXT, `createJournalEntry` INTEGER NOT NULL)",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `guid` TEXT NOT NULL, `guidHash` TEXT NOT NULL, `version` INTEGER NOT NULL, `type` INTEGER NOT NULL, `description` TEXT NOT NULL, `address` TEXT NOT NULL, `traceLocationStart` TEXT, `traceLocationEnd` TEXT, `defaultCheckInLengthInMinutes` INTEGER, `traceLocationBytes` TEXT NOT NULL, `signature` TEXT NOT NULL, `checkInStart` TEXT NOT NULL, `checkInEnd` TEXT NOT NULL, `completed` INTEGER NOT NULL, `createJournalEntry` INTEGER NOT NULL)",
         "fields": [
           {
             "fieldPath": "id",
@@ -20,6 +20,12 @@
             "affinity": "TEXT",
             "notNull": true
           },
+          {
+            "fieldPath": "guidHashBase64",
+            "columnName": "guidHash",
+            "affinity": "TEXT",
+            "notNull": true
+          },
           {
             "fieldPath": "version",
             "columnName": "version",
@@ -63,7 +69,13 @@
             "notNull": false
           },
           {
-            "fieldPath": "signature",
+            "fieldPath": "traceLocationBytesBase64",
+            "columnName": "traceLocationBytes",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "signatureBase64",
             "columnName": "signature",
             "affinity": "TEXT",
             "notNull": true
@@ -78,13 +90,13 @@
             "fieldPath": "checkInEnd",
             "columnName": "checkInEnd",
             "affinity": "TEXT",
-            "notNull": false
+            "notNull": true
           },
           {
-            "fieldPath": "targetCheckInEnd",
-            "columnName": "targetCheckInEnd",
-            "affinity": "TEXT",
-            "notNull": false
+            "fieldPath": "completed",
+            "columnName": "completed",
+            "affinity": "INTEGER",
+            "notNull": true
           },
           {
             "fieldPath": "createJournalEntry",
@@ -155,7 +167,7 @@
             "notNull": false
           },
           {
-            "fieldPath": "signature",
+            "fieldPath": "signatureBase64",
             "columnName": "signature",
             "affinity": "TEXT",
             "notNull": true
@@ -174,7 +186,7 @@
     "views": [],
     "setupQueries": [
       "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
-      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '48d71b0a00d0c7fe01ffe05d5fecb512')"
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3130771db80d789cd0ef50b8d24e0354')"
     ]
   }
 }
\ No newline at end of file
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt
index 00b450294..c97a39b0d 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/bugreporting/DebugLogFragmentTest.kt
@@ -53,7 +53,7 @@ class DebugLogFragmentTest : BaseUITest() {
     fun setup() {
         MockKAnnotations.init(this, relaxed = true)
         inactiveViewModel = setupViewModels(false, 0)
-        activeViewModel = setupViewModels(true, 9410 )
+        activeViewModel = setupViewModels(true, 9410)
 
         setupMockViewModel(
             object : DebugLogViewModel.Factory {
@@ -127,4 +127,3 @@ abstract class DebugLogTestModule {
     @ContributesAndroidInjector
     abstract fun debugLogFragment(): DebugLogFragment
 }
-
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/CheckInDatabaseData.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/CheckInDatabaseData.kt
index 32f3d6094..3434c4b92 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/CheckInDatabaseData.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/CheckInDatabaseData.kt
@@ -8,6 +8,7 @@ object CheckInDatabaseData {
 
     val testCheckIn = TraceLocationCheckInEntity(
         guid = "testGuid1",
+        guidHashBase64 = "",
         version = 1,
         type = TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_TEMPORARY_OTHER.number,
         description = "testDescription1",
@@ -15,15 +16,17 @@ object CheckInDatabaseData {
         traceLocationStart = Instant.parse("2021-01-01T12:00:00.000Z"),
         traceLocationEnd = Instant.parse("2021-01-01T15:00:00.000Z"),
         defaultCheckInLengthInMinutes = 15,
-        signature = "Signature",
+        traceLocationBytesBase64 = "",
+        signatureBase64 = "Signature",
         checkInStart = Instant.parse("2021-01-01T12:30:00.000Z"),
         checkInEnd = Instant.parse("2021-01-01T14:00:00.000Z"),
-        targetCheckInEnd = Instant.parse("2021-01-01T12:45:00.000Z"),
+        completed = false,
         createJournalEntry = true
     )
 
     val testCheckInWithoutCheckOutTime = TraceLocationCheckInEntity(
         guid = "testGuid2",
+        guidHashBase64 = "",
         version = 1,
         type = TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_TEMPORARY_OTHER.number,
         description = "testDescription2",
@@ -31,10 +34,11 @@ object CheckInDatabaseData {
         traceLocationStart = null,
         traceLocationEnd = null,
         defaultCheckInLengthInMinutes = null,
-        signature = "Signature",
+        traceLocationBytesBase64 = "",
+        signatureBase64 = "Signature",
         checkInStart = Instant.parse("2021-01-01T12:30:00.000Z"),
-        checkInEnd = null,
-        targetCheckInEnd = Instant.parse("2021-01-01T12:45:00.000Z"),
+        checkInEnd = Instant.parse("2021-01-01T14:00:00.000Z"),
+        completed = false,
         createJournalEntry = true
     )
 }
diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt
index 46e4496f1..ecb1c406e 100644
--- a/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt
+++ b/Corona-Warn-App/src/androidTest/java/testhelpers/FragmentTestModuleRegistrar.kt
@@ -72,7 +72,7 @@ import de.rki.coronawarnapp.ui.tracing.TracingDetailsFragmentTestTestModule
         ContactDiaryEditPersonsFragmentTestModule::class,
         // Statistics
         StatisticsExplanationFragmentTestModule::class,
-        //Bugreporting
+        // Bugreporting
         DebugLogUploadTestModule::class,
         DebugLogTestModule::class
     ]
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckIn.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckIn.kt
index 39a15fbce..0c3b0f922 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckIn.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckIn.kt
@@ -1,11 +1,13 @@
 package de.rki.coronawarnapp.eventregistration.checkins
 
+import okio.ByteString
 import org.joda.time.Instant
 
 @Suppress("LongParameterList")
 data class CheckIn(
     val id: Long,
     val guid: String,
+    val guidHash: ByteString,
     val version: Int,
     val type: Int,
     val description: String,
@@ -13,9 +15,10 @@ data class CheckIn(
     val traceLocationStart: Instant?,
     val traceLocationEnd: Instant?,
     val defaultCheckInLengthInMinutes: Int?,
-    val signature: String,
+    val traceLocationBytes: ByteString,
+    val signature: ByteString,
     val checkInStart: Instant,
-    val checkInEnd: Instant?,
-    val targetCheckInEnd: Instant?,
+    val checkInEnd: Instant,
+    val completed: Boolean,
     val createJournalEntry: Boolean
 )
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt
index 248a3c2df..78e830582 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepository.kt
@@ -8,6 +8,7 @@ import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.launch
+import okio.ByteString.Companion.decodeBase64
 import javax.inject.Inject
 
 class CheckInRepository @Inject constructor(
@@ -50,6 +51,7 @@ class CheckInRepository @Inject constructor(
 private fun TraceLocationCheckInEntity.toCheckIn() = CheckIn(
     id = id,
     guid = guid,
+    guidHash = guidHashBase64.decodeBase64()!!,
     version = version,
     type = type,
     description = description,
@@ -57,16 +59,18 @@ private fun TraceLocationCheckInEntity.toCheckIn() = CheckIn(
     traceLocationStart = traceLocationStart,
     traceLocationEnd = traceLocationEnd,
     defaultCheckInLengthInMinutes = defaultCheckInLengthInMinutes,
-    signature = signature,
+    traceLocationBytes = traceLocationBytesBase64.decodeBase64()!!,
+    signature = signatureBase64.decodeBase64()!!,
     checkInStart = checkInStart,
     checkInEnd = checkInEnd,
-    targetCheckInEnd = targetCheckInEnd,
+    completed = completed,
     createJournalEntry = createJournalEntry
 )
 
 private fun CheckIn.toEntity() = TraceLocationCheckInEntity(
     id = id,
     guid = guid,
+    guidHashBase64 = guidHash.base64(),
     version = version,
     type = type,
     description = description,
@@ -74,9 +78,10 @@ private fun CheckIn.toEntity() = TraceLocationCheckInEntity(
     traceLocationStart = traceLocationStart,
     traceLocationEnd = traceLocationEnd,
     defaultCheckInLengthInMinutes = defaultCheckInLengthInMinutes,
-    signature = signature,
+    traceLocationBytesBase64 = traceLocationBytes.base64(),
+    signatureBase64 = signature.base64(),
     checkInStart = checkInStart,
     checkInEnd = checkInEnd,
-    targetCheckInEnd = targetCheckInEnd,
+    completed = completed,
     createJournalEntry = createJournalEntry
 )
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/download/CheckInsPackage.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/download/CheckInsPackage.kt
index 64a3ccf60..7de508fb6 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/download/CheckInsPackage.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/download/CheckInsPackage.kt
@@ -1,6 +1,8 @@
 package de.rki.coronawarnapp.eventregistration.checkins.download
 
 import de.rki.coronawarnapp.eventregistration.checkins.CheckIn
+import okio.ByteString.Companion.EMPTY
+import okio.ByteString.Companion.toByteString
 import org.joda.time.DateTime
 import org.joda.time.Instant
 
@@ -27,6 +29,7 @@ private const val TYPE_EVENT = 2
 private val dummyEventCheckIn1: CheckIn = CheckIn(
     id = 1L,
     guid = "eventOne",
+    guidHash = EMPTY,
     version = 1,
     type = TYPE_LOCATION,
     description = "Restaurant",
@@ -34,34 +37,37 @@ private val dummyEventCheckIn1: CheckIn = CheckIn(
     traceLocationStart = null,
     traceLocationEnd = null,
     defaultCheckInLengthInMinutes = null,
-    signature = "signature",
+    traceLocationBytes = EMPTY,
+    signature = "signature".toByteArray().toByteString(),
     checkInStart = Instant.ofEpochMilli(
         DateTime(2021, 2, 2012, 11, 45).millis
     ),
     checkInEnd = Instant.ofEpochMilli(
         DateTime(2021, 2, 20, 12, 15).millis
     ),
-    targetCheckInEnd = null,
+    completed = false,
     createJournalEntry = false
 )
 
 private val dummyEventCheckIn2: CheckIn = CheckIn(
     id = 1L,
     guid = "eventOne",
+    guidHash = EMPTY,
     version = 1,
     type = TYPE_EVENT,
-    description = "Women in tech meetup",
+    description = "People in tech meetup",
     address = "Technology Park",
     traceLocationStart = null,
     traceLocationEnd = null,
     defaultCheckInLengthInMinutes = null,
-    signature = "signature2",
+    traceLocationBytes = EMPTY,
+    signature = "signature2".toByteArray().toByteString(),
     checkInStart = Instant.ofEpochMilli(
         DateTime(2021, 3, 20, 18, 45).millis
     ),
     checkInEnd = Instant.ofEpochMilli(
         DateTime(2021, 3, 20, 20, 15).millis
     ),
-    targetCheckInEnd = null,
+    completed = false,
     createJournalEntry = false
 )
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitter.kt
index 7152e3e36..89df718fe 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitter.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitter.kt
@@ -14,7 +14,7 @@ import kotlin.math.ceil
  */
 fun CheckIn.splitByMidnightUTC(): List<CheckIn> {
     val startTimeSeconds = checkInStart.seconds
-    val endTimeSeconds = checkInEnd?.seconds ?: return listOf(copy()) // Should not arrive here ,but just in case
+    val endTimeSeconds = checkInEnd.seconds
     val durationSecondsUTC = endTimeSeconds - startTimeSeconds.toMidnightUTC()
 
     Timber.i("durationSecondsUTC=$durationSecondsUTC")
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationCheckInEntity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationCheckInEntity.kt
index 354715f9c..493fd68ae 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationCheckInEntity.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationCheckInEntity.kt
@@ -9,6 +9,7 @@ import org.joda.time.Instant
 data class TraceLocationCheckInEntity(
     @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") val id: Long = 0L,
     @ColumnInfo(name = "guid") val guid: String,
+    @ColumnInfo(name = "guidHash") val guidHashBase64: String,
     @ColumnInfo(name = "version") val version: Int,
     @ColumnInfo(name = "type") val type: Int,
     @ColumnInfo(name = "description") val description: String,
@@ -16,9 +17,10 @@ data class TraceLocationCheckInEntity(
     @ColumnInfo(name = "traceLocationStart") val traceLocationStart: Instant?,
     @ColumnInfo(name = "traceLocationEnd") val traceLocationEnd: Instant?,
     @ColumnInfo(name = "defaultCheckInLengthInMinutes") val defaultCheckInLengthInMinutes: Int?,
-    @ColumnInfo(name = "signature") val signature: String,
+    @ColumnInfo(name = "traceLocationBytes") val traceLocationBytesBase64: String,
+    @ColumnInfo(name = "signature") val signatureBase64: String,
     @ColumnInfo(name = "checkInStart") val checkInStart: Instant,
-    @ColumnInfo(name = "checkInEnd") val checkInEnd: Instant?,
-    @ColumnInfo(name = "targetCheckInEnd") val targetCheckInEnd: Instant?,
+    @ColumnInfo(name = "checkInEnd") val checkInEnd: Instant,
+    @ColumnInfo(name = "completed") val completed: Boolean,
     @ColumnInfo(name = "createJournalEntry") val createJournalEntry: Boolean
 )
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt
index 677374af7..a6642cb20 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/eventregistration/attendee/checkins/CheckInsViewModel.kt
@@ -19,6 +19,8 @@ import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.map
+import okio.ByteString.Companion.EMPTY
+import okio.ByteString.Companion.toByteString
 import org.joda.time.Duration
 import org.joda.time.Instant
 import timber.log.Timber
@@ -98,6 +100,7 @@ private val FAKE_CHECKINS = listOf(
     CheckIn(
         id = 1,
         guid = "testGuid2",
+        guidHash = EMPTY,
         version = 1,
         type = 1,
         description = "Jahrestreffen der deutschen SAP Anwendergruppe",
@@ -105,15 +108,17 @@ private val FAKE_CHECKINS = listOf(
         traceLocationStart = null,
         traceLocationEnd = null,
         defaultCheckInLengthInMinutes = 3 * 60,
-        signature = "Signature",
+        traceLocationBytes = EMPTY,
+        signature = "Signature".toByteArray().toByteString(),
         checkInStart = Instant.now().minus(Duration.standardHours(2)),
-        checkInEnd = null,
-        targetCheckInEnd = Instant.now().plus(Duration.standardHours(1)),
+        checkInEnd = Instant.now(),
+        completed = false,
         createJournalEntry = true
     ),
     CheckIn(
         id = 2,
         guid = "testGuid1",
+        guidHash = EMPTY,
         version = 1,
         type = 2,
         description = "CWA Launch Party",
@@ -121,10 +126,11 @@ private val FAKE_CHECKINS = listOf(
         traceLocationStart = Instant.parse("2021-01-01T12:00:00.000Z"),
         traceLocationEnd = Instant.parse("2021-01-01T15:00:00.000Z"),
         defaultCheckInLengthInMinutes = 15,
-        signature = "Signature",
+        traceLocationBytes = EMPTY,
+        signature = "Signature".toByteArray().toByteString(),
         checkInStart = Instant.parse("2021-01-01T12:30:00.000Z"),
         checkInEnd = Instant.parse("2021-01-01T14:00:00.000Z"),
-        targetCheckInEnd = Instant.parse("2021-01-01T12:45:00.000Z"),
+        completed = true,
         createJournalEntry = true
     )
 )
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt
index c699b8bd7..ebd8bcd9b 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/CheckInRepositoryTest.kt
@@ -13,6 +13,7 @@ import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.test.runBlockingTest
+import okio.ByteString.Companion.EMPTY
 import org.joda.time.Instant
 import org.junit.jupiter.api.BeforeEach
 import org.junit.jupiter.api.Test
@@ -43,10 +44,12 @@ class CheckInRepositoryTest : BaseTest() {
         coEvery { checkInDao.insert(any()) } returns 0L
         runBlockingTest {
             val time = Instant.ofEpochMilli(1397210400000)
+            val end = Instant.ofEpochMilli(1397210400001)
             createInstance(scope = this).addCheckIn(
                 CheckIn(
                     id = 0L,
                     guid = "41da2115-eba2-49bd-bf17-adb3d635ddaf",
+                    guidHash = EMPTY,
                     version = 1,
                     type = 2,
                     description = "brothers birthday",
@@ -54,10 +57,11 @@ class CheckInRepositoryTest : BaseTest() {
                     traceLocationStart = time,
                     traceLocationEnd = null,
                     defaultCheckInLengthInMinutes = null,
-                    signature = "abc",
+                    traceLocationBytes = EMPTY,
+                    signature = EMPTY,
                     checkInStart = time,
-                    checkInEnd = null,
-                    targetCheckInEnd = null,
+                    checkInEnd = end,
+                    completed = false,
                     createJournalEntry = false
                 )
             )
@@ -66,6 +70,7 @@ class CheckInRepositoryTest : BaseTest() {
                     TraceLocationCheckInEntity(
                         id = 0L,
                         guid = "41da2115-eba2-49bd-bf17-adb3d635ddaf",
+                        guidHashBase64 = "",
                         version = 1,
                         type = 2,
                         description = "brothers birthday",
@@ -73,10 +78,11 @@ class CheckInRepositoryTest : BaseTest() {
                         traceLocationStart = time,
                         traceLocationEnd = null,
                         defaultCheckInLengthInMinutes = null,
-                        signature = "abc",
+                        traceLocationBytesBase64 = "",
+                        signatureBase64 = "",
                         checkInStart = time,
-                        checkInEnd = null,
-                        targetCheckInEnd = null,
+                        checkInEnd = end,
+                        completed = false,
                         createJournalEntry = false
                     )
                 )
@@ -94,6 +100,7 @@ class CheckInRepositoryTest : BaseTest() {
                 CheckIn(
                     id = 0L,
                     guid = "6e5530ce-1afc-4695-a4fc-572e6443eacd",
+                    guidHash = EMPTY,
                     version = 1,
                     type = 2,
                     description = "sisters birthday",
@@ -101,10 +108,11 @@ class CheckInRepositoryTest : BaseTest() {
                     traceLocationStart = start,
                     traceLocationEnd = end,
                     defaultCheckInLengthInMinutes = null,
-                    signature = "efg",
+                    traceLocationBytes = EMPTY,
+                    signature = EMPTY,
                     checkInStart = start,
                     checkInEnd = end,
-                    targetCheckInEnd = end,
+                    completed = false,
                     createJournalEntry = false
                 )
             )
@@ -113,6 +121,7 @@ class CheckInRepositoryTest : BaseTest() {
                     TraceLocationCheckInEntity(
                         id = 0L,
                         guid = "6e5530ce-1afc-4695-a4fc-572e6443eacd",
+                        guidHashBase64 = "",
                         version = 1,
                         type = 2,
                         description = "sisters birthday",
@@ -120,10 +129,11 @@ class CheckInRepositoryTest : BaseTest() {
                         traceLocationStart = start,
                         traceLocationEnd = end,
                         defaultCheckInLengthInMinutes = null,
-                        signature = "efg",
+                        traceLocationBytesBase64 = "",
+                        signatureBase64 = "",
                         checkInStart = start,
                         checkInEnd = end,
-                        targetCheckInEnd = end,
+                        completed = false,
                         createJournalEntry = false
                     )
                 )
@@ -139,6 +149,7 @@ class CheckInRepositoryTest : BaseTest() {
             TraceLocationCheckInEntity(
                 id = 0L,
                 guid = "6e5530ce-1afc-4695-a4fc-572e6443eacd",
+                guidHashBase64 = "",
                 version = 1,
                 type = 2,
                 description = "sisters birthday",
@@ -146,10 +157,11 @@ class CheckInRepositoryTest : BaseTest() {
                 traceLocationStart = start,
                 traceLocationEnd = end,
                 defaultCheckInLengthInMinutes = null,
-                signature = "efg",
+                traceLocationBytesBase64 = "",
+                signatureBase64 = "",
                 checkInStart = start,
                 checkInEnd = end,
-                targetCheckInEnd = end,
+                completed = false,
                 createJournalEntry = false
             )
         )
@@ -158,6 +170,8 @@ class CheckInRepositoryTest : BaseTest() {
                 CheckIn(
                     id = 0L,
                     guid = "6e5530ce-1afc-4695-a4fc-572e6443eacd",
+                    guidHash = EMPTY,
+                    traceLocationBytes = EMPTY,
                     version = 1,
                     type = 2,
                     description = "sisters birthday",
@@ -165,10 +179,10 @@ class CheckInRepositoryTest : BaseTest() {
                     traceLocationStart = start,
                     traceLocationEnd = end,
                     defaultCheckInLengthInMinutes = null,
-                    signature = "efg",
+                    signature = EMPTY,
                     checkInStart = start,
                     checkInEnd = end,
-                    targetCheckInEnd = end,
+                    completed = false,
                     createJournalEntry = false
                 )
             )
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/DefaultCheckInsTransformerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/DefaultCheckInsTransformerTest.kt
index 6b981947c..ecd98df37 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/DefaultCheckInsTransformerTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/DefaultCheckInsTransformerTest.kt
@@ -3,6 +3,8 @@ package de.rki.coronawarnapp.eventregistration.checkins
 import com.google.protobuf.ByteString
 import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass
 import io.kotest.matchers.shouldBe
+import okio.ByteString.Companion.EMPTY
+import okio.ByteString.Companion.decodeBase64
 import org.joda.time.Instant
 import org.junit.jupiter.api.Test
 import testhelpers.BaseTest
@@ -16,6 +18,7 @@ class DefaultCheckInsTransformerTest : BaseTest() {
         val checkIn1 = CheckIn(
             id = 0,
             guid = "3055331c-2306-43f3-9742-6d8fab54e848",
+            guidHash = EMPTY,
             version = 1,
             type = 2,
             description = "description1",
@@ -23,16 +26,18 @@ class DefaultCheckInsTransformerTest : BaseTest() {
             traceLocationStart = Instant.ofEpochMilli(2687955 * 1_000L),
             traceLocationEnd = Instant.ofEpochMilli(2687991 * 1_000L),
             defaultCheckInLengthInMinutes = 10,
-            signature = "signature1",
+            traceLocationBytes = EMPTY,
+            signature = "c2lnbmF0dXJlMQ==".decodeBase64()!!,
             checkInStart = Instant.ofEpochMilli(2687955 * 1_000L),
             checkInEnd = Instant.ofEpochMilli(2687991 * 1_000L),
-            targetCheckInEnd = null,
+            completed = false,
             createJournalEntry = true
         )
 
         val checkIn2 = CheckIn(
             id = 1,
             guid = "fca84b37-61c0-4a7c-b2f8-825cadd506cf",
+            guidHash = EMPTY,
             version = 1,
             type = 1,
             description = "description2",
@@ -40,13 +45,14 @@ class DefaultCheckInsTransformerTest : BaseTest() {
             traceLocationStart = null,
             traceLocationEnd = null,
             defaultCheckInLengthInMinutes = 20,
-            signature = "signature2",
+            traceLocationBytes = EMPTY,
+            signature = "c2lnbmF0dXJlMg==".decodeBase64()!!,
             checkInStart = Instant.ofEpochMilli(2687955 * 1_000L),
-            checkInEnd = null,
-            targetCheckInEnd = null,
+            checkInEnd = Instant.ofEpochMilli(2687956 * 1_000L),
+            completed = false,
             createJournalEntry = false
         )
-        
+
         val outCheckIns = checkInTransformer.transform(
             listOf(
                 checkIn1,
@@ -89,7 +95,7 @@ class DefaultCheckInsTransformerTest : BaseTest() {
                 signature shouldBe ByteString.copyFrom("signature2".toByteArray())
             }
             startIntervalNumber shouldBe 2687955
-            endIntervalNumber shouldBe 0
+            endIntervalNumber shouldBe 2687956
             // TODO transmissionRiskLevel shouldBe
         }
     }
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitterTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitterTest.kt
index ec69a2792..3ee4abca6 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitterTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/checkins/split/CheckInSplitterTest.kt
@@ -2,6 +2,8 @@ package de.rki.coronawarnapp.eventregistration.checkins.split
 
 import de.rki.coronawarnapp.eventregistration.checkins.CheckIn
 import io.kotest.matchers.shouldBe
+import okio.ByteString.Companion.EMPTY
+import okio.ByteString.Companion.decodeBase64
 import org.joda.time.Instant
 import org.junit.jupiter.api.Test
 
@@ -16,6 +18,7 @@ class CheckInSplitterTest : BaseTest() {
     private val defaultCheckIn = CheckIn(
         id = 1L,
         guid = "eventOne",
+        guidHash = EMPTY,
         version = 1,
         type = 1,
         description = "Restaurant",
@@ -23,17 +26,17 @@ class CheckInSplitterTest : BaseTest() {
         traceLocationStart = null,
         traceLocationEnd = null,
         defaultCheckInLengthInMinutes = null,
-        signature = "signature",
+        traceLocationBytes = EMPTY,
+        signature = "c2lnbmF0dXJl".decodeBase64()!!,
         checkInStart = Instant.now(),
         checkInEnd = Instant.now(),
-        targetCheckInEnd = null,
+        completed = false,
         createJournalEntry = false
     )
 
     @Test
-    fun `Scenario 1`() {
+    fun `same-day check-in`() {
         /*
-           Example 1 - same-day check-in
            localCheckIn = { start: '2021-03-04 09:30', end: '2021-03-04 09:45' }
            splitInto = [{ start: '2021-03-04 09:30', end: '2021-03-04 09:45' } // no split
         */
@@ -49,27 +52,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 2`() {
+    fun `same-start-end-times check-in`() {
         /*
-           Example 2 - no-checkout-time check-in
-           localCheckIn = { start: '2021-03-04 09:30', end: null }
-           splitInto = [{ start: '2021-03-04 09:30', end: null } // no split
-        */
-        val checkIn = defaultCheckIn.copy(
-            checkInStart = Instant.parse("2021-03-04T09:30:00Z"),
-            checkInEnd = null
-        )
-
-        checkIn.splitByMidnightUTC().apply {
-            size shouldBe 1 // No splitting
-            get(0) shouldBe checkIn
-        }
-    }
-
-    @Test
-    fun `Scenario 3`() {
-        /*
-           Example 3 - same-start-end-times check-in
            localCheckIn = { start: '2021-03-04 09:30', end: '2021-03-04 09:30' }
            splitInto = [{ start: '2021-03-04 09:30', end: '2021-03-04 09:30' } // no split
         */
@@ -85,9 +69,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 4`() {
+    fun `2-days check-in`() {
         /*
-        // Example 4 - 2-days check-in
         localCheckIn = { start: '2021-03-04 09:30', end: '2021-03-05 09:45' }
         splitInto = [
             { start: '2021-03-04 09:30', end: '2021-03-05 00:00' },
@@ -115,9 +98,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 5`() {
+    fun `3-days check-in`() {
         /*
-         // Example 5 - 3-days check-in
          localCheckIn = { start: '2021-03-04 09:30', end: '2021-03-06 09:45' }
          splitInto = [
             { start: '2021-03-04 09:30', end: '2021-03-05 00:00' },
@@ -150,9 +132,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 6`() {
+    fun `2-days-different-months check-in`() {
         /*
-        // Example 6 - 2-days-different-months check-in
         localCheckIn = { start: '2021-02-28 09:30', end: '2021-03-01 12:45' }
         splitInto = [
             { start: '2021-02-28 09:30', end: '2021-03-01 00:00' },
@@ -180,9 +161,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 7`() {
+    fun `2-days-different-years check-in`() {
         /*
-        // Example 7 - 2-days-different-years check-in
         localCheckIn = { start: '2021-12-31 09:30', end: '2022-01-01 12:45' }
         splitInto = [
             { start: '2021-12-31 09:30', end: '2022-01-01 00:00' },
@@ -210,9 +190,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 8`() {
+    fun `3-days-different-months-leap-year check-in`() {
         /*
-        // Example 8 - 3-days-different-months-leap-year check-in
         localCheckIn = { start: '2020-02-28 09:30', end: '2020-03-01 12:45' }
         splitInto = [
             { start: '2020-02-28 09:30', end: '2020-02-29 00:00' },
@@ -246,9 +225,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 9`() {
+    fun `2-dates duration lower than day check-in`() {
         /*
-        // Example 9 - 2-dates duration < day check-in
         localCheckIn = { start: '2021-03-04 09:30', end: '2021-03-05 09:15' }
         splitInto = [
             { start: '2021-03-04 09:30', end: '2021-03-05 00:00' },
@@ -276,9 +254,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 10`() {
+    fun `2-dates duration lower than day - same start and end times check-in`() {
         /*
-        // Example 10 - 2-dates duration < day - same start and end times check-in
         localCheckIn = { start: '2021-03-04 09:00', end: '2021-03-05 09:00' }
         splitInto = [
             { start: '2021-03-04 09:00', end: '2021-03-05 00:00' },
@@ -306,9 +283,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 11`() {
+    fun `midnight times check-in`() {
         /*
-        // Example 11 - midnight times check-in
         localCheckIn = { start: '2021-03-04 00:00', end: '2021-03-05 00:00' }
         splitInto = [
             { start: '2021-03-04 00:00', end: '2021-03-05 00:00' } // No split
@@ -330,9 +306,8 @@ class CheckInSplitterTest : BaseTest() {
     }
 
     @Test
-    fun `Scenario 12`() {
+    fun `2min-2dates check-in`() {
         /*
-        // Example 12 - 2min-2dates check-in
         localCheckIn = { start: '2021-03-04 23:59', end: '2021-03-05 00:01' }
         splitInto = [
             { start: '2021-03-04 00:00', end: '2021-03-05 00:00' } // No split
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/organizer/category/TraceLocationCategoryViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/organizer/category/TraceLocationCategoryViewModelTest.kt
index fb3176ba1..9e323401d 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/organizer/category/TraceLocationCategoryViewModelTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/eventregistration/organizer/category/TraceLocationCategoryViewModelTest.kt
@@ -14,7 +14,7 @@ import testhelpers.extensions.InstantExecutorExtension
 import testhelpers.extensions.observeForTesting
 
 @ExtendWith(InstantExecutorExtension::class)
-internal class TraceLocationCategoryViewModelTest : BaseTest(){
+internal class TraceLocationCategoryViewModelTest : BaseTest() {
 
     @Test
     fun `viewModel should emit correct categoryItems`() {
-- 
GitLab