Skip to content
Snippets Groups Projects
Unverified Commit 68accb40 authored by chris-cwa's avatar chris-cwa Committed by GitHub
Browse files

Vaccination Server Test (EXPOSUREAPP-6890) (#3231)


* unit tests for vaccination server

* renamed resources

Co-authored-by: default avatarBMItter <Berndus@gmx.de>
Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>
parent e0e0018a
No related branches found
No related tags found
No related merge requests found
package de.rki.coronawarnapp.vaccination.core.server.valueset package de.rki.coronawarnapp.vaccination.core.server.valueset
import androidx.annotation.VisibleForTesting
import dagger.Lazy import dagger.Lazy
import dagger.Reusable import dagger.Reusable
import de.rki.coronawarnapp.server.protocols.internal.dgc.ValueSetsOuterClass import de.rki.coronawarnapp.server.protocols.internal.dgc.ValueSetsOuterClass
...@@ -15,6 +16,7 @@ import okhttp3.ResponseBody ...@@ -15,6 +16,7 @@ import okhttp3.ResponseBody
import retrofit2.HttpException import retrofit2.HttpException
import retrofit2.Response import retrofit2.Response
import timber.log.Timber import timber.log.Timber
import java.io.InputStream
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
...@@ -50,8 +52,12 @@ class VaccinationServer @Inject constructor( ...@@ -50,8 +52,12 @@ class VaccinationServer @Inject constructor(
apiV1.get().getValueSets(languageCode = languageCode) apiV1.get().getValueSets(languageCode = languageCode)
} }
private fun ResponseBody.parseBody(): ValueSetsOuterClass.ValueSets { private fun ResponseBody.parseBody(): ValueSetsOuterClass.ValueSets =
val fileMap = this.byteStream().unzip().readIntoMap() parseBody(byteStream())
@VisibleForTesting
internal fun parseBody(inputStream: InputStream): ValueSetsOuterClass.ValueSets {
val fileMap = inputStream.unzip().readIntoMap()
val exportBinary = fileMap[EXPORT_BINARY_FILE_NAME] val exportBinary = fileMap[EXPORT_BINARY_FILE_NAME]
val exportSignature = fileMap[EXPORT_SIGNATURE_FILE_NAME] val exportSignature = fileMap[EXPORT_SIGNATURE_FILE_NAME]
......
package de.rki.coronawarnapp.vaccination.core.server.valueset
import dagger.Lazy
import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
import de.rki.coronawarnapp.util.security.SignatureValidation
import de.rki.coronawarnapp.vaccination.core.server.valueset.internal.ValueSetInvalidSignatureException
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.just
import io.mockk.runs
import io.mockk.verify
import okhttp3.Cache
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import testhelpers.BaseTest
import java.io.File
class VaccinationServerTest : BaseTest() {
/**
* contains both binary and signature
*/
private val exportZip = File("src/test/resources/vaccination/valueset_default.zip")
/**
* binary is missing
*/
private val invalidExportZip = File("src/test/resources/vaccination/valueset_invalid.zip")
@MockK lateinit var cache: Cache
@MockK lateinit var apiV1: Lazy<VaccinationValueSetApiV1>
@MockK lateinit var dispatcherProvider: DispatcherProvider
@MockK lateinit var signatureValidation: SignatureValidation
@BeforeEach
fun setup() {
MockKAnnotations.init(this)
exportZip.exists() shouldBe true
invalidExportZip.exists() shouldBe true
}
private fun createInstance() = VaccinationServer(
cache,
apiV1,
dispatcherProvider,
signatureValidation
)
@Test
fun `valid export data`() {
every { signatureValidation.hasValidSignature(any(), any()) } returns true
exportZip.inputStream().use {
createInstance().parseBody(it).apply {
this shouldNotBe null
ma.apply {
itemsCount shouldBe 1
getItems(0).apply {
key shouldBe "maKey"
displayText shouldBe "maDisplayText"
}
}
mp.apply {
itemsCount shouldBe 1
getItems(0).apply {
key shouldBe "mpKey"
displayText shouldBe "mpDisplayText"
}
}
vp.apply {
itemsCount shouldBe 1
getItems(0).apply {
key shouldBe "vpKey"
displayText shouldBe "vpDisplayText"
}
}
}
}
}
@Test
fun `invalid signature`() {
every { signatureValidation.hasValidSignature(any(), any()) } returns false
exportZip.inputStream().use {
shouldThrow<ValueSetInvalidSignatureException> {
createInstance().parseBody(it)
}
}
}
@Test
fun `a file is missing`() {
invalidExportZip.inputStream().use {
shouldThrow<ValueSetInvalidSignatureException> {
createInstance().parseBody(it)
}
}
}
@Test
fun `call to clear invalidates cache`() {
every { cache.evictAll() } just runs
createInstance().clear()
verify { cache.evictAll() }
}
}
File added
File added
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