diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-08-21 10:28:24 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-08-21 11:05:02 +0200 |
| commit | 5d38db0855f8e48cf43795b73488121dd4810b1b (patch) | |
| tree | 49671ebe18bcfa89524ba99362be32e0d92fe5eb /android/lib/model/src | |
| parent | 766cdae544ac89151794957c696de04fff851162 (diff) | |
| download | mullvadvpn-5d38db0855f8e48cf43795b73488121dd4810b1b.tar.xz mullvadvpn-5d38db0855f8e48cf43795b73488121dd4810b1b.zip | |
Add voucher code domain model
Diffstat (limited to 'android/lib/model/src')
| -rw-r--r-- | android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCode.kt | 31 | ||||
| -rw-r--r-- | android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCodeTest.kt | 34 |
2 files changed, 65 insertions, 0 deletions
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()) + } +} |
