IdentitiesTest.kt

4.9 KB · raw

1package com.peachpasswords.autofill23import com.peachpasswords.vault.VaultEntry4import org.junit.Assert.assertEquals5import org.junit.Assert.assertTrue6import org.junit.Test78class IdentitiesTest {9    private fun login(10        id: String,11        username: String? = null,12        email: String? = null,13        url: String? = null,14        modifiedAt: Long = 100,15        deleted: Boolean = false,16        type: String? = "login",17    ) = VaultEntry(18        id = id,19        title = id,20        username = username,21        email = email,22        url = url,23        createdAt = 0,24        modifiedAt = modifiedAt,25        deletedAt = if (deleted) 1L else null,26        type = type,27    )2829    @Test fun usernames_and_emails_are_derived_from_login_entries() {30        val identities = deriveIdentities(31            listOf(32                login("a", username = "june", url = "https://github.com"),33                login("b", email = "[email protected]", url = "https://fastmail.com"),34            ),35        )36        assertEquals(37            listOf(38                SavedIdentity("[email protected]", IdentityType.EMAIL, 100, 1, "fastmail.com"),39                SavedIdentity("june", IdentityType.USERNAME, 100, 1, "github.com"),40            ),41            identities,42        )43    }4445    @Test fun username_shaped_like_an_email_counts_as_email() {46        val identities = deriveIdentities(listOf(login("a", username = "[email protected]")))47        assertEquals(listOf(SavedIdentity("[email protected]", IdentityType.EMAIL, 100, 1, null)), identities)48    }4950    @Test fun same_email_across_entries_appears_once_with_use_count() {51        val identities = deriveIdentities(52            listOf(53                login("a", email = "[email protected]", url = "https://one.com", modifiedAt = 10),54                login("b", username = "[email protected]", url = "https://two.com", modifiedAt = 30),55                login("c", email = "[email protected]", url = "https://three.com", modifiedAt = 20),56            ),57        )58        val identity = identities.single()59        assertEquals("[email protected]", identity.value)60        assertEquals(3, identity.useCount)61        assertEquals(30L, identity.lastUsed)62        assertEquals("two.com", identity.exampleDomain)63    }6465    @Test fun emails_come_first_and_sort_by_use_count() {66        val identities = deriveIdentities(67            listOf(68                login("a", username = "u1"),69                login("b", username = "u2"),70                login("c", email = "[email protected]"),71                login("d", email = "[email protected]"),72                login("e", email = "[email protected]"),73            ),74        )75        assertEquals(76            listOf("[email protected]", "[email protected]", "u1", "u2"),77            identities.map { it.value },78        )79    }8081    @Test fun deleted_and_non_login_entries_are_ignored() {82        val identities = deriveIdentities(83            listOf(84                login("a", username = "gone", deleted = true),85                login("b", username = "cardholder", type = "card"),86                login("c", username = "note-taker", type = "note"),87            ),88        )89        assertTrue(identities.isEmpty())90    }9192    @Test fun filter_modes_restrict_the_type() {93        val identities = listOf(94            SavedIdentity("[email protected]", IdentityType.EMAIL, 2, 1),95            SavedIdentity("june", IdentityType.USERNAME, 1, 1),96        )97        assertEquals(listOf("[email protected]"), filterIdentities(identities, "", IdentityFilterMode.EMAIL).map { it.value })98        assertEquals(listOf("june"), filterIdentities(identities, "", IdentityFilterMode.USERNAME).map { it.value })99        assertEquals(2, filterIdentities(identities, "", IdentityFilterMode.BOTH).size)100    }101102    @Test fun filter_orders_by_last_used_then_use_count() {103        val identities = listOf(104            SavedIdentity("[email protected]", IdentityType.EMAIL, lastUsed = 1, useCount = 9),105            SavedIdentity("[email protected]", IdentityType.EMAIL, lastUsed = 5, useCount = 1),106            SavedIdentity("[email protected]", IdentityType.EMAIL, lastUsed = 3, useCount = 2),107        )108        assertEquals(109            listOf("[email protected]", "[email protected]", "[email protected]"),110            filterIdentities(identities, "", IdentityFilterMode.BOTH).map { it.value },111        )112    }113114    @Test fun filter_query_matches_value_domain_or_type() {115        val identities = listOf(116            SavedIdentity("[email protected]", IdentityType.EMAIL, 2, 1, "fastmail.com"),117            SavedIdentity("june", IdentityType.USERNAME, 1, 1, "github.com"),118        )119        assertEquals(listOf("[email protected]"), filterIdentities(identities, "fastmail", IdentityFilterMode.BOTH).map { it.value })120        assertEquals(listOf("june"), filterIdentities(identities, "github", IdentityFilterMode.BOTH).map { it.value })121        assertEquals(listOf("[email protected]"), filterIdentities(identities, "email", IdentityFilterMode.BOTH).map { it.value })122        assertTrue(filterIdentities(identities, "zzz", IdentityFilterMode.BOTH).isEmpty())123    }124}