From bd706fe6fb9b0dd5fd140410f82db33c6502ea46 Mon Sep 17 00:00:00 2001 From: Mohamed Metwalli <mohamed.metwalli@sap.com> Date: Wed, 26 May 2021 17:05:15 +0200 Subject: [PATCH] Vaccination QR-Code isn't equal to scanned vaccination code (EXPOSUREAPP-7416) (#3285) * Parameterise correction level * Fix test * Fix instrumentation test * Update QrCodeGenerator.kt * Current config * Lint * Fix tests Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com> --- .../organizer/QrCodeDetailFragmentTest.kt | 18 ++++++++++- .../ui/poster/QrCodePosterTestViewModel.kt | 10 +++++-- .../checkins/qrcode/QrCodeGenerator.kt | 30 +++++++++++-------- .../organizer/details/QrCodeDetailFragment.kt | 2 +- .../details/QrCodeDetailNavigationEvents.kt | 6 +++- .../details/QrCodeDetailViewModel.kt | 24 +++++++++++++-- .../organizer/poster/QrCodePosterViewModel.kt | 7 ++++- .../fullscreen/QrCodeFullScreenFragment.kt | 3 +- .../fullscreen/QrCodeFullScreenViewModel.kt | 9 ++++-- .../src/main/res/navigation/nav_graph.xml | 4 +++ .../poster/QrCodePosterViewModelTest.kt | 20 +++++++++++-- 11 files changed, 107 insertions(+), 26 deletions(-) diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/eventregistration/organizer/QrCodeDetailFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/eventregistration/organizer/QrCodeDetailFragmentTest.kt index 9986448a3..88fd58510 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/eventregistration/organizer/QrCodeDetailFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/eventregistration/organizer/QrCodeDetailFragmentTest.kt @@ -5,9 +5,13 @@ import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel import dagger.Module import dagger.android.ContributesAndroidInjector import de.rki.coronawarnapp.R +import de.rki.coronawarnapp.appconfig.AppConfigProvider +import de.rki.coronawarnapp.appconfig.ConfigData +import de.rki.coronawarnapp.appconfig.PresenceTracingConfig import de.rki.coronawarnapp.presencetracing.checkins.qrcode.QrCodeGenerator import de.rki.coronawarnapp.presencetracing.storage.repo.TraceLocationRepository import de.rki.coronawarnapp.ui.presencetracing.organizer.details.QrCodeDetailFragment @@ -15,7 +19,10 @@ import de.rki.coronawarnapp.ui.presencetracing.organizer.details.QrCodeDetailFra import de.rki.coronawarnapp.ui.presencetracing.organizer.details.QrCodeDetailViewModel import io.mockk.MockKAnnotations import io.mockk.coEvery +import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.mockk +import kotlinx.coroutines.flow.flowOf import org.joda.time.DateTimeZone import org.junit.After import org.junit.Before @@ -30,6 +37,7 @@ import java.util.TimeZone class QrCodeDetailFragmentTest : BaseUITest() { @MockK private lateinit var qrCodeGenerator: QrCodeGenerator + @MockK private lateinit var appConfigProvider: AppConfigProvider @MockK private lateinit var traceLocationRepository: TraceLocationRepository private val timeZone = TimeZone.getTimeZone("Europe/Berlin") @@ -42,6 +50,13 @@ class QrCodeDetailFragmentTest : BaseUITest() { coEvery { traceLocationRepository.traceLocationForId(1) } returns TraceLocationData.traceLocationSameDate coEvery { traceLocationRepository.traceLocationForId(2) } returns TraceLocationData.traceLocationDifferentDate + coEvery { appConfigProvider.currentConfig } returns flowOf( + mockk<ConfigData>().apply { + every { presenceTracing } returns mockk<PresenceTracingConfig>().apply { + every { qrCodeErrorCorrectionLevel } returns ErrorCorrectionLevel.M + } + } + ) setupMockViewModel( object : QrCodeDetailViewModel.Factory { @@ -87,7 +102,8 @@ class QrCodeDetailFragmentTest : BaseUITest() { traceLocationId = traceLocationId, qrCodeGenerator = qrCodeGenerator, traceLocationRepository = traceLocationRepository, - dispatcher = TestDispatcherProvider() + dispatcher = TestDispatcherProvider(), + appConfigProvider = appConfigProvider ) } diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/presencetracing/ui/poster/QrCodePosterTestViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/presencetracing/ui/poster/QrCodePosterTestViewModel.kt index 05bfd33c0..02f7de56f 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/presencetracing/ui/poster/QrCodePosterTestViewModel.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/presencetracing/ui/poster/QrCodePosterTestViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.MutableLiveData import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.presencetracing.checkins.qrcode.PosterTemplateProvider import de.rki.coronawarnapp.presencetracing.checkins.qrcode.QrCodeGenerator import de.rki.coronawarnapp.presencetracing.checkins.qrcode.Template @@ -30,6 +31,7 @@ class QrCodePosterTestViewModel @AssistedInject constructor( private val qrCodeGenerator: QrCodeGenerator, private val posterTemplateProvider: PosterTemplateProvider, private val traceLocationRepository: TraceLocationRepository, + private val appConfigProvider: AppConfigProvider, private val fileSharing: FileSharing ) : CWAViewModel(dispatcher) { @@ -81,10 +83,12 @@ class QrCodePosterTestViewModel @AssistedInject constructor( if (isRunning) return@launch isRunning = true val traceLocation = traceLocation() + val correctionLevel = appConfigProvider.getAppConfig().presenceTracing.qrCodeErrorCorrectionLevel val qrCode = qrCodeGenerator.createQrCode( input = traceLocation.locationUrl, length = length, - margin = 0 + margin = 0, + correctionLevel = correctionLevel ) qrCodeBitmap.postValue(qrCode) } catch (e: Exception) { @@ -99,11 +103,13 @@ class QrCodePosterTestViewModel @AssistedInject constructor( try { val traceLocation = traceLocation() val template = posterTemplateProvider.template() + val correctionLevel = appConfigProvider.getAppConfig().presenceTracing.qrCodeErrorCorrectionLevel Timber.d("template=$template") val qrCode = qrCodeGenerator.createQrCode( input = traceLocation.locationUrl, length = template.qrCodeLength, - margin = 0 + margin = 0, + correctionLevel = correctionLevel ) val textInfo = buildString { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/checkins/qrcode/QrCodeGenerator.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/checkins/qrcode/QrCodeGenerator.kt index d4645b71f..bb024a2b9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/checkins/qrcode/QrCodeGenerator.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/presencetracing/checkins/qrcode/QrCodeGenerator.kt @@ -8,15 +8,17 @@ import com.google.zxing.EncodeHintType import com.google.zxing.MultiFormatWriter import com.google.zxing.WriterException import com.google.zxing.common.BitMatrix +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel import dagger.Reusable -import de.rki.coronawarnapp.appconfig.AppConfigProvider +import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.di.AppContext +import kotlinx.coroutines.withContext import timber.log.Timber import javax.inject.Inject @Reusable class QrCodeGenerator @Inject constructor( - private val appConfigProvider: AppConfigProvider, + private val dispatcherProvider: DispatcherProvider, @AppContext private val context: Context, ) { @@ -25,25 +27,29 @@ class QrCodeGenerator @Inject constructor( * @param input [String] * @param length [Int] QR Code side length * @param margin [Int] QR Code side's margin + * @param correctionLevel [ErrorCorrectionLevel] + * + * Note: we cannot use Charsets.UTF_8 as zxing calls toString internally and some android version + * return the class name and not the charset name + * @param characterSet [String] * * @throws [Exception] it could throw [IllegalArgumentException] , [WriterException] * or exception while creating the bitmap */ - suspend fun createQrCode(input: String, length: Int = 1000, margin: Int = 1): Bitmap { - val correctionLevel = appConfigProvider - .getAppConfig() - .presenceTracing - .qrCodeErrorCorrectionLevel + suspend fun createQrCode( + input: String, + length: Int = 1000, + margin: Int = 1, + correctionLevel: ErrorCorrectionLevel = ErrorCorrectionLevel.Q, + characterSet: String = Charsets.UTF_8.name() + ): Bitmap = withContext(dispatcherProvider.Default) { Timber.i("correctionLevel=$correctionLevel") - val hints = mapOf( EncodeHintType.ERROR_CORRECTION to correctionLevel, EncodeHintType.MARGIN to margin, - // we cannot use Charsets.UTF_8 as zxing calls toString internally and some android version - // return the class name and not the charset name - EncodeHintType.CHARACTER_SET to Charsets.UTF_8.name() + EncodeHintType.CHARACTER_SET to characterSet ) - return MultiFormatWriter().encode( + MultiFormatWriter().encode( input, BarcodeFormat.QR_CODE, length, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailFragment.kt index ee6f9e9bd..70758a135 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailFragment.kt @@ -104,7 +104,7 @@ class QrCodeDetailFragment : Fragment(R.layout.trace_location_organizer_qr_code_ ) is QrCodeDetailNavigationEvents.NavigateToFullScreenQrCode -> findNavController().navigate( R.id.action_global_qrCodeFullScreenFragment, - QrCodeFullScreenFragmentArgs(it.qrcodeText).toBundle(), + QrCodeFullScreenFragmentArgs(it.qrcodeText, it.correctionLevel).toBundle(), null, FragmentNavigatorExtras(binding.qrCodeImage to binding.qrCodeImage.transitionName) ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailNavigationEvents.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailNavigationEvents.kt index d2eafc381..55dfb3917 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailNavigationEvents.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailNavigationEvents.kt @@ -1,5 +1,6 @@ package de.rki.coronawarnapp.ui.presencetracing.organizer.details +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel import de.rki.coronawarnapp.presencetracing.checkins.qrcode.TraceLocation import de.rki.coronawarnapp.ui.presencetracing.organizer.category.adapter.category.TraceLocationCategory @@ -9,5 +10,8 @@ sealed class QrCodeDetailNavigationEvents { data class NavigateToDuplicateFragment(val traceLocation: TraceLocation, val category: TraceLocationCategory) : QrCodeDetailNavigationEvents() - data class NavigateToFullScreenQrCode(val qrcodeText: String) : QrCodeDetailNavigationEvents() + data class NavigateToFullScreenQrCode( + val qrcodeText: String, + val correctionLevel: ErrorCorrectionLevel + ) : QrCodeDetailNavigationEvents() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailViewModel.kt index 50ac1f175..747679e4f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/details/QrCodeDetailViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.presencetracing.checkins.qrcode.QrCodeGenerator import de.rki.coronawarnapp.presencetracing.checkins.qrcode.TraceLocation import de.rki.coronawarnapp.presencetracing.storage.repo.TraceLocationRepository @@ -16,6 +17,7 @@ import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory +import kotlinx.coroutines.flow.first import org.joda.time.Instant import timber.log.Timber import java.lang.Exception @@ -24,6 +26,7 @@ class QrCodeDetailViewModel @AssistedInject constructor( @Assisted private val traceLocationId: Long, private val dispatcher: DispatcherProvider, private val qrCodeGenerator: QrCodeGenerator, + private val appConfigProvider: AppConfigProvider, private val traceLocationRepository: TraceLocationRepository ) : CWAViewModel() { @@ -57,8 +60,17 @@ class QrCodeDetailViewModel @AssistedInject constructor( private fun createQrCode(traceLocation: TraceLocation) = launch(context = dispatcher.IO) { try { val input = traceLocation.locationUrl + val correctionLevel = appConfigProvider.currentConfig.first().presenceTracing.qrCodeErrorCorrectionLevel Timber.d("input=$input") - mutableUiState.postValue(UiState(traceLocation, qrCodeGenerator.createQrCode(input))) + mutableUiState.postValue( + UiState( + traceLocation, + qrCodeGenerator.createQrCode( + input = input, + correctionLevel = correctionLevel + ) + ) + ) } catch (e: Exception) { Timber.d(e, "Qr code creation failed") e.report(ExceptionCategory.INTERNAL) @@ -86,9 +98,15 @@ class QrCodeDetailViewModel @AssistedInject constructor( } } - fun openFullScreen() { + fun openFullScreen() = launch { traceLocation?.let { - routeToScreen.postValue(QrCodeDetailNavigationEvents.NavigateToFullScreenQrCode(it.locationUrl)) + val correctionLevel = appConfigProvider.currentConfig.first().presenceTracing.qrCodeErrorCorrectionLevel + routeToScreen.postValue( + QrCodeDetailNavigationEvents.NavigateToFullScreenQrCode( + it.locationUrl, + correctionLevel + ) + ) } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModel.kt index 4f903050f..0c9f19cd9 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.MutableLiveData import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import de.rki.coronawarnapp.appconfig.AppConfigProvider import de.rki.coronawarnapp.presencetracing.checkins.qrcode.PosterTemplateProvider import de.rki.coronawarnapp.presencetracing.checkins.qrcode.QrCodeGenerator import de.rki.coronawarnapp.presencetracing.checkins.qrcode.Template @@ -19,6 +20,7 @@ import de.rki.coronawarnapp.util.files.FileSharing import de.rki.coronawarnapp.util.ui.SingleLiveEvent import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory +import kotlinx.coroutines.flow.first import timber.log.Timber import java.io.File import java.io.FileOutputStream @@ -30,6 +32,7 @@ class QrCodePosterViewModel @AssistedInject constructor( private val qrCodeGenerator: QrCodeGenerator, private val posterTemplateProvider: PosterTemplateProvider, private val traceLocationRepository: TraceLocationRepository, + private val appConfigProvider: AppConfigProvider, private val fileSharing: FileSharing ) : CWAViewModel(dispatcher) { @@ -80,11 +83,13 @@ class QrCodePosterViewModel @AssistedInject constructor( try { val traceLocation = traceLocation() val template = posterTemplateProvider.template() + val correctionLevel = appConfigProvider.currentConfig.first().presenceTracing.qrCodeErrorCorrectionLevel Timber.d("template=$template") val qrCode = qrCodeGenerator.createQrCode( input = traceLocation.locationUrl, length = template.qrCodeLength, - margin = 0 + margin = 0, + correctionLevel = correctionLevel ) val textInfo = buildString { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenFragment.kt index 0f4420cc9..ec0a46a97 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenFragment.kt @@ -37,7 +37,8 @@ class QrCodeFullScreenFragment : Fragment(R.layout.fragment_qr_code_full_screen) constructorCall = { factory, _ -> factory as QrCodeFullScreenViewModel.Factory factory.create( - qrcodeText = args.qrCodeText + qrcodeText = args.qrCodeText, + correctionLevel = args.correctionLevel ) } ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenViewModel.kt index 7427c998b..1cfc2635a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/qrcode/fullscreen/QrCodeFullScreenViewModel.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.ui.qrcode.fullscreen import android.graphics.Bitmap import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -15,6 +16,7 @@ import timber.log.Timber class QrCodeFullScreenViewModel @AssistedInject constructor( @Assisted private val qrcodeText: String, + @Assisted private val correctionLevel: ErrorCorrectionLevel, private val qrCodeGenerator: QrCodeGenerator, dispatcherProvider: DispatcherProvider ) : CWAViewModel(dispatcherProvider) { @@ -29,7 +31,9 @@ class QrCodeFullScreenViewModel @AssistedInject constructor( private fun generateQrCode() = launch { try { - qrCodeBitmap.postValue(qrCodeGenerator.createQrCode(qrcodeText)) + qrCodeBitmap.postValue( + qrCodeGenerator.createQrCode(input = qrcodeText, correctionLevel = correctionLevel) + ) } catch (e: Exception) { Timber.d(e, "generateQrCode failed") } @@ -40,7 +44,8 @@ class QrCodeFullScreenViewModel @AssistedInject constructor( @AssistedFactory interface Factory : CWAViewModelFactory<QrCodeFullScreenViewModel> { fun create( - qrcodeText: String + qrcodeText: String, + correctionLevel: ErrorCorrectionLevel ): QrCodeFullScreenViewModel } } diff --git a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml index 6966786ea..3b7b70124 100644 --- a/Corona-Warn-App/src/main/res/navigation/nav_graph.xml +++ b/Corona-Warn-App/src/main/res/navigation/nav_graph.xml @@ -807,6 +807,10 @@ <argument android:name="qrCodeText" app:argType="string" /> + <argument + android:name="correctionLevel" + app:argType="com.google.zxing.qrcode.decoder.ErrorCorrectionLevel" + android:defaultValue="Q" /> </fragment> <action android:id="@+id/action_global_qrCodeFullScreenFragment" diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModelTest.kt index 7d843d40c..7438b8e3c 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/presencetracing/organizer/poster/QrCodePosterViewModelTest.kt @@ -1,6 +1,10 @@ package de.rki.coronawarnapp.ui.presencetracing.organizer.poster import android.graphics.Bitmap +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel +import de.rki.coronawarnapp.appconfig.AppConfigProvider +import de.rki.coronawarnapp.appconfig.ConfigData +import de.rki.coronawarnapp.appconfig.PresenceTracingConfig import de.rki.coronawarnapp.presencetracing.checkins.qrcode.PosterTemplateProvider import de.rki.coronawarnapp.presencetracing.checkins.qrcode.QrCodeGenerator import de.rki.coronawarnapp.presencetracing.checkins.qrcode.Template @@ -13,6 +17,8 @@ import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.mockk +import kotlinx.coroutines.flow.flowOf import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -32,6 +38,7 @@ class QrCodePosterViewModelTest : BaseTest() { @MockK lateinit var templateBitmap: Bitmap @MockK lateinit var textBox: QRCodeTextBoxAndroid @MockK lateinit var traceLocation: TraceLocation + @MockK lateinit var appConfigProvider: AppConfigProvider private lateinit var template: Template @BeforeEach @@ -48,13 +55,21 @@ class QrCodePosterViewModelTest : BaseTest() { textBox = textBox ) - coEvery { qrCodeGenerator.createQrCode("locationUrl", any(), any()) } returns qrCodeBitmap + coEvery { qrCodeGenerator.createQrCode("locationUrl", any(), any(), any(), any()) } returns qrCodeBitmap coEvery { posterTemplateProvider.template() } returns template coEvery { traceLocationRepository.traceLocationForId(any()) } returns traceLocation.apply { every { description } returns "description" every { address } returns "address" every { locationUrl } returns "locationUrl" } + + coEvery { appConfigProvider.currentConfig } returns flowOf( + mockk<ConfigData>().apply { + every { presenceTracing } returns mockk<PresenceTracingConfig>().apply { + every { qrCodeErrorCorrectionLevel } returns ErrorCorrectionLevel.M + } + } + ) } @Test @@ -72,6 +87,7 @@ class QrCodePosterViewModelTest : BaseTest() { qrCodeGenerator = qrCodeGenerator, posterTemplateProvider = posterTemplateProvider, traceLocationRepository = traceLocationRepository, - fileSharing = fileSharing + fileSharing = fileSharing, + appConfigProvider = appConfigProvider ) } -- GitLab