EntryEditExtraTest.kt

4.5 KB · raw

1package com.peachpasswords.ui.vault23import com.peachpasswords.vault.PasswordGenerator4import org.junit.Assert.assertEquals5import org.junit.Assert.assertFalse6import org.junit.Assert.assertTrue7import org.junit.Test89/**10 * EntryEdit suite expansion (brief Suite 5): the new-card field logic11 * (network detection, PAN/CVC limits, expiry validation) and the password12 * generator the editor drawer drives. Builds on [EntryEditScreenTest].13 */14class EntryEditExtraTest {1516    // ── Network detection from the leading digit ──────────────────────────────1718    @Test fun network_detected_from_first_digit() {19        assertEquals("visa", CardFieldUtils.detectNetwork("4111111111111111"))20        assertEquals("mastercard", CardFieldUtils.detectNetwork("5500000000000004"))21        assertEquals("amex", CardFieldUtils.detectNetwork("378282246310005"))22        assertEquals("discover", CardFieldUtils.detectNetwork("6011000000000004"))23        assertEquals("unknown", CardFieldUtils.detectNetwork("9999"))24        assertEquals("unknown", CardFieldUtils.detectNetwork(""))25    }2627    @Test fun network_label_is_human_readable() {28        assertEquals("Visa", CardFieldUtils.networkLabel("visa"))29        assertEquals("Mastercard", CardFieldUtils.networkLabel("mastercard"))30        assertEquals("Amex", CardFieldUtils.networkLabel("amex"))31        assertEquals("Discover", CardFieldUtils.networkLabel("discover"))32        assertEquals("", CardFieldUtils.networkLabel("unknown"))33        assertEquals("", CardFieldUtils.networkLabel(null))34    }3536    // ── PAN / CVC limits ──────────────────────────────────────────────────────3738    @Test fun pan_max_digits_amex_is_15_others_16() {39        assertEquals(15, CardFieldUtils.panMaxDigits("amex"))40        assertEquals(16, CardFieldUtils.panMaxDigits("visa"))41        assertEquals(16, CardFieldUtils.panMaxDigits(null))42    }4344    @Test fun cvc_max_digits_amex_is_4_others_3() {45        assertEquals(4, CardFieldUtils.cvcMaxDigits("amex"))46        assertEquals(3, CardFieldUtils.cvcMaxDigits("visa"))47    }4849    @Test fun format_pan_caps_at_network_max() {50        // 20 digits typed for a Visa → capped to 16 (four groups of four).51        assertEquals("4242 4242 4242 4242", CardFieldUtils.formatPan("42424242424242424242"))52    }5354    @Test fun format_pan_strips_non_digits() {55        assertEquals("4242 4242", CardFieldUtils.formatPan("4242-4242"))56    }5758    @Test fun last4_extracts_trailing_digits() {59        assertEquals("4242", CardFieldUtils.last4("4242 4242 4242 4242"))60        assertEquals("", CardFieldUtils.last4(null))61    }6263    // ── Expiry validation (currentYear2 = 26, currentMonth = 6 → 2026-06) ─────6465    @Test fun expiry_valid_in_future() {66        assertTrue(CardFieldUtils.isExpiryValid("06/26", currentYear2 = 26, currentMonth = 6)) // this month67        assertTrue(CardFieldUtils.isExpiryValid("01/30", currentYear2 = 26, currentMonth = 6))68    }6970    @Test fun expiry_rejects_past_month_this_year() {71        assertFalse(CardFieldUtils.isExpiryValid("05/26", currentYear2 = 26, currentMonth = 6))72    }7374    @Test fun expiry_rejects_bad_month() {75        assertFalse(CardFieldUtils.isExpiryValid("13/30", currentYear2 = 26, currentMonth = 6))76        assertFalse(CardFieldUtils.isExpiryValid("00/30", currentYear2 = 26, currentMonth = 6))77    }7879    @Test fun expiry_rejects_incomplete() {80        assertFalse(CardFieldUtils.isExpiryValid("6/2", currentYear2 = 26, currentMonth = 6))81    }8283    // ── Password generator (editor drawer) ────────────────────────────────────8485    @Test fun generator_respects_length() {86        val pw = PasswordGenerator.generate(PasswordGenerator.Options(length = 24))87        assertEquals(24, pw.length)88    }8990    @Test fun generator_with_only_digits_yields_digits() {91        val pw = PasswordGenerator.generate(92            PasswordGenerator.Options(93                length = 20, includeUppercase = false, includeLowercase = false,94                includeNumbers = true, includeSymbols = false,95            ),96        )97        assertTrue(pw.all { it.isDigit() })98    }99100    @Test fun generator_produces_distinct_passwords() {101        val a = PasswordGenerator.generate(PasswordGenerator.Options(length = 32))102        val b = PasswordGenerator.generate(PasswordGenerator.Options(length = 32))103        assertFalse("two generated passwords should differ", a == b)104    }105}