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}