1package com.peachpasswords.ui.vault23import com.peachpasswords.vault.PasskeyData4import com.peachpasswords.vault.VaultEntry5import org.junit.Assert.assertEquals6import org.junit.Assert.assertTrue7import org.junit.Test89class VaultSearchParityTest {10 @Test fun recent_sort_uses_last_used_then_modified_time() {11 val entries = listOf(12 entry(id = "created-only", title = "Created only", modifiedAt = 10),13 entry(id = "login-used", title = "Login used", modifiedAt = 20, lastUsedAt = 300),14 entry(id = "modified-fallback", title = "Modified fallback", modifiedAt = 200),15 )1617 val sorted = filterAndSortVaultEntries(entries, SortOrder.NEWEST, "")1819 assertEquals(listOf("login-used", "modified-fallback", "created-only"), sorted.map { it.id })20 }2122 @Test fun fuzzy_search_matches_notes_passkeys_and_additional_urls() {23 val note = entry(id = "note", type = "note", title = "Notebook", notes = "recovery codes")24 val passkey = entry(25 id = "passkey",26 title = "Loginless",27 passkey = passkeyData(rpId = "example.com", userDisplayName = "Passkey User"),28 )29 val alias = entry(30 id = "alias",31 title = "Primary",32 url = "https://example.com",33 additionalUrls = listOf("https://billing.example.com"),34 )3536 assertEquals(listOf("note"), filterAndSortVaultEntries(listOf(note), SortOrder.SMART, "rcvry").map { it.id })37 assertEquals(listOf("passkey"), filterAndSortVaultEntries(listOf(passkey), SortOrder.SMART, "psky usr").map { it.id })38 assertEquals(listOf("alias"), filterAndSortVaultEntries(listOf(alias), SortOrder.SMART, "billing").map { it.id })39 }4041 @Test fun exact_prefix_search_beats_newer_fuzzy_match() {42 val exact = entry(id = "exact", title = "GitHub", modifiedAt = 10)43 val fuzzyNewer = entry(id = "fuzzy", title = "Work login", username = "github-user", modifiedAt = 500)4445 val sorted = filterAndSortVaultEntries(listOf(fuzzyNewer, exact), SortOrder.SMART, "git")4647 assertEquals(listOf("exact", "fuzzy"), sorted.map { it.id })48 }4950 @Test fun fuzzy_match_allows_non_contiguous_letters() {51 assertTrue(fuzzyMatch("gthb", "GitHub"))52 }5354 private fun entry(55 id: String,56 title: String,57 type: String = "login",58 username: String? = null,59 url: String? = null,60 additionalUrls: List<String>? = null,61 notes: String? = null,62 passkey: PasskeyData? = null,63 createdAt: Long = 1,64 modifiedAt: Long = 1,65 lastUsedAt: Long? = null,66 ) = VaultEntry(67 id = id,68 title = title,69 type = type,70 username = username,71 url = url,72 additionalUrls = additionalUrls,73 notes = notes,74 passkey = passkey,75 createdAt = createdAt,76 modifiedAt = modifiedAt,77 lastUsedAt = lastUsedAt,78 )7980 private fun passkeyData(81 rpId: String,82 userDisplayName: String,83 ) = PasskeyData(84 credentialId = "cred",85 publicKeyCose = "cose",86 rpId = rpId,87 userHandle = "handle",88 userName = "passkey-user",89 userDisplayName = userDisplayName,90 )91}