From 4269461319f88510d7d817e74ec67dde82d27488 Mon Sep 17 00:00:00 2001 From: Lukas Lechner <lukas.lechner@sap.com> Date: Wed, 24 Feb 2021 16:48:20 +0100 Subject: [PATCH] Add unit tests for Surverys.isConsentNeeded() (DEV) #2450 * Add unit tests for Surveys.isConsentNeeded() * Adress PR feedback: Add fixed timesource, Extend from BaseTest Co-authored-by: Ralf Gehrer <ralfgehrer@users.noreply.github.com> --- .../datadonation/survey/SurveysTest.kt | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveysTest.kt diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveysTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveysTest.kt new file mode 100644 index 000000000..5b6ea68da --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveysTest.kt @@ -0,0 +1,93 @@ +package de.rki.coronawarnapp.datadonation.survey + +import de.rki.coronawarnapp.appconfig.AppConfigProvider +import de.rki.coronawarnapp.datadonation.OTPAuthorizationResult +import de.rki.coronawarnapp.datadonation.safetynet.DeviceAttestation +import de.rki.coronawarnapp.datadonation.storage.OTPRepository +import de.rki.coronawarnapp.datadonation.survey.Surveys.ConsentResult.AlreadyGiven +import de.rki.coronawarnapp.datadonation.survey.Surveys.ConsentResult.Needed +import de.rki.coronawarnapp.datadonation.survey.Surveys.Type.HIGH_RISK_ENCOUNTER +import de.rki.coronawarnapp.datadonation.survey.server.SurveyServer +import de.rki.coronawarnapp.util.TimeStamper +import io.kotest.matchers.should +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.beInstanceOf +import io.mockk.MockKAnnotations +import io.mockk.coEvery +import io.mockk.every +import io.mockk.impl.annotations.MockK +import kotlinx.coroutines.test.runBlockingTest +import org.joda.time.Instant +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import testhelpers.BaseTest +import testhelpers.TestDispatcherProvider +import java.util.UUID + +internal class SurveysTest : BaseTest() { + + @MockK lateinit var deviceAttestation: DeviceAttestation + @MockK lateinit var appConfigProvider: AppConfigProvider + @MockK lateinit var surveyServer: SurveyServer + @MockK lateinit var oneTimePasswordRepo: OTPRepository + @MockK lateinit var urlProvider: SurveyUrlProvider + @MockK lateinit var timeStamper: TimeStamper + + @BeforeEach + fun setUp() { + MockKAnnotations.init(this) + every { timeStamper.nowUTC } returns Instant.parse("2020-01-01T00:00:00.000Z") + } + + private fun createInstance() = Surveys( + deviceAttestation, + appConfigProvider, + surveyServer, + oneTimePasswordRepo, + TestDispatcherProvider(), + urlProvider, + timeStamper + ) + + @Test + fun `isConsentNeeded() should return Needed when no otp was yet authorized`() = runBlockingTest { + every { oneTimePasswordRepo.otpAuthorizationResult } returns null + createInstance().isConsentNeeded(HIGH_RISK_ENCOUNTER) shouldBe Needed + } + + @Test + fun `isConsentNeeded() should return Needed when authentication of stored otp failed `() = runBlockingTest { + every { oneTimePasswordRepo.otpAuthorizationResult } returns OTPAuthorizationResult( + UUID.randomUUID(), + authorized = false, + redeemedAt = timeStamper.nowUTC, + invalidated = false + ) + createInstance().isConsentNeeded(HIGH_RISK_ENCOUNTER) shouldBe Needed + } + + @Test + fun `isConsentNeeded() should return Needed when an authorized otp was invalidated due to a risk change from high to low risk`() = + runBlockingTest { + every { oneTimePasswordRepo.otpAuthorizationResult } returns OTPAuthorizationResult( + UUID.randomUUID(), + authorized = true, + redeemedAt = timeStamper.nowUTC, + invalidated = true + ) + createInstance().isConsentNeeded(HIGH_RISK_ENCOUNTER) shouldBe Needed + } + + @Test + fun `isConsentNeeded() should return AlreadyGiven when an authorized otp is stored and not invalidated`() = + runBlockingTest { + every { oneTimePasswordRepo.otpAuthorizationResult } returns OTPAuthorizationResult( + UUID.randomUUID(), + authorized = true, + redeemedAt = timeStamper.nowUTC, + invalidated = false + ) + coEvery { urlProvider.provideUrl(any(), any()) } returns "" + createInstance().isConsentNeeded(HIGH_RISK_ENCOUNTER) should beInstanceOf<AlreadyGiven>() + } +} -- GitLab