Credit card validator implementations and spec tests.

This commit is contained in:
Alex Hart
2022-10-17 13:47:51 -03:00
parent 27c3607099
commit 1174bc8e07
21 changed files with 948 additions and 6 deletions

View File

@@ -0,0 +1,65 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.donate.card
import android.app.Application
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.ParameterizedRobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(ParameterizedRobolectricTestRunner::class)
@Config(application = Application::class)
class CreditCardCodeValidatorTest(
private val code: String,
private val cardType: CreditCardType,
private val isFocused: Boolean,
private val validity: CreditCardCodeValidator.Validity
) {
@Test
fun getValidity() {
assertEquals(validity, CreditCardCodeValidator.getValidity(code, cardType, isFocused))
}
companion object {
@JvmStatic
@ParameterizedRobolectricTestRunner.Parameters(name = "{index}: getValidity(..) = {0}, {1}, {2}, {3}")
fun data(): Iterable<Array<Any>> = arrayListOf(
// Unfocused
arrayOf("", CreditCardType.UNIONPAY, false, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("1", CreditCardType.UNIONPAY, false, CreditCardCodeValidator.Validity.TOO_SHORT),
arrayOf("12", CreditCardType.UNIONPAY, false, CreditCardCodeValidator.Validity.TOO_SHORT),
arrayOf("123", CreditCardType.UNIONPAY, false, CreditCardCodeValidator.Validity.FULLY_VALID),
arrayOf("1234", CreditCardType.UNIONPAY, false, CreditCardCodeValidator.Validity.TOO_LONG),
arrayOf("", CreditCardType.OTHER, false, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("1", CreditCardType.OTHER, false, CreditCardCodeValidator.Validity.TOO_SHORT),
arrayOf("12", CreditCardType.OTHER, false, CreditCardCodeValidator.Validity.TOO_SHORT),
arrayOf("123", CreditCardType.OTHER, false, CreditCardCodeValidator.Validity.FULLY_VALID),
arrayOf("1234", CreditCardType.OTHER, false, CreditCardCodeValidator.Validity.TOO_LONG),
arrayOf("", CreditCardType.AMERICAN_EXPRESS, false, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("1", CreditCardType.AMERICAN_EXPRESS, false, CreditCardCodeValidator.Validity.TOO_SHORT),
arrayOf("12", CreditCardType.AMERICAN_EXPRESS, false, CreditCardCodeValidator.Validity.TOO_SHORT),
arrayOf("123", CreditCardType.AMERICAN_EXPRESS, false, CreditCardCodeValidator.Validity.TOO_SHORT),
arrayOf("1234", CreditCardType.AMERICAN_EXPRESS, false, CreditCardCodeValidator.Validity.FULLY_VALID),
arrayOf("12345", CreditCardType.AMERICAN_EXPRESS, false, CreditCardCodeValidator.Validity.TOO_LONG),
// Focused
arrayOf("", CreditCardType.UNIONPAY, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("1", CreditCardType.UNIONPAY, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("12", CreditCardType.UNIONPAY, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("123", CreditCardType.UNIONPAY, true, CreditCardCodeValidator.Validity.FULLY_VALID),
arrayOf("1234", CreditCardType.UNIONPAY, true, CreditCardCodeValidator.Validity.TOO_LONG),
arrayOf("", CreditCardType.OTHER, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("1", CreditCardType.OTHER, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("12", CreditCardType.OTHER, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("123", CreditCardType.OTHER, true, CreditCardCodeValidator.Validity.FULLY_VALID),
arrayOf("1234", CreditCardType.OTHER, true, CreditCardCodeValidator.Validity.TOO_LONG),
arrayOf("", CreditCardType.AMERICAN_EXPRESS, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("1", CreditCardType.AMERICAN_EXPRESS, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("12", CreditCardType.AMERICAN_EXPRESS, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("123", CreditCardType.AMERICAN_EXPRESS, true, CreditCardCodeValidator.Validity.POTENTIALLY_VALID),
arrayOf("1234", CreditCardType.AMERICAN_EXPRESS, true, CreditCardCodeValidator.Validity.FULLY_VALID),
arrayOf("12345", CreditCardType.AMERICAN_EXPRESS, true, CreditCardCodeValidator.Validity.TOO_LONG)
)
}
}

View File

@@ -0,0 +1,105 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.donate.card
import android.app.Application
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.ParameterizedRobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(ParameterizedRobolectricTestRunner::class)
@Config(application = Application::class)
class CreditCardExpirationValidatorTest(
private val creditCardExpiration: CreditCardExpiration,
private val currentYear: Int,
private val isFocused: Boolean,
private val validity: CreditCardExpirationValidator.Validity
) {
@Test
fun getValidity() {
assertEquals(validity, CreditCardExpirationValidator.getValidity(creditCardExpiration, 3, currentYear, isFocused))
}
companion object {
@JvmStatic
@ParameterizedRobolectricTestRunner.Parameters(name = "{index}: getValidity(..) = {0}, {1}, {2}, {3}, {4}")
fun data(): Iterable<Array<Any>> = arrayListOf(
// Unfocused
arrayOf(CreditCardExpiration("", ""), 2020, false, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("0", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("1", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MISSING_YEAR),
arrayOf(CreditCardExpiration("9", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MISSING_YEAR),
arrayOf(CreditCardExpiration("01", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MISSING_YEAR),
arrayOf(CreditCardExpiration("09", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MISSING_YEAR),
arrayOf(CreditCardExpiration("12", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MISSING_YEAR),
arrayOf(CreditCardExpiration("", "0"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "1"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "9"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "00"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "01"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "99"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("3", "20"), 2020, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("03", "20"), 2020, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("4", "20"), 2020, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("12", "20"), 2020, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("3", "21"), 2020, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("3", "40"), 2020, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("2", "20"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_EXPIRED),
arrayOf(CreditCardExpiration("3", "41"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_EXPIRED),
arrayOf(CreditCardExpiration("3", "41"), 2021, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("01", "99"), 2098, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("03", "00"), 2099, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("04", "00"), 2099, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("03", "19"), 2099, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("12", "19"), 2099, false, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("00", "20"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("X", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("1X", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("123", ""), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "X"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "2X"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "202"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "2020"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("X", "X"), 2020, false, CreditCardExpirationValidator.Validity.INVALID_MONTH),
// Focused
arrayOf(CreditCardExpiration("", ""), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("0", ""), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("1", ""), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("9", ""), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("01", ""), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("09", ""), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("12", ""), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("", "0"), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("", "1"), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("", "9"), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("", "00"), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("", "01"), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("", "99"), 2020, true, CreditCardExpirationValidator.Validity.POTENTIALLY_VALID),
arrayOf(CreditCardExpiration("3", "20"), 2020, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("03", "20"), 2020, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("4", "20"), 2020, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("12", "20"), 2020, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("3", "21"), 2020, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("3", "40"), 2020, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("2", "20"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_EXPIRED),
arrayOf(CreditCardExpiration("3", "41"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_EXPIRED),
arrayOf(CreditCardExpiration("3", "41"), 2021, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("01", "99"), 2098, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("03", "00"), 2099, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("04", "00"), 2099, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("03", "19"), 2099, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("12", "19"), 2099, true, CreditCardExpirationValidator.Validity.FULLY_VALID),
arrayOf(CreditCardExpiration("00", "20"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("X", ""), 2020, true, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("1X", ""), 2020, true, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("123", ""), 2020, true, CreditCardExpirationValidator.Validity.INVALID_MONTH),
arrayOf(CreditCardExpiration("", "X"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_YEAR),
arrayOf(CreditCardExpiration("", "2X"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_YEAR),
arrayOf(CreditCardExpiration("", "202"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_YEAR),
arrayOf(CreditCardExpiration("", "2020"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_YEAR),
arrayOf(CreditCardExpiration("X", "X"), 2020, true, CreditCardExpirationValidator.Validity.INVALID_MONTH)
)
}
}

View File

@@ -0,0 +1,43 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.donate.card
import android.app.Application
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.ParameterizedRobolectricTestRunner
import org.robolectric.annotation.Config
@RunWith(ParameterizedRobolectricTestRunner::class)
@Config(application = Application::class)
class CreditCardNumberValidatorTest(
private val creditCardNumber: String,
private val creditCardNumberFieldFocused: Boolean,
private val validity: CreditCardNumberValidator.Validity
) {
@Test
fun getValidity() {
assertEquals(validity, CreditCardNumberValidator.getValidity(creditCardNumber, creditCardNumberFieldFocused))
}
companion object {
@JvmStatic
@ParameterizedRobolectricTestRunner.Parameters(name = "{index}: getValidity(..) = {0}, {1}, {2}")
fun data(): Iterable<Array<Any>> = arrayListOf(
arrayOf("", false, CreditCardNumberValidator.Validity.POTENTIALLY_VALID),
arrayOf("4", false, CreditCardNumberValidator.Validity.POTENTIALLY_VALID),
arrayOf("42", false, CreditCardNumberValidator.Validity.POTENTIALLY_VALID),
arrayOf("42424242424", false, CreditCardNumberValidator.Validity.POTENTIALLY_VALID),
arrayOf("424242424242", false, CreditCardNumberValidator.Validity.FULLY_VALID),
arrayOf("424242424242424242", false, CreditCardNumberValidator.Validity.FULLY_VALID),
arrayOf("4242424242424", false, CreditCardNumberValidator.Validity.INVALID),
arrayOf("4242424242424", true, CreditCardNumberValidator.Validity.POTENTIALLY_VALID),
arrayOf("6200000000000004", false, CreditCardNumberValidator.Validity.FULLY_VALID),
arrayOf("6200000000000005", false, CreditCardNumberValidator.Validity.FULLY_VALID),
arrayOf("42424242424242424242", false, CreditCardNumberValidator.Validity.INVALID),
arrayOf("X", false, CreditCardNumberValidator.Validity.INVALID),
arrayOf("42X", false, CreditCardNumberValidator.Validity.INVALID),
arrayOf("424242424242X", false, CreditCardNumberValidator.Validity.INVALID)
)
}
}

View File

@@ -0,0 +1,44 @@
package org.thoughtcrime.securesms.components.settings.app.subscription.donate.card
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
@RunWith(Parameterized::class)
class CreditCardTypeTest(
private val creditCardNumber: String,
private val creditCardType: CreditCardType
) {
@Test
fun fromCardNumber() {
assertEquals(creditCardType, CreditCardType.fromCardNumber(cardNumber = creditCardNumber))
}
companion object {
@JvmStatic
@Parameterized.Parameters(name = "{index}: fromCardNumber(..) = {0}, {1}")
fun data(): Iterable<Array<Any>> = arrayListOf(
arrayOf("34", CreditCardType.AMERICAN_EXPRESS),
arrayOf("37", CreditCardType.AMERICAN_EXPRESS),
arrayOf("343452000000306", CreditCardType.AMERICAN_EXPRESS),
arrayOf("371449635398431", CreditCardType.AMERICAN_EXPRESS),
arrayOf("378282246310005", CreditCardType.AMERICAN_EXPRESS),
arrayOf("62", CreditCardType.UNIONPAY),
arrayOf("81", CreditCardType.UNIONPAY),
arrayOf("6200000000000004", CreditCardType.UNIONPAY),
arrayOf("", CreditCardType.OTHER),
arrayOf("X", CreditCardType.OTHER),
arrayOf("4", CreditCardType.OTHER),
arrayOf("4111111111111111", CreditCardType.OTHER),
arrayOf("4242424242424242", CreditCardType.OTHER),
arrayOf("5555555555554444", CreditCardType.OTHER),
arrayOf("5555555555554444", CreditCardType.OTHER),
arrayOf("2223003122003222", CreditCardType.OTHER),
arrayOf("6011111111111117", CreditCardType.OTHER),
arrayOf("3056930009020004", CreditCardType.OTHER),
arrayOf("3566002020360505", CreditCardType.OTHER),
)
}
}