import Elementary import Foundation import Persistence import Testing @testable import WebsiteLibrary @Suite( "Account and collector pages", .tags(.page) ) struct CollectorPagesTests { // MARK: Constants private static let nightward = Series(slug: "nightward", name: "Nightward", publisher: "Meridian Comics", years: "2019–2021", issueCount: 4, blurb: "A short run.") // MARK: OpenShopPage tests @Test func `open-a-shop form starts as a private seller, and gives back what was typed with its problems`() { let empty = OpenShopPage().render() let sent = OpenShopPage( form: ShopFormTests.form(["kind": "business", "about": "Spare "]), problems: [.kvk: "Enter your 8-digit KvK number."] ).render() #expect(empty.contains(#"action="/sell/open-a-shop" method="post""#)) #expect(empty.contains(#"name="kind" value="private" checked"#)) #expect(!empty.contains(#"role="alert""#)) #expect(sent.contains("One thing to fix before opening.")) #expect(sent.contains(#"name="kind" value="business" checked"#)) #expect(sent.contains(#"name="name" value="Ana's Longbox""#) || sent.contains(#"name="name" value="Ana's Longbox""#)) #expect(sent.contains(#"id="kvk-error">Enter your 8-digit KvK number."#)) #expect(sent.contains("Spare <copies>")) #expect(!sent.contains("style=")) } // MARK: WelcomePage and AccountPage tests @Test func `welcome screen is bare, asks for a name, and carries the intent on`() { let html = WelcomePage(displayName: "ana.devries", returnPath: "/listing/nightward-1").render() #expect(html.contains("You're in.") || html.contains("You're in.")) #expect(html.contains(#"action="/welcome" method="post""#)) #expect(html.contains(#"name="name" value="ana.devries""#)) #expect(html.contains(#"name="return" value="/listing/nightward-1""#)) #expect(html.contains(#"content="noindex""#)) #expect(!html.contains("site-header")) } @Test func `account screen lists the passkeys with a way to revoke each, and to add one`() { let passkey = Passkey(credentialID: "cred-1", publicKey: [], signCount: 0, user: .mara) let html = AccountPage(user: .mara, passkeys: [(passkey, .stub)], viewer: .init(.mara), now: .stub).render() let bare = AccountPage(user: .mara, passkeys: [], now: .stub).render() #expect(html.contains(#"action="/account/name" method="post""#)) #expect(html.contains(#"name="name" value="Mara Visser""#)) #expect(html.contains("Passkey 1")) #expect(html.contains("created today, 09:14")) #expect(html.contains(#"name="credential" value="cred-1""#)) #expect(html.contains(#"hidden data-passkey="add""#)) #expect(html.contains("/js/passkey.js")) #expect(html.contains(#"href="/sell/open-a-shop">Open a shop"#)) #expect(bare.contains("No passkey yet")) } // MARK: WantsPage tests @Test func `want list shows each want's limits, its cheapest match, and what is new`() { let want = Want( id: .init(uuidString: "00000000-0000-0000-0000-0000000000EE") ?? .init(), title: "Nightward #1", minGrade: 8, maxPriceCents: 30_000, slabbedOnly: true, alerts: true, matches: [.stub(slug: "a", priceCents: 24_000), .stub(slug: "b", priceCents: 21_000)], newMatchCount: 1 ) let html = WantsPage(wants: [want]).render() #expect(html.contains("1 want · 1 new matches")) #expect(html.contains("slabbed only · grade ≥ 8.0 · max €300 · ships from EU only")) #expect(html.contains(#"href="/listing/b">From €210"#)) #expect(html.contains(#"class="wants__new">1 new"#)) #expect(html.contains(#"role="switch" aria-checked="true""#)) #expect(html.contains(#"action="/wants/00000000-0000-0000-0000-0000000000ee/remove""#)) #expect(html.contains(#"href="/search?q=Nightward%20%231&grade-min=8.0&price-max=300&grading=slabbed""#)) #expect(html.contains(#"href="/wants/new""#)) } @Test func `want list fills its form from what is being saved`() { let html = WantsPage(wants: [], draft: .init(title: "Nightward #2", minGrade: 9.6, maxPriceCents: 8_500)).render() #expect(html.contains(#"name="title" value="Nightward #2""#)) #expect(html.contains(#"