From db55996a0802286f7f627ae9595d98df3a6a3572 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Wed, 14 Oct 2026 00:44:47 +0200 Subject: [PATCH] test(18): persist human verification items as UAT --- .planning/phases/18-payment-gateway/18-UAT.md | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .planning/phases/18-payment-gateway/18-UAT.md diff --git a/.planning/phases/18-payment-gateway/18-UAT.md b/.planning/phases/18-payment-gateway/18-UAT.md new file mode 100644 index 0000000..4fc0b7d --- /dev/null +++ b/.planning/phases/18-payment-gateway/18-UAT.md @@ -0,0 +1,60 @@ +--- +status: testing +phase: 18-payment-gateway +source: [18-VERIFICATION.md] +started: 2026-10-13T22:44:44.227Z +updated: 2026-10-13T22:44:44.227Z +--- + +## Current Test + +number: 1 +name: Live Stripe test mode, declined card then a successful retry. On an instance with both plugins mounted, test keys and the test signing secret stored on the pgstripe settings page, and the webhook endpoint reachable (public URL or `stripe listen --forward-to`): (a) Checkout mode: start a payment, pay with 4000 0000 0000 0002, then on the same Checkout page with 4242 4242 4242 4242; (b) PaymentIntent mode: the same two cards through the card form with the same client secret +expected: | + After the decline: the payment stays Sent, the order AwaitingPayment, no rejected mail, one Warn line 'payment attempt failed' with code and decline_code and no decline text. After the retry: payment Accepted, order Paid, one OrderPaid and one paid mail. No 'refuses Accept' Error line +awaiting: user response + +## Tests + +### 1. Live Stripe test mode, declined card then a successful retry. On an instance with both plugins mounted, test keys and the test signing secret stored on the pgstripe settings page, and the webhook endpoint reachable (public URL or `stripe listen --forward-to`): (a) Checkout mode: start a payment, pay with 4000 0000 0000 0002, then on the same Checkout page with 4242 4242 4242 4242; (b) PaymentIntent mode: the same two cards through the card form with the same client secret +expected: After the decline: the payment stays Sent, the order AwaitingPayment, no rejected mail, one Warn line 'payment attempt failed' with code and decline_code and no decline text. After the retry: payment Accepted, order Paid, one OrderPaid and one paid mail. No 'refuses Accept' Error line +result: [pending] + +### 2. Read the README of sm-pgstripe-plugin: the Webhook events list, the paragraph on a paid signal that cannot be accepted, and step 2 of Stripe Dashboard (18-08 coverage item D6, human_judgment true) +expected: The text matches the behaviour and is clear for an operator. Known inaccuracies to accept or have fixed: 'one Error log line' is one line per signal (A-IN-10); the settings page comment (lang webhook_comment, en and pl) still lists three events and omits checkout.session.async_payment_failed, the only event that rejects (A-IN-15) +result: [pending] + +### 3. Mail wording: send each of the 27 templates (PL unsuffixed, EN -en) through the memory or log driver, or read views/mail/**.htm in sm-paymentgateway-plugin +expected: Polish copy reads naturally and matches the PHP mails in meaning; variables (order code, totals, items, names, orderUrl) render; the bank transfer block is readable as plain lines +result: [pending] + +### 4. Admin quote cart widget (Quotes > update a Quote order) in light and dark mode: add a quote item, edit description/qty/net/VAT, try 12.34567 and qty 0, remove a row, then process_quote +expected: Busy row while posting, refused change restores the row with a danger toast, totals update from the server, the placed quote renders read-only; colours follow --c-* in both themes +result: [pending] + +### 5. Settings pages payment_gateway, payment_gateway_mailer and pgstripe in light and dark mode; on pgstripe set a secret, reload, remove it, undo +expected: Tabs and error chips render; secrets show only the stored/env/empty status line, never the value; long comments and Polish tab labels wrap +result: [pending] + +### 6. Run the vue-paymentgateway-layer .playground against a running instance; walk order page -> checkout -> redirect, AwaitingPayment polling, order list, narrow screen +expected: UI-SPEC L1-L8 layouts on --pg-* tokens; Pay redirects once; polling announces Paid or shows the slow copy +result: [pending] + +### 7. Horoskopia consumer parity: compare the acme.books fixture (sm-pgstripe-plugin/fixture_plugin_test.go) with horoscope BookApiController::purchase/pay and BookFulfilmentService::transitionToPaid, and decide whether the pgstripe operator will be enabled on Horoskopia after cutover +expected: The fixture makes the same calls; the Stripe operator is enabled on Horoskopia (or RecordExternal is changed), because Go guards Send/Accept with the operator's enabled setting while PHP's guard was always true for a directly constructed StripeOperator. With the operator disabled, the fixture-style webhook skips Send/Accept and answers 200, leaving the payment Created and the order Placed with no error (B-WR-04) +result: [pending] + +### 8. Review the judgment-tier prohibitions table below (non-authoritative LLM verdicts, 19 rows including the four of plan 18-08) and accept or reject each +expected: Every prohibition is accepted as held, or turned into a gap. Two need a decision: the push go-aheads cannot be checked from code, and 'logs never carry the decline message' holds for the webhook lines 18-08 added but not for the older purchase-time path (A-IN-11) +result: [pending] + +## Summary + +total: 8 +passed: 0 +issues: 0 +pending: 8 +skipped: 0 +blocked: 0 + +## Gaps