Skip to content
Snippets Groups Projects
Unverified Commit 42694613 authored by Lukas Lechner's avatar Lukas Lechner Committed by GitHub
Browse files

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: default avatarRalf Gehrer <ralfgehrer@users.noreply.github.com>
parent b87fc782
No related branches found
No related tags found
No related merge requests found
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>()
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment