package com.peachpasswords.passkeys import com.peachpasswords.vault.PasskeyData import com.peachpasswords.vault.VaultEntry import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test class PasskeyCredentialPlannerTest { @Test fun matches_passkeys_by_exact_rp_id() { val matches = PasskeyCredentialPlanner.candidates( listOf( passkey("a", rpId = "example.com", username = "june"), passkey("b", rpId = "evil-example.com", username = "lookalike"), ), """{"challenge":"c","rpId":"example.com"}""", ) assertEquals(listOf("a"), matches.map { it.entryId }) assertEquals("june", matches.single().username) } @Test fun narrows_to_allow_credentials_when_present() { val matches = PasskeyCredentialPlanner.candidates( listOf( passkey("a", credentialId = "cred-a", lastUsedAt = 10), passkey("b", credentialId = "cred-b", lastUsedAt = 20), ), """{"challenge":"c","rpId":"example.com","allowCredentials":[{"type":"public-key","id":"cred-a"}]}""", ) assertEquals(listOf("a"), matches.map { it.entryId }) } @Test fun empty_or_invalid_requests_offer_no_credentials() { assertTrue(PasskeyCredentialPlanner.candidates(listOf(passkey("a")), """{"challenge":"c"}""").isEmpty()) assertTrue(PasskeyCredentialPlanner.candidates(listOf(passkey("a")), "not-json").isEmpty()) } private fun passkey( id: String, rpId: String = "example.com", credentialId: String = "cred-$id", username: String = "user-$id", lastUsedAt: Long? = null, ) = VaultEntry( id = id, type = "passkey", title = "Passkey $id", passkey = PasskeyData( credentialId = credentialId, publicKeyCose = "cose-$id", rpId = rpId, userHandle = "handle-$id", userName = username, userDisplayName = "User $id", ), lastUsedAt = lastUsedAt, createdAt = 1, modifiedAt = 1, ) }