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) } } }