diff --git a/scripts/check-phase18.sh b/scripts/check-phase18.sh index d938a75..6a77f20 100755 --- a/scripts/check-phase18.sh +++ b/scripts/check-phase18.sh @@ -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/ with the guest query, and only non-empty values' + 'process POSTs /orders//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() {