diff options
| author | Albin <albin@mullvad.net> | 2024-08-21 11:12:44 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2024-08-21 11:12:44 +0200 |
| commit | 114d58677e77213df647aab2ae35c5235a24cb5b (patch) | |
| tree | abc325946db7d2aa627282e626cbd3fde72ee0a8 /android/app | |
| parent | 766cdae544ac89151794957c696de04fff851162 (diff) | |
| parent | e12c64a82809d0bf17f3ab59cfafe3ed7ab7793c (diff) | |
| download | mullvadvpn-114d58677e77213df647aab2ae35c5235a24cb5b.tar.xz mullvadvpn-114d58677e77213df647aab2ae35c5235a24cb5b.zip | |
Merge branch 'add-voucher-error-message-droid-923'
Diffstat (limited to 'android/app')
3 files changed, 44 insertions, 11 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt index 093dc7ce97..6d3d134e1d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt @@ -274,10 +274,23 @@ private fun EnterVoucherBody( ) } } + if ( + state.voucherState is VoucherDialogState.Error && + state.voucherState.error is RedeemVoucherError.EnteredAccountNumber + ) { + Text( + modifier = Modifier.padding(top = Dimens.smallPadding), + text = stringResource(id = R.string.voucher_is_account_number), + color = MaterialTheme.colorScheme.onPrimary, + style = MaterialTheme.typography.bodySmall + ) + } } private fun RedeemVoucherError.message(): Int = when (this) { + RedeemVoucherError.TooShortVoucher, + RedeemVoucherError.EnteredAccountNumber, RedeemVoucherError.InvalidVoucher -> R.string.invalid_voucher RedeemVoucherError.VoucherAlreadyUsed -> R.string.voucher_already_used RedeemVoucherError.RpcError, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModel.kt index 3d67b42bd1..857953f28b 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModel.kt @@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import arrow.core.raise.either import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine @@ -11,7 +12,9 @@ import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.compose.state.VoucherDialogState import net.mullvad.mullvadvpn.compose.state.VoucherDialogUiState import net.mullvad.mullvadvpn.constant.VOUCHER_LENGTH +import net.mullvad.mullvadvpn.lib.model.ParseVoucherCodeError import net.mullvad.mullvadvpn.lib.model.RedeemVoucherError +import net.mullvad.mullvadvpn.lib.model.VoucherCode import net.mullvad.mullvadvpn.lib.shared.VoucherRepository import net.mullvad.mullvadvpn.util.VoucherRegexHelper @@ -26,11 +29,23 @@ class VoucherDialogViewModel(private val voucherRepository: VoucherRepository) : } .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), VoucherDialogUiState.INITIAL) - fun onRedeem(voucherCode: String) { + fun onRedeem(voucherInput: String) { vmState.update { VoucherDialogState.Verifying } viewModelScope.launch { - voucherRepository - .submitVoucher(voucherCode) + either { + val voucherCode = + VoucherCode.fromString(voucherInput) + .mapLeft { + when (it) { + is ParseVoucherCodeError.AllDigit -> + RedeemVoucherError.EnteredAccountNumber + is ParseVoucherCodeError.TooShort -> + RedeemVoucherError.TooShortVoucher + } + } + .bind() + voucherRepository.submitVoucher(voucherCode).bind() + } .fold( { error -> setError(error) }, { success -> handleAddedTime(success.timeAdded) } diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt index ef3b34effc..3bd96de3cb 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt @@ -16,6 +16,7 @@ import net.mullvad.mullvadvpn.compose.state.VoucherDialogState import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule import net.mullvad.mullvadvpn.lib.model.RedeemVoucherError import net.mullvad.mullvadvpn.lib.model.RedeemVoucherSuccess +import net.mullvad.mullvadvpn.lib.model.VoucherCode import net.mullvad.mullvadvpn.lib.shared.VoucherRepository import org.joda.time.DateTime import org.junit.jupiter.api.AfterEach @@ -45,11 +46,12 @@ class VoucherDialogViewModelTest { @Test fun `ensure onRedeem invokes submit on VoucherRedeemer with same voucher code`() = runTest { val voucher = DUMMY_INVALID_VOUCHER + val parsedVoucher = VoucherCode.fromString(voucher).getOrNull()!! // Arrange val timeAdded = 0L val newExpiry = DateTime() - coEvery { mockVoucherRepository.submitVoucher(voucher) } returns + coEvery { mockVoucherRepository.submitVoucher(parsedVoucher) } returns RedeemVoucherSuccess(timeAdded, newExpiry).right() // Act @@ -57,7 +59,7 @@ class VoucherDialogViewModelTest { viewModel.onRedeem(voucher) // Assert - coVerify(exactly = 1) { mockVoucherRepository.submitVoucher(voucher) } + coVerify(exactly = 1) { mockVoucherRepository.submitVoucher(parsedVoucher) } } @Test @@ -66,8 +68,9 @@ class VoucherDialogViewModelTest { // Arrange every { mockVoucherSubmission.timeAdded } returns 0 - coEvery { mockVoucherRepository.submitVoucher(voucher) } returns - RedeemVoucherError.InvalidVoucher.left() + coEvery { + mockVoucherRepository.submitVoucher(VoucherCode.fromString(voucher).getOrNull()!!) + } returns RedeemVoucherError.InvalidVoucher.left() // Act, Assert viewModel.uiState.test { @@ -84,8 +87,9 @@ class VoucherDialogViewModelTest { // Arrange every { mockVoucherSubmission.timeAdded } returns 0 - coEvery { mockVoucherRepository.submitVoucher(voucher) } returns - RedeemVoucherSuccess(0, DateTime()).right() + coEvery { + mockVoucherRepository.submitVoucher(VoucherCode.fromString(voucher).getOrNull()!!) + } returns RedeemVoucherSuccess(0, DateTime()).right() // Act, Assert viewModel.uiState.test { @@ -102,8 +106,9 @@ class VoucherDialogViewModelTest { // Arrange every { mockVoucherSubmission.timeAdded } returns 0 - coEvery { mockVoucherRepository.submitVoucher(voucher) } returns - RedeemVoucherError.VoucherAlreadyUsed.left() + coEvery { + mockVoucherRepository.submitVoucher(VoucherCode.fromString(voucher).getOrNull()!!) + } returns RedeemVoucherError.VoucherAlreadyUsed.left() // Act, Assert viewModel.uiState.test { |
