Files
ccn/Packages/Persistence/Tests/Cases/Public/Repositories/AccountRepositoryTests.swift
T

94 lines
3.5 KiB
Swift

import Testing
@testable import Persistence
@Suite(
"AccountRepository repository",
.tags(.repository)
)
struct AccountRepositoryTests {
// MARK: Methods tests
@Test
func `finds the seeded demo buyer`() async throws {
try await withDatabase { fluent in
let user = try await AccountRepository(fluent: fluent).account(email: AccountRepository.demoEmail)
#expect(user.email == "mara.v@example.com")
#expect(user.displayName == "Mara Visser")
}
}
@Test
func `joins an unknown email once, named after its local part`() async throws {
try await withDatabase { fluent in
let repository = AccountRepository(fluent: fluent)
let joined = try await repository.account(email: "sam@example.com")
let returning = try await repository.account(email: "sam@example.com")
#expect(joined.displayName == "sam")
#expect(returning == joined)
}
}
}
// MARK: - Passkeys
extension AccountRepositoryTests {
@Test
func `joins an account together with its first passkey`() async throws {
try await withDatabase { fluent in
let accounts = AccountRepository(fluent: fluent)
let free = try await accounts.isUnregistered(credentialID: "cred-1")
let sam = try #require(try await accounts.join(email: "sam@example.com", credentialID: "cred-1", publicKey: [1, 2, 3], signCount: 0))
let passkey = try await accounts.passkey(credentialID: "cred-1")
let byEmail = try await accounts.passkeys(email: "sam@example.com")
let taken = try await accounts.isUnregistered(credentialID: "cred-1")
#expect(free)
#expect(!taken)
#expect(sam.displayName == "sam")
#expect(passkey == Passkey(credentialID: "cred-1", publicKey: [1, 2, 3], signCount: 0, user: sam))
#expect(byEmail == [passkey])
}
}
@Test
func `never adds a passkey to an account that already exists`() async throws {
try await withDatabase { fluent in
let accounts = AccountRepository(fluent: fluent)
let hijack = try await accounts.join(email: AccountRepository.demoEmail, credentialID: "cred-x", publicKey: [9], signCount: 0)
let passkeys = try await accounts.passkeys(email: AccountRepository.demoEmail)
let stillFree = try await accounts.isUnregistered(credentialID: "cred-x")
#expect(hijack == nil)
#expect(passkeys.isEmpty)
#expect(stillFree)
}
}
@Test
func `records a passkey's signature counter, and finds accounts without creating them`() async throws {
try await withDatabase { fluent in
let accounts = AccountRepository(fluent: fluent)
_ = try await accounts.join(email: "sam@example.com", credentialID: "cred-1", publicKey: [1], signCount: 0)
try await accounts.recordUse(ofPasskey: "cred-1", signCount: 7)
let passkey = try await accounts.passkey(credentialID: "cred-1")
let known = try await accounts.existingAccount(email: "sam@example.com")
let unknown = try await accounts.existingAccount(email: "nobody@example.com")
let stillUnknown = try await accounts.existingAccount(email: "nobody@example.com")
#expect(passkey?.signCount == 7)
#expect(known?.email == "sam@example.com")
#expect(unknown == nil)
#expect(stillUnknown == nil)
}
}
}