Added the catalogue models and seed to support phase 5 of the POC prototype in the Persistence package.

This commit is contained in:
javier committed 2026-09-21 13:31:44 +02:00
1 parent 9403931109
commit 89a7a7b8e5
19 files changed
+990 -15

No files matched your search

@@ -91,3 +91,83 @@ extension AccountRepositoryTests {
}
}
// MARK: - Accounts and shops
extension AccountRepositoryTests {
@Test
func `says whether a sign-in created the account`() async throws {
try await withDatabase { fluent in
let accounts = AccountRepository(fluent: fluent)
let first = try await accounts.signIn(email: "sam@example.com")
let again = try await accounts.signIn(email: "sam@example.com")
#expect(first.isNew)
#expect(!again.isNew)
#expect(first.user == again.user)
}
}
@Test
func `renames an account, and manages the passkeys of its own`() async throws {
try await withDatabase { fluent in
let accounts = AccountRepository(fluent: fluent)
let mara = try await accounts.account(email: AccountRepository.demoEmail)
let sam = try await accounts.account(email: "sam@example.com")
let renamed = try await accounts.rename(mara, to: "Mara V.")
let stored = try await accounts.existingAccount(email: AccountRepository.demoEmail)
try await accounts.addPasskey(to: mara, credentialID: "cred-m", publicKey: [1], signCount: 0)
try await accounts.revokePasskey("cred-m", of: sam)
let kept = try await accounts.passkeys(of: mara)
try await accounts.revokePasskey("cred-m", of: mara)
let revoked = try await accounts.passkeys(of: mara)
#expect(renamed.displayName == "Mara V.")
#expect(stored?.displayName == "Mara V.")
#expect(kept.map(\.passkey.credentialID) == ["cred-m"])
#expect(revoked.isEmpty)
}
}
@Test
func `opens one shop per account, under a handle of its own`() async throws {
try await withDatabase { fluent in
let accounts = AccountRepository(fluent: fluent)
let catalogue = CatalogueRepository(fluent: fluent)
let mara = try await accounts.account(email: AccountRepository.demoEmail)
let sam = try await accounts.account(email: "sam@example.com")
let draft = ShopDraft(
name: "Mara's Longbox", handle: "maras-longbox", city: "Haarlem", country: "NL", about: "Spare copies.",
kind: .privateSeller, kvkNumber: "12345678", vatID: nil, legalName: nil, returnsNote: "14-day returns", handlingDays: 2
)
let shop = try await catalogue.openShop(draft, for: mara)
let owned = try await TradeRepository(fluent: fluent).shop(ownedBy: mara)
#expect(shop.slug == "maras-longbox")
#expect(shop.kind == .privateSeller)
// A private seller shows no registration, whatever was typed.
#expect(shop.kvkNumber == nil)
#expect(!shop.isVerified)
#expect(shop.ratedSales == 0)
#expect(owned == shop)
await #expect(throws: ShopError.alreadyOwner) {
try await catalogue.openShop(draft, for: mara)
}
await #expect(throws: ShopError.handleTaken) {
try await catalogue.openShop(draft, for: sam)
}
// And the new shop sells: its owner lists a copy, which a buyer finds.
let listing = try await catalogue.publish(ListingDraftTests.draft(), by: mara)
#expect(listing?.shop.slug == "maras-longbox")
}
}
}