From 018baa63db353a5d2a7d68a9c60df76960f794c3 Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Wed, 18 Mar 2026 22:13:41 +0000 Subject: [PATCH 01/35] Add join-e2e package scaffold package.json, .wp-env.json, and playwright.config.ts for the new @ck/join-e2e package. wp-env targets WordPress 6.5 with the join-block plugin mounted; Playwright is configured for Chromium against port 8889 (wp-env tests environment). --- packages/join-e2e/.wp-env.json | 12 ++++++++++++ packages/join-e2e/package.json | 17 +++++++++++++++++ packages/join-e2e/playwright.config.ts | 20 ++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 packages/join-e2e/.wp-env.json create mode 100644 packages/join-e2e/package.json create mode 100644 packages/join-e2e/playwright.config.ts diff --git a/packages/join-e2e/.wp-env.json b/packages/join-e2e/.wp-env.json new file mode 100644 index 0000000..066771a --- /dev/null +++ b/packages/join-e2e/.wp-env.json @@ -0,0 +1,12 @@ +{ + "core": "WordPress/WordPress#6.5", + "plugins": ["../../packages/join-block"], + "mappings": { + "wp-content/e2e-scripts": "../../packages/join-e2e/scripts" + }, + "config": { + "WP_DEBUG": true, + "WP_DEBUG_LOG": true, + "SCRIPT_DEBUG": true + } +} diff --git a/packages/join-e2e/package.json b/packages/join-e2e/package.json new file mode 100644 index 0000000..7d9aec5 --- /dev/null +++ b/packages/join-e2e/package.json @@ -0,0 +1,17 @@ +{ + "name": "@ck/join-e2e", + "version": "1.0.0", + "private": true, + "scripts": { + "test": "playwright test", + "test:ui": "playwright test --ui", + "wp-env:start": "wp-env start", + "wp-env:stop": "wp-env stop", + "pretest": "bash scripts/seed.sh" + }, + "devDependencies": { + "@playwright/test": "^1.46.0", + "@wordpress/e2e-test-utils-playwright": "^0.21.0", + "@wordpress/env": "^10.0.0" + } +} diff --git a/packages/join-e2e/playwright.config.ts b/packages/join-e2e/playwright.config.ts new file mode 100644 index 0000000..7bd770e --- /dev/null +++ b/packages/join-e2e/playwright.config.ts @@ -0,0 +1,20 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + fullyParallel: false, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: 1, + reporter: 'html', + use: { + baseURL: 'http://localhost:8889', + trace: 'on-first-retry', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}); From 58a25e76c5b05aaea16979c616f92bfea0297cf1 Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Wed, 18 Mar 2026 22:14:42 +0000 Subject: [PATCH 02/35] Add E2E seed scripts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit seed.sh builds join-flow with REACT_APP_USE_TEST_DATA=true (so getTestDataIfEnabled() pre-fills all fields), then calls setup.php via wp-env to create the two test pages and flush rewrite rules. setup.php creates e2e-standard-join (£5/month) and e2e-free-join (£0/month) pages using carbon-fields/ck-join-form block markup with the membership plan data embedded in the "data" block attribute, which Carbon Fields passes directly to the render callback's $fields argument. get-page-url.sh retrieves a stored page URL from the wp_options table. --- packages/join-e2e/scripts/get-page-url.sh | 13 +++ packages/join-e2e/scripts/seed.sh | 19 ++++ packages/join-e2e/scripts/setup.php | 128 ++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100755 packages/join-e2e/scripts/get-page-url.sh create mode 100755 packages/join-e2e/scripts/seed.sh create mode 100644 packages/join-e2e/scripts/setup.php diff --git a/packages/join-e2e/scripts/get-page-url.sh b/packages/join-e2e/scripts/get-page-url.sh new file mode 100755 index 0000000..0a541d8 --- /dev/null +++ b/packages/join-e2e/scripts/get-page-url.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# Prints the URL for a named E2E test page. +# Usage: ./get-page-url.sh [standard|free] +# Defaults to "standard". +set -euo pipefail + +SLUG="${1:-standard}" +OPTION_KEY="ck_e2e_${SLUG}_page_url" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "${SCRIPT_DIR}/.." + +npx wp-env run tests-cli wp option get "${OPTION_KEY}" 2>/dev/null diff --git a/packages/join-e2e/scripts/seed.sh b/packages/join-e2e/scripts/seed.sh new file mode 100755 index 0000000..e50a6dc --- /dev/null +++ b/packages/join-e2e/scripts/seed.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# Builds the join-flow bundle with test data enabled and seeds the wp-env +# test WordPress instance with the two E2E test pages. +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PACKAGE_DIR="${SCRIPT_DIR}/.." +JOIN_FLOW_DIR="${SCRIPT_DIR}/../../join-flow" + +echo "--- Building join-flow bundle (USE_TEST_DATA=true) ---" +cd "${JOIN_FLOW_DIR}" +REACT_APP_USE_TEST_DATA=true npm run build + +echo "--- Seeding WordPress test environment ---" +cd "${PACKAGE_DIR}" +npx wp-env run tests-cli wp eval-file /var/www/html/wp-content/e2e-scripts/setup.php +npx wp-env run tests-cli wp rewrite flush --hard + +echo "--- Seed complete ---" diff --git a/packages/join-e2e/scripts/setup.php b/packages/join-e2e/scripts/setup.php new file mode 100644 index 0000000..2c43a76 --- /dev/null +++ b/packages/join-e2e/scripts/setup.php @@ -0,0 +1,128 @@ + $plans, + 'require_address' => true, + 'require_phone_number' => true, + 'ask_for_additional_donation' => false, + ]; + $attrs = wp_json_encode(['data' => $data]); + return "\n" + . '
' . "\n" + . ''; +} + +/** + * Create or update a page by post_name slug. + * Returns the page ID on success; exits with status 1 on failure. + */ +function ck_e2e_upsert_page(string $slug, string $title, string $content): int +{ + $existing = get_posts([ + 'post_type' => 'page', + 'post_status' => 'publish', + 'name' => $slug, + 'numberposts' => 1, + ]); + + if ($existing) { + $page_id = $existing[0]->ID; + wp_update_post(['ID' => $page_id, 'post_content' => $content]); + echo "Updated page '{$slug}' (ID: {$page_id}).\n"; + return $page_id; + } + + $page_id = wp_insert_post([ + 'post_name' => $slug, + 'post_title' => $title, + 'post_status' => 'publish', + 'post_type' => 'page', + 'post_content' => $content, + ], true); + + if (is_wp_error($page_id)) { + echo 'Failed to create page \'' . $slug . '\': ' . $page_id->get_error_message() . "\n"; + exit(1); + } + + echo "Created page '{$slug}' (ID: {$page_id}).\n"; + return $page_id; +} + +// Configure pretty permalinks so test URLs are predictable. +update_option('permalink_structure', '/%postname%/'); +flush_rewrite_rules(true); + +// Standard membership plan (£5/month). +$standard_plans = [ + [ + '_type' => '', + 'label' => 'Standard', + 'id' => 'standard', + 'amount' => '5', + 'allow_custom_amount' => '', + 'frequency' => 'monthly', + 'currency' => 'GBP', + 'description' => '', + 'add_tags' => '', + 'remove_tags' => '', + ], +]; + +// Free membership plan (£0/month). +$free_plans = [ + [ + '_type' => '', + 'label' => 'Free', + 'id' => 'free', + 'amount' => '0', + 'allow_custom_amount' => '', + 'frequency' => 'monthly', + 'currency' => 'GBP', + 'description' => '', + 'add_tags' => '', + 'remove_tags' => '', + ], +]; + +$standard_page_id = ck_e2e_upsert_page( + 'e2e-standard-join', + 'E2E Standard Join Test', + ck_e2e_make_block_content($standard_plans) +); + +$free_page_id = ck_e2e_upsert_page( + 'e2e-free-join', + 'E2E Free Membership Test', + ck_e2e_make_block_content($free_plans) +); + +// Persist URLs as options so get-page-url.sh can retrieve them. +update_option('ck_e2e_standard_page_url', get_permalink($standard_page_id)); +update_option('ck_e2e_free_page_url', get_permalink($free_page_id)); + +echo 'Standard page URL: ' . get_permalink($standard_page_id) . "\n"; +echo 'Free page URL: ' . get_permalink($free_page_id) . "\n"; +echo "Setup complete.\n"; From 765406b64e069085eb463b781d8616ce60249526 Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Wed, 18 Mar 2026 22:15:03 +0000 Subject: [PATCH 03/35] Add Phase 1 rendering tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 01-render.spec.ts verifies: 1.1 — .ck-join-form is visible; script#env is attached and parseable JSON with WP_REST_API and at least one MEMBERSHIP_PLANS entry. 1.2 — input#firstName is visible after React mounts; no console errors. 1.3 — .progress-steps is rendered; .progress-step--current contains "Your Details" on the initial page load. --- packages/join-e2e/tests/01-render.spec.ts | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 packages/join-e2e/tests/01-render.spec.ts diff --git a/packages/join-e2e/tests/01-render.spec.ts b/packages/join-e2e/tests/01-render.spec.ts new file mode 100644 index 0000000..f745df2 --- /dev/null +++ b/packages/join-e2e/tests/01-render.spec.ts @@ -0,0 +1,66 @@ +import { test, expect } from '@playwright/test'; + +/** + * Phase 1 — Rendering + * + * Verifies that the join form block renders correctly: the React mount point + * is present, the environment JSON is injected and parseable, the first step's + * input fields are visible, and no console errors are emitted. + */ + +const STANDARD_PAGE = '/e2e-standard-join/'; + +test.describe('1 — Rendering', () => { + test('1.1 — form container and env script are present', async ({ page }) => { + await page.goto(STANDARD_PAGE); + + // React mounts into .ck-join-form; the outer .ck-join-flow wrapper is + // emitted directly by the PHP render callback. + await expect(page.locator('.ck-join-form')).toBeVisible(); + + // The #env + + + +
+ + + \ No newline at end of file diff --git a/packages/join-e2e/test-results/.last-run.json b/packages/join-e2e/test-results/.last-run.json new file mode 100644 index 0000000..cbcc1fb --- /dev/null +++ b/packages/join-e2e/test-results/.last-run.json @@ -0,0 +1,4 @@ +{ + "status": "passed", + "failedTests": [] +} \ No newline at end of file diff --git a/packages/join-e2e/tests/04-donation-upsell.spec.ts b/packages/join-e2e/tests/donation-upsell.spec.ts similarity index 100% rename from packages/join-e2e/tests/04-donation-upsell.spec.ts rename to packages/join-e2e/tests/donation-upsell.spec.ts diff --git a/packages/join-e2e/tests/02-form-progression.spec.ts b/packages/join-e2e/tests/form-progression.spec.ts similarity index 100% rename from packages/join-e2e/tests/02-form-progression.spec.ts rename to packages/join-e2e/tests/form-progression.spec.ts diff --git a/packages/join-e2e/tests/03-free-membership.spec.ts b/packages/join-e2e/tests/free-membership.spec.ts similarity index 100% rename from packages/join-e2e/tests/03-free-membership.spec.ts rename to packages/join-e2e/tests/free-membership.spec.ts diff --git a/packages/join-e2e/tests/01-render.spec.ts b/packages/join-e2e/tests/render.spec.ts similarity index 100% rename from packages/join-e2e/tests/01-render.spec.ts rename to packages/join-e2e/tests/render.spec.ts diff --git a/packages/join-e2e/tests/07-supporter-mode-edge-cases.spec.ts b/packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts similarity index 99% rename from packages/join-e2e/tests/07-supporter-mode-edge-cases.spec.ts rename to packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts index 2fd6cfc..8940d87 100644 --- a/packages/join-e2e/tests/07-supporter-mode-edge-cases.spec.ts +++ b/packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts @@ -21,7 +21,7 @@ import { mockRestEndpoints, captureJoinBodyViaStripeRedirect, injectEnvOverrides * a one-time PaymentIntent; backend uses the "Supporter Donation" product. * * Note: Free membership (payment skipped for zero-price plans) is covered by - * 03-free-membership.spec.ts. Mailchimp non-fatal error handling is + * free-membership.spec.ts. Mailchimp non-fatal error handling is * a backend concern covered by JoinServiceMailchimpTest.php. Supporter mode * monthly via Direct Debit requires a live GoCardless integration. */ diff --git a/packages/join-e2e/tests/05-supporter-mode-monthly.spec.ts b/packages/join-e2e/tests/supporter-mode-monthly.spec.ts similarity index 100% rename from packages/join-e2e/tests/05-supporter-mode-monthly.spec.ts rename to packages/join-e2e/tests/supporter-mode-monthly.spec.ts diff --git a/packages/join-e2e/tests/06-supporter-mode-oneoff.spec.ts b/packages/join-e2e/tests/supporter-mode-oneoff.spec.ts similarity index 100% rename from packages/join-e2e/tests/06-supporter-mode-oneoff.spec.ts rename to packages/join-e2e/tests/supporter-mode-oneoff.spec.ts diff --git a/readme.md b/readme.md index 241acb9..3c6a9ed 100644 --- a/readme.md +++ b/readme.md @@ -44,6 +44,10 @@ Results in deployable artifacts: - `packages/join-block`: Join block plugin +## End-to-End Testing + +See [docs/e2e-testing.md](docs/e2e-testing.md) for the full testing plan, current coverage, known gaps, and instructions for running the Playwright suite. + ## Auth0 Setup You must create an Auth0 machine-to-machine application, and then authorize this application for the Auth0 Management API. From 0a508252a00e0709b8185cd2bb50034a52e9ba20 Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Sun, 29 Mar 2026 10:46:13 +0100 Subject: [PATCH 28/35] Remove section number comments from supporter-mode-edge-cases spec --- packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts b/packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts index 8940d87..bdcc6d8 100644 --- a/packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts +++ b/packages/join-e2e/tests/supporter-mode-edge-cases.spec.ts @@ -31,7 +31,7 @@ const SUPPORTER_NO_PLANS_PAGE = '/e2e-supporter-no-plans/'; const STANDARD_PAGE = '/e2e-standard-join/'; // --------------------------------------------------------------------------- -// Section 9 — One-off disabled when Direct Debit only +// One-off disabled when Direct Debit only // --------------------------------------------------------------------------- test.describe('One-off tab disabled when STRIPE_DIRECT_DEBIT_ONLY=true', () => { @@ -68,7 +68,7 @@ test.describe('One-off tab disabled when STRIPE_DIRECT_DEBIT_ONLY=true', () => { }); // --------------------------------------------------------------------------- -// Section 10 — No plans configured +// No plans configured // --------------------------------------------------------------------------- test.describe('No plans configured warning', () => { @@ -91,7 +91,7 @@ test.describe('No plans configured warning', () => { }); // --------------------------------------------------------------------------- -// Section 13 — Product naming +// Product naming // --------------------------------------------------------------------------- test.describe('Product naming: standard join', () => { From aa7dd3f7efc9fc259906a091fc23ae8b56732449 Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Mon, 30 Mar 2026 10:00:28 +0100 Subject: [PATCH 29/35] Rename build:e2e to test:build and stop running CI on feature branch pushes --- .github/workflows/e2e.yml | 3 +- ...3495759a541bcc30497e5c46b58f7e1fbe6cbe1.md | 172 ------------------ .../join-e2e/playwright-report/index.html | 85 --------- packages/join-e2e/test-results/.last-run.json | 4 - packages/join-flow/package.json | 2 +- 5 files changed, 2 insertions(+), 264 deletions(-) delete mode 100644 packages/join-e2e/playwright-report/data/f3495759a541bcc30497e5c46b58f7e1fbe6cbe1.md delete mode 100644 packages/join-e2e/playwright-report/index.html delete mode 100644 packages/join-e2e/test-results/.last-run.json diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index fc6d48f..d2fefae 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -4,7 +4,6 @@ on: push: branches: - master - - 'feature/**' pull_request: jobs: @@ -23,7 +22,7 @@ jobs: - name: Build join-flow bundle (E2E mode) working-directory: packages/join-flow - run: REACT_APP_USE_TEST_DATA=true npm run build + run: npm run test:build - name: Install E2E deps working-directory: packages/join-e2e diff --git a/packages/join-e2e/playwright-report/data/f3495759a541bcc30497e5c46b58f7e1fbe6cbe1.md b/packages/join-e2e/playwright-report/data/f3495759a541bcc30497e5c46b58f7e1fbe6cbe1.md deleted file mode 100644 index f5f6ed5..0000000 --- a/packages/join-e2e/playwright-report/data/f3495759a541bcc30497e5c46b58f7e1fbe6cbe1.md +++ /dev/null @@ -1,172 +0,0 @@ -# Page snapshot - -```yaml -- generic [active] [ref=e1]: - - link "Skip to content" [ref=e2] [cursor=pointer]: - - /url: "#wp--skip-link--target" - - generic [ref=e3]: - - banner [ref=e4]: - - generic [ref=e6]: - - paragraph [ref=e9]: - - link "join-e2e" [ref=e10] [cursor=pointer]: - - /url: http://localhost:8889 - - navigation [ref=e12]: - - list [ref=e17]: - - list [ref=e18]: - - listitem [ref=e19]: - - link "E2E Donation Upsell Test" [ref=e20] [cursor=pointer]: - - /url: http://localhost:8889/e2e-donation-upsell/ - - listitem [ref=e21]: - - link "E2E Free Membership Test" [ref=e22] [cursor=pointer]: - - /url: http://localhost:8889/e2e-free-join/ - - listitem [ref=e23]: - - link "E2E Standard Join Test" [ref=e24] [cursor=pointer]: - - /url: http://localhost:8889/e2e-standard-join/ - - listitem [ref=e25]: - - link "E2E Supporter Custom Amount Test" [ref=e26] [cursor=pointer]: - - /url: http://localhost:8889/e2e-supporter-custom/ - - listitem [ref=e27]: - - link "E2E Supporter Mode Test" [ref=e28] [cursor=pointer]: - - /url: http://localhost:8889/e2e-supporter/ - - listitem [ref=e29]: - - link "E2E Supporter No Plans Test" [ref=e30] [cursor=pointer]: - - /url: http://localhost:8889/e2e-supporter-no-plans/ - - listitem [ref=e31]: - - link "Sample Page" [ref=e32] [cursor=pointer]: - - /url: http://localhost:8889/sample-page/ - - main [ref=e33]: - - generic [ref=e34]: - - generic [ref=e35]: - - heading "A commitment to innovation and sustainability" [level=1] [ref=e36] - - paragraph [ref=e38]: Études is a pioneering firm that seamlessly merges creativity and functionality to redefine architectural excellence. - - generic [ref=e42] [cursor=pointer]: About us - - figure [ref=e44]: - - img "Building exterior in Toronto, Canada" [ref=e45] - - generic [ref=e46]: - - generic [ref=e47]: - - heading "A passion for creating spaces" [level=2] [ref=e48] - - paragraph [ref=e49]: Our comprehensive suite of professional services caters to a diverse clientele, ranging from homeowners to commercial developers. - - generic [ref=e51]: - - generic [ref=e52]: - - heading "Renovation and restoration" [level=3] [ref=e53] - - paragraph [ref=e54]: Experience the fusion of imagination and expertise with Études Architectural Solutions. - - generic [ref=e55]: - - heading "Continuous Support" [level=3] [ref=e56] - - paragraph [ref=e57]: Experience the fusion of imagination and expertise with Études Architectural Solutions. - - generic [ref=e58]: - - heading "App Access" [level=3] [ref=e59] - - paragraph [ref=e60]: Experience the fusion of imagination and expertise with Études Architectural Solutions. - - generic [ref=e62]: - - generic [ref=e63]: - - heading "Consulting" [level=3] [ref=e64] - - paragraph [ref=e65]: Experience the fusion of imagination and expertise with Études Architectural Solutions. - - generic [ref=e66]: - - heading "Project Management" [level=3] [ref=e67] - - paragraph [ref=e68]: Experience the fusion of imagination and expertise with Études Architectural Solutions. - - generic [ref=e69]: - - heading "Architectural Solutions" [level=3] [ref=e70] - - paragraph [ref=e71]: Experience the fusion of imagination and expertise with Études Architectural Solutions. - - generic [ref=e73]: - - generic [ref=e74]: - - heading "An array of resources" [level=2] [ref=e75] - - paragraph [ref=e76]: Our comprehensive suite of professional services caters to a diverse clientele, ranging from homeowners to commercial developers. - - generic [ref=e78]: - - generic [ref=e79]: - - heading "Études Architect App" [level=3] [ref=e80] - - list [ref=e81]: - - listitem [ref=e82]: Collaborate with fellow architects. - - listitem [ref=e83]: Showcase your projects. - - listitem [ref=e84]: Experience the world of architecture. - - figure [ref=e86]: - - img "Tourist taking photo of a building" [ref=e87] - - generic [ref=e89]: - - figure [ref=e91]: - - img "Windows of a building in Nuremberg, Germany" [ref=e92] - - generic [ref=e93]: - - heading "Études Newsletter" [level=3] [ref=e94] - - list [ref=e95]: - - listitem [ref=e96]: A world of thought-provoking articles. - - listitem [ref=e97]: Case studies that celebrate architecture. - - listitem [ref=e98]: Exclusive access to design insights. - - generic [ref=e100]: - - paragraph [ref=e101]: - - emphasis [ref=e102]: “Études has saved us thousands of hours of work and has unlocked insights we never thought possible.” - - generic [ref=e104]: - - paragraph [ref=e105]: Annie Steiner - - paragraph [ref=e106]: CEO, Greenprint - - generic [ref=e107]: - - heading "Watch, Read, Listen" [level=2] [ref=e108] - - list [ref=e111]: - - listitem [ref=e112]: - - separator [ref=e113] - - generic [ref=e114]: - - heading "Hello world!" [level=2] [ref=e116]: - - link "Hello world!" [ref=e117] [cursor=pointer]: - - /url: http://localhost:8889/hello-world/ - - generic [ref=e121]: - - time [ref=e123]: - - link "Mar 18, 2026" [ref=e124] [cursor=pointer]: - - /url: http://localhost:8889/hello-world/ - - paragraph [ref=e125]: — - - paragraph [ref=e126]: by - - link "admin" [ref=e128] [cursor=pointer]: - - /url: http://localhost:8889/author/admin/ - - generic [ref=e129]: - - text: in - - link "Uncategorized" [ref=e130] [cursor=pointer]: - - /url: http://localhost:8889/category/uncategorized/ - - generic [ref=e133]: - - heading "Join 900+ subscribers" [level=2] [ref=e135] - - paragraph [ref=e136]: Stay in the loop with everything you need to know. - - generic [ref=e139] [cursor=pointer]: Sign up - - contentinfo [ref=e141]: - - generic [ref=e142]: - - generic [ref=e143]: - - paragraph [ref=e146]: - - link "join-e2e" [ref=e147] [cursor=pointer]: - - /url: http://localhost:8889 - - generic [ref=e150]: - - generic [ref=e151]: - - heading "About" [level=2] [ref=e152] - - navigation "About" [ref=e154]: - - list [ref=e155]: - - listitem [ref=e156]: - - link "Team" [ref=e157] [cursor=pointer]: - - /url: "#" - - listitem [ref=e158]: - - link "History" [ref=e159] [cursor=pointer]: - - /url: "#" - - listitem [ref=e160]: - - link "Careers" [ref=e161] [cursor=pointer]: - - /url: "#" - - generic [ref=e162]: - - heading "Privacy" [level=2] [ref=e163] - - navigation "Privacy" [ref=e165]: - - list [ref=e166]: - - listitem [ref=e167]: - - link "Privacy Policy" [ref=e168] [cursor=pointer]: - - /url: "#" - - listitem [ref=e169]: - - link "Terms and Conditions" [ref=e170] [cursor=pointer]: - - /url: "#" - - listitem [ref=e171]: - - link "Contact Us" [ref=e172] [cursor=pointer]: - - /url: "#" - - generic [ref=e173]: - - heading "Social" [level=2] [ref=e174] - - navigation "Social Media" [ref=e176]: - - list [ref=e177]: - - listitem [ref=e178]: - - link "Facebook" [ref=e179] [cursor=pointer]: - - /url: "#" - - listitem [ref=e180]: - - link "Instagram" [ref=e181] [cursor=pointer]: - - /url: "#" - - listitem [ref=e182]: - - link "Twitter/X" [ref=e183] [cursor=pointer]: - - /url: "#" - - paragraph [ref=e185]: - - text: Designed with - - link "WordPress" [ref=e186] [cursor=pointer]: - - /url: https://wordpress.org -``` \ No newline at end of file diff --git a/packages/join-e2e/playwright-report/index.html b/packages/join-e2e/playwright-report/index.html deleted file mode 100644 index afdf59d..0000000 --- a/packages/join-e2e/playwright-report/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - Playwright Test Report - - - - -
- - - \ No newline at end of file diff --git a/packages/join-e2e/test-results/.last-run.json b/packages/join-e2e/test-results/.last-run.json deleted file mode 100644 index cbcc1fb..0000000 --- a/packages/join-e2e/test-results/.last-run.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "status": "passed", - "failedTests": [] -} \ No newline at end of file diff --git a/packages/join-flow/package.json b/packages/join-flow/package.json index 82c00d6..261eeff 100644 --- a/packages/join-flow/package.json +++ b/packages/join-flow/package.json @@ -48,7 +48,7 @@ "build": "webpack --config './webpack/production.js'", "test": "jest", - "build:e2e": "REACT_APP_USE_TEST_DATA=true webpack --config './webpack/production.js'" + "test:build": "REACT_APP_USE_TEST_DATA=true webpack --config './webpack/production.js'" }, "proxy": "http://localhost:8080", "eslintConfig": { From 3309531cd3dc08936f9be45ef398a3820aea97fd Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Mon, 30 Mar 2026 10:00:35 +0100 Subject: [PATCH 30/35] Ignore playwright-report and test-results directories --- packages/join-e2e/.gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages/join-e2e/.gitignore diff --git a/packages/join-e2e/.gitignore b/packages/join-e2e/.gitignore new file mode 100644 index 0000000..945fcd0 --- /dev/null +++ b/packages/join-e2e/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +playwright-report/ +test-results/ From 9b4f66a9271734cc2eb10077e4b5b8dfab8a21dc Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Mon, 30 Mar 2026 10:00:35 +0100 Subject: [PATCH 31/35] Update WordPress test environment to 6.9.4 --- packages/join-e2e/.wp-env.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/join-e2e/.wp-env.json b/packages/join-e2e/.wp-env.json index eaba76c..81a4016 100644 --- a/packages/join-e2e/.wp-env.json +++ b/packages/join-e2e/.wp-env.json @@ -1,5 +1,5 @@ { - "core": "https://wordpress.org/wordpress-6.5.zip", + "core": "https://wordpress.org/wordpress-6.9.4.zip", "plugins": ["../../packages/join-block"], "mappings": { "wp-content/e2e-scripts": "../../packages/join-e2e/scripts" From bd25bbbc333f394249ad914fa47e1962178ff5a3 Mon Sep 17 00:00:00 2001 From: Alex Worrad-Andrews Date: Mon, 30 Mar 2026 10:00:35 +0100 Subject: [PATCH 32/35] Update e2e testing docs: fix name, expand env injection note, add WP version workstream --- docs/e2e-testing.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/e2e-testing.md b/docs/e2e-testing.md index acf7d48..a4a1645 100644 --- a/docs/e2e-testing.md +++ b/docs/e2e-testing.md @@ -2,7 +2,7 @@ ## Overview -The CK Join Form plugin ships with a Playwright end-to-end test suite that exercises the React join flow inside a real WordPress environment. Tests run against a wp-env (Docker WordPress) instance seeded with purpose-built test pages. +Join ships with a Playwright end-to-end test suite that exercises the React join flow inside a real WordPress environment. Tests run against a wp-env (Docker WordPress) instance seeded with purpose-built test pages. ### Test approach @@ -15,7 +15,7 @@ This is a deliberate trade-off: payment provider SDKs require live credentials, | Component | Location | Purpose | |-----------|----------|---------| | Test suite | `packages/join-e2e/tests/` | Playwright spec files | -| Helpers | `packages/join-e2e/tests/helpers.ts` | Shared utilities for mocking, env injection, and payment simulation | +| Helpers | `packages/join-e2e/tests/helpers.ts` | Shared utilities for mocking, environment injection, and payment simulation | | Seed script | `packages/join-e2e/scripts/setup.php` | Creates test pages with specific block configurations in WordPress | | Playwright config | `packages/join-e2e/playwright.config.ts` | Single Chromium project, serial execution, base URL `localhost:8889` | @@ -25,6 +25,8 @@ This is a deliberate trade-off: payment provider SDKs require live credentials, **`injectEnvOverrides(page, urlPattern, overrides)`** intercepts the page HTML response and patches the `