From 25805a093adfa76566ac150da5e5f92fee2a9420 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Sat, 5 Sep 2026 18:38:39 +0200 Subject: [PATCH] removed fp6 from shop --- deploy/README.md | 2 +- images/fp6-pmos.jpg | Bin 123514 -> 0 bytes images/fp6plus-pmos.jpg | Bin 128346 -> 0 bytes project.cpp | 12 +- .../implementations/Catcrafts.Server-Mail.cpp | 2 +- server/implementations/main.cpp | 4 +- .../interfaces/Catcrafts.Shared-Content.cppm | 253 ++------- shared/interfaces/Catcrafts.Shared-Form.cppm | 12 +- shared/interfaces/Catcrafts.Shared-Model.cppm | 7 +- shared/interfaces/Catcrafts.Shared-Money.cppm | 17 +- shared/interfaces/Catcrafts.Shared-Views.cppm | 30 +- tests/ShouldEmitStructuredData/main.cpp | 190 ++++--- tests/ShouldProcessCheckout/main.cpp | 272 +++++---- tests/ShouldSellTheShopFront/main.cpp | 174 +++--- tests/ShouldServeRoutes/main.cpp | 25 +- tests/ShouldSettleBankTransfers/main.cpp | 2 +- tests/ShouldShipContent/main.cpp | 526 +++++++++--------- tests/ShouldStayScriptFree/main.cpp | 27 +- tests/harness/Catcrafts.E2eHarness.cppm | 25 +- tools/dev.sh | 13 +- 20 files changed, 788 insertions(+), 805 deletions(-) delete mode 100644 images/fp6-pmos.jpg delete mode 100644 images/fp6plus-pmos.jpg diff --git a/deploy/README.md b/deploy/README.md index a5f1ccd..28a4524 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -661,7 +661,7 @@ donation, which ships nothing and is a gift rather than a purchase. whole withdrawal period, ask only for what identifies the order, **not** require creating an account, and confirm immediately on a durable medium. **Sanction for not having one: the withdrawal period extends from 14 days to - twelve months**, so every EU phone sale stays unwindable for a year. + twelve months**, so every EU sale of goods stays unwindable for a year. The order page is the natural home, since it already identifies exactly one order through an unguessable link and therefore needs no login. Sketch: `POST /order//withdraw`, a button rendered while the window is open diff --git a/images/fp6-pmos.jpg b/images/fp6-pmos.jpg deleted file mode 100644 index a7fa5bdc06520bda966551bb3f241ba6ea1454d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123514 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 b%5`naQ>cGCyEZ+TgYo a // EnableWasiBrowserRuntime — sets /<link> tags since the // Dom partition has no head-element access. cfg.files.emplace_back(fs::path("catcrafts-head.js")); - // Product photography. Both renders are © Fairphone under CC BY-SA 4.0 and - // are cropped and recompressed here — the Gen. 6 one came via Wikimedia - // Commons, the Gen. 6+ one from Fairphone's own Flickr. The attribution and - // the adaptation notice the licence requires live on /legal/imprint. NOT in - // cfg.assets: that pipeline transcodes to .ctex, which <img> cannot decode. - cfg.files.emplace_back(fs::path("images/fp6-pmos.jpg")); - cfg.files.emplace_back(fs::path("images/fp6plus-pmos.jpg")); + // Product photography goes here as cfg.files entries (images/<slug>.jpg, + // referenced by Product::image as "/<slug>.jpg"), NOT in cfg.assets: that + // pipeline transcodes to .ctex, which <img> cannot decode. None today: the + // catalogue lists only the donation item. When a licensed render returns, + // its attribution and adaptation notice belong on /legal/imprint. // ECB rates ride with the content so the wasm-rendered shop (backend-down // fallback) can emit the same indicative prices the server does. cfg.files.emplace_back(fs::path("content/rates.json")); diff --git a/server/implementations/Catcrafts.Server-Mail.cpp b/server/implementations/Catcrafts.Server-Mail.cpp index f884361..388d01c 100644 --- a/server/implementations/Catcrafts.Server-Mail.cpp +++ b/server/implementations/Catcrafts.Server-Mail.cpp @@ -156,7 +156,7 @@ std::string BuildOrderConfirmationEmail(const OrderRecord& o, "(gpg --verify) without this shop's help. Keep the file with your " "records — receipts are not hosted forever.\n\n"; - m += "Devices are sourced, flashed and tested to order — allow up to a " + m += "Goods are sourced, prepared and tested to order. Allow up to a " "week between payment and dispatch. The order page tracks it:\n\n"; m += std::format(" {}\n\n", orderUrl); m += "That link is the key to the order: anyone holding it can read the " diff --git a/server/implementations/main.cpp b/server/implementations/main.cpp index 8c2895e..b639e4a 100644 --- a/server/implementations/main.cpp +++ b/server/implementations/main.cpp @@ -125,8 +125,8 @@ int main(int argc, char** argv) { // --routes: status + title for every route, for a quick smoke check. if (has("--routes")) { const Views::SiteContent content = LoadContent("content"); - for (std::string_view p : { "/", "/about", "/shop", "/shop/fp6-pmos", - "/shop/fp6plus-pmos", "/shop/donation", "/shop/nope", + for (std::string_view p : { "/", "/about", "/shop", + "/shop/donation", "/shop/nope", "/financials", "/order/0123456789abcdef0123456789abcdef", "/order/not-a-token", diff --git a/shared/interfaces/Catcrafts.Shared-Content.cppm b/shared/interfaces/Catcrafts.Shared-Content.cppm index 7ff2471..a94fdbc 100644 --- a/shared/interfaces/Catcrafts.Shared-Content.cppm +++ b/shared/interfaces/Catcrafts.Shared-Content.cppm @@ -38,12 +38,14 @@ import :Money; namespace Catcrafts::Content { -// The flat markup on every variant — "whatever it costs me + 50", where the -// €50 is what Catcrafts KEEPS. Retail is VAT-inclusive, so a markup added to -// it is taxed with the rest of the price: a flat +5000 would net only €41.32 -// once the VAT on it is remitted. Grossed up once here (€60.50 on the -// sticker), the walk-away margin is exactly €50 per unit — on EU sales and -// on exports alike, since the export price is the net of the same retail. +// The flat markup on every priced variant — "whatever it costs me + 50", +// where the €50 is what Catcrafts KEEPS. No priced product is listed today; +// the rule and its proof stay here for the next one. Retail is VAT-inclusive, +// so a markup added to it is taxed with the rest of the price: a flat +5000 +// would net only €41.32 once the VAT on it is remitted. Grossed up once here +// (€60.50 on the sticker), the walk-away margin is exactly €50 per unit — on +// EU sales and on exports alike, since the export price is the net of the +// same retail. inline constexpr std::int64_t kMarkupNetMinor = 5000; inline constexpr std::int64_t kMarkupMinor = Money::GrossFromNet(kMarkupNetMinor); // Exactness is not luck: NetFromGross strips a gross amount additively only @@ -56,187 +58,36 @@ static_assert(kMarkupMinor * 10000 % (10000 + Money::kVatRateBp) == 0, static_assert(kMarkupMinor * 10000 / (10000 + Money::kVatRateBp) == kMarkupNetMinor, "the exact net of the markup must be the €50 the rule promises"); -// The warranty both phones carry, verbatim. Shared rather than pasted per -// product because it is a promise about how Catcrafts handles a fault, not a -// statement about a particular board — and two copies of a legal text are two -// texts that can drift apart, while /legal/terms states exactly one policy. -inline constexpr std::string_view kPhoneWarranty = - "Two years from Catcrafts, worldwide, one counter: every claim goes to Catcrafts, whatever turns out to be broken. The software (postmarketOS, the patches, imsd) is Catcrafts' own work and is fixed by Catcrafts with updates, delivered over the air. Even a phone that no longer boots is normally recovered in place: as long as fastboot still comes up, Catcrafts walks you through reflashing it over a USB cable in minutes. Only a phone that shows nothing at all, not even fastboot, travels for a software fault. For a hardware fault Catcrafts takes the phone back and handles the manufacturer's process, including the temporary reflash to stock Android it requires, and returns it running postmarketOS. When a phone does have to travel, warranty shipping is paid by Catcrafts, both directions, worldwide. User inflicted damage, including software faults caused by relocking the bootloader do not fall under this policy. The full terms are on the terms page."; - +// The catalogue. Goods come and go: the two handsets that opened this list +// were withdrawn on 2026-09-05, and nothing here, in the renderers or on the +// legal pages may assume what kind of thing is sold next. The one standing +// entry is the donation item. +// +// Adding a priced product is one Product below: slug, name, brand, variants +// (each with its VAT-inclusive price, supplier + kMarkupMinor), a boxed +// shipping weight in grams, a photo under images/ (and in project.cpp's +// cfg.files), a spec sheet and a warranty text. The shop grid, the product +// page, the checkout, the sitemap and the JSON-LD all read this vector and +// nothing else; the E2E suites find the first non-donation entry and skip +// their goods checks while there is none. export const std::vector<Product>& Products() { static const std::vector<Product> products = [] { - Product p; - p.slug = "fp6-pmos"; - p.name = "The Fairphone (Gen. 6) with postmarketOS"; - p.brand = "Fairphone"; - p.tagline = "A repairable Android phone, reflashed to run mainline Linux with a working IMS/VoLTE stack."; - // Launch day is this one line: "coming-soon" -> "available". The page - // shows launch prices either way; only the order form is held back. + // The donation item. The buyer names the amount (Form::ValidateDonation + // bounds it); nothing ships and no VAT is charged, because a gift with + // nothing supplied in return is not a taxable supply — which is also + // why a donation never gets an invoice. // - // ── BEFORE FLIPPING THIS, TWO THINGS ARE OWED ──────────────────── - // - // 1. THE WITHDRAWAL BUTTON (herroepingsknop). Since 2026-06-19, art. - // 11a of the Consumer Rights Directive — art. 6:230oa BW — has - // required a clearly labelled button in the interface for a - // consumer to withdraw from a distance contract. Email alone is no - // longer enough. It must stay available for the whole withdrawal - // period, ask only for essentials, NOT require an account, and - // confirm immediately on a durable medium. - // **If it is missing, the 14-day withdrawal period becomes ONE - // YEAR** — every EU phone sale unwindable for twelve months. - // It does not bite today only because the sole purchasable item is - // the donation, and a gift carries no withdrawal right. Flipping - // this line is exactly the moment it starts to. - // The order page is the natural home: it already identifies one - // order by an unguessable link, so no account is needed. - // - // 2. THE SHIPPING RATE TABLE. Without SENDCLOUD_* credentials (or a - // hand-placed cache) there is no rate table, and checkout refuses - // every order that ships. Donations skip that branch, which is why - // the shop looks fine today. See deploy/README.md. - p.status = "coming-soon"; - // Boxed shipping weight, grams: the FP6 retail box (~450 g) plus the - // outer carton and padding. Rounded UP on purpose — this number picks - // the carrier's weight bracket, and guessing light is how an order gets - // quoted a rate the parcel does not qualify for. Worth replacing with a - // scale reading of a real outgoing parcel before launch. - p.shipWeightGrams = 700; - p.image = "/fp6-pmos.jpg"; - p.summary = "The Fairphone (Gen. 6), reflashed by Catcrafts to run postmarketOS with the patches and IMS/VoLTE implementation Catcrafts maintains. All of that software is open source. You can download it and flash a Fairphone yourself, and you are welcome to. What you pay for here is the thing open source doesn't come with: real support. A phone that arrives working, and one email address that answers for it. Not a forum, not a git issue, but support like any other manufacturer offers. And the margin funds the development itself."; - p.warranty = kPhoneWarranty; - // No safety note. There was one — the emergency-calling caveat — and - // it came off on 2026-08-18, when imsd placed calls to 112 on a live - // network in a test session approved by TB112 (the Dutch 1-1-2 - // operator). That verification is exactly what the caveat was waiting - // for, so the claim it hedged is now a plain fact and the warning box - // would only mislead. The field stays in the model for the next real - // safety claim; leaving it empty is the decision, not an oversight. - p.variants = { - // supplier €513.30 incl VAT - { "green", "Forest Green", 51330 + kMarkupMinor }, - // supplier €519.30 incl VAT - { "black", "Black", 51930 + kMarkupMinor }, - // supplier €604.88 incl VAT - { "white", "White", 60488 + kMarkupMinor }, - }; - // The hardware, as Fairphone specifies it — this is a stock Fairphone - // (Gen. 6), so its spec sheet is this product's spec sheet. - p.specs = { - { "Display", "6.31″ OLED, 2484 × 1116 (FHD+), up to 120 Hz, Gorilla Glass 7i" }, - { "Processor", "Qualcomm Snapdragon 7s Gen 3, Adreno 810 GPU" }, - { "Memory", "8 GB RAM" }, - { "Storage", "256 GB, microSD slot up to 2 TB" }, - { "Rear cameras", "50 MP main with OIS + 13 MP ultra-wide" }, - { "Front camera", "32 MP" }, - { "Battery", "4415 mAh, user-replaceable, 30 W fast charging" }, - { "Connectivity", "5G, Wi-Fi 6E, Bluetooth 5.4, NFC" }, - { "SIM", "Dual: nano-SIM + eSIM" }, - { "USB", "USB-C 2.0" }, - { "Fingerprint reader", "Side-mounted, in the power button" }, - { "Durability", "IP55, 12 user-replaceable modules" }, - { "Dimensions", "156.5 × 73.3 × 9.6 mm, 193 g" }, - }; - // Same rule the loader used to apply: the from-price is the - // cheapest variant, derived so the two can never disagree. - if (const Variant* cheapest = p.CheapestVariant()) { - p.priceInclMinor = cheapest->priceInclMinor; - } - - // The Fairphone (Gen. 6+): Fairphone's mid-generation refresh, announced - // 2026-08-18. A second listing rather than more colours on the entry - // above — different silicon, a different price and its own spec sheet, - // and the two are bought as different phones. - // - // It is sellable at all because the SOFTWARE is unchanged: the same - // postmarketOS image, the same kernel patches and the same imsd run on - // this board, confirmed on a device. The chassis, modem, cameras and - // battery are the Gen. 6's; the SoC and the RAM are the only parts the - // image had to be re-verified against, and it was. - Product q; - q.slug = "fp6plus-pmos"; - q.name = "The Fairphone (Gen. 6+) with postmarketOS"; - q.brand = "Fairphone"; - q.tagline = "The mid-generation refresh with faster chip, 12 GB of RAM, running the same mainline Linux image."; - q.status = "coming-soon"; - // Same device weight (193 g) in the same retail box, so the outgoing - // parcel is the Gen. 6's parcel and lands in the same carrier bracket. - // The rounding note on the entry above applies here too: this wants a - // scale reading of a real parcel before launch, not a second guess. - q.shipWeightGrams = 700; - // Fairphone's own Cobalt Blue render, cropped from the 2200 × 2200 - // original on their Flickr — same rightsholder and same CC BY-SA 4.0 - // licence as the Gen. 6 render above, credited with the adaptation - // notice on /legal/imprint. Deliberately NOT one of the copies the tech - // press hosts: an outlet's file carries no licence grant from the - // outlet, and the ones in circulation show the phone running stock - // Android with the Play Store on screen — which is the single thing - // this listing exists to sell the absence of. - q.image = "/fp6plus-pmos.jpg"; - q.summary = "The Fairphone (Gen. 6+), reflashed by Catcrafts to run postmarketOS with the patches and IMS/VoLTE implementation Catcrafts maintains. All of that software is open source. You can download it and flash a Fairphone yourself, and you are welcome to. What you pay for here is the thing open source doesn't come with: real support. A phone that arrives working, and one email address that answers for it. Not a forum, not a git issue, but support like any other manufacturer offers. And the margin funds the development itself."; - q.warranty = kPhoneWarranty; - // Supplier €649.00 incl VAT in every colour — Fairphone's own launch - // price, which is what the device costs anywhere a day after launch and - // the only real number that exists for it today. The Gen. 6 above is - // sourced well below list, so expect these to come DOWN once a sourcing - // price lands: change the three numbers here (and the pins in - // ShouldShipContent) and the €50 net margin holds by construction, as - // the static_asserts above guarantee for every supplier price. - // - // Cobalt Blue leads the list: with one price across the range, - // CheapestVariant() returns whichever colour comes first, and that is - // the selector's pre-selected default — so it has to be the colour the - // photo above actually shows. - q.variants = { - { "blue", "Cobalt Blue", 64900 + kMarkupMinor }, - { "green", "Forest Green", 64900 + kMarkupMinor }, - { "black", "Horizon Black", 64900 + kMarkupMinor }, - }; - // The hardware, as Fairphone specifies it. Five rows differ from the - // Gen. 6 — the panel, the SoC, the RAM, the charge rate, and Fairphone's - // own rounding of the chassis length (156.57 mm here, 156.5 there, one - // shell). The other eight are restated rather than cross-referenced: a - // spec sheet that says "as above" is not a spec sheet. - q.specs = { - { "Display", "6.31″ LTPO AMOLED, 2484 × 1116 (FHD+), 10–120 Hz adaptive, Gorilla Glass 7i" }, - { "Processor", "Qualcomm Snapdragon 7s Gen 4, Adreno 810 GPU" }, - { "Memory", "12 GB RAM" }, - { "Storage", "256 GB, microSD slot up to 2 TB" }, - { "Rear cameras", "50 MP main with OIS + 13 MP ultra-wide" }, - { "Front camera", "32 MP" }, - { "Battery", "4415 mAh, user-replaceable, 27 W fast charging" }, - { "Connectivity", "5G, Wi-Fi 6E, Bluetooth 5.4, NFC" }, - { "SIM", "Dual: nano-SIM + eSIM" }, - { "USB", "USB-C 2.0" }, - { "Fingerprint reader", "Side-mounted, in the power button" }, - { "Durability", "IP55, 12 user-replaceable modules" }, - { "Dimensions", "156.6 × 73.3 × 9.6 mm, 193 g" }, - }; - // Same derivation as above: the sticker is the cheapest colour, so the - // page cannot advertise a number the default choice doesn't honour. - if (const Variant* cheapest = q.CheapestVariant()) { - q.priceInclMinor = cheapest->priceInclMinor; - } - - // The donation item: the shop's soft opening. It is "available" while - // the phones above stay "coming-soon" on purpose — the two rails, the - // ledger, the reconciler and the mailer all run for real money before - // the first phone order depends on them. The buyer names the amount - // (Form::ValidateDonation bounds it); nothing ships and no VAT is - // charged, because a gift with nothing supplied in return is not a - // taxable supply — which is also why a donation never gets an invoice. - // The order of this vector is the order of the shop grid, and it is - // deliberate: fp6-pmos FIRST (the shop's headline, and the tests - // address Products()[0] as the priced product), the Gen. 6+ second, - // and the donation LAST — it is the odd entry out, not what the shop - // is about. + // The order of this vector is the order of the shop grid. Priced goods + // go BEFORE this entry: the donation is the odd one out, not what the + // shop is about, and stays last. Product d; d.slug = "donation"; d.name = "Donation"; d.tagline = "Fund the open-source work directly"; d.status = "available"; d.donation = true; - d.summary = "Thank you very much for considering to donate! Your donation will contribute to the maintenance of the image and R&D for new devices."; - return std::vector<Product>{ std::move(p), std::move(q), std::move(d) }; + d.summary = "Thank you very much for considering to donate! Your donation contributes to the maintenance of the open-source software Catcrafts publishes and to research and development for new devices."; + return std::vector<Product>{ std::move(d) }; }(); return products; } @@ -317,7 +168,7 @@ export const LegalPage& AboutPage() { static const LegalPage page{ .slug = "about", .title = "About", - .updated = "2026-08-05", + .updated = "2026-09-05", .lede = "Catcrafts is a one-person company. This page is about the person, the mission, and the name.", .sections = { { "Who", @@ -327,7 +178,7 @@ export const LegalPage& AboutPage() { { "The mission", { "Accessible open-source software and hardware, for the benefit of everyone. Software you can read, hardware you can repair, and phones that answer to their owner rather than to an advertising department. A real alternative to big tech: not a manifesto about one, but things you can download, flash and buy today.", - "Everything Catcrafts makes is published as open source. The shop is how the development gets funded: buying a phone here pays for the stack it runs.", + "Everything Catcrafts makes is published as open source. The shop is how the development gets funded: every purchase and every donation there pays for the work.", } }, { "The work", { @@ -337,7 +188,7 @@ export const LegalPage& AboutPage() { } }, { "The name", { - "Catcrafts is not the Minecraft server. That is catcraft.net, singular, an unrelated community that happens to share almost the same name. This site sells and builds software and hardware for Linux phones, and has no cross-play, no ranks and no diamonds. The cat in the logo speaks shell, not creeper.", + "Catcrafts is not the Minecraft server. That is catcraft.net, singular, an unrelated community that happens to share almost the same name. This site is about open-source software and hardware for Linux phones, and has no cross-play, no ranks and no diamonds. The cat in the logo speaks shell, not creeper.", } }, }, }; @@ -375,7 +226,7 @@ export const std::vector<LegalPage>& LegalPages() { { .slug = "privacy", .title = "Privacy", - .updated = "2026-08-20", + .updated = "2026-09-05", .lede = "What this site collects, why, and how to get rid of it. Written to describe what the code actually does. If you find a discrepancy, the code is the bug and a report is very welcome.", .sections = { { "Who is responsible", @@ -384,7 +235,7 @@ export const std::vector<LegalPage>& LegalPages() { } }, { "Orders", { - "Placing an order stores what fulfilling it requires: your email address, the recipient name and shipping address, the country, and the order itself (product, amounts, timestamps, payment reference and status). Nothing else is asked for and nothing else is kept. The legal basis is the contract: this data is what shipping you a phone and issuing an invoice consist of.", + "Placing an order stores what fulfilling it requires: your email address, the recipient name and shipping address, the country, and the order itself (product, amounts, timestamps, payment reference and status). Nothing else is asked for and nothing else is kept. The legal basis is the contract: this data is what shipping you an order and issuing an invoice consist of.", "Neither payment method involves a payment processor, so there is no third party that Catcrafts hands your data to in order to get paid. Bank payment is an ordinary transfer from your bank to the account named on the order page: your own bank and Catcrafts' bank handle it, as they would any transfer you make, and Catcrafts has engaged nobody in between. Cryptocurrency payment involves no provider either: the order page shows a receiving address that belongs to Catcrafts, and paying it is a transaction on a public blockchain. Only the order record described above connects a payment to you, and that record stays with Catcrafts.", "What Catcrafts records about a bank transfer is deliberately narrow: the payment reference you quoted, the amount, the date and the method. Your name and IBAN are visible to Catcrafts on its own bank statement, as they are to anyone who receives a transfer, but they are not copied into the shop's records and are not needed to confirm an order. The reference is what matches your payment to your order.", "The order status page lives at an unguessable link. Anyone holding the link can read that order's status and totals, so treat it like a receipt on your desk and don't post it anywhere public.", @@ -418,7 +269,7 @@ export const std::vector<LegalPage>& LegalPages() { { .slug = "imprint", .title = "Imprint & contact", - .updated = "2026-08-19", + .updated = "2026-09-05", .lede = "Who is behind this site and how to reach them.", .sections = { { "Contact", @@ -434,21 +285,12 @@ export const std::vector<LegalPage>& LegalPages() { { "If you find a vulnerability, please email at security@catcrafts.net before disclosing it publicly and you will be credited. This site is source-available on Forgejo, so you can read exactly what it does rather than guessing.", } }, - // The CC BY-SA 4.0 licence on both product renders requires - // naming the author, linking the licence and flagging that the - // files were changed. project.cpp pointed here for it long - // before anything here said it, which is the gap this closes. - { "Image credits", - { - "The product renders are the manufacturer's own: © Fairphone, used under the Creative Commons Attribution-ShareAlike 4.0 licence, https://creativecommons.org/licenses/by-sa/4.0 . The Fairphone (Gen. 6) in Forest Green came through Wikimedia Commons; the Fairphone (Gen. 6+) in Cobalt Blue comes from Fairphone's own photostream at https://www.flickr.com/photos/fairphone . Both were cropped and recompressed to fit this site, and those adaptations are offered back under the same licence.", - "They are renders of stock hardware, which is exactly what Catcrafts ships. The difference is the software on it. No manufacturer render shows postmarketOS, so treat the screens in those images as the manufacturer's artwork rather than a picture of what arrives.", - } }, }, }, { .slug = "terms", .title = "Terms", - .updated = "2026-08-20", + .updated = "2026-09-05", .lede = "The terms for buying from this shop. Written to be read: short sections, no boilerplate imported from anywhere, and every claim checkable against what the site actually does.", .sections = { { "Ordering and payment", @@ -466,32 +308,17 @@ export const std::vector<LegalPage>& LegalPages() { "Because nothing ships, no name or address is asked for. An email address is optional and is used only to send the confirmation. Donations appear on the financials page as an aggregate running total, never individually.", "A donation is not a purchase, so the returns section below does not apply to it.", } }, - { "Fulfilment", - { - "Devices are sourced, flashed and tested to order. There is no warehouse. Allow up to a week between payment and dispatch; the order page and email updates track it. If sourcing falls through, you get the money back, promptly and in full.", - "Shipping is tracked and insured. The tiers and prices are shown at checkout before you commit.", - } }, - { "Where Catcrafts sells", - { - "Catcrafts ships to a short list of countries, and the list is the whole policy: the Netherlands, Switzerland, Serbia, Montenegro, Albania, Kosovo, Georgia, Australia, Hong Kong and Singapore. Checkout accepts a delivery address in those and refuses every other country. The current list is always the one checkout enforces, so if a country is not offered at checkout it is not offered at all. Outside the Netherlands you are the importer: the parcel is sent duty unpaid, and your own customs authority charges you import VAT and any duty when it arrives.", - "The reason it is a list of what is allowed rather than a list of what is not, is that the rules are national and there are nearly two hundred of them. Selling a phone into a country can enrol Catcrafts in that country's recycling and battery schemes, require its own radio approval, or require the handset to be registered in a national database before any local network will carry a call. Those obligations attach before the first parcel, not after it, and a shop this size cannot pretend to have read every country's version. So a country is added when it has actually been checked, and until then the answer is no. That is a deliberately cautious default and it will sometimes say no to a country that would have been fine.", - "Catcrafts does not ship to the United States or Canada, and these are worth naming because they are the two people ask about most. Canada is not a choice: the phone holds no Canadian radio certification, and Canadian law prohibits importing, distributing or selling uncertified radio equipment, so it cannot lawfully be sold there by anyone at present. The United States is a combination: a customs entry is now required for every individual parcel, the mobile networks certify which handsets may be activated, and none of the legal protection that shields telephone companies over emergency calls extends to whoever made the device. Insurance is part of the picture too, but it is no longer the interesting part, and buying a policy would not open either country.", - "Separately, Catcrafts cannot sell or ship to Russia, Belarus or North Korea. Unlike everything above this is not a judgement call: European Union sanctions prohibit exporting consumer electronics to those countries, and the prohibition covers indirect routes, a forwarding address, a reseller, or a purchase made on behalf of someone there just as much as a direct parcel. Checkout refuses a delivery address in any of them, and an order that turns out to be bound there by another route is refused and the payment returned.", - "The same anti-routing rule applies to every refused country, not only the sanctioned ones: if a parcel is to be forwarded onward, or the delivery address belongs to a forwarding service acting for a customer elsewhere, the order is refused, and refunded in full if that only becomes clear after payment. Please do not try to route around it. The point is that the sale does not happen, not that the address looks acceptable.", - "One more thing that can refuse an address even inside the list: shipping is priced entirely from the carrier's own rates, so a destination the carrier has no rate for cannot be quoted and cannot be ordered. That is a different and much softer no than the ones above, it is about a price not existing rather than a sale being refused, and it can change whenever the carrier's tariff does.", - "The software itself remains free for anyone anywhere, and none of this touches it: the sources and images are public, and flashing a device you already own is not a purchase and is not restricted by this section.", - } }, { "Warranty", { - "Everything sold here is warranted by Catcrafts for two years from delivery, worldwide. One counter: every claim goes to Catcrafts, and Catcrafts deals with whoever needs dealing with. You never have to work out whether a fault is hardware or software, or talk to a manufacturer.", - "Behind that counter the split is simple. Software Catcrafts wrote is fixed by Catcrafts with an update, delivered remotely like any other update. If a fault stops the product from starting, Catcrafts provides the tools and walks you through recovering it in place, so a software fault still does not mean sending anything anywhere. Hardware faults are handled through the manufacturer's or supplier's warranty: Catcrafts keeps the purchase paperwork those claims depend on and runs the process end to end. What that means for a specific product is described on its own page.", - "When a product does have to travel (a hardware fault, or a product so far gone it no longer responds to recovery tools at all), the shipping is paid by Catcrafts, both directions, worldwide. Every unit is tested before dispatch, so a genuine defect should be rare. When one happens anyway, it should not cost you anything. The one exception: if a returned product turns out to have no fault, or the damage is yours (a drop, water damage, a repair attempt gone wrong, software issue caused by a relocked bootloader), the repair and the shipping are billed at cost, and you are told the price before any work happens.", + "Everything sold here is warranted by Catcrafts for two years from delivery, worldwide.", + "Software Catcrafts wrote is fixed by Catcrafts with an update, delivered remotely like any other update. If a fault stops the product from starting, Catcrafts provides the tools and walks you through recovering it in place, so a software fault still does not mean sending anything anywhere.", + "When a product does have to travel (a hardware fault, or a product so far gone it no longer responds to recovery tools at all), the shipping is paid by Catcrafts, both directions, worldwide. Every unit is tested before dispatch, so a genuine defect should be rare. When one happens anyway, it should not cost you anything. The one exception: if a returned product turns out to have no fault, or the damage is yours (a drop, water damage, a repair attempt gone wrong, or a software fault caused by your own changes), the repair and the shipping are billed at cost, and you are told the price before any work happens.", "If you are an EU consumer you additionally hold the statutory conformity guarantee: under Dutch law it lasts as long as a product of this kind may reasonably be expected to last, a defect appearing in the first year is presumed to have existed at delivery, and remedies under it are free. Nothing in this section limits those rights.", "For warranty please contact warranty@catcrafts.net" } }, { "Returns", { - "EU consumers can withdraw from the purchase within 14 days of delivery, no reason needed: send an email, send the product back, and the price plus the standard shipping you paid is refunded within 14 days of your notice, though the refund can wait until the product is back or you show it has been shipped. Return shipping is yours to arrange and pay. You may inspect the product as you would in a shop; value lost through use beyond that can be deducted from the refund.", + "EU consumers can withdraw from the purchase within 14 days of delivery, no reason needed: send an email, send the product back, and the price plus the standard shipping you paid is refunded when the product has beeb retuned and inspected. Return shipping is yours to arrange and pay. You may inspect the product as you would in a shop. value lost through use beyond that can be deducted from the refund.", "Outside the EU, sales are final except for defects: the warranty above applies in full, but there is no change-of-mind window. Import duties and fees paid to your own authorities are between you and them and are never refunded by Catcrafts in any case.", "A product that arrives broken is a warranty case, not a return: the warranty section applies, and the shipping is on Catcrafts.", } }, diff --git a/shared/interfaces/Catcrafts.Shared-Form.cppm b/shared/interfaces/Catcrafts.Shared-Form.cppm index 566dc3d..49e150e 100644 --- a/shared/interfaces/Catcrafts.Shared-Form.cppm +++ b/shared/interfaces/Catcrafts.Shared-Form.cppm @@ -238,8 +238,8 @@ export inline constexpr std::int64_t kMaxQuantity = 99; // // Names the reason as regulatory rather than commercial, because a Dutch shop // that plainly posts worldwide would otherwise read as arbitrary, or worse as -// quietly declining someone. The truth is duller and better: selling a phone into -// a country means meeting that country's rules first, and doing it in the wrong +// quietly declining someone. The truth is duller and better: selling into a +// country means meeting that country's rules first, and doing it in the wrong // order is the illegal part. // // No date is promised. Which country comes next depends on which one people ask @@ -250,9 +250,9 @@ export inline constexpr std::int64_t kMaxQuantity = 99; // on-page total preview, so the page can never encourage an order the server // will refuse. export inline constexpr std::string_view kRegulatoryMessage = - "Catcrafts can't ship there. Selling a phone into a country means meeting " - "that country's own rules first — recycling schemes, radio approval, import " - "registration — and only a few are cleared so far. Email " + "Catcrafts can't ship there. Selling into a country means meeting that " + "country's own rules first: recycling schemes, radio approval, import " + "registration. Only a few are cleared so far. Email " "orders@catcrafts.net if you would like yours looked at next."; // The standing note above the buy form, and the one place the policy is stated @@ -432,7 +432,7 @@ export CheckoutResult ValidateCheckout(const Fields& f) { // Quantity: a small positive integer, nothing else. Absent means 1 (the // no-JS form default); anything unparseable or out of range is rejected - // rather than clamped — silently changing how many phones someone buys is + // rather than clamped — silently changing how many units someone buys is // worse than asking again. const std::string_view qty = Trim(f.Get("quantity")); if (qty.empty()) { diff --git a/shared/interfaces/Catcrafts.Shared-Model.cppm b/shared/interfaces/Catcrafts.Shared-Model.cppm index 2e51ef4..4379f14 100644 --- a/shared/interfaces/Catcrafts.Shared-Model.cppm +++ b/shared/interfaces/Catcrafts.Shared-Model.cppm @@ -192,8 +192,9 @@ export struct Product { // Deliberately NOT accompanied by a GTIN: the device is materially // modified (different OS), and Google's product-data rules say a // customized product must not carry the original manufacturer's GTIN — - // which also matches the legal framing that this is a Fairphone with - // different software, not a Catcrafts-manufactured phone. Empty = omit. + // which also matches the legal framing that this is the manufacturer's + // device with different software, not a Catcrafts-manufactured one. + // Empty = omit. std::string brand; // "available" — buyable now. "coming-soon" — listed with launch prices, // orders not open yet. "unavailable" — listed but not sellable (sourcing @@ -220,7 +221,7 @@ export struct Product { // decides how many units fit one parcel. A destination the carrier has no // bracket for is refused at checkout rather than priced from a guess. std::int64_t shipWeightGrams = 0; - // Root-relative path of the product photo, e.g. "/fp6-pmos.jpg". Served + // Root-relative path of the product photo, e.g. "/widget.jpg". Served // from our own origin like every other asset — the privacy notice's // "everything comes from catcrafts.net" applies to product images too. std::string image; diff --git a/shared/interfaces/Catcrafts.Shared-Money.cppm b/shared/interfaces/Catcrafts.Shared-Money.cppm index ff56138..9329cef 100644 --- a/shared/interfaces/Catcrafts.Shared-Money.cppm +++ b/shared/interfaces/Catcrafts.Shared-Money.cppm @@ -107,8 +107,8 @@ export bool IsSanctioned(std::string_view cc) { // Where this shop ships. An allow-list, and that inversion IS the design. // // Everything not named here is refused. That is not timidity, it is the only -// honest posture available: the rules deciding whether a phone may lawfully be -// sold into a country are national, they differ in kind rather than degree, and +// honest posture available: the rules deciding whether a product may lawfully +// be sold into a country are national, they differ in kind rather than degree, and // nobody has read all of them. A deny-list ships to every country nobody thought // about; an allow-list refuses them. Only one of those failure modes is // survivable, so the default is no, and every code below is a country somebody @@ -139,9 +139,10 @@ export bool IsSanctioned(std::string_view cc) { // JP — using a handset without Japan's giteki (技適) mark on a Japanese network // is a Radio Act offence carrying up to a year's detention or ¥1,000,000. // The only exemption is for a short-stay visitor carrying a device in; it -// does not reach a resident receiving a parcel. Fairphone holds no Japanese -// certification and says outright that its devices cannot be used in -// countries requiring local homologation. Note where the liability lands: +// does not reach a resident receiving a parcel. A handset certified for +// the EU market holds no Japanese certification, and its maker will say +// outright that it cannot be used in countries requiring local +// homologation. Note where the liability lands: // the offence is USE, so the person committing it is the customer. Selling // someone a phone they break the law by switching on is worse than any // paperwork gap on this page. @@ -155,7 +156,7 @@ export bool IsSanctioned(std::string_view cc) { // // Not here, and deliberately: the United States and Canada. The insurance // exclusion was only ever half the reason and is no longer the interesting half. -// Canada is legally shut — the Fairphone (Gen. 6) holds no ISED certification, +// Canada is legally shut — an EU-certified handset holds no ISED certification, // and Canadian law bars importing, distributing or selling uncertified radio // apparatus, so no structure or policy opens it. The US adds per-parcel customs // entry since de minimis ended, carrier certification that gates activation, and @@ -170,8 +171,8 @@ export bool IsSanctioned(std::string_view cc) { // Appear as importer of record and two of these countries close. export std::span<const std::string_view> ShippableCountries() { static constexpr std::array<std::string_view, 10> open{ - // Home. Verpact wants nothing under 50,000 kg of packaging, and the - // phones are already on the Dutch market when Catcrafts buys them, so no + // Home. Verpact wants nothing under 50,000 kg of packaging, and goods + // bought from Dutch retail are already on the Dutch market when Catcrafts buys them, so no // producer duty attaches. That second clause is load-bearing: source // stock from another member state and Catcrafts becomes the Dutch // importer, owing Stichting OPEN before this line is honest again. diff --git a/shared/interfaces/Catcrafts.Shared-Views.cppm b/shared/interfaces/Catcrafts.Shared-Views.cppm index 66e50d0..dd78377 100644 --- a/shared/interfaces/Catcrafts.Shared-Views.cppm +++ b/shared/interfaces/Catcrafts.Shared-Views.cppm @@ -289,8 +289,8 @@ export RenderedPage RenderHome(std::span<const Project> projects, R"("founder":{"@type":"Person","@id":"https://catcrafts.net/about#person",)" R"("name":"Jorijn van der Graaf","url":"https://catcrafts.net/about"},)" R"("description":"Catcrafts makes accessible, open-source software and hardware: )" - R"(the Crafter C++ suite, the imsd IMS/VoLTE implementation, and Fairphone )" - R"((Gen. 6) handsets sold with postmarketOS preinstalled.",)" + R"(the Crafter C++ suite, the imsd IMS/VoLTE implementation, and mainline )" + R"(Linux support for mobile hardware.",)" R"("sameAs":["https://forgejo.catcrafts.net/Catcrafts/"]},)" R"({"@type":"WebSite","@id":"https://catcrafts.net/#website",)" R"("name":"Catcrafts","alternateName":["Catcrafts.net","CatCrafts"],)" @@ -676,8 +676,8 @@ export RenderedPage RenderShop(std::span<const Product> products, const Rates& r RenderedPage page; page.meta.title = "Shop — Catcrafts"; page.meta.description = - "Fairphone (Gen. 6) and (Gen. 6+) handsets reflashed to run postmarketOS, " - "with the IMS/VoLTE stack Catcrafts maintains."; + "Hardware that runs the open-source software Catcrafts maintains, and a " + "donation item that funds the work directly."; page.meta.canonical = "/shop"; page.meta.geoPriceHint = true; // The category page as typed data: an ItemList naming each product page. @@ -704,10 +704,9 @@ export RenderedPage RenderShop(std::span<const Product> products, const Rates& r page.main = Format( R"(<header class="page-header">)" R"(<h1 class="page-header__title">Shop</h1>)" - R"(<p class="page-header__lede">Hardware that runs the software from the )" - R"(projects page. Assembled to order and flashed. Please allow up to a )" - R"(week before dispatch. Or fund the work directly: the donation item )" - R"(takes any amount.)" + R"(<p class="page-header__lede">Everything sold here funds the open-source )" + R"(work on the projects page. Or fund the work directly: the donation )" + R"(item takes any amount.)" R"(</header>)" R"(<div class="product-grid">{}</div>)", cards.empty() ? Raw(R"(<p class="empty">No products listed.</p>)") : Join(cards)); @@ -1362,18 +1361,19 @@ export RenderedPage RenderProduct(const Product& product, // donation has neither a spec sheet nor a warranty, and an empty table // under a manufacturer-specific lede would be nonsense on its page. // - // The lede names the BRAND, never a model. It used to say "Fairphone - // (Gen. 6)" in the markup, which read true while the catalogue held one - // phone and went silently false the moment it held two — a spec sheet - // introduced as some other device's sheet is worse than no lede at all. + // The lede names the BRAND, never a model. It used to hardcode one model + // name, which read true while the catalogue held one device and went + // silently false the moment it held two — a spec sheet introduced as some + // other device's sheet is worse than no lede at all. It also claims + // nothing about the software on the device: that is the product's own + // summary's job, and this renderer serves whatever the catalogue lists. // A spec sheet with no brand to name is a content bug, asserted against in // ShouldShipContent rather than papered over with a second sentence here. const SafeHtml specsSection = product.specs.empty() ? SafeHtml{} : Format( R"(<section class="section">)" R"(<h2 class="section__title">Specifications</h2>)" R"(<p class="section__lede">The hardware is a stock {}, unmodified. )" - R"({}'s spec sheet is this product's spec sheet, )" - R"(and all of it works under postmarketOS.</p>)" + R"({}'s spec sheet is this product's spec sheet.</p>)" R"(<table class="spec-table"><tbody>{}</tbody></table>)" R"(</section>)", Escape(product.brand), Escape(product.brand), Join(specRows)); @@ -1671,7 +1671,7 @@ export RenderedPage RenderOrderStatus(const OrderView& o, std::string_view indic R"(</section>)") : Format( R"(<section class="section"><h2 class="section__title">What happens now</h2>)" - R"(<p>The device is ordered, flashed and tested, then shipped. Allow up )" + R"(<p>Your order is sourced, prepared and tested, then shipped. Allow up )" R"(to a week before dispatch. Updates land in your email.</p>)" R"(<p><a class="btn btn--primary"{} download>Download invoice (.md)</a></p>)" R"(<p class="order__note">GPG-clearsigned markdown. It verifies with )" diff --git a/tests/ShouldEmitStructuredData/main.cpp b/tests/ShouldEmitStructuredData/main.cpp index f5024f9..7a4a0c1 100644 --- a/tests/ShouldEmitStructuredData/main.cpp +++ b/tests/ShouldEmitStructuredData/main.cpp @@ -8,8 +8,8 @@ No permission is granted to copy, modify, distribute, or create derivative works // The JSON-LD blocks are the machine-readable identity and offer records, // born from a Google AI overview flatly asserting that nobody named Catcrafts -// sells Fairphone hardware. Parsed with our own JSON reader — the same one -// that must accept them — and checked for the facts. +// sells the hardware it then sold. Parsed with our own JSON reader — the same +// one that must accept them — and checked for the facts. import std; import Catcrafts.Shared; @@ -64,28 +64,7 @@ int main(int argc, char** argv) { Check(ok, "home Organization schema parses and carries the VAT identity"); } - // ── the product record ──────────────────────────────────────────── - // Variants are a ProductGroup: one variant Product per colour, each with - // its own single offer — not one Product with three prices. - const std::vector<Json::Value> productLd = ExtractLd(srv, "/shop/fp6-pmos"); - const Json::Value* group = nullptr; - for (const Json::Value& doc : productLd) { - if (doc.Str("@type") == "ProductGroup") group = &doc; - } - { - bool variantsOk = false; - if (group) { - if (const Json::Value* v = group->Find("hasVariant"); v && v->IsArray() - && v->array.size() == 3) { - variantsOk = true; - for (const Json::Value& node : v->array) { - const Json::Value* offers = node.Find("offers"); - variantsOk = variantsOk && offers && offers->IsObject(); - } - } - } - Check(variantsOk, "product schema parses with one variant (and offer) per colour"); - } + // ── the shop index ──────────────────────────────────────────────── { bool listOk = false; for (const Json::Value& doc : ExtractLd(srv, "/shop")) { @@ -96,80 +75,117 @@ int main(int argc, char** argv) { } Check(listOk, "shop index carries an ItemList of the product pages"); } - srv.BodyHas("/shop/fp6-pmos", "\"price\":\"573.80\"", "schema price is the checkout integer"); - // Merchant-grade offer fields: what Merchant Center's website-crawl feed - // reads. Shipping is published from the live carrier table at one unit's - // weight — the same integers checkout charges, so the listing cannot - // quote a rate the till won't honour; returns mirror the terms page. - srv.BodyHas("/shop/fp6-pmos", "OfferShippingDetails", "offers carry shipping details"); - srv.BodyHas("/shop/fp6-pmos", "MerchantReturnPolicy", "offers carry a return policy"); - srv.BodyHas("/shop/fp6-pmos", "\"sku\":\"fp6-pmos-green\"", "offers carry per-variant skus"); - srv.BodyHas("/shop/fp6-pmos", "\"brand\":{\"@type\":\"Brand\",\"name\":\"Fairphone\"}", - "product carries the hardware brand"); - // One entry per (transit tier, price) the carrier table produces, for the - // destinations the shop actually sells to — two, since the fixture prices - // NL/DE/GB/CH and checkout refuses DE and GB pending their producer - // registrations. Not a fixed property of the code: it is whatever the - // carrier prices INTERSECTED with where the shop sells, and publishing a - // rate to a country checkout would decline is an offer that cannot be - // accepted. - const Json::Value* shipping = nullptr; - if (group) { - if (const Json::Value* v = group->Find("hasVariant"); v && v->IsArray() - && !v->array.empty()) { - if (const Json::Value* offers = v->array[0].Find("offers")) { - shipping = offers->Find("shippingDetails"); - } + // ── the product record ──────────────────────────────────────────── + // Against whatever priced product the catalogue lists first, with every + // expected value read off that record: a listing coming or going is a + // content change, not an edit here. While no goods are listed (as since + // 2026-09-05) this block prints a note and is skipped. + if (const Product* pr = FirstPricedProduct()) { + const std::string shop = "/shop/" + pr->slug; + // Variants are a ProductGroup: one variant Product per colour, each + // with its own single offer — not one Product with three prices. A + // single-colour or colourless listing is a plain Product with one offer. + const bool grouped = pr->variants.size() > 1; + // Kept alive for the block: `record` and `firstOffer` point into it. + const std::vector<Json::Value> productLd = ExtractLd(srv, shop); + const Json::Value* record = nullptr; + for (const Json::Value& doc : productLd) { + if (doc.Str("@type") == (grouped ? "ProductGroup" : "Product")) record = &doc; } - } - Check(shipping && shipping->IsArray() && shipping->array.size() == 2, - "shipping details group the carrier's rates"); - // The advertised rate IS the carrier's single-unit price. Neither a - // destination the table does not cover (AU) nor one the policy refuses - // (DE, priced at €25 in the fixture) is ever advertised. - if (shipping && shipping->IsArray()) { - std::vector<std::string> rates; - bool au = false; - bool refused = false; - for (const Json::Value& detail : shipping->array) { - if (const Json::Value* rate = detail.Find("shippingRate")) { - rates.emplace_back(rate->Str("value")); + const Json::Value* firstOffer = nullptr; + { + bool offersOk = false; + if (record && grouped) { + if (const Json::Value* v = record->Find("hasVariant"); v && v->IsArray() + && v->array.size() == pr->variants.size()) { + offersOk = true; + for (const Json::Value& node : v->array) { + const Json::Value* offers = node.Find("offers"); + offersOk = offersOk && offers && offers->IsObject(); + } + if (!v->array.empty()) firstOffer = v->array[0].Find("offers"); + } + } else if (record) { + firstOffer = record->Find("offers"); + offersOk = firstOffer && firstOffer->IsObject(); } - if (const Json::Value* dest = detail.Find("shippingDestination")) { - if (const Json::Value* cc = dest->Find("addressCountry"); cc && cc->IsArray()) { - for (const Json::Value& c : cc->array) { - au = au || c.string == "AU"; - refused = refused || c.string == "DE" || c.string == "GB"; + Check(offersOk, grouped + ? "product schema parses with one variant (and offer) per colour" + : "product schema parses with its one offer"); + } + srv.BodyHas(shop, "\"price\":\"" + Money::FormatMinor(pr->priceInclMinor) + "\"", + "schema price is the checkout integer"); + // Merchant-grade offer fields: what Merchant Center's website-crawl feed + // reads. Shipping is published from the live carrier table at one unit's + // weight — the same integers checkout charges, so the listing cannot + // quote a rate the till won't honour; returns mirror the terms page. + srv.BodyHas(shop, "OfferShippingDetails", "offers carry shipping details"); + srv.BodyHas(shop, "MerchantReturnPolicy", "offers carry a return policy"); + const std::string sku = pr->variants.empty() + ? pr->slug : pr->slug + "-" + pr->variants[0].slug; + srv.BodyHas(shop, "\"sku\":\"" + sku + "\"", "offers carry per-variant skus"); + if (!pr->brand.empty()) { + srv.BodyHas(shop, "\"brand\":{\"@type\":\"Brand\",\"name\":\"" + pr->brand + "\"}", + "product carries the hardware brand"); + } + + // One entry per (transit tier, price) the carrier table produces, for + // the destinations the shop actually sells to — two, since the fixture + // prices NL/DE/GB/CH and checkout refuses DE and GB pending their + // producer registrations. Not a fixed property of the code: it is + // whatever the carrier prices INTERSECTED with where the shop sells, + // and publishing a rate to a country checkout would decline is an + // offer that cannot be accepted. + const Json::Value* shipping = firstOffer ? firstOffer->Find("shippingDetails") : nullptr; + Check(shipping && shipping->IsArray() && shipping->array.size() == 2, + "shipping details group the carrier's rates"); + // The advertised rate IS the carrier's single-unit price. Neither a + // destination the table does not cover (AU) nor one the policy refuses + // (DE, priced at €25 in the fixture) is ever advertised. + if (shipping && shipping->IsArray()) { + std::vector<std::string> rates; + bool au = false; + bool refused = false; + for (const Json::Value& detail : shipping->array) { + if (const Json::Value* rate = detail.Find("shippingRate")) { + rates.emplace_back(rate->Str("value")); + } + if (const Json::Value* dest = detail.Find("shippingDestination")) { + if (const Json::Value* cc = dest->Find("addressCountry"); cc && cc->IsArray()) { + for (const Json::Value& c : cc->array) { + au = au || c.string == "AU"; + refused = refused || c.string == "DE" || c.string == "GB"; + } } } } + std::ranges::sort(rates); + Check(rates == std::vector<std::string>{ "15.00", "55.00" }, + "published shipping rates come from the carrier table"); + Check(!au, "an uncovered destination is not advertised"); + Check(!refused, "a destination the policy refuses is not advertised"); } - std::ranges::sort(rates); - Check(rates == std::vector<std::string>{ "15.00", "55.00" }, - "published shipping rates come from the carrier table"); - Check(!au, "an uncovered destination is not advertised"); - Check(!refused, "a destination the policy refuses is not advertised"); - } - if (srv.ShopOpen()) { - srv.BodyHas("/shop/fp6-pmos", "schema.org/InStock", - "open shop maps to InStock availability"); + if (srv.ShopOpen(pr->slug)) { + srv.BodyHas(shop, "schema.org/InStock", "open shop maps to InStock availability"); + } else { + srv.BodyHas(shop, "schema.org/PreOrder", "coming-soon maps to PreOrder availability"); + } + + // og: tags are the link-preview card on Mastodon and Lemmy — where the + // traffic actually comes from. Per product, not per site: two listings + // that share a link-preview image are two posts that look like the + // same thing. + if (!pr->image.empty()) { + srv.BodyHas(shop, "og:image\" content=\"https://catcrafts.net" + pr->image, + "product og:image is the absolute photo URL"); + } } else { - srv.BodyHas("/shop/fp6-pmos", "schema.org/PreOrder", - "coming-soon maps to PreOrder availability"); + std::println("note: the catalogue lists no priced product; the product-record " + "checks did not run and re-arm when one is listed"); } - - // og: tags are the link-preview card on Mastodon and Lemmy — where the - // traffic actually comes from. srv.BodyHas("/", "property=\"og:title\"", "home page has og:title"); - srv.BodyHas("/shop/fp6-pmos", "og:image\" content=\"https://catcrafts.net/fp6-pmos.jpg", - "product og:image is the absolute photo URL"); - // Per product, not per site: two phones that share a link-preview image - // are two Mastodon posts that look like the same phone. - srv.BodyHas("/shop/fp6plus-pmos", - "og:image\" content=\"https://catcrafts.net/fp6plus-pmos.jpg", - "the refresh previews with its own photo, not the Gen. 6's"); // ── the person-company weld ─────────────────────────────────────── // The about page: the founder must be named in the HTML, the Person diff --git a/tests/ShouldProcessCheckout/main.cpp b/tests/ShouldProcessCheckout/main.cpp index bd3a6e2..3380add 100644 --- a/tests/ShouldProcessCheckout/main.cpp +++ b/tests/ShouldProcessCheckout/main.cpp @@ -13,12 +13,15 @@ No permission is granted to copy, modify, distribute, or create derivative works // payment links and reports "paid" once the marker file exists — which is how // this suite simulates the customer paying. // -// The lifecycle half runs only while the shop is OPEN; while coming-soon it -// asserts the closed behaviour instead. Launch day (status flip to -// "available" in Catcrafts.Shared-Content.cppm) re-arms the full suite with -// no edit here. The validation half runs in both states on purpose: -// validation happens before the coming-soon check, and that ordering is -// exactly what it pins. +// The goods half addresses whatever priced product the compiled catalogue +// lists first — slug, default colour, boxed weight — and derives every expected +// figure from that record and the harness's carrier table with the till's own +// Money arithmetic. It runs only while that product is OPEN; while coming-soon +// it asserts the closed behaviour instead, and while the catalogue lists no +// goods at all (as since 2026-09-05) it prints a note and is skipped — listing +// one re-arms it with no edit here. The validation half runs in both shop +// states on purpose: validation happens before the coming-soon check, and that +// ordering is exactly what it pins. The donation lifecycle runs regardless. import std; import Catcrafts.Shared; @@ -81,21 +84,46 @@ bool GpgVerifies(const std::filesystem::path& file) { file.string()).c_str()) == 0; } -void OpenShopLifecycle(TestServer& srv) { +// The carrier table the harness hands the server (kShippingFixture), as the +// ladders the totals below are derived from: one parcel under 2 kg ships for +// €15 at home and €55 to Switzerland, and the 10 kg band is what caps a parcel. +const std::vector<Money::ShipBracket> kNl{ { 2000, 1500 }, { 10000, 2900 } }; +const std::vector<Money::ShipBracket> kCh{ { 2000, 5500 }, { 10000, 7900 } }; + +// What the till charges for `quantity` units at `unit` cents to `cc`: the +// parcel weighs quantity × boxed weight, the carrier prices that parcel, and +// ComputeTotals nets the LINE for an export. The same three calls the +// checkout handler makes, so a figure asserted here is one the shop derives, +// not one anybody typed. +std::int64_t Total(const Product& pr, std::int64_t unit, std::int64_t quantity, + std::span<const Money::ShipBracket> ladder, std::string_view cc) { + const std::int64_t shipping = Money::RateFor(ladder, pr.shipWeightGrams * quantity); + return Money::ComputeTotals(unit, quantity, shipping, cc).total; +} + +void OpenShopLifecycle(TestServer& srv, const Product& pr) { + const std::string shop = "/shop/" + pr.slug; + const std::int64_t unit = pr.priceInclMinor; // the default (cheapest) colour + const std::int64_t nlTotal = Total(pr, unit, 1, kNl, "NL"); + const std::string nlEuro = Money::FormatEuro(nlTotal); + // The one-parcel ceiling: the heaviest band any destination offers (10 kg + // in the fixture) divided by the boxed unit weight. + const std::int64_t maxUnits = Money::MaxUnitsFor(kNl, pr.shipWeightGrams); + // ── checkout ────────────────────────────────────────────────────── // A valid submission answers 303 straight to the PAYMENT page — no // interim stop. The fake rail's payUrl is the order page itself, so the // token is still extractable from the Location and the browser flow works // in dev. - const auto checkout = srv.Post("/shop/fp6-pmos", Good()); + const auto checkout = srv.Post(shop, Good()); const std::string token = TokenOf(checkout); Check(checkout.status == "303" && !token.empty(), "POST checkout -> 303 straight to payment", checkout.status); { const std::string ledger = srv.OrdersText(); Check(ledger.find("\"country\":\"NL\"") != std::string::npos - && ledger.find("\"total_minor\":58880") != std::string::npos, - "order stored: NL total is €588.80 (green €573.80 + €15 shipping)"); + && ledger.find(std::format("\"total_minor\":{}", nlTotal)) != std::string::npos, + "order stored: NL total is the default colour plus €15 home shipping"); // No `pay` field in that submission, which is what a form with only // one rail configured posts: it must land on the bank rail rather // than nothing. @@ -108,8 +136,9 @@ void OpenShopLifecycle(TestServer& srv) { const std::string orderPath = std::format("/order/{}", token); { const std::string page = srv.Body(orderPath); - for (std::string_view probe : { "awaiting payment", "Resume payment", "CC-", - "http-equiv=\"refresh\"", "€588.80" }) { + for (std::string_view probe : std::initializer_list<std::string_view>{ + "awaiting payment", "Resume payment", "CC-", + "http-equiv=\"refresh\"", nlEuro }) { Check(page.find(probe) != std::string::npos, std::format("order page has {}", probe)); } @@ -128,11 +157,11 @@ void OpenShopLifecycle(TestServer& srv) { // assertion that matters: it is what the reconciler later reads to decide // WHICH provider may confirm the order, so a choice that renders but is // not stored would mean crypto orders being asked about at the bank. - srv.BodyHas("/shop/fp6-pmos", "name=\"pay\"", "the form offers a payment choice"); - srv.BodyHas("/shop/fp6-pmos", "value=\"crypto\"", "crypto is one of the choices"); - srv.BodyHas("/shop/fp6-pmos", "value=\"bank\" checked", "bank is the pre-selected choice"); + srv.BodyHas(shop, "name=\"pay\"", "the form offers a payment choice"); + srv.BodyHas(shop, "value=\"crypto\"", "crypto is one of the choices"); + srv.BodyHas(shop, "value=\"bank\" checked", "bank is the pre-selected choice"); - const std::string tokenCrypto = TokenOf(srv.Post("/shop/fp6-pmos", Good("&pay=crypto"))); + const std::string tokenCrypto = TokenOf(srv.Post(shop, Good("&pay=crypto"))); Check(!tokenCrypto.empty(), "a crypto order goes through"); if (!tokenCrypto.empty()) { bool recorded = false; @@ -161,7 +190,7 @@ void OpenShopLifecycle(TestServer& srv) { // so the form comes back with the choice highlighted rather than a bare // 400. { - const auto bogus = srv.Post("/shop/fp6-pmos", Good("&pay=invoice-me-later")); + const auto bogus = srv.Post(shop, Good("&pay=invoice-me-later")); Check(bogus.status == "422", "an unknown payment method is refused", bogus.status); Check(bogus.body.find("Pick one of the payment methods") != std::string::npos, "the refusal names the payment field"); @@ -171,13 +200,13 @@ void OpenShopLifecycle(TestServer& srv) { // national currency line sourced from the build-time ECB rates. CH because // it is the export destination that actually sells — North America is // refused on insurance, and GB waits on its e-waste registrations. - const std::string tokenCh = TokenOf(srv.Post("/shop/fp6-pmos", + const std::string tokenCh = TokenOf(srv.Post(shop, "email=ch%40example.org&name=Heidi&street=1%20Bahnhofstrasse&postal=8001&city=Zurich&country=CH")); Check(!tokenCh.empty(), "CH checkout issues an order"); if (!tokenCh.empty()) { const std::string page = srv.Body(std::format("/order/{}", tokenCh)); - // €474.21 goods (green net) + €55 world shipping = €529.21 - Check(page.find("€529.21") != std::string::npos, + // Net of the default colour + €55 world shipping. + Check(page.find(Money::FormatEuro(Total(pr, unit, 1, kCh, "CH"))) != std::string::npos, "export order total is ex-VAT + world shipping"); Check(page.find("Zero-rated export") != std::string::npos, "export order states the VAT treatment"); @@ -187,42 +216,55 @@ void OpenShopLifecycle(TestServer& srv) { "conversion is labelled indicative"); } - // A two-unit white export order: unit €665.38, line €1330.76, net from the - // LINE total (not per unit) = €1099.80, plus €55 world shipping = €1154.80. - const std::string tokenWhite = TokenOf(srv.Post("/shop/fp6-pmos", - "email=w%40example.org&name=W&street=X%201&postal=1&city=Y&country=CH&color=white&quantity=2")); - Check(!tokenWhite.empty(), "white ×2 checkout issues an order"); - if (!tokenWhite.empty()) { - const std::string page = srv.Body(std::format("/order/{}", tokenWhite)); - Check(page.find("€1154.80") != std::string::npos, - "white ×2 export total nets the line, not the unit"); + // A two-unit export order in the dearest colour (or the only price, for a + // colourless listing): the export net comes from the LINE total (unit × 2), + // not per unit, plus one parcel's world shipping at twice the weight. + const Variant* dear = nullptr; + for (const Variant& v : pr.variants) { + if (!dear || v.priceInclMinor > dear->priceInclMinor) dear = &v; + } + const std::int64_t dearUnit = dear ? dear->priceInclMinor : unit; + const std::string tokenTwo = TokenOf(srv.Post(shop, + "email=w%40example.org&name=W&street=X%201&postal=1&city=Y&country=CH&quantity=2" + + (dear ? "&color=" + dear->slug : std::string{}))); + Check(!tokenTwo.empty(), "a two-unit checkout issues an order"); + if (!tokenTwo.empty()) { + const std::string page = srv.Body(std::format("/order/{}", tokenTwo)); + Check(page.find(Money::FormatEuro(Total(pr, dearUnit, 2, kCh, "CH"))) != std::string::npos, + "two-unit export total nets the line, not the unit"); Check(page.find("Device × 2") != std::string::npos, "order page shows the quantity"); - Check(page.find("White") != std::string::npos, "order page names the colour"); + if (dear) { + Check(page.find(dear->label) != std::string::npos, "order page names the colour"); + } } // A colour we never listed must not buy anything, whatever the form claims. - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", Good("&color=mauve")); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", Good("&quantity=100")); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", Good("&quantity=0")); + if (!pr.variants.empty()) { + srv.CheckStatus(shop, "422", "POST", Good("&color=no-such-colour")); + } + srv.CheckStatus(shop, "422", "POST", Good("&quantity=100")); + srv.CheckStatus(shop, "422", "POST", Good("&quantity=0")); // Quantity is a free input with a technical ceiling, not a dropdown — a - // nine-unit order is business, not fraud. - Check(!TokenOf(srv.Post("/shop/fp6-pmos", Good("&quantity=9"))).empty(), - "a nine-unit order goes through"); - srv.BodyHas("/shop/fp6-pmos", "type=\"number\"", "quantity is a number input, not a dropdown"); + // multi-unit order within the parcel is business, not fraud. + const std::int64_t several = std::min<std::int64_t>(9, maxUnits); + Check(several > 1 && !TokenOf(srv.Post(shop, Good(std::format("&quantity={}", several)))).empty(), + std::format("a {}-unit order goes through", several)); + srv.BodyHas(shop, "type=\"number\"", "quantity is a number input, not a dropdown"); // The ceiling is physical: the heaviest band any destination offers - // (10 kg in the fixture) divided by the boxed unit weight (700 g) = 14. - // The input advertises the BEST case across destinations; the per-country - // limit is enforced on submit, below. - srv.BodyHas("/shop/fp6-pmos", "max=\"14\"", "quantity input carries the one-parcel ceiling"); + // (10 kg in the fixture) divided by the boxed unit weight. The input + // advertises the BEST case across destinations; the per-country limit is + // enforced on submit, below. + srv.BodyHas(shop, std::format("max=\"{}\"", maxUnits), + "quantity input carries the one-parcel ceiling"); - // One order is one parcel. Fifteen units is 10.5 kg, past every band the - // fixture has, so it must be refused rather than quoted a rate the + // One order is one parcel. One unit past the ceiling is past every band + // the fixture has, so it must be refused rather than quoted a rate the // carrier would not accept — and the refusal has to say what WOULD fit, // or the buyer is left guessing. { - const auto heavy = srv.Post("/shop/fp6-pmos", Good("&quantity=15")); + const auto heavy = srv.Post(shop, Good(std::format("&quantity={}", maxUnits + 1))); Check(heavy.status == "422", "an over-weight order is refused", heavy.status); - Check(heavy.body.find("up to 14 per order") != std::string::npos, + Check(heavy.body.find(std::format("up to {} per order", maxUnits)) != std::string::npos, "the too-heavy refusal says what fits"); Check(heavy.body.find("orders@catcrafts.net") != std::string::npos, "the too-heavy refusal offers a way to order anyway"); @@ -235,17 +277,17 @@ void OpenShopLifecycle(TestServer& srv) { constexpr std::string_view kAu = "email=au%40example.org&name=Alex&street=1%20George%20St&postal=2000&city=Sydney&country=AU"; { - const auto au = srv.Post("/shop/fp6-pmos", std::string(kAu)); + const auto au = srv.Post(shop, std::string(kAu)); Check(au.status == "422", "an uncovered destination is refused", au.status); Check(au.body.find("No carrier rate for AU") != std::string::npos, "an uncovered destination is refused, naming the country"); // The country FIELD ERROR must be the carrier message, not the // no-sale one. Matched on the error markup rather than the bare // sentence: the no-sale line is standing copy above every buy form. - Check(au.body.find("field__error\">Catcrafts does not sell") == std::string::npos, + Check(au.body.find("field__error\">Catcrafts can't ship there") == std::string::npos, "an uncovered destination is not confused with a refused one"); const std::size_t before = LedgerLines(srv).size(); - srv.Post("/shop/fp6-pmos", std::string(kAu)); + srv.Post(shop, std::string(kAu)); Check(LedgerLines(srv).size() == before, "a refused destination writes no order"); } @@ -286,10 +328,11 @@ void OpenShopLifecycle(TestServer& srv) { // registered identity, amounts — and a signature that verifies offline. { const auto invoice = srv.Get(std::format("/order/{}/invoice.md", token)); - for (std::string_view probe : { "BEGIN PGP SIGNED MESSAGE", "# Invoice ", - "Customer number: ", "Chico Mendesring 256", - "KVK 78437059", "NL003329281B38", "CC-", - "VAT 21% (NL)", "€588.80" }) { + for (std::string_view probe : std::initializer_list<std::string_view>{ + "BEGIN PGP SIGNED MESSAGE", "# Invoice ", + "Customer number: ", "Chico Mendesring 256", + "KVK 78437059", "NL003329281B38", "CC-", + "VAT 21% (NL)", nlEuro }) { Check(invoice.body.find(probe) != std::string::npos, std::format("invoice has {}", probe)); } @@ -373,11 +416,12 @@ void OpenShopLifecycle(TestServer& srv) { } Check(!nlMail.empty(), "a confirmation email links the NL order"); if (!nlMail.empty()) { - for (std::string_view probe : { "To: e2e@example.org", "Subject: Catcrafts order CC-", - "From: Catcrafts <info@catcrafts.net>", - "MIME-Version: 1.0", "€588.80", "incl. 21% NL VAT", - "KVK 78437059", "BEGIN PGP SIGNED MESSAGE", - "filename=\"catcrafts-invoice-" }) { + for (std::string_view probe : std::initializer_list<std::string_view>{ + "To: e2e@example.org", "Subject: Catcrafts order CC-", + "From: Catcrafts <info@catcrafts.net>", + "MIME-Version: 1.0", nlEuro, "incl. 21% NL VAT", + "KVK 78437059", "BEGIN PGP SIGNED MESSAGE", + "filename=\"catcrafts-invoice-" }) { Check(nlMail.find(probe) != std::string::npos, std::format("email has {}", probe)); } @@ -451,24 +495,26 @@ void OpenShopLifecycle(TestServer& srv) { } } -void ComingSoon(TestServer& srv) { +void ComingSoon(TestServer& srv, const Product& pr) { + const std::string shop = "/shop/" + pr.slug; // A perfectly valid order must be refused while the shop is closed: after // validation (so the field checks below still exercise the parser) and // before any rail or ledger is touched. - srv.CheckStatus("/shop/fp6-pmos", "409", "POST", Good()); + srv.CheckStatus(shop, "409", "POST", Good()); Check(srv.OrdersText().empty(), "refused order writes nothing to the ledger"); std::println("shop is coming-soon; the checkout, order-lifecycle and invoice " "checks re-arm when the status flips to available"); } -void AlwaysOnValidation(TestServer& srv) { - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", +void AlwaysOnValidation(TestServer& srv, const Product& pr) { + const std::string shop = "/shop/" + pr.slug; + srv.CheckStatus(shop, "422", "POST", "name=Ada&street=x&postal=1&city=y&country=NL"); // no email - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=nonsense&" + Good()); // bad email (dup keeps first) - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=a%40b.example&country=NL"); // missing address - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", Good("&website=spam")); // honeypot + srv.CheckStatus(shop, "422", "POST", Good("&website=spam")); // honeypot // Destinations the shop refuses (Money::SellsTo). Well-formed, real // addresses: the refusal is policy, not a shape check, so it has to hold for @@ -477,20 +523,20 @@ void AlwaysOnValidation(TestServer& srv) { // whether the shop is open or not, and it is the assertion that would catch // the gate being lost in a refactor. const std::size_t before = LedgerLines(srv).size(); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=us%40example.org&name=Pat&street=1%20Main%20St&postal=43004&city=Columbus&country=US"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=ca%40example.org&name=Terry&street=1%20Bloor%20St&postal=M4W&city=Toronto&country=CA"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=us%40example.org&name=Pat&street=1%20Main%20St&postal=43004&city=Columbus&country=us"); // Sanctioned destinations (Money::SanctionedCountries) refuse through the // same always-on gate — this refusal is the law, so of all the checks in // this file it is the one that must survive every refactor. - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=ru%40example.org&name=Sasha&street=1%20Tverskaya&postal=125009&city=Moscow&country=RU"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=by%40example.org&name=Vanya&street=1%20Kastrychnitskaya&postal=220030&city=Minsk&country=BY"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=ru%40example.org&name=Sasha&street=1%20Tverskaya&postal=125009&city=Moscow&country=ru"); // Destinations off the shipping allow-list (Money::ShipsTo). DE and GB are // the pointed cases: the fixture PRICES both, so a rate exists and the parcel @@ -503,19 +549,19 @@ void AlwaysOnValidation(TestServer& srv) { // no order form for a field error to land in. What is worth proving over real // HTTP is that the refusal holds at all, in both states — which is what 422 // says here. - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=de%40example.org&name=Klaus&street=1%20Hauptstr&postal=10115&city=Berlin&country=DE"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=gb%40example.org&name=Terry&street=1%20Baker%20St&postal=W1U&city=London&country=GB"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=no%40example.org&name=Kari&street=1%20Karl%20Johans&postal=0154&city=Oslo&country=NO"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=tr%40example.org&name=Emre&street=1%20Istiklal&postal=34430&city=Istanbul&country=TR"); - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=br%40example.org&name=Ana&street=1%20Paulista&postal=01310&city=Sao%20Paulo&country=BR"); // And the default that makes an allow-list worth having: a well-formed code // nobody ever considered is refused without appearing on any list. - srv.CheckStatus("/shop/fp6-pmos", "422", "POST", + srv.CheckStatus(shop, "422", "POST", "email=zz%40example.org&name=Sam&street=1%20Main&postal=0000&city=Nowhere&country=ZZ"); // Refused in validation means nothing reached the ledger and no payment // link was ever created. @@ -524,7 +570,7 @@ void AlwaysOnValidation(TestServer& srv) { } // The donation item is open in BOTH shop states — it is the soft opening the -// coming-soon phone waits behind — so this whole lifecycle runs +// goods wait behind, listed or not — so this whole lifecycle runs // unconditionally: create with a buyer-named amount, settle on the fake rail, // confirm there is no invoice and no VAT, and watch /financials book it under // donations rather than sales. @@ -554,7 +600,16 @@ void DonationLifecycle(TestServer& srv) { // live EURC payment proved that a buyer staring at "awaiting payment" // after their wallet said done is a support email in the making. The // fake rail's "<marker>.seen" file is that state's test handle. + // + // The rail must be UNPAID first. The open-shop half (when it runs) leaves + // the paid marker behind, and a marker already present pays this donation + // the moment it arrives — the seen state could then never show. Every + // order placed before this point has already settled, so nothing else + // notices the marker going. { + std::error_code ec; + std::filesystem::remove(std::filesystem::path( + srv.Orders().string() + ".fake-paid"), ec); const std::string tokenSeen = TokenOf(srv.Post("/shop/donation", "amount=2&pay=crypto")); Check(!tokenSeen.empty(), "a crypto donation goes through"); @@ -641,7 +696,7 @@ void DonationLifecycle(TestServer& srv) { "a donation is not worded as an export"); Check(page.find("invoice.md") == std::string::npos, "a paid donation offers no invoice download"); - Check(page.find("flashed and tested") == std::string::npos, + Check(page.find("prepared and tested") == std::string::npos, "a paid donation promises no dispatch"); } srv.CheckStatus(std::format("/order/{}/invoice.md", token), "404"); @@ -746,11 +801,12 @@ void DonationLifecycle(TestServer& srv) { // The re-rendered form only exists when the shop is open; while coming-soon a // rejection answers with the coming-soon page instead. -void RejectedFormEcho(TestServer& srv) { +void RejectedFormEcho(TestServer& srv, const Product& pr) { + const std::string shop = "/shop/" + pr.slug; // A rejected submission must come back with the values still in it — // losing a filled-in form is how a sale gets abandoned. { - const auto rejected = srv.Post("/shop/fp6-pmos", + const auto rejected = srv.Post(shop, "email=bad&name=Ada&street=Main%201&postal=1234AB&city=Delft&country=NLD"); for (std::string_view probe : { "value=\"bad\"", "value=\"NLD\"", "value=\"Ada\"", "value=\"Main 1\"", "value=\"Delft\"" }) { @@ -762,11 +818,14 @@ void RejectedFormEcho(TestServer& srv) { } // A refused destination says why, in the form, with the address still in // it — the visitor should learn the shop does not sell there, not that - // something went wrong. + // something went wrong. The wording is kRegulatoryMessage's, as a FIELD + // error (the same sentence also rides in the preview blob, so the error + // markup is what is matched; the apostrophe is escaped as the renderer + // escapes it). { - const auto refused = srv.Post("/shop/fp6-pmos", + const auto refused = srv.Post(shop, "email=us%40example.org&name=Pat&street=1%20Main%20St&postal=43004&city=Columbus&country=US"); - Check(refused.body.find("does not sell or ship to the United States or Canada") + Check(refused.body.find("field__error\">Catcrafts can't ship there") != std::string::npos, "refusal explains itself on the form"); Check(refused.body.find("value=\"Pat\"") != std::string::npos, @@ -776,30 +835,34 @@ void RejectedFormEcho(TestServer& srv) { // one — the buyer should learn the law forbids the sale, not wonder what // insurance has to do with Moscow. { - const auto refused = srv.Post("/shop/fp6-pmos", + const auto refused = srv.Post(shop, "email=ru%40example.org&name=Sasha&street=1%20Tverskaya&postal=125009&city=Moscow&country=RU"); Check(refused.body.find("EU sanctions prohibit") != std::string::npos, "sanctions refusal explains itself on the form"); - Check(refused.body.find("field__error\">Catcrafts does not sell") == std::string::npos, + Check(refused.body.find("field__error\">Catcrafts can't ship there") == std::string::npos, "sanctions refusal is not worded as the policy one"); } - // The buy panel warns before anyone fills it in, and the preview script - // carries the same lists so it cannot quote a total the server would - // refuse. - srv.BodyHas("/shop/fp6-pmos", "does not sell or ship to the United States or Canada", - "buy panel states where the shop does not sell"); - srv.BodyHas("/shop/fp6-pmos", "cannot sell or ship to Russia, Belarus or North Korea", + // The buy panel warns before anyone fills it in — positively, as the + // allow-list is the whole policy — and the preview script carries the + // same lists so it cannot quote a total the server would refuse: `w` is + // the shipping allow-list (a country is refused by its ABSENCE), `s` the + // sanctioned countries. No deny-list survives in the payload + // (ShouldShipContent pins the exact contents against the fixture). + srv.BodyHas(shop, "Catcrafts currently ships to the Netherlands", + "buy panel states where the shop ships"); + srv.BodyHas(shop, "cannot sell or ship to Russia, Belarus or North Korea", "buy panel states where the law forbids selling"); - srv.BodyHas("/shop/fp6-pmos", ""x":["US","CA"]", - "total preview knows the refused destinations"); - srv.BodyHas("/shop/fp6-pmos", ""s":["RU","BY","KP"]", + srv.BodyHas(shop, ""w":["NL",", + "total preview carries the shipping allow-list"); + srv.BodyLacks(shop, ""x":[", "no deny-list survives in the preview payload"); + srv.BodyHas(shop, ""s":["RU","BY","KP"]", "total preview knows the sanctioned destinations"); // The honeypot message must not name the trap, or it teaches the next // bot. Only the ERROR NOTICE is inspected: the re-rendered form // legitimately contains the name="website" field itself — that IS the // trap, re-armed. { - const auto pot = srv.Post("/shop/fp6-pmos", Good("&website=x")); + const auto pot = srv.Post(shop, Good("&website=x")); std::smatch m; Check(std::regex_search(pot.body, m, std::regex(R"lit(notice--error">([^<]*))lit")), "honeypot rejection renders an error notice"); @@ -826,7 +889,7 @@ void RejectedFormEcho(TestServer& srv) { // // Its own server, because a rail roster is fixed at startup. Donations are // what this asserts against: they are open in BOTH shop states, so this runs -// whatever fp6-pmos's status is. +// whatever the goods' status is, or whether any are listed. void OneRailDown(const char* binary) { ServerOptions options; options.extraArgs = { "--rail=off", "--crypto-rail=fake-crypto" }; @@ -856,19 +919,24 @@ int main(int argc, char** argv) { options.mailer = true; TestServer srv(argv[1], 8217, options); - if (srv.ShopOpen()) { - OpenShopLifecycle(srv); + const Product* pr = FirstPricedProduct(); + if (!pr) { + std::println("note: the catalogue lists no priced product; the goods checkout, " + "order-lifecycle and invoice checks did not run and re-arm when one " + "is listed"); + } else if (srv.ShopOpen(pr->slug)) { + OpenShopLifecycle(srv, *pr); } else { - ComingSoon(srv); + ComingSoon(srv, *pr); } - AlwaysOnValidation(srv); + if (pr) AlwaysOnValidation(srv, *pr); // The donation item is open in both shop states — that is the point of it. DonationLifecycle(srv); - if (srv.ShopOpen()) { - RejectedFormEcho(srv); + if (pr && srv.ShopOpen(pr->slug)) { + RejectedFormEcho(srv, *pr); } OneRailDown(argv[1]); diff --git a/tests/ShouldSellTheShopFront/main.cpp b/tests/ShouldSellTheShopFront/main.cpp index c01d957..acf8bbe 100644 --- a/tests/ShouldSellTheShopFront/main.cpp +++ b/tests/ShouldSellTheShopFront/main.cpp @@ -10,61 +10,106 @@ No permission is granted to copy, modify, distribute, or create derivative works // charges, the currency conversions the shop card carries, and the copy // around them. Runs in both shop states — coming-soon asserts the closed // shape, launch re-arms the open one with no edit here. +// +// The goods half addresses whatever priced product the compiled catalogue +// lists first — its slug, its variants and its photo are read off the record, +// and every expected figure is formatted with the same Money routines the +// renderer uses. While the catalogue lists no goods (as since 2026-09-05) that +// half prints a note and is skipped; the donation checks run regardless. import std; +import Catcrafts.Shared; import Catcrafts.E2eHarness; +using namespace Catcrafts; using namespace Catcrafts::E2e; -int main(int argc, char** argv) { - TestServer srv(argv[1], 8216); +namespace { + +void PricedProduct(TestServer& srv, const Product& pr) { + const std::string shop = "/shop/" + pr.slug; + const std::string incl = Money::FormatEuro(pr.priceInclMinor); + const std::string net = Money::FormatEuro(Money::NetFromGross(pr.priceInclMinor)); // The price is rendered from the same integers the checkout charges, with // the derived ex-VAT twin alongside — asserting both pins the arithmetic. - srv.BodyHas("/shop/fp6-pmos", "€573.80", - "product page shows the from-price (green supplier + €60.50 gross markup)"); - srv.BodyHas("/shop/fp6-pmos", "€474.21", "product page shows the derived ex-VAT price"); - srv.BodyHas("/shop/fp6-pmos", ">from<", "product page marks the price as a from-price"); - srv.BodyHas("/shop", "€573.80", "shop card shows the from-price"); - // Every colour is priced in the selector, and the form carries the exact - // data blob the preview computes from. - srv.BodyHas("/shop/fp6-pmos", "Black €579.80", "colour selector prices black"); - srv.BodyHas("/shop/fp6-pmos", "White €665.38", "colour selector prices white"); - if (srv.ShopOpen()) { - srv.BodyHas("/shop/fp6-pmos", "data-cc=", "form embeds the pricing blob"); - srv.BodyHas("/shop/fp6-pmos", "id=\"cc-total\"", "live total element present"); + srv.BodyHas(shop, incl, "product page shows the (from-)price"); + srv.BodyHas(shop, net, "product page shows the derived ex-VAT price"); + srv.BodyHas("/shop", incl, "shop card shows the (from-)price"); + // "from" is a claim that other colours cost more, so it appears exactly + // when there is more than one colour to choose from. + if (pr.variants.size() > 1) { + srv.BodyHas(shop, ">from<", "product page marks the price as a from-price"); + Check(pr.CheapestVariant() && pr.CheapestVariant()->priceInclMinor == pr.priceInclMinor, + "the advertised from-price is the cheapest colour's"); } else { - srv.BodyHas("/shop/fp6-pmos", "Coming soon", "coming-soon notice on the buy panel"); - srv.BodyHas("/shop", "coming soon", "shop card carries the coming-soon badge"); - srv.BodyLacks("/shop/fp6-pmos", "<form", "no order form while coming soon"); + srv.BodyLacks(shop, ">from<", "a single-price product is not a from-price"); + } + // Every colour is priced in the selector, label and euro amount together, + // and the form carries the exact data blob the preview computes from. + if (srv.ShopOpen(pr.slug)) { + for (const Variant& v : pr.variants) { + srv.BodyHas(shop, v.label + " " + Money::FormatEuro(v.priceInclMinor), + "colour selector prices " + v.slug); + } + srv.BodyHas(shop, "data-cc=", "form embeds the pricing blob"); + srv.BodyHas(shop, "id=\"cc-total\"", "live total element present"); + } else { + srv.BodyHas(shop, "Coming soon", "coming-soon notice on the buy panel"); + srv.BodyHas("/shop", "coming soon", "shop card carries the coming-soon badge"); + srv.BodyLacks(shop, "<form", "no order form while coming soon"); } - // The Gen. 6+ beside it: one launch price in all three colours, so the - // "from" price and every selector row are the same number — and the - // ex-VAT twin is still derived from it rather than typed in. - srv.BodyHas("/shop/fp6plus-pmos", "€709.50", - "refresh page shows the from-price (€649.00 supplier + €60.50 gross markup)"); - srv.BodyHas("/shop/fp6plus-pmos", "€586.36", "refresh page shows the derived ex-VAT price"); - srv.BodyHas("/shop", "€709.50", "shop card shows the refresh from-price"); - srv.BodyHas("/shop/fp6plus-pmos", "Cobalt Blue €709.50", - "colour selector prices the colour only this model ships in"); - srv.BodyHas("/shop/fp6plus-pmos", "12 GB RAM", - "refresh page states the spec that makes it a different phone"); - srv.BodyHas("/shop/fp6plus-pmos", "src=\"/fp6plus-pmos.jpg\"", - "refresh page embeds its own photo"); - srv.BodyHas("/shop", "src=\"/fp6plus-pmos.jpg\"", "shop card embeds the refresh thumbnail"); - Check(std::filesystem::exists("images/fp6plus-pmos.jpg"), - "refresh photo exists in the repo"); - srv.BodyLacks("/shop/fp6plus-pmos", "stock Fairphone (Gen. 6),", - "refresh page does not caption its specs as the Gen. 6's"); - // The donation item: open while the phones above may not be — the shop's - // soft opening. Its card quotes no price (there is none), its page is a - // form asking an amount and, optionally, an email — never an address. + // The photo: on the page, on the card, in the link preview, and actually + // present in the repo — the file itself is Caddy's to serve (static + // asset), so its presence is asserted against the tree, not this server. + if (!pr.image.empty()) { + const std::string src = "src=\"" + pr.image + "\""; + srv.BodyHas(shop, src, "product page embeds the photo"); + srv.BodyHas("/shop", src, "shop card embeds the thumbnail"); + Check(std::filesystem::exists("images" + pr.image), + "product photo exists in the repo", pr.image); + } + // The spec lede is generated from the brand, so it introduces THIS sheet + // and no other device's. + if (!pr.specs.empty()) { + srv.BodyHas(shop, "a stock " + pr.brand + ", unmodified", + "the spec lede names the brand, not a model"); + } + srv.BodyLacks(shop, "not yet verified", "no unverified-emergency-calling caveat on the page"); + srv.BodyLacks(shop, "Reserve one", "no reservation form survives"); + + // The shop card: one euro number as the crawler/no-JS text, every + // supported currency pre-formatted server-side as a data attribute for + // the script to pick from. Converted amounts carry "~". GBP converts the + // ex-VAT price; SEK (an EU member's currency) converts the VAT-inclusive + // price. USD and CAD are absent on purpose — the shop refuses those + // destinations, so it does not quote a local price to them either. + srv.BodyHas("/shop", "class=\"price__single\"", "shop card renders the single-number price"); + srv.BodyHas("/shop", "data-gbp=\"~£", "shop card carries a GBP conversion"); + srv.BodyHas("/shop", "data-sek=\"~kr ", "shop card carries an SEK conversion"); + srv.BodyHas("/shop", "data-world=\"" + net + "\"", "shop card carries the euro export fallback"); + srv.BodyLacks("/shop", "data-usd=", "no USD price for a country the shop refuses"); + srv.BodyLacks("/shop", "data-cad=", "no CAD price for a country the shop refuses"); + // The product page gets the same headline element, so a British visitor + // sees ~£ at the top there too, and the buy card states the customs + // position plainly. + srv.BodyHas(shop, "data-gbp=\"~£", "product page headline carries the conversion"); + srv.BodyHas(shop, "indicative only", "buy card says converted prices are indicative"); + srv.BodyHas(shop, "customs authority", "buy card names whose problem import charges are"); + srv.BodyLacks(shop, "collected on arrival", "the vague customs phrasing is gone"); + // The label must not claim the Dutch rate is an EU-wide one. + srv.BodyLacks(shop, "EU VAT", "price label does not call 21% an EU-wide rate"); +} + +void Donation(TestServer& srv) { + // The donation item: open whatever the goods are doing — the shop's soft + // opening. Its card quotes no price (there is none), its page is a form + // asking an amount and, optionally, an email — never an address. srv.BodyHas("/shop", "/shop/donation", "shop grid lists the donation item"); srv.BodyHas("/shop", "any amount", "donation card quotes no price"); srv.BodyHas("/shop/donation", "name=\"amount\"", "donation form asks for an amount"); - srv.BodyHas("/shop/donation", ">Donate</button>", - "donation form submits to payment"); + srv.BodyHas("/shop/donation", ">Donate</button>", "donation form submits to payment"); srv.BodyLacks("/shop/donation", "name=\"street\"", "donation form asks no address — nothing ships"); srv.BodyLacks("/shop/donation", "name=\"quantity\"", @@ -79,44 +124,21 @@ int main(int argc, char** argv) { // No price, no conversions, no preview: the donation page ships NO // executable script at all — stricter than the shop pages' one-script rule. srv.BodyLacks("/shop/donation", "<script>", "donation page ships no executable script"); - - srv.BodyHas("/shop/fp6-pmos", "src=\"/fp6-pmos.jpg\"", "product page embeds the photo"); - srv.BodyHas("/shop", "src=\"/fp6-pmos.jpg\"", "shop card embeds the thumbnail"); - // The image file itself is Caddy's to serve (static asset), so its - // presence is asserted against the repo, not this server. - Check(std::filesystem::exists("images/fp6-pmos.jpg"), "product photo exists in the repo"); - // 112 was verified against a live network on 2026-08-18, so the caveat - // that used to sit above the spec sheet is gone from the served page and - // must not creep back in. - srv.BodyLacks("/shop/fp6-pmos", "not yet verified", - "no unverified-emergency-calling caveat on the page"); srv.BodyLacks("/shop", "reservation", "no reservation copy survives on /shop"); - srv.BodyLacks("/shop/fp6-pmos", "Reserve one", "no reservation form survives"); +} - // The shop card: one euro number as the crawler/no-JS text, every - // supported currency pre-formatted server-side as a data attribute for - // the script to pick from. Converted amounts carry "~". GBP converts the - // ex-VAT price; SEK (an EU member's currency) converts the VAT-inclusive - // price. USD and CAD are absent on purpose — the shop refuses those - // destinations, so it does not quote a local price to them either. - srv.BodyHas("/shop", "class=\"price__single\"", "shop card renders the single-number price"); - srv.BodyHas("/shop", "data-gbp=\"~£", "shop card carries a GBP conversion"); - srv.BodyHas("/shop", "data-sek=\"~kr ", "shop card carries an SEK conversion"); - srv.BodyHas("/shop", "data-world=\"€474.21\"", "shop card carries the euro export fallback"); - srv.BodyLacks("/shop", "data-usd=", "no USD price for a country the shop refuses"); - srv.BodyLacks("/shop", "data-cad=", "no CAD price for a country the shop refuses"); - // The product page gets the same headline element, so a British visitor - // sees ~£ at the top there too, and the buy card states the customs - // position plainly. - srv.BodyHas("/shop/fp6-pmos", "data-gbp=\"~£", "product page headline carries the conversion"); - srv.BodyHas("/shop/fp6-pmos", "indicative only", - "buy card says converted prices are indicative"); - srv.BodyHas("/shop/fp6-pmos", "customs authority", - "buy card names whose problem import charges are"); - srv.BodyLacks("/shop/fp6-pmos", "collected on arrival", - "the vague customs phrasing is gone"); - // The label must not claim the Dutch rate is an EU-wide one. - srv.BodyLacks("/shop/fp6-pmos", "EU VAT", "price label does not call 21% an EU-wide rate"); +} // namespace + +int main(int argc, char** argv) { + TestServer srv(argv[1], 8216); + + if (const Product* pr = FirstPricedProduct()) { + PricedProduct(srv, *pr); + } else { + std::println("note: the catalogue lists no priced product; the goods checks " + "did not run and re-arm when one is listed"); + } + Donation(srv); return Finish(); } diff --git a/tests/ShouldServeRoutes/main.cpp b/tests/ShouldServeRoutes/main.cpp index e898ba0..2c5363d 100644 --- a/tests/ShouldServeRoutes/main.cpp +++ b/tests/ShouldServeRoutes/main.cpp @@ -11,21 +11,28 @@ No permission is granted to copy, modify, distribute, or create derivative works // backend exists: a client-side router cannot produce one. import std; +import Catcrafts.Shared; import Catcrafts.E2eHarness; +using namespace Catcrafts; using namespace Catcrafts::E2e; int main(int argc, char** argv) { TestServer srv(argv[1], 8210); // ── status codes ────────────────────────────────────────────────── - for (std::string_view p : { "/", "/about", "/shop", "/shop/fp6-pmos", - "/shop/fp6plus-pmos", "/shop/donation", "/projects", + for (std::string_view p : { "/", "/about", "/shop", "/shop/donation", "/projects", "/posts", "/demos", "/demos/raytracer", "/financials", "/legal/privacy", "/legal/terms", "/legal/imprint", "/feed.xml", "/sitemap.xml", "/api/healthz" }) { srv.CheckStatus(std::string(p), "200"); } + // Every catalogue entry has a page, whatever its status: a coming-soon or + // withdrawn listing stays up with its form closed, and only a slug the + // catalogue never held is a 404. + for (const Product& pr : Content::Products()) { + srv.CheckStatus("/shop/" + pr.slug, "200"); + } // Trailing slashes must normalise, not 404 or duplicate the canonical URL. srv.CheckStatus("/projects/", "200"); srv.CheckStatus("/shop/", "200"); @@ -72,9 +79,11 @@ int main(int argc, char** argv) { srv.HeaderHas("/sitemap.xml", "content-type", "application/xml", "sitemap content-type"); // ── sitemap and feed content ────────────────────────────────────── - srv.BodyHas("/sitemap.xml", "/shop/fp6-pmos", "sitemap lists the product"); - srv.BodyHas("/sitemap.xml", "/shop/fp6plus-pmos", - "sitemap lists the refresh — it comes off the catalogue, not a second list"); + // Product URLs come off the catalogue, not a second list, so every entry + // is advertised and nothing that is not listed can be. + for (const Product& pr : Content::Products()) { + srv.BodyHas("/sitemap.xml", "/shop/" + pr.slug, "sitemap lists " + pr.slug); + } srv.BodyHas("/sitemap.xml", "/about", "sitemap lists the about page"); srv.BodyHas("/sitemap.xml", "/legal/privacy", "sitemap lists the privacy page"); srv.BodyHas("/sitemap.xml", "/demos", "sitemap lists the demos page"); @@ -84,11 +93,13 @@ int main(int argc, char** argv) { srv.BodyHas("/feed.xml", "<feed xmlns=\"http://www.w3.org/2005/Atom\">", "feed is Atom"); // ── abuse ───────────────────────────────────────────────────────── - srv.CheckStatus("/shop/fp6-pmos", "413", "POST", + // The body guards run for any listed product before its form is read, so + // the donation item (the one entry every catalogue has) is the target. + srv.CheckStatus("/shop/donation", "413", "POST", "email=a%40b.example&name=" + std::string(20000, 'x') + "&street=x&postal=1&city=y&country=NL"); { - const auto json = srv.Post("/shop/fp6-pmos", "{}", "application/json"); + const auto json = srv.Post("/shop/donation", "{}", "application/json"); Check(json.status == "415", "POST with a JSON content-type -> 415", json.status); } srv.CheckStatus("/shop/nope", "404", "POST", diff --git a/tests/ShouldSettleBankTransfers/main.cpp b/tests/ShouldSettleBankTransfers/main.cpp index b19bc43..3cf8225 100644 --- a/tests/ShouldSettleBankTransfers/main.cpp +++ b/tests/ShouldSettleBankTransfers/main.cpp @@ -93,7 +93,7 @@ std::string TokenOf(const Crafter::HTTPResponse& res) { // Every order this suite places is a donation, for the same reason the donation // item exists in the other suites: it is purchasable in BOTH shop states, so -// this runs whether or not fp6-pmos has been opened, and it needs no shipping +// this runs whether or not any priced product is listed or open, and it needs no shipping // address or rate table. struct Order { std::string token; diff --git a/tests/ShouldShipContent/main.cpp b/tests/ShouldShipContent/main.cpp index bfe0c80..90461b2 100644 --- a/tests/ShouldShipContent/main.cpp +++ b/tests/ShouldShipContent/main.cpp @@ -26,263 +26,136 @@ void Check(bool ok, std::string_view what, std::string_view got = {}) { got.empty() ? "" : " got: ", got); } +// ── a priced product, built by hand ─────────────────────────────────── +// Since 2026-09-05 the catalogue lists the donation item alone: the goods that +// opened the shop were withdrawn. The renderer's contract for priced goods — +// the ProductGroup record, the merchant fields, the carrier-table filter, the +// spec lede, the preview blob — must not lapse while nothing exercises it, so +// this fixture stands in for the next listing. It carries every optional field +// a real one would: three colours at distinct prices (so from-price and default +// selection are decidable), a boxed weight that lands in the fixture ladders' +// cheap band, a brand for the spec lede, a photo path and a warranty text. The +// stickers are supplier + €60.50, the same rule a real listing follows. +Product Fixture() { + Product pr; + pr.slug = "fixture-handheld"; + pr.name = "Fixture Handheld"; + pr.brand = "Acme"; + pr.tagline = "A stand-in priced product for the renderer contract."; + pr.status = "coming-soon"; + pr.shipWeightGrams = 700; + pr.image = "/fixture-handheld.jpg"; + pr.summary = "Stands in for a priced listing."; + pr.warranty = "Two years from Catcrafts, worldwide, one counter: every claim goes to " + "Catcrafts, whatever turns out to be broken. The full terms are on the " + "terms page."; + pr.variants = { + { "green", "Forest Green", 51330 + 6050 }, + { "black", "Black", 51930 + 6050 }, + { "white", "White", 60488 + 6050 }, + }; + pr.specs = { + { "Display", "6.31″ OLED" }, + { "Memory", "8 GB RAM" }, + }; + pr.priceInclMinor = pr.CheapestVariant()->priceInclMinor; + return pr; +} + // ── the compiled-in catalogue ───────────────────────────────────────── +// What is asserted against the shipped data is the SHAPE every listing must +// have, over whatever is listed, plus the donation item's own contract. No +// slug, price or model is written here: a listing coming or going is a content +// change, not a test edit. void CatalogueContract() { using namespace Catcrafts::Money; const auto& products = Content::Products(); - // Three entries: the two phones, and the donation item that soft-opens - // the shop. The Gen. 6 stays FIRST — it is the headline, and the suites - // below address Products()[0] as the priced product — and the donation - // stays LAST. - Check(products.size() == 3, "content: three products"); - if (products.size() == 3) { - const Product& pr = products[0]; - Check(pr.slug == "fp6-pmos", "content: product slug"); - // Coming-soon is the pre-launch state; launch flips it to - // "available" and this check keeps passing either way. - Check(pr.Buyable() || pr.ComingSoon(), - "content: product is buyable or deliberately coming soon"); - Check(pr.variants.size() == 3, "content: three colours"); - // Cost-plus pricing, derived in code: supplier + €60.50 gross markup, - // exactly — the gross-up of the €50 Catcrafts keeps after VAT. The - // margin identity itself (net of retail = net of supplier + 5000) is - // asserted below; these pin the resulting stickers. - Check(pr.FindVariant("green") && pr.FindVariant("green")->priceInclMinor == 57380, - "content: green = 513.30 supplier + 60.50 gross markup"); - Check(pr.FindVariant("black") && pr.FindVariant("black")->priceInclMinor == 57980, - "content: black = 519.30 supplier + 60.50 gross markup"); - Check(pr.FindVariant("white") && pr.FindVariant("white")->priceInclMinor == 66538, - "content: white = 604.88 supplier + 60.50 gross markup"); - Check(pr.FindVariant("mauve") == nullptr, "content: unknown colour is null"); - Check(pr.priceInclMinor == 57380, "content: from-price is the cheapest variant"); - // The pricing rule as the user states it: after shipping (a pass- - // through) and VAT, every unit sold walks away with €50.00 — however - // the supplier moves. Checked against the COMPILED catalogue, per - // variant, in the same arithmetic the invoice and checkout use: - // net(retail) - net(supplier) must be exactly 5000 minor. Shipping - // has its own round-trip guarantee in ShouldComputeMoney, and - // Payment costs are the one accepted deviation, and on a bank - // transfer they are zero. - for (const auto& [slug, supplier] : - std::initializer_list<std::pair<std::string_view, std::int64_t>>{ - { "green", 51330 }, { "black", 51930 }, { "white", 60488 } }) { - const Variant* v = pr.FindVariant(slug); - Check(v && Money::NetFromGross(v->priceInclMinor) - - Money::NetFromGross(supplier) == 5000, - "content: variant nets the supplier price plus exactly €50", slug); + Check(!products.empty(), "content: the catalogue is not empty"); + + // The donation item: exactly one, LAST (it is the odd entry out, not what + // the shop is about), and available — it is what the shop is open FOR + // whatever the goods are doing. Buyer names the amount, so no price, no + // variants, no weight — and the Buyable() price check is waived for + // exactly this shape. + std::size_t donations = 0; + for (const Product& p : products) donations += p.donation ? 1 : 0; + Check(donations == 1, "content: exactly one donation item"); + const Product& don = products.back(); + Check(don.donation && don.slug == "donation", "content: the donation item comes last"); + Check(don.Buyable() && !don.ComingSoon(), "content: the donation item is on sale"); + Check(don.priceInclMinor == 0 && don.variants.empty() && don.shipWeightGrams == 0, + "content: a donation has no price, no colours and no parcel"); + Check(don.warranty.empty() && don.specs.empty(), + "content: a donation carries no spec sheet and no warranty"); + // Its page: a donation form (amount + optional email), no price line, no + // product JSON-LD — an offer with no amount is a claim shopping crawlers + // can only misread — and no goods sections. + { + const auto dp = Views::RenderProduct(don, Rates{}); + const std::string_view html = dp.main.View(); + Check(html.find("name=\"amount\"") != std::string_view::npos, + "donation page: the form asks for an amount"); + Check(html.find("name=\"street\"") == std::string_view::npos + && html.find("name=\"country\"") == std::string_view::npos, + "donation page: no address is asked for — nothing ships"); + Check(html.find("field__req") == std::string_view::npos + || html.find("Email <span") == std::string_view::npos, + "donation page: email is not marked required"); + Check(html.find("price--product") == std::string_view::npos, + "donation page: no price line for an unpriced item"); + Check(html.find("Specifications") == std::string_view::npos + && html.find("Warranty") == std::string_view::npos, + "donation page: no spec or warranty section renders"); + Check(dp.meta.jsonLd.empty(), + "donation page: no product JSON-LD is published"); + Check(!dp.meta.geoPriceHint, + "donation page: no price-hint script — nothing to convert"); + } + + // Every priced listing, whatever it is. These are the fields the checkout, + // the carrier lookup and the renderers dereference; a listing missing one + // is a content bug that must not sell. + for (const Product& pr : products) { + if (pr.donation) continue; + Check(ParseRoute("/shop/" + pr.slug).kind == RouteKind::Product, + "content: the slug is a URL", pr.slug); + Check(pr.Buyable() || pr.ComingSoon() || pr.status == "unavailable", + "content: status is available, coming-soon or unavailable", pr.slug); + Check(pr.priceInclMinor > 0, "content: a priced product has a price", pr.slug); + if (!pr.variants.empty()) { + // The from-price is the cheapest variant, derived so the two can + // never disagree, and no colour may be listed unpriced. + Check(pr.CheapestVariant() + && pr.CheapestVariant()->priceInclMinor == pr.priceInclMinor, + "content: from-price is the cheapest variant", pr.slug); + for (const Variant& v : pr.variants) { + Check(v.priceInclMinor > 0 && !v.slug.empty() && !v.label.empty(), + "content: every colour is priced and named", pr.slug + "/" + v.slug); + } } - Check(pr.CheapestVariant() && pr.CheapestVariant()->slug == "green", - "content: cheapest is green"); - // The boxed weight of one outgoing parcel. Not decoration: this - // single integer picks the carrier's weight bracket, so it decides - // the shipping cents added to every order AND the per-country - // quantity ceiling. Regressed to 0 or off by an order of magnitude, - // the shop quotes a rate the carrier does not honour on real parcels. - Check(pr.shipWeightGrams == 700, "content: one boxed unit weighs 700 g"); - { - // A ladder straddling that weight. 700 g fits both bands, and - // RateFor takes the CHEAPEST band that can carry it — 895, not - // the tighter-looking 5500 — while the ceiling comes off the - // heaviest band: 10000 / 700 = 14 units to a parcel. - const std::vector<ShipBracket> ladder{ { 2000, 895 }, { 10000, 5500 } }; - Check(RateFor(ladder, pr.shipWeightGrams) == 895, - "content: the shipped weight lands in the cheap carrier bracket"); - Check(MaxUnitsFor(ladder, pr.shipWeightGrams) == 14, - "content: and caps one parcel at fourteen units"); - } - // This used to assert the emergency-calling caveat was present. It - // came off on 2026-08-18, when imsd called 112 over a live network in - // an approved test session, so the assertion inverts: the page must - // not go back to telling buyers that path is unverified. A future - // safety claim may fill this field again — it just cannot be that one. - Check(pr.safetyNote.find("not yet verified") == std::string::npos, - "content: no stale unverified-emergency-calling caveat"); + // The boxed weight of one outgoing parcel. Not decoration: this single + // integer picks the carrier's weight bracket, so it decides the + // shipping cents added to every order AND the per-country quantity + // ceiling. Zero would quote a rate the carrier does not honour. + Check(pr.shipWeightGrams > 0, "content: one boxed unit has a weight", pr.slug); Check(pr.warranty.find("TODO") == std::string::npos && pr.warranty.size() > 100, - "content: warranty is written, not a placeholder"); - // The product page's schema.org record must parse with our own - // JSON parser and carry one variant Product per colour, each - // with its ONE offer — built from the same integers the - // checkout charges. - { - // The listing's shipping block is now carrier data, so the - // render needs a table. Three of these four are priced on purpose - // and must still not be advertised: US is refused on insurance, DE - // and GB on their missing producer registrations. The carrier will - // happily quote all three, which is exactly why the filter is worth - // asserting — CH is the only one here besides home that sells. - const std::vector<ShipRates> feedTable{ - { "NL", { { 2000, 895 } } }, - { "CH", { { 2000, 2450 } } }, - { "DE", { { 2000, 995 } } }, - { "GB", { { 2000, 3300 } } }, - { "US", { { 2000, 1794 } } }, - }; - auto pp = Views::RenderProduct(pr, Rates{}, feedTable); - auto ld = Json::Parse(pp.meta.jsonLd); - bool variantsOk = false; - if (ld && ld->IsObject()) { - if (const Json::Value* v = ld->Find("hasVariant"); - v && v->IsArray() && v->array.size() == pr.variants.size()) { - variantsOk = true; - for (const Json::Value& node : v->array) { - const Json::Value* o = node.Find("offers"); - variantsOk = variantsOk && node.Str("@type") == "Product" - && o && o->IsObject(); - } - } - } - Check(ld && ld->IsObject() && ld->Str("@type") == "ProductGroup" && variantsOk, - "schema: product JSON-LD parses, one variant per colour"); - // Merchant-grade fields: shipping, returns, sku, group id — - // what Merchant Center's website-crawl feed reads at launch - // (productGroupID is its item_group_id). - Check(pp.meta.jsonLd.find("OfferShippingDetails") != std::string::npos - && pp.meta.jsonLd.find("MerchantReturnPolicy") != std::string::npos - && pp.meta.jsonLd.find("\"sku\"") != std::string::npos - && pp.meta.jsonLd.find("\"productGroupID\"") != std::string::npos, - "schema: variants carry shipping, returns, sku and group id"); - // The published rates ARE the carrier's, at one unit's weight. - Check(pp.meta.jsonLd.find("\"8.95\"") != std::string::npos - && pp.meta.jsonLd.find("\"24.50\"") != std::string::npos, - "schema: shipping rates come from the carrier table"); - // And nothing the shop refuses is advertised, whatever the carrier - // quotes for it — by rate, so a filter that dropped the country code - // but kept the price would still be caught. - Check(pp.meta.jsonLd.find("\"9.95\"") == std::string::npos - && pp.meta.jsonLd.find("\"33.00\"") == std::string::npos - && pp.meta.jsonLd.find("\"17.94\"") == std::string::npos, - "schema: refused destinations are never advertised"); - Check(pp.meta.jsonLd.find("\"17.94\"") == std::string::npos - && pp.meta.jsonLd.find("\"US\"") == std::string::npos, - "schema: a refused destination is never advertised, priced or not"); - - // No table: no shipping claim. The listing loses the merchant - // block rather than inventing a rate — the whole point of - // dropping the zone fallback. - auto bare = Views::RenderProduct(pr, Rates{}); - Check(bare.meta.jsonLd.find("OfferShippingDetails") == std::string::npos - && bare.meta.jsonLd.find("MerchantReturnPolicy") == std::string::npos, - "schema: with no carrier table the offer publishes no shipping"); - Check(Json::Parse(bare.meta.jsonLd).has_value() - && bare.meta.jsonLd.find("\"productGroupID\"") != std::string::npos, - "schema: and the rest of the record still parses"); - } - - // The Gen. 6+: the same contract as the phone above, asserted against - // its own numbers. That the two SHARE the pricing rule is the point — - // a second device must not quietly become a second pricing policy. - const Product& plus = products[1]; - Check(plus.slug == "fp6plus-pmos", "content: the refresh is the second listing"); - Check(plus.brand == "Fairphone", "content: the refresh names its manufacturer"); - Check(plus.Buyable() || plus.ComingSoon(), - "content: the refresh is buyable or deliberately coming soon"); - Check(plus.variants.size() == 3, "content: three colours on the refresh"); - // Launch price in every colour, so all three stickers are €709.50 — - // and each still nets exactly €50 after VAT, by the same arithmetic - // the invoice and the checkout use. - for (std::string_view slug : { "green", "black", "blue" }) { - const Variant* v = plus.FindVariant(slug); - Check(v && v->priceInclMinor == 70950, - "content: refresh colour = 649.00 supplier + 60.50 gross markup", slug); - Check(v && Money::NetFromGross(v->priceInclMinor) - - Money::NetFromGross(64900) == 5000, - "content: refresh colour nets the supplier price plus exactly €50", slug); - } - Check(plus.FindVariant("white") == nullptr, - "content: a colour this model doesn't ship in is null"); - Check(plus.CheapestVariant() - && plus.priceInclMinor == plus.CheapestVariant()->priceInclMinor, - "content: refresh from-price is the cheapest variant"); - // Same box, same 193 g device, so the same bracket and the same - // per-parcel ceiling the phone above is checked against. - Check(plus.shipWeightGrams == 700, - "content: the refresh leaves in the same 700 g parcel"); - // One warranty text for both phones, not two that can drift — the - // reason it is a shared constant rather than a second paste. - Check(plus.warranty == pr.warranty, - "content: both phones carry the identical warranty text"); - Check(plus.specs.size() == pr.specs.size(), - "content: the refresh states every spec row the Gen. 6 does"); - // The refresh IS the faster silicon — if these two rows ever match the - // Gen. 6's, the listing is selling the wrong phone. - { - bool soc = false, ram = false; - for (const Spec& s : plus.specs) { - soc = soc || (s.label == "Processor" && s.value.find("7s Gen 4") != std::string::npos); - ram = ram || (s.label == "Memory" && s.value.find("12 GB") != std::string::npos); - } - Check(soc && ram, "content: the refresh lists its own SoC and 12 GB of RAM"); - } - // Its own photo, not the Gen. 6's — the two phones ship in different - // colours, so sharing one render would picture a phone this listing - // cannot sell. Published, not merely committed: a file that the page, - // the link preview and the schema record all omit is a photo nobody - // ever sees, which is the failure the checks below actually catch. - Check(plus.image == "/fp6plus-pmos.jpg", "content: the refresh names its own photo"); - Check(plus.image != pr.image, "content: and not the Gen. 6's"); - // The pictured colour is the pre-selected one. With a single price - // across the range that is purely a question of list order, so it is - // worth pinning: a reorder would leave the page showing blue and - // selling green by default. - Check(plus.CheapestVariant() && plus.CheapestVariant()->slug == "blue", - "content: the default colour is the one the photo shows"); - { - const auto pp = Views::RenderProduct(plus, Rates{}); - // The spec lede is generated from the brand, so it must introduce - // THIS sheet — the old markup hardcoded "Fairphone (Gen. 6)" and - // would now caption the refresh's specs with the other phone's name. - Check(pp.main.View().find("a stock Fairphone, unmodified") != std::string_view::npos, - "refresh page: the spec lede names the brand, not a model"); - Check(pp.main.View().find("stock Fairphone (Gen. 6)") == std::string_view::npos, - "refresh page: and does not caption these specs as the Gen. 6's"); - Check(pp.main.View().find("product__photo") != std::string_view::npos, - "refresh page: the photo renders"); - Check(pp.meta.ogImage == "/fp6plus-pmos.jpg", - "refresh page: the link preview names its own photo"); - Check(pp.meta.jsonLd.find("\"image\":\"https://catcrafts.net/fp6plus-pmos.jpg\"") - != std::string::npos, - "refresh page: and the schema record carries it absolute"); - } - - // The donation item: the shop's soft opening. Available (it is what - // the shop is open FOR) while both phones stay coming-soon; buyer - // names the amount, so no price, no variants, no weight — and the - // Buyable() price check is waived for exactly this shape. - const Product& don = products[2]; - Check(don.slug == "donation" && don.donation, - "content: the donation item comes last"); - Check(don.Buyable() && !don.ComingSoon(), - "content: the donation item is on sale while the phones are not"); - Check(don.priceInclMinor == 0 && don.variants.empty() - && don.shipWeightGrams == 0, - "content: a donation has no price, no colours and no parcel"); - Check(don.warranty.empty() && don.specs.empty(), - "content: a donation carries no spec sheet and no warranty"); - // Its page: a donation form (amount + optional email), no price line, - // no product JSON-LD — an offer with no amount is a claim shopping - // crawlers can only misread — and no Fairphone sections. - { - const auto dp = Views::RenderProduct(don, Rates{}); - const std::string_view html = dp.main.View(); - Check(html.find("name=\"amount\"") != std::string_view::npos, - "donation page: the form asks for an amount"); - Check(html.find("name=\"street\"") == std::string_view::npos - && html.find("name=\"country\"") == std::string_view::npos, - "donation page: no address is asked for — nothing ships"); - Check(html.find("field__req") == std::string_view::npos - || html.find("Email <span") == std::string_view::npos, - "donation page: email is not marked required"); - Check(html.find("price--product") == std::string_view::npos, - "donation page: no price line for an unpriced item"); - Check(html.find("Specifications") == std::string_view::npos - && html.find("Warranty") == std::string_view::npos, - "donation page: no spec or warranty section renders"); - Check(dp.meta.jsonLd.empty(), - "donation page: no product JSON-LD is published"); - Check(!dp.meta.geoPriceHint, - "donation page: no price-hint script — nothing to convert"); + "content: warranty is written, not a placeholder", pr.slug); + Check(pr.safetyNote.find("not yet verified") == std::string::npos, + "content: no stale unverified-emergency-calling caveat", pr.slug); + // Published, not merely committed: the photo the page, the link preview + // and the schema record name has to exist in the tree, or nobody sees it. + if (!pr.image.empty()) { + Check(std::filesystem::exists("images" + pr.image), + "content: the photo exists in the repo", pr.image); } + // Its record parses with our own JSON parser and is sold by the + // registered organisation — the join the identity graph depends on. + const auto pp = Views::RenderProduct(pr, Rates{}); + Check(Json::Parse(pp.meta.jsonLd).has_value(), + "content: the product record parses", pr.slug); + Check(pp.meta.jsonLd.find("https://catcrafts.net/#organization") != std::string::npos, + "content: the offer is sold by the organization node", pr.slug); } // The spec lede is "a stock <brand>, unmodified", so a spec sheet with no // brand renders a sentence with a hole in it. Cheaper to assert than to @@ -301,6 +174,134 @@ void CatalogueContract() { Check(!Content::Demos().empty(), "content: demos present"); } +// ── the product page, against the fixture ───────────────────────────── +// The renderer's contract for a priced listing, pinned on the hand-built +// product above so it holds while the catalogue lists none. +void RendererContract() { + using namespace Catcrafts::Money; + const Product pr = Fixture(); + + Check(pr.FindVariant("mauve") == nullptr, "fixture: unknown colour is null"); + Check(pr.CheapestVariant() && pr.CheapestVariant()->slug == "green", + "fixture: cheapest is green"); + // The pricing rule as the user states it: after shipping (a pass-through) + // and VAT, every unit sold walks away with €50.00 — however the supplier + // moves. net(retail) - net(supplier) must be exactly 5000 minor, in the + // same arithmetic the invoice and checkout use. + for (const auto& [slug, supplier] : + std::initializer_list<std::pair<std::string_view, std::int64_t>>{ + { "green", 51330 }, { "black", 51930 }, { "white", 60488 } }) { + const Variant* v = pr.FindVariant(slug); + Check(v && NetFromGross(v->priceInclMinor) - NetFromGross(supplier) == 5000, + "fixture: variant nets the supplier price plus exactly €50", slug); + } + { + // A ladder straddling the boxed weight. 700 g fits both bands, and + // RateFor takes the CHEAPEST band that can carry it — 895, not the + // tighter-looking 5500 — while the ceiling comes off the heaviest band: + // 10000 / 700 = 14 units to a parcel. + const std::vector<ShipBracket> ladder{ { 2000, 895 }, { 10000, 5500 } }; + Check(RateFor(ladder, pr.shipWeightGrams) == 895, + "fixture: the shipped weight lands in the cheap carrier bracket"); + Check(MaxUnitsFor(ladder, pr.shipWeightGrams) == 14, + "fixture: and caps one parcel at fourteen units"); + } + + // The product page's schema.org record must parse with our own JSON parser + // and carry one variant Product per colour, each with its ONE offer — built + // from the same integers the checkout charges. + { + // The listing's shipping block is carrier data, so the render needs a + // table. Three of these four are priced on purpose and must still not + // be advertised: US is refused by policy, DE and GB on their missing + // producer registrations. The carrier will happily quote all three, + // which is exactly why the filter is worth asserting — CH is the only + // one here besides home that sells. + const std::vector<ShipRates> feedTable{ + { "NL", { { 2000, 895 } } }, + { "CH", { { 2000, 2450 } } }, + { "DE", { { 2000, 995 } } }, + { "GB", { { 2000, 3300 } } }, + { "US", { { 2000, 1794 } } }, + }; + auto pp = Views::RenderProduct(pr, Rates{}, feedTable); + auto ld = Json::Parse(pp.meta.jsonLd); + bool variantsOk = false; + if (ld && ld->IsObject()) { + if (const Json::Value* v = ld->Find("hasVariant"); + v && v->IsArray() && v->array.size() == pr.variants.size()) { + variantsOk = true; + for (const Json::Value& node : v->array) { + const Json::Value* o = node.Find("offers"); + variantsOk = variantsOk && node.Str("@type") == "Product" + && o && o->IsObject(); + } + } + } + Check(ld && ld->IsObject() && ld->Str("@type") == "ProductGroup" && variantsOk, + "schema: product JSON-LD parses, one variant per colour"); + Check(pp.meta.jsonLd.find("\"brand\":{\"@type\":\"Brand\",\"name\":\"Acme\"}") + != std::string::npos, + "schema: the group carries the hardware brand"); + // Merchant-grade fields: shipping, returns, sku, group id — what + // Merchant Center's website-crawl feed reads (productGroupID is its + // item_group_id). + Check(pp.meta.jsonLd.find("OfferShippingDetails") != std::string::npos + && pp.meta.jsonLd.find("MerchantReturnPolicy") != std::string::npos + && pp.meta.jsonLd.find("\"sku\":\"fixture-handheld-green\"") != std::string::npos + && pp.meta.jsonLd.find("\"productGroupID\"") != std::string::npos, + "schema: variants carry shipping, returns, sku and group id"); + // The published rates ARE the carrier's, at one unit's weight. + Check(pp.meta.jsonLd.find("\"8.95\"") != std::string::npos + && pp.meta.jsonLd.find("\"24.50\"") != std::string::npos, + "schema: shipping rates come from the carrier table"); + // And nothing the shop refuses is advertised, whatever the carrier + // quotes for it — by rate, so a filter that dropped the country code + // but kept the price would still be caught. + Check(pp.meta.jsonLd.find("\"9.95\"") == std::string::npos + && pp.meta.jsonLd.find("\"33.00\"") == std::string::npos + && pp.meta.jsonLd.find("\"17.94\"") == std::string::npos, + "schema: refused destinations are never advertised"); + Check(pp.meta.jsonLd.find("\"US\"") == std::string::npos, + "schema: a refused destination is never advertised, priced or not"); + Check(pp.meta.jsonLd.find("https://catcrafts.net/#organization") != std::string::npos, + "schema: offers are sold by the organization node"); + // The photo travels three ways: the page, the link preview, the record. + Check(pp.main.View().find("product__photo") != std::string_view::npos, + "product page: the photo renders"); + Check(pp.meta.ogImage == pr.image, "product page: the link preview names the photo"); + Check(pp.meta.jsonLd.find("\"image\":\"https://catcrafts.net/fixture-handheld.jpg\"") + != std::string::npos, + "product page: and the schema record carries it absolute"); + // The spec lede is generated from the brand, so it introduces THIS + // sheet — and claims nothing about any particular model or software. + Check(pp.main.View().find("a stock Acme, unmodified") != std::string_view::npos, + "product page: the spec lede names the brand, not a model"); + Check(pp.main.View().find("postmarketOS") == std::string_view::npos, + "product page: the renderer names no software of its own"); + Check(pp.main.View().find("<h2 class=\"section__title\">Warranty</h2>") + != std::string_view::npos, + "product page: the warranty section renders where a text exists"); + + // No table: no shipping claim. The listing loses the merchant block + // rather than inventing a rate — the whole point of dropping the zone + // fallback. + auto bare = Views::RenderProduct(pr, Rates{}); + Check(bare.meta.jsonLd.find("OfferShippingDetails") == std::string::npos + && bare.meta.jsonLd.find("MerchantReturnPolicy") == std::string::npos, + "schema: with no carrier table the offer publishes no shipping"); + Check(Json::Parse(bare.meta.jsonLd).has_value() + && bare.meta.jsonLd.find("\"productGroupID\"") != std::string::npos, + "schema: and the rest of the record still parses"); + // Coming-soon publishes the price and closes the form. + Check(bare.meta.jsonLd.find("schema.org/PreOrder") != std::string::npos, + "schema: coming-soon maps to PreOrder availability"); + Check(bare.main.View().find("<form") == std::string_view::npos + && bare.main.View().find("Coming soon") != std::string_view::npos, + "product page: coming-soon renders the notice and no order form"); + } +} + // ── the identity graph ──────────────────────────────────────────────── // "Catcrafts" is two common words with no space, so it competes with a // decade of kids' craft blogs, Etsy and a Minecraft server on the @@ -366,8 +367,11 @@ void IdentityGraph() { auto about = Views::RenderAbout(Content::AboutPage()); Check(about.meta.jsonLd.find(kOrgId) != std::string::npos, "schema: about joins the founder to the organization node"); - if (!Content::Products().empty()) { - auto pp = Views::RenderProduct(Content::Products()[0], Rates{}); + { + // The offer side of the join, on the fixture: the catalogue may list + // no priced product (the donation publishes no offer at all), and the + // join must hold for the next one regardless. + auto pp = Views::RenderProduct(Fixture(), Rates{}); Check(pp.meta.jsonLd.find(kOrgId) != std::string::npos, "schema: offers are sold by the organization node"); } @@ -382,9 +386,9 @@ void IdentityGraph() { } // ── the sale gates, built by hand ───────────────────────────────────── -// The shipped catalogue is one product in one status with three colours, so -// asserting against it can only ever exercise one arm of each guard. These -// products exist to reach the others. +// The shipped catalogue holds each status at most once (today: the donation +// alone), so asserting against it can only ever exercise one arm of each +// guard. These products exist to reach the others. // // Buyable() is the ONLY server-side gate on POST /checkout, and it is a // conjunction: status AND a price. ComingSoon() is separately what decides @@ -454,16 +458,15 @@ void SaleGates() { } // ── the product page's live-total blob ──────────────────────────────── -// RenderCheckoutForm renders only for a Buyable product, and the shipped -// catalogue is coming-soon, so today nothing renders it: the two suites that -// read this attribute both sit behind a ShopOpen() gate. Flip a copy to -// "available" and read the markup here instead — the refusal lists in that -// blob are what make the on-page total decline in exactly the places +// RenderCheckoutForm renders only for a Buyable priced product, and the +// shipped catalogue lists none, so nothing in it renders the form: the suites +// that read this attribute over HTTP sit behind a ShopOpen() gate. Flip the +// fixture to "available" and read the markup here instead — the refusal lists +// in that blob are what make the on-page total decline in exactly the places // checkout declines, and a page that quotes a total for a sanctioned or // no-sale destination invites an order that must then be refused. void CheckoutPreviewData() { - if (Content::Products().empty()) return; - Product pr = Content::Products()[0]; + Product pr = Fixture(); pr.status = "available"; Check(pr.Buyable(), "checkout: the flipped copy is buyable, so the form renders"); @@ -583,6 +586,7 @@ void AdvertisedUrls() { int main() { CatalogueContract(); + RendererContract(); IdentityGraph(); SaleGates(); CheckoutPreviewData(); diff --git a/tests/ShouldStayScriptFree/main.cpp b/tests/ShouldStayScriptFree/main.cpp index 9f1a48e..2c21b81 100644 --- a/tests/ShouldStayScriptFree/main.cpp +++ b/tests/ShouldStayScriptFree/main.cpp @@ -12,8 +12,10 @@ No permission is granted to copy, modify, distribute, or create derivative works // (the timezone price hint); everything else ships none at all. import std; +import Catcrafts.Shared; import Catcrafts.E2eHarness; +using namespace Catcrafts; using namespace Catcrafts::E2e; namespace { @@ -53,10 +55,14 @@ int main(int argc, char** argv) { // Placeholders are dev-only markers; one reaching production is a content // bug (an imprint that says PLACEHOLDER once shipped exactly that way). for (std::string_view pg : { "/legal/privacy", "/legal/terms", "/legal/imprint", - "/shop/fp6-pmos", "/shop/fp6plus-pmos", "/financials" }) { + "/financials" }) { srv.BodyLacks(std::string(pg), "PLACEHOLDER", std::format("{} ships no placeholder markers", pg)); } + for (const Product& pr : Content::Products()) { + srv.BodyLacks("/shop/" + pr.slug, "PLACEHOLDER", + std::format("/shop/{} ships no placeholder markers", pr.slug)); + } // Shop pages are the one exception to script-free: they carry exactly ONE // EXECUTABLE inline script — the timezone price hint, whose tag is the @@ -65,8 +71,15 @@ int main(int argc, char** argv) { // rule. Pin the shape hard: inline only (no src=, so nothing external can // ever ride in under this exception), no network APIs, and the page must // remain complete without it — both prices in the markup regardless. - for (std::string_view pg : { "/shop", "/shop/fp6-pmos", "/shop/fp6plus-pmos" }) { - const std::string body = srv.Body(std::string(pg)); + // The pages under the rule: the shop index and every PRICED product page. + // The donation page has no price to convert and ships no script at all + // (ShouldSellTheShopFront pins that), so it is not in this list. + std::vector<std::string> pricedPages{ "/shop" }; + for (const Product& pr : Content::Products()) { + if (!pr.donation) pricedPages.push_back("/shop/" + pr.slug); + } + for (const std::string& pg : pricedPages) { + const std::string body = srv.Body(pg); const std::size_t n = CountOccurrences(body, "<script>"); Check(n == 1, std::format("{} carries exactly one executable script (the price hint)", pg), @@ -87,8 +100,10 @@ int main(int argc, char** argv) { } Check(!network, std::format("{} script makes no network calls", pg)); } - srv.BodyHas("/shop/fp6-pmos", "cc-noneu", "price hint tags the non-EU outcome"); - srv.BodyHas("/shop/fp6-pmos", "cc-eu", "price hint tags the confirmed-EU outcome too"); + if (const Product* pr = FirstPricedProduct()) { + srv.BodyHas("/shop/" + pr->slug, "cc-noneu", "price hint tags the non-EU outcome"); + srv.BodyHas("/shop/" + pr->slug, "cc-eu", "price hint tags the confirmed-EU outcome too"); + } // The renderer loads only where a demo entry declares needsWasm — the // demo LIST is a content page and must stay free of it. @@ -127,7 +142,7 @@ int main(int argc, char** argv) { // it is dead weight and one more thing that could retarget a future // relative link. srv.BodyLacks("/posts", "<base", "/posts has no base tag"); - srv.BodyLacks("/shop/fp6-pmos", "<base", "/shop/<slug> has no base tag"); + srv.BodyLacks("/shop/donation", "<base", "/shop/<slug> has no base tag"); // ── home page actions ───────────────────────────────────────────── srv.BodyHas("/", "Browse projects", "home links to projects"); diff --git a/tests/harness/Catcrafts.E2eHarness.cppm b/tests/harness/Catcrafts.E2eHarness.cppm index b5b6d03..9f897c1 100644 --- a/tests/harness/Catcrafts.E2eHarness.cppm +++ b/tests/harness/Catcrafts.E2eHarness.cppm @@ -28,6 +28,10 @@ module; export module Catcrafts.E2eHarness; import std; import Crafter.Network; +// For the compiled-in catalogue: the suites address whatever priced product it +// lists rather than a slug written into them, so a listing coming or going is +// a content change and not a test edit. +import Catcrafts.Shared; namespace fs = std::filesystem; @@ -62,6 +66,18 @@ inline std::string ReadFile(const fs::path& p) { return buf.str(); } +// The priced product the goods suites run against: the first non-donation +// entry of the compiled catalogue, or nullptr while it lists none — the state +// since 2026-09-05, when the two handsets were withdrawn. A suite with goods +// checks prints a note and skips them in that case; the donation item keeps +// the shared order lifecycle covered regardless. +inline const Catcrafts::Product* FirstPricedProduct() { + for (const Catcrafts::Product& p : Catcrafts::Content::Products()) { + if (!p.donation) return &p; + } + return nullptr; +} + inline std::size_t CountOccurrences(std::string_view haystack, std::string_view needle) { if (needle.empty()) return 0; std::size_t n = 0; @@ -302,9 +318,12 @@ public: return Body(path); } - // Open shop or coming-soon? The pricing blob (data-cc) exists only on the - // real order form, so its presence is the probe. - bool ShopOpen() { return Body("/shop/fp6-pmos").find("data-cc=") != std::string::npos; } + // Open shop or coming-soon, for one priced product? The pricing blob + // (data-cc) exists only on the real order form, so its presence is the + // probe. + bool ShopOpen(std::string_view slug) { + return Body("/shop/" + std::string(slug)).find("data-cc=") != std::string::npos; + } private: void Spawn(const std::vector<std::string>& argv) { diff --git a/tools/dev.sh b/tools/dev.sh index c7e6314..e057ae0 100755 --- a/tools/dev.sh +++ b/tools/dev.sh @@ -203,13 +203,14 @@ elif [ "${DEV_FINANCIALS:-0}" = 1 ]; then {"label":"SAMPLE inventory","total_minor":300000}, {"label":"SAMPLE payment fees","total_minor":5000}]} JSON - # Two paid orders, written straight to the ledger: the product is - # coming-soon, so checkout refuses and there is no other way to make the - # sales row non-zero. Same event shapes Orders.cpp appends. + # Two paid orders, written straight to the ledger: the catalogue lists no + # priced goods, so checkout cannot make the sales row non-zero and this is + # the only way to fill it. Same event shapes Orders.cpp appends; the slug + # names nothing in the catalogue, so the order page shows it verbatim. cat > "$WORK/orders.jsonl" <<'JSON' -{"type":"order","at":"2026-08-10T10:00:00Z","id":"1111111111111111aaaaaaaaaaaaaaaa","ref":"CC-111111","product":"fp6-pmos","color":"green","quantity":1,"unit_minor":56330,"email":"sample@example.org","name":"Sample Buyer","street":"1 Example St","postal":"1000AA","city":"Amsterdam","country":"NL","goods_minor":56330,"shipping_minor":713,"total_minor":57043,"vat_included":true,"status":"awaiting_payment","pay_choice":"bank","pay_url":"","pay_id":"dev-1"} +{"type":"order","at":"2026-08-10T10:00:00Z","id":"1111111111111111aaaaaaaaaaaaaaaa","ref":"CC-111111","product":"sample-goods","color":"green","quantity":1,"unit_minor":56330,"email":"sample@example.org","name":"Sample Buyer","street":"1 Example St","postal":"1000AA","city":"Amsterdam","country":"NL","goods_minor":56330,"shipping_minor":713,"total_minor":57043,"vat_included":true,"status":"awaiting_payment","pay_choice":"bank","pay_url":"","pay_id":"dev-1"} {"type":"status","at":"2026-08-10T10:04:00Z","id":"1111111111111111aaaaaaaaaaaaaaaa","status":"paid","via":"ideal"} -{"type":"order","at":"2026-08-12T14:30:00Z","id":"2222222222222222bbbbbbbbbbbbbbbb","ref":"CC-222222","product":"fp6-pmos","color":"white","quantity":1,"unit_minor":65488,"email":"other@example.org","name":"Other Buyer","street":"2 Example Rd","postal":"3000BB","city":"Rotterdam","country":"DE","goods_minor":65488,"shipping_minor":2500,"total_minor":67988,"vat_included":true,"status":"awaiting_payment","pay_choice":"crypto","pay_url":"","pay_id":"dev-2"} +{"type":"order","at":"2026-08-12T14:30:00Z","id":"2222222222222222bbbbbbbbbbbbbbbb","ref":"CC-222222","product":"sample-goods","color":"white","quantity":1,"unit_minor":65488,"email":"other@example.org","name":"Other Buyer","street":"2 Example Rd","postal":"3000BB","city":"Rotterdam","country":"DE","goods_minor":65488,"shipping_minor":2500,"total_minor":67988,"vat_included":true,"status":"awaiting_payment","pay_choice":"crypto","pay_url":"","pay_id":"dev-2"} {"type":"status","at":"2026-08-12T14:33:00Z","id":"2222222222222222bbbbbbbbbbbbbbbb","status":"paid","via":"bitcoin"} JSON echo "dev: seeded SAMPLE financials (DEV_FINANCIALS=1) — figures are invented" @@ -241,7 +242,7 @@ cat <<EOF / home /shop product list - /shop/<slug> fp6-pmos, fp6plus-pmos, donation (fake payment rail) + /shop/<slug> donation (fake payment rail) /projects the Crafter suite /posts fediverse posts /demos demo list; /demos/raytracer loads the wasm

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 QSc=8Y631 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⁡_fkf7h-HqYR~Xe-SpG~RK}kQR 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 diff --git a/images/fp6plus-pmos.jpg b/images/fp6plus-pmos.jpg deleted file mode 100644 index 26dffe1545ec3582d442f53b9381b26462bd91e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128346 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ξ^13ClWd+*5n%4-hQ6!gP%zlxx~1~@nzeKdoCGE{ zK5X`YTRlpJ?zMdZ7|LQ}S_F=e3Gd2kDsvZ9#rQ}lNt-GYh|#+tXGpEPooUG%{T%h5 zSY>apA=hIR&U1>H7N_uC_qEbYVWvw?oNQP!C>2E=>&e$3fjU@6j$86f_jyj7G#p{% zoa)~&f05(=3+n8HhJNH!5S5}nRu$ydI>vOMU37`@L|Ro>p$N2k;iZC(JYtf-!EVKn zLK?xSnQsI~;9E9!Mc{Q2f#1r6E-Zd+5gyqM?P;$o$+H$CtSmpo=m*Ju2lN&6m)~5e zQO_l{m3eb}!(?Z+9Ig3(HEyV4;bN*UbF{kzzQ;asd)2kz@JDtAX3Z^%lG*-)8{)YL zC73PYwIps2I5RyOdYF-B-Y$;cpF@jiIOel@j_-zY0|XO@cw@N44(AhA7}uzT!>Xnm z&AZt2!_iV}8PdwSdnbg=8V8Puh&*m=y!{NDYLBQ0phfFBQDbYH2NXY5CDM**G71h5 zp0!Nu77o+qPclQ1P2BbnZHq%irv=h!5W)U2WwR{hPTH9?zEZyx#Y`o`0lrjC^VN%# z9-UiHYP51s(G+Bg^AXwg=LBsPv_IkF`c>{UgRGWcvgJf7|Wu+-pcsx(w+rqXHVdz!6z!ZE|)0C5^I&S2I5?d&Ruu;5}- zXh^mt!l}~hYZ9O0Mt?0Yj;ys9m6X9ONa?2-xQdB{#Ky(=c^nQ9ZpHcZ*%olp zHw!hF{U`gg4HBjr=(Q (I30-3~JgeF?%Y!opa)Ac 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