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/lib/model/src | |
| 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/lib/model/src')
3 files changed, 69 insertions, 0 deletions
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt index d14a2f236b..6df604c4a6 100644 --- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt @@ -5,6 +5,10 @@ sealed class RedeemVoucherError { data object VoucherAlreadyUsed : RedeemVoucherError() + data object TooShortVoucher : RedeemVoucherError() + + data object EnteredAccountNumber : RedeemVoucherError() + data object RpcError : RedeemVoucherError() data class Unknown(val error: Throwable) : RedeemVoucherError() diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCode.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCode.kt new file mode 100644 index 0000000000..9790096d55 --- /dev/null +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCode.kt @@ -0,0 +1,31 @@ +package net.mullvad.mullvadvpn.lib.model + +import arrow.core.Either +import arrow.core.raise.either +import arrow.core.raise.ensure + +@JvmInline +value class VoucherCode private constructor(val value: String) { + + companion object { + // Parsing reference: + // <services-repository>/services/docs/adr/0018-distinguish-voucher-codes-from-account-numbers.md + fun fromString(value: String): Either<ParseVoucherCodeError, VoucherCode> = either { + val trimmedValue = value.trim() + ensure(trimmedValue.length >= MIN_VOUCHER_LENGTH) { + ParseVoucherCodeError.TooShort(trimmedValue) + } + ensure(!value.all { it.isDigit() }) { ParseVoucherCodeError.AllDigit(trimmedValue) } + VoucherCode(trimmedValue) + } + + const val MIN_VOUCHER_LENGTH = 16 + } +} + +sealed interface ParseVoucherCodeError { + + data class AllDigit(val value: String) : ParseVoucherCodeError + + data class TooShort(val value: String) : ParseVoucherCodeError +} diff --git a/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCodeTest.kt b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCodeTest.kt new file mode 100644 index 0000000000..270e8b2503 --- /dev/null +++ b/android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCodeTest.kt @@ -0,0 +1,34 @@ +package net.mullvad.mullvadvpn.lib.model + +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import org.junit.jupiter.api.Test + +class VoucherCodeTest { + @Test + fun `parsing a too short voucher code should return TooShort`() { + val input = "mycode" + val result = VoucherCode.fromString(input) + + assertTrue(result.isLeft()) + assertEquals(ParseVoucherCodeError.TooShort(input), result.leftOrNull()) + } + + @Test + fun `numbers only should not be allowed`() { + val input = "1234123412341234" + val result = VoucherCode.fromString(input) + + assertTrue(result.isLeft()) + assertEquals(ParseVoucherCodeError.AllDigit(input), result.leftOrNull()) + } + + @Test + fun `number only input when too short should return TooShort`() { + val input = "123412341234" + val result = VoucherCode.fromString(input) + + assertTrue(result.isLeft()) + assertEquals(ParseVoucherCodeError.TooShort(input), result.leftOrNull()) + } +} |
