test(18-07): the phase 18 gate requires the Stripe operator suites and every layer spec (task 4)

- plugins stage: TestStripeAuthentication, TestStripeDataHandling,
  TestSDKPin and TestStripeOperator in sm-pgstripe-plugin
- postgres stage: TestStripeSettingsSmoke and TestStripeImportWinterSmoke
  beside TestHostStripeFlow
- layers stage: the ten spec files and all 69 TAP test names
This commit is contained in:
2026-10-13 17:35:02 +02:00
parent be853996c7
commit fc3cb26322

View File

@@ -71,7 +71,7 @@ PG_EVENTS_TESTS=(TestEvents TestMailers TestBankDetailsSanitized)
PG_CONSOLE_TESTS=(TestImportWinter TestPGCommandsDeadline)
PG_API_TESTS=(TestCustomerAPIAuthz)
PG_ROOT_TESTS=(TestNotificationRoute TestNotificationSecurity TestHashidsBoot TestAdminPermissions TestAdminCatalogSmoke TestAdminFormatSmoke TestMailCatalog)
PGSTRIPE_ROOT_TESTS=(TestStripeWebhook TestFixtureAbsentFromProduction)
PGSTRIPE_ROOT_TESTS=(TestStripeWebhook TestFixtureAbsentFromProduction TestStripeAuthentication TestStripeDataHandling TestSDKPin TestStripeOperator)
# postgres stage: testcontainers suites.
PG_CABANA_TESTS=(TestMoneyFieldSmoke TestMoneyListSmoke TestRecordActionDangerSmoke TestSettingsSecretSmoke TestSettingsRichEditorSmoke TestMoneyFieldSave TestSettingsSecretPostgres TestRichEditor TestPhase10OpenAPIConformance)
@@ -79,7 +79,7 @@ PG_PG_TESTS=(TestPaymentGatewayTracer TestRefundBridgeSmoke TestNotificationRout
TestOrdersAdminSmoke TestPaymentsAdminSmoke TestShippingsAdminSmoke TestQuoteablesAdminSmoke TestQuotesAdminSmoke
TestPGSettingsSmoke TestMailerSettingsSmoke TestMailTracer TestMailersMatrixSmoke TestCustomerAPITracer TestCustomerAPI
TestPaymentsService TestRefundBridge TestOrderAndPaymentEvents TestMigrations TestPGCommands TestCurrencyConverterPostgres)
PG_PGSTRIPE_TESTS=(TestHostStripeFlow)
PG_PGSTRIPE_TESTS=(TestHostStripeFlow TestStripeSettingsSmoke TestStripeImportWinterSmoke)
# admin stage: vitest spec files and full test names (describe + it).
ADMIN_FILES=(
@@ -143,10 +143,88 @@ ADMIN_REQUIRE=(
# layers stage: test files (must exist and match the test script's glob) and
# TAP test names.
LAYER_FILES=(tests/checkout.test.ts tests/orderPage.test.ts)
LAYER_FILES=(
tests/client.test.ts
tests/money.test.ts
tests/checkout.test.ts
tests/orderPage.test.ts
tests/states.test.ts
tests/i18n.test.ts
tests/cart.test.ts
tests/orderList.test.ts
tests/confirm.test.ts
tests/methods.test.ts
)
LAYER_REQUIRE=(
"a redirect answer calls location.assign once with the URL and the button stays busy"
"an AwaitingPayment order is polled every 3 s and polling stops at Paid"
'cart: the decrease stops at 1 while the increase stays available'
'cart: the last item has no Remove; Remove confirms through a danger PgConfirm'
'cart: the busy row is marked and every control is disabled while a change runs'
'cart: it re-renders from the order the API answered, with exact totals'
'cart: read-only shows counts, the delivery line and no controls'
'a redirect answer calls location.assign once with the URL and the button stays busy'
'a second click while the first request runs sends no request'
'requires_action without the payment-action slot shows pg.error.payment_action'
'requires_action with the slot hands the PaymentIntent to it; done refreshes'
'an error shows pg.error.process and enables the buttons again'
'a pending answer refreshes the order'
'the Pay copy is pg.checkout.place for cash and bank transfer'
'Pay saves a changed delivery and payment method before process'
'Pay with the methods already stored only processes'
'no method chosen is a field error with focus, and nothing is sent'
'a 422 on shipping_id from the server is the delivery field error'
'a 409 shows pg.error.stale and refreshes the order; a 429 shows pg.error.throttled'
'an order action (cancel, an item change) runs under the busy flag and refreshes'
'PgCart: one item has no Remove button and the decrease is disabled at 1'
'PgCart: with two items each has Remove; a count above 1 can decrease'
'PgCart: read-only shows counts without controls; the busy row is marked'
'order GETs /orders/<hash> with the guest query, and only non-empty values'
'process POSTs /orders/<hash>/process with the guest query and no body'
'every other method hits its path with its HTTP method and body'
'a list body without data is an empty list'
'the client never sends an amount, a price, a currency or a state'
'guestQuery drops empty values'
'errorStatus and fieldErrors read $fetch errors'
'isRedirect and isPaymentAction tell the three process answers apart'
'on the server the composable uses the internal base and forwards the visitor address'
'in the browser the composable uses the public base and the app bearer token'
'without a token from the hook no authorization header is sent'
'confirm: opening shows a modal dialog with focus on the dismiss button'
'confirm: dismiss and Esc report close, and focus returns to the opener'
'confirm: confirm emits confirm and the dialog stays open until the parent closes it'
'confirm: while busy both buttons are disabled and Esc is refused'
'confirm: the title labels the dialog; danger and primary variants'
'every string lives under the pg namespace'
'pl and en have identical leaf key sets'
'no leaf is empty and none uses vue-i18n special characters'
'pl and en use the same placeholders per key'
'every state has a title and a body, and so does the polling title'
'every literal pg.* key used in app/ exists in both locales'
'methods: the order method, else the only method, is preselected'
'methods: a method that does not accept the order currency is not offered'
'methods: zero methods disables Pay and passes an empty list to the picker'
'methods: the delivery fieldset is hidden when the API lists none, preselected when there is one'
'methods: the bank transfer block follows a manual method with bank details'
'methods: the pickers render the checked card, the no-methods copy, free delivery and the field error'
'99999999.9999 PLN keeps four decimals in en and pl'
'39.8400 shows two decimals; 85.4193 is never rounded'
'the string is passed to Intl, never a number'
'no currency formats a plain decimal; a missing amount is a dash'
'order list: no orders shows the empty copy and no table'
'order list: the first load shows three skeleton rows in a busy table'
'order list: a failed load shows pg.error.load with Retry'
'order list: rows link to the order with the state title, the date and the exact total'
'order list: pagination disables previous on the first page and next on the last'
'an AwaitingPayment order is polled every 3 s and polling stops at Paid'
'polling stops after 20 attempts with the slow state'
'polling pauses while the page is hidden and resumes when visible'
'a failed refetch counts as an attempt and polling goes on'
'only AwaitingPayment orders of an online operator are polled'
'PgOrderPage routes Placed to PgCheckout and other states to PgOrderStatus'
'a 404 renders the not-found panel; a failed fetch renders pg.error.load with Retry'
'every state maps to its tone'
'an unknown or missing state is neutral'
'the copy key is the lower-cased state'
'Canceled and Rejected orders render their cart dimmed'
)
usage() {