summaryrefslogtreecommitdiffhomepage
path: root/android/lib/model/src
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-08-21 10:28:24 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-08-21 11:05:02 +0200
commit5d38db0855f8e48cf43795b73488121dd4810b1b (patch)
tree49671ebe18bcfa89524ba99362be32e0d92fe5eb /android/lib/model/src
parent766cdae544ac89151794957c696de04fff851162 (diff)
downloadmullvadvpn-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.kt31
-rw-r--r--android/lib/model/src/test/kotlin/net/mullvad/mullvadvpn/lib/model/VoucherCodeTest.kt34
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())
+ }
+}