package com.stripe.android.util; import com.stripe.android.model.Card; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * Test class for {@link CardUtils}. */ @RunWith(RobolectricTestRunner.class) @Config(sdk = 23) public class CardUtilsTest { @Test public void getPossibleCardType_withEmptyCard_returnsUnknown() { assertEquals(Card.UNKNOWN, CardUtils.getPossibleCardType(" ")); } @Test public void getPossibleCardType_withNullCardNumber_returnsUnknown() { assertEquals(Card.UNKNOWN, CardUtils.getPossibleCardType(null)); } @Test public void getPossibleCardType_withVisaPrefix_returnsVisa() { assertEquals(Card.VISA, CardUtils.getPossibleCardType("4899 99")); assertEquals(Card.VISA, CardUtils.getPossibleCardType("4")); } @Test public void getPossibleCardType_withAmexPrefix_returnsAmex() { assertEquals(Card.AMERICAN_EXPRESS, CardUtils.getPossibleCardType("345")); assertEquals(Card.AMERICAN_EXPRESS, CardUtils.getPossibleCardType("37999999999")); } @Test public void getPossibleCardType_withJCBPrefix_returnsJCB() { assertEquals(Card.JCB, CardUtils.getPossibleCardType("3535 3535")); } @Test public void getPossibleCardType_withMasterCardPrefix_returnsMasterCard() { assertEquals(Card.MASTERCARD, CardUtils.getPossibleCardType("2222 452")); assertEquals(Card.MASTERCARD, CardUtils.getPossibleCardType("5050")); } @Test public void getPossibleCardType_withDinersClubPrefix_returnsDinersClub() { assertEquals(Card.DINERS_CLUB, CardUtils.getPossibleCardType("303922 2234")); assertEquals(Card.DINERS_CLUB, CardUtils.getPossibleCardType("36778 9098")); } @Test public void getPossibleCardType_withDiscoverPrefix_returnsDiscover() { assertEquals(Card.DISCOVER, CardUtils.getPossibleCardType("60355")); assertEquals(Card.DISCOVER, CardUtils.getPossibleCardType("62")); assertEquals(Card.DISCOVER, CardUtils.getPossibleCardType("6433 8 90923")); // This one has too many numbers on purpose. Checking for length is not part of the // function under test. assertEquals(Card.DISCOVER, CardUtils.getPossibleCardType("6523452309209340293423")); } @Test public void getPossibleCardType_withNonsenseNumber_returnsUnknown() { assertEquals(Card.UNKNOWN, CardUtils.getPossibleCardType("1234567890123456")); assertEquals(Card.UNKNOWN, CardUtils.getPossibleCardType("9999 9999 9999 9999")); assertEquals(Card.UNKNOWN, CardUtils.getPossibleCardType("3")); } @Test public void isValidCardLength_whenValidVisaNumber_returnsTrue() { assertTrue(CardUtils.isValidCardLength("4242424242424242")); } @Test public void isValidCardLength_whenValidJCBNumber_returnsTrue() { assertTrue(CardUtils.isValidCardLength("3530111333300000")); } @Test public void isValidCardLength_whenValidDiscover_returnsTrue() { assertTrue(CardUtils.isValidCardLength("6011000990139424")); } @Test public void isValidCardLength_whenValidDinersClub_returnsTrue() { assertTrue(CardUtils.isValidCardLength("30569309025904")); } @Test public void isValidCardLength_whenValidMasterCard_returnsTrue() { assertTrue(CardUtils.isValidCardLength("5555555555554444")); } @Test public void isValidCardLength_whenValidAmEx_returnsTrue() { assertTrue(CardUtils.isValidCardLength("378282246310005")); } @Test public void isValidCardLength_whenNull_returnsFalse() { assertFalse(CardUtils.isValidCardLength(null)); } @Test public void isValidCardLength_whenVisaStyleNumberButDinersClubLength_returnsFalse() { assertFalse(CardUtils.isValidCardLength("42424242424242")); } @Test public void isValidCardLength_whenVisaStyleNumberButAmExLength_returnsFalse() { assertFalse(CardUtils.isValidCardLength("424242424242424")); } @Test public void isValidCardLength_whenAmExStyleNumberButVisaLength_returnsFalse() { assertFalse(CardUtils.isValidCardLength("3782822463100050")); } @Test public void isValidCardLength_whenAmExStyleNumberButDinersClubLength_returnsFalse() { assertFalse(CardUtils.isValidCardLength("37828224631000")); } @Test public void isValidCardLength_whenDinersClubStyleNumberButVisaLength_returnsFalse() { assertFalse(CardUtils.isValidCardLength("3056930902590400")); } @Test public void isValidCardLength_whenDinersClubStyleNumberStyleNumberButAmexLength_returnsFalse() { assertFalse(CardUtils.isValidCardLength("305693090259040")); } @Test public void isValidCardLengthWithBrand_whenBrandUnknown_alwaysReturnsFalse() { String validVisa = "4242424242424242"; // Adding this check to ensure the input number is correct assertTrue(CardUtils.isValidCardLength(validVisa)); assertFalse(CardUtils.isValidCardLength(validVisa, Card.UNKNOWN)); } @Test public void isValidLuhnNumber_whenValidVisaNumber_returnsTrue() { assertTrue(CardUtils.isValidLuhnNumber("4242424242424242")); } @Test public void isValidLuhnNumber_whenValidJCBNumber_returnsTrue() { assertTrue(CardUtils.isValidLuhnNumber("3530111333300000")); } @Test public void isValidLuhnNumber_whenValidDiscover_returnsTrue() { assertTrue(CardUtils.isValidLuhnNumber("6011000990139424")); } @Test public void isValidLuhnNumber_whenValidDinersClub_returnsTrue() { assertTrue(CardUtils.isValidLuhnNumber("30569309025904")); } @Test public void isValidLuhnNumber_whenValidMasterCard_returnsTrue() { assertTrue(CardUtils.isValidLuhnNumber("5555555555554444")); } @Test public void isValidLuhnNumber_whenValidAmEx_returnsTrue() { assertTrue(CardUtils.isValidLuhnNumber("378282246310005")); } @Test public void isValidLunhNumber_whenNumberIsInvalid_returnsFalse() { assertFalse(CardUtils.isValidLuhnNumber("4242424242424243")); } @Test public void isValidLuhnNumber_whenInputIsNull_returnsFalse() { assertFalse(CardUtils.isValidLuhnNumber(null)); } @Test public void isValidLuhnNumber_whenInputIsNotNumeric_returnsFalse() { assertFalse(CardUtils.isValidLuhnNumber("abcdefg")); // Note: it is not the job of this function to de-space the card number, nor de-hyphen it assertFalse(CardUtils.isValidLuhnNumber("4242 4242 4242 4242")); assertFalse(CardUtils.isValidLuhnNumber("4242-4242-4242-4242")); } @Test public void separateCardNumberGroups_withVisa_returnsCorrectCardGroups() { String testCardNumber = "4000056655665556"; String[] groups = CardUtils.separateCardNumberGroups(testCardNumber, Card.VISA); assertEquals(4, groups.length); assertEquals("4000", groups[0]); assertEquals("0566", groups[1]); assertEquals("5566", groups[2]); assertEquals("5556", groups[3]); } @Test public void separateCardNumberGroups_withAmex_returnsCorrectCardGroups() { String testCardNumber = "378282246310005"; String[] groups = CardUtils.separateCardNumberGroups(testCardNumber, Card.AMERICAN_EXPRESS); assertEquals(3, groups.length); assertEquals("3782", groups[0]); assertEquals("822463", groups[1]); assertEquals("10005", groups[2]); } @Test public void separateCardNumberGroups_withDinersClub_returnsCorrectCardGroups() { String testCardNumber = "38520000023237"; String[] groups = CardUtils.separateCardNumberGroups(testCardNumber, Card.DINERS_CLUB); assertEquals(4, groups.length); assertEquals("3852", groups[0]); assertEquals("0000", groups[1]); assertEquals("0232", groups[2]); assertEquals("37", groups[3]); } @Test public void separateCardNumberGroups_withInvalid_returnsCorrectCardGroups() { String testCardNumber = "1234056655665556"; String[] groups = CardUtils.separateCardNumberGroups(testCardNumber, Card.UNKNOWN); assertEquals(4, groups.length); assertEquals("1234", groups[0]); assertEquals("0566", groups[1]); assertEquals("5566", groups[2]); assertEquals("5556", groups[3]); } @Test public void separateCardNumberGroups_withAmexPrefix_returnsPrefixGroups() { String testCardNumber = "378282246310005"; String[] groups = CardUtils.separateCardNumberGroups( testCardNumber.substring(0, 2), Card.AMERICAN_EXPRESS); assertEquals(3, groups.length); assertEquals("37", groups[0]); assertNull(groups[1]); assertNull(groups[2]); groups = CardUtils.separateCardNumberGroups( testCardNumber.substring(0, 5), Card.AMERICAN_EXPRESS); assertEquals(3, groups.length); assertEquals("3782", groups[0]); assertEquals("8", groups[1]); assertNull(groups[2]); groups = CardUtils.separateCardNumberGroups( testCardNumber.substring(0, 11), Card.AMERICAN_EXPRESS); assertEquals(3, groups.length); assertEquals("3782", groups[0]); assertEquals("822463", groups[1]); assertEquals("1", groups[2]); } @Test public void separateCardNumberGroups_withVisaPrefix_returnsCorrectGroups() { String testCardNumber = "4000056655665556"; String[] groups = CardUtils.separateCardNumberGroups( testCardNumber.substring(0, 2), Card.VISA); assertEquals(4, groups.length); assertEquals("40", groups[0]); assertNull(groups[1]); assertNull(groups[2]); assertNull(groups[3]); groups = CardUtils.separateCardNumberGroups( testCardNumber.substring(0, 5), Card.VISA); assertEquals(4, groups.length); assertEquals("4000", groups[0]); assertEquals("0", groups[1]); assertNull(groups[2]); assertNull(groups[3]); groups = CardUtils.separateCardNumberGroups( testCardNumber.substring(0, 9), Card.VISA); assertEquals(4, groups.length); assertEquals("4000", groups[0]); assertEquals("0566", groups[1]); assertEquals("5", groups[2]); assertNull(groups[3]); groups = CardUtils.separateCardNumberGroups( testCardNumber.substring(0, 15), Card.VISA); assertEquals(4, groups.length); assertEquals("4000", groups[0]); assertEquals("0566", groups[1]); assertEquals("5566", groups[2]); assertEquals("555", groups[3]); } }