diff options
Diffstat (limited to 'android/lib/model')
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()) + } +} |
