diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollector.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollector.kt index 914bd7cc0e81776c4b5700926e03cec87b980452..52b8be6d4a4c6d7012d4306dba6a3f0f759cf252 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollector.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollector.kt @@ -19,6 +19,14 @@ class TestResultDataCollector @Inject constructor( * exclude any registered test result before giving a consent */ suspend fun saveTestResultAnalyticsSettings(testResult: TestResult) { + val validTestResults = listOf( + TestResult.POSITIVE, + TestResult.PENDING, + TestResult.NEGATIVE + ) + + if (testResult !in validTestResults) return // Not interested in other values + if (analyticsSettings.analyticsEnabled.value) { val lastRiskResult = riskLevelStorage .latestAndLastSuccessful diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanViewModel.kt index e4087abac71bccf897054b11663c304de677f51d..250fa3998c34879d1bf4895a14ca99087bc46008 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/qrcode/scan/SubmissionQRCodeScanViewModel.kt @@ -56,10 +56,12 @@ class SubmissionQRCodeScanViewModel @AssistedInject constructor( try { registrationState.postValue(RegistrationState(ApiRequestState.STARTED)) val testResult = submissionRepository.asyncRegisterDeviceViaGUID(scanResult.guid!!) + // Order here is important. When `registrationState.postValue` is called before + // `saveTestResultAnalyticsSettings`, this coroutine will get canceled due to the navigation + // to the next screen. + testResultDataCollector.saveTestResultAnalyticsSettings(testResult) checkTestResult(testResult) registrationState.postValue(RegistrationState(ApiRequestState.SUCCESS, testResult)) - // Order here is important. Save Analytics after SUCCESS - testResultDataCollector.saveTestResultAnalyticsSettings(testResult) } catch (err: CwaWebException) { registrationState.postValue(RegistrationState(ApiRequestState.FAILED)) registrationError.postValue(err) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollectorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollectorTest.kt index 104a2d06deaafc25023c3edac0582567f65e10c4..a0a8ba370dda50e7c7e3a73c55339af02f6af696 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollectorTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/analytics/modules/registeredtest/TestResultDataCollectorTest.kt @@ -5,6 +5,7 @@ import de.rki.coronawarnapp.datadonation.analytics.storage.TestResultDonorSettin import de.rki.coronawarnapp.risk.RiskLevelResult import de.rki.coronawarnapp.risk.storage.RiskLevelStorage import de.rki.coronawarnapp.util.formatter.TestResult +import io.mockk.Called import io.mockk.MockKAnnotations import io.mockk.Runs import io.mockk.every @@ -66,4 +67,24 @@ class TestResultDataCollectorTest : BaseTest() { testResultDonorSettings.saveTestResultDonorDataAtRegistration(any(), any()) } } + + @Test + fun `saveTestResultAnalyticsSettings does not save data when TestResult is INVALID`() = runBlockingTest { + every { analyticsSettings.analyticsEnabled } returns mockFlowPreference(false) + testResultDataCollector.saveTestResultAnalyticsSettings(TestResult.INVALID) + + verify { + analyticsSettings.analyticsEnabled wasNot Called + } + } + + @Test + fun `saveTestResultAnalyticsSettings does not save data when TestResult is REDEEMED`() = runBlockingTest { + every { analyticsSettings.analyticsEnabled } returns mockFlowPreference(false) + testResultDataCollector.saveTestResultAnalyticsSettings(TestResult.REDEEMED) + + verify { + analyticsSettings.analyticsEnabled wasNot Called + } + } }