1package com.peachpasswords.passkeys23import com.peachpasswords.vault.PasskeyData4import com.peachpasswords.vault.VaultEntry5import org.junit.Assert.assertEquals6import org.junit.Assert.assertTrue7import org.junit.Test89class PasskeyCredentialPlannerTest {10 @Test fun matches_passkeys_by_exact_rp_id() {11 val matches = PasskeyCredentialPlanner.candidates(12 listOf(13 passkey("a", rpId = "example.com", username = "june"),14 passkey("b", rpId = "evil-example.com", username = "lookalike"),15 ),16 """{"challenge":"c","rpId":"example.com"}""",17 )1819 assertEquals(listOf("a"), matches.map { it.entryId })20 assertEquals("june", matches.single().username)21 }2223 @Test fun narrows_to_allow_credentials_when_present() {24 val matches = PasskeyCredentialPlanner.candidates(25 listOf(26 passkey("a", credentialId = "cred-a", lastUsedAt = 10),27 passkey("b", credentialId = "cred-b", lastUsedAt = 20),28 ),29 """{"challenge":"c","rpId":"example.com","allowCredentials":[{"type":"public-key","id":"cred-a"}]}""",30 )3132 assertEquals(listOf("a"), matches.map { it.entryId })33 }3435 @Test fun empty_or_invalid_requests_offer_no_credentials() {36 assertTrue(PasskeyCredentialPlanner.candidates(listOf(passkey("a")), """{"challenge":"c"}""").isEmpty())37 assertTrue(PasskeyCredentialPlanner.candidates(listOf(passkey("a")), "not-json").isEmpty())38 }3940 private fun passkey(41 id: String,42 rpId: String = "example.com",43 credentialId: String = "cred-$id",44 username: String = "user-$id",45 lastUsedAt: Long? = null,46 ) = VaultEntry(47 id = id,48 type = "passkey",49 title = "Passkey $id",50 passkey = PasskeyData(51 credentialId = credentialId,52 publicKeyCose = "cose-$id",53 rpId = rpId,54 userHandle = "handle-$id",55 userName = username,56 userDisplayName = "User $id",57 ),58 lastUsedAt = lastUsedAt,59 createdAt = 1,60 modifiedAt = 1,61 )62}