VaultSearchParityTest.kt

3.2 KB · raw

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}