From 2d606f5fdff60427a7ffe49382de1f3856f3f23d Mon Sep 17 00:00:00 2001 From: Bit Nimble Date: Mon, 8 Jun 2026 23:23:56 +1000 Subject: [PATCH 1/2] test: add e2e tests --- .env.e2e | 44 ++++++++++ .github/workflows/e2e.yml | 60 ++++++++++++++ .gitignore | 10 +++ bun.lock | 9 ++ docker/docker-compose.e2e.yml | 21 +++++ e2e/fixtures.ts | 48 +++++++++++ e2e/fixtures/E2E_Map_One.zip | Bin 0 -> 68486 bytes e2e/fixtures/E2E_Map_Two.zip | Bin 0 -> 68485 bytes e2e/fixtures/README.md | 53 ++++++++++++ e2e/full_journey.e2e.ts | 140 ++++++++++++++++++++++++++++++++ e2e/helpers/auth.ts | 70 ++++++++++++++++ e2e/helpers/inbucket.ts | 87 ++++++++++++++++++++ e2e/helpers/maps.ts | 67 +++++++++++++++ e2e/helpers/zip.ts | 22 +++++ e2e/tsconfig.json | 13 +++ package.json | 5 +- playwright.config.ts | 40 +++++++++ src/ui/base/textbox/textbox.tsx | 3 + supabase/config.toml | 4 +- tools/e2e.sh | 76 +++++++++++++++++ tools/e2e_setup_s3.ts | 58 +++++++++++++ 21 files changed, 828 insertions(+), 2 deletions(-) create mode 100644 .env.e2e create mode 100644 .github/workflows/e2e.yml create mode 100644 docker/docker-compose.e2e.yml create mode 100644 e2e/fixtures.ts create mode 100644 e2e/fixtures/E2E_Map_One.zip create mode 100644 e2e/fixtures/E2E_Map_Two.zip create mode 100644 e2e/fixtures/README.md create mode 100644 e2e/full_journey.e2e.ts create mode 100644 e2e/helpers/auth.ts create mode 100644 e2e/helpers/inbucket.ts create mode 100644 e2e/helpers/maps.ts create mode 100644 e2e/helpers/zip.ts create mode 100644 e2e/tsconfig.json create mode 100644 playwright.config.ts create mode 100644 tools/e2e.sh create mode 100644 tools/e2e_setup_s3.ts diff --git a/.env.e2e b/.env.e2e new file mode 100644 index 0000000..85bc277 --- /dev/null +++ b/.env.e2e @@ -0,0 +1,44 @@ +# Environment for the full-stack E2E suite (`bun run test:e2e`). +# +# Unlike .env.test (which fakes everything), these tests run against REAL local services: +# - Supabase Auth + Postgres from `supabase start` (API :54321, DB :54322, Inbucket :54324) +# - Minio as a real S3, brought up by tools/e2e.sh (docker compose) +# +# The Supabase publishable/secret keys are NOT set here: tools/e2e.sh injects them from +# `supabase status` at runtime so this file never goes stale against the local CLI's keys. + +NEXT_PUBLIC_BASE_URL=http://localhost:3000 + +# Postgres = the database that `supabase start` runs. +PGHOST=127.0.0.1 +PGPORT=54322 +PGUSER=postgres +PGDATABASE=postgres +PGPASSWORD=postgres + +# Real Supabase Auth. Keys (NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, SUPABASE_SECRET_KEY) are injected +# by tools/e2e.sh from `supabase status`. +SUPABASE_IMPLEMENTATION=real +NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321 + +# Real S3 via Minio (docker/docker-compose.dev.yml). PUBLIC_S3_BASE_URL is path-style: endpoint + +# bucket, since the download route redirects the browser straight to the object. +S3_IMPLEMENTATION=real +S3_ENDPOINT=http://localhost:9000 +PUBLIC_S3_BASE_URL=http://localhost:9000/paradb-maps-e2e +S3_REGION=us-east-1 +S3_ACCESS_KEY_ID=minioadmin +S3_ACCESS_KEY_SECRET=minioadmin +S3_MAPS_BUCKET=paradb-maps-e2e + +# Everything else stays faked/local - not under test here. +SENTRY_DSN=sentryDsn +SENTRY_ENV=e2e +AXIOM_IMPLEMENTATION=fake +FLAGS_IMPLEMENTATION=local +FLAGS_EDGE_CONFIG=abc +FLAGS_EDGE_CONFIG_KEY=123 +AXIOM_API_TOKEN=local +AXIOM_DATASET=local +NEXT_PUBLIC_AXIOM_API_TOKEN=local +NEXT_PUBLIC_AXIOM_DATASET=local diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000..7de90ea --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,60 @@ +name: E2E + +on: + pull_request: + workflow_dispatch: + +# Cancel superseded runs on the same PR/branch so updates don't queue up. +concurrency: + group: e2e-${{ github.ref }} + cancel-in-progress: true + +jobs: + e2e: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 1 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + + - name: Cache bun install cache + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('bun.lock') }} + restore-keys: bun-${{ runner.os }}- + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Typecheck E2E sources + run: bun run typecheck:e2e + + - name: Install Playwright (Chromium + OS deps) + run: bunx playwright install --with-deps chromium + + - name: Setup Supabase CLI + uses: supabase/setup-cli@v1 + with: + version: latest + + # Brings up the real Supabase stack (Auth, Postgres, Inbucket) that the E2E suite requires. + # Minio (real S3) and the Next dev server are started by the test script itself. + - name: Start Supabase + run: supabase start + + - name: Run E2E tests + run: bun run test:e2e + + - name: Upload Playwright report + if: ${{ !cancelled() }} + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index ffa37b9..6a37106 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ data.ms .env .env.* +# ...but the non-secret, committed local/test/e2e env files are tracked. +!.env.localdev +!.env.test +!.env.e2e # dependencies /node_modules @@ -40,3 +44,9 @@ next-env.d.ts # Local dev fake-backend state (file-backed PGlite + on-disk fake S3) .fake_dev/ + +# Playwright E2E artifacts +/playwright-report/ +/test-results/ +/blob-report/ +/playwright/.cache/ diff --git a/bun.lock b/bun.lock index ba75c57..e5afdb9 100644 --- a/bun.lock +++ b/bun.lock @@ -53,6 +53,7 @@ "@babel/plugin-syntax-typescript": "^7.28.6", "@electric-sql/pglite": "^0.4.6", "@electric-sql/pglite-socket": "^0.1.6", + "@playwright/test": "^1.60.0", "@types/jest": "^29.5.5", "@types/pg": "^8.10.2", "@types/postcss-modules-values": "^4", @@ -651,6 +652,8 @@ "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@playwright/test": ["@playwright/test@1.60.0", "", { "dependencies": { "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" } }, "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag=="], + "@prisma/instrumentation": ["@prisma/instrumentation@6.19.0", "", { "dependencies": { "@opentelemetry/instrumentation": ">=0.52.0 <1" }, "peerDependencies": { "@opentelemetry/api": "^1.8" } }, "sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg=="], "@react-aria/autocomplete": ["@react-aria/autocomplete@3.0.0-rc.4", "", { "dependencies": { "@react-aria/combobox": "^3.14.1", "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/listbox": "^3.15.1", "@react-aria/searchfield": "^3.8.10", "@react-aria/textfield": "^3.18.3", "@react-aria/utils": "^3.32.0", "@react-stately/autocomplete": "3.0.0-beta.4", "@react-stately/combobox": "^3.12.1", "@react-types/autocomplete": "3.0.0-alpha.36", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-4bMMVNaCuYDZX9HM4ZNSAImZMcL/orwhLLe818+lyzmSrvGmW9h433PZxTolb0d+FnJVfn1MDY0zEWLiyI86GA=="], @@ -2219,6 +2222,10 @@ "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + "playwright": ["playwright@1.60.0", "", { "dependencies": { "playwright-core": "1.60.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA=="], + + "playwright-core": ["playwright-core@1.60.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA=="], + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], @@ -2825,6 +2832,8 @@ "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], diff --git a/docker/docker-compose.e2e.yml b/docker/docker-compose.e2e.yml new file mode 100644 index 0000000..2490a1a --- /dev/null +++ b/docker/docker-compose.e2e.yml @@ -0,0 +1,21 @@ +# Minio (real S3) for the full-stack E2E suite. Self-contained and separate from the dev compose so +# the E2E run never touches dev state. Brought up by tools/e2e.sh, which polls readiness host-side. +services: + minio: + image: minio/minio:latest + container_name: paradb_minio_e2e + command: server /data --console-address ":9001" + ports: + - 9000:9000 + environment: + # Root credentials the app signs presigned URLs with (see .env.e2e S3_ACCESS_KEY_*). + - MINIO_ROOT_USER=minioadmin + - MINIO_ROOT_PASSWORD=minioadmin + # The browser uploads to presigned URLs cross-origin (localhost:3000 -> :9000); allow CORS. + - MINIO_API_CORS_ALLOW_ORIGIN=* + volumes: + - paradb_minio_e2e_data:/data + restart: unless-stopped + +volumes: + paradb_minio_e2e_data: diff --git a/e2e/fixtures.ts b/e2e/fixtures.ts new file mode 100644 index 0000000..6f3c635 --- /dev/null +++ b/e2e/fixtures.ts @@ -0,0 +1,48 @@ +import path from 'node:path'; + +/** + * Canonical metadata for the committed map fixtures under `e2e/fixtures/`. The values here MUST match + * the `recordingMetadata` baked into the zips (see `e2e/fixtures/README.md`); the tests assert on + * them and drive search/filter from them, so distinct artist/mapper/description across the two maps + * is what makes the filter assertions meaningful. + */ +export type MapFixture = { + /** Absolute path to the zip, ready for `setInputFiles`. */ + zipPath: string; + title: string; + artist: string; + mapper: string; + description: string; + /** The file entries the downloaded zip must contain (directories excluded). */ + expectedEntries: string[]; +}; + +const fixturesDir = path.join(__dirname, 'fixtures'); + +export const MAP_ONE: MapFixture = { + zipPath: path.join(fixturesDir, 'E2E_Map_One.zip'), + title: 'E2E Map One Alpha', + artist: 'Aurora Borealis', + mapper: 'MapperAlpha', + description: 'First e2e map uniquealphadesc', + expectedEntries: [ + 'MapOne/MapOne_Easy.rlrr', + 'MapOne/album.jpg', + 'MapOne/song.ogg', + 'MapOne/drums.ogg', + ], +}; + +export const MAP_TWO: MapFixture = { + zipPath: path.join(fixturesDir, 'E2E_Map_Two.zip'), + title: 'E2E Map Two Beta', + artist: 'Crimson Tide', + mapper: 'MapperBeta', + description: 'Second e2e map uniquebetadesc', + expectedEntries: [ + 'MapTwo/MapTwo_Hard.rlrr', + 'MapTwo/album.jpg', + 'MapTwo/song.ogg', + 'MapTwo/drums.ogg', + ], +}; diff --git a/e2e/fixtures/E2E_Map_One.zip b/e2e/fixtures/E2E_Map_One.zip new file mode 100644 index 0000000000000000000000000000000000000000..bc3357ccf17105d95946ffc995273ceb4187b4f1 GIT binary patch literal 68486 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 literal 0 HcmV?d00001 diff --git a/e2e/fixtures/E2E_Map_Two.zip b/e2e/fixtures/E2E_Map_Two.zip new file mode 100644 index 0000000000000000000000000000000000000000..5cebb53ee4706e005b7091a27c94b6f554a7cb94 GIT binary patch literal 68485 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�%eRdpbLlt!@R>F^uij4(jTsdR={=MMh5{7g$ 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%0D^h^9M%3VYg*ivx{jTs9a%rK9oiho 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 literal 0 HcmV?d00001 diff --git a/e2e/fixtures/README.md b/e2e/fixtures/README.md new file mode 100644 index 0000000..ec3b2ac --- /dev/null +++ b/e2e/fixtures/README.md @@ -0,0 +1,53 @@ +# E2E map fixtures + +Two valid Paradiddle map zips with **distinct, known metadata** so the E2E +search/filter assertions are meaningful. The map title/artist/mapper/description +come from the `recordingMetadata` inside the `.rlrr`, not from any form field, so +controlled metadata has to live in the fixture itself. + +| Fixture | Title | Artist | Mapper (creator) | Description | +| ----------------- | ----------------- | --------------- | ---------------- | ----------------------------- | +| `E2E_Map_One.zip` | E2E Map One Alpha | Aurora Borealis | MapperAlpha | First e2e map uniquealphadesc | +| `E2E_Map_Two.zip` | E2E Map Two Beta | Crimson Tide | MapperBeta | Second e2e map uniquebetadesc | + +The audio tracks and album art are reused from the unit-test fixtures under +`src/services/maps/tests/files/` (`silence.ogg`, `album.jpg`). + +The canonical metadata used by the tests lives in `e2e/fixtures.ts`, keep the two +in sync if you regenerate the zips. + +## Regenerating + +These are committed binaries (same as the `Test_valid.zip` unit fixtures). To +rebuild them, run from the repo root: + +```python +# python3 - <<'PY' +import json, os, zipfile +SRC = "src/services/maps/tests/files" +silence = open(f"{SRC}/silence.ogg", "rb").read() +album = open(f"{SRC}/album.jpg", "rb").read() + +def build(name, folder, difficulty, title, artist, creator, description, complexity): + rlrr = { + "version": 0.6, + "recordingMetadata": {"title": title, "description": description, + "coverImagePath": "album.jpg", "artist": artist, "creator": creator, + "length": 11.1814, "complexity": complexity}, + "audioFileData": {"songTracks": ["song.ogg"], "drumTracks": ["drums.ogg"], + "calibrationOffset": 0.0}, + "instruments": [], "events": [], "bpmEvents": [{"bpm": 120.0, "time": 0.0}], + } + with zipfile.ZipFile(f"e2e/fixtures/{name}", "w", zipfile.ZIP_DEFLATED) as z: + z.writestr(f"{folder}/", "") + z.writestr(f"{folder}/{folder}_{difficulty}.rlrr", json.dumps(rlrr, indent=2)) + z.writestr(f"{folder}/album.jpg", album) + z.writestr(f"{folder}/song.ogg", silence) + z.writestr(f"{folder}/drums.ogg", silence) + +build("E2E_Map_One.zip", "MapOne", "Easy", "E2E Map One Alpha", "Aurora Borealis", + "MapperAlpha", "First e2e map uniquealphadesc", 3) +build("E2E_Map_Two.zip", "MapTwo", "Hard", "E2E Map Two Beta", "Crimson Tide", + "MapperBeta", "Second e2e map uniquebetadesc", 4) +# PY +``` diff --git a/e2e/full_journey.e2e.ts b/e2e/full_journey.e2e.ts new file mode 100644 index 0000000..934d2ca --- /dev/null +++ b/e2e/full_journey.e2e.ts @@ -0,0 +1,140 @@ +import { expect, Page, test } from '@playwright/test'; +import { MAP_ONE, MAP_TWO, MapFixture } from './fixtures'; +import { + expectLoggedOut, + login, + logout, + makeUser, + signUpAndConfirm, + TestUser, +} from './helpers/auth'; +import { + applySimpleFilter, + favoritesCell, + goHome, + mapRow, + searchMaps, + uploadMap, +} from './helpers/maps'; +import { assertZipMatchesFixture } from './helpers/zip'; + +async function favoriteMap(page: Page) { + // The favorite button only renders once the map's userProjection has loaded; wait for it so a + // missing projection fails loudly here rather than as an opaque click timeout. + const favorite = page.getByRole('button', { name: '❤' }); + await expect(favorite).toBeVisible(); + await Promise.all([ + page.waitForResponse( + (r) => r.url().includes('/api/favorites') && r.request().method() === 'POST' + ), + favorite.click(), + ]); +} + +async function downloadAndVerify(page: Page, id: string, fixture: MapFixture) { + const resp = await page.request.get(`/api/maps/${id}/download`); + expect(resp.ok()).toBeTruthy(); + await assertZipMatchesFixture(await resp.body(), fixture); +} + +// One long, stateful journey across two users; runs as a single ordered test so the shared state +// (the uploaded maps, the favorite counts) flows naturally between steps. +test('full happy-path journey across two users', async ({ page }) => { + test.setTimeout(300_000); + + const user1: TestUser = makeUser('one'); + const user2: TestUser = makeUser('two'); + let map1Id = ''; + let map2Id = ''; + + await test.step('load homepage', async () => { + await page.goto('/'); + await expect(page.getByPlaceholder('Search for a song or artist...')).toBeVisible(); + await expectLoggedOut(page); + }); + + await test.step('sign up (with email confirmation), log out, log back in', async () => { + await signUpAndConfirm(page, user1); + await logout(page); + await login(page, user1); + }); + + await test.step('upload a map and land on its page', async () => { + map1Id = await uploadMap(page, MAP_ONE); + await expect(page.getByText(MAP_ONE.artist)).toBeVisible(); + }); + + await test.step('map page shows owner actions for the uploader', async () => { + await expect(page.getByRole('button', { name: 'Delete' })).toBeVisible(); + await expect(page.getByRole('button', { name: 'Reupload' })).toBeVisible(); + }); + + await test.step('favorite and download the map as the owner', async () => { + await favoriteMap(page); + await downloadAndVerify(page, map1Id, MAP_ONE); + }); + + await test.step('homepage lists the new map with 1 favorite', async () => { + await goHome(page); + await searchMaps(page, MAP_ONE.title); + await expect(mapRow(page, map1Id)).toBeVisible(); + await expect(favoritesCell(page, map1Id)).toHaveText('1'); + }); + + await test.step('log out and sign up as a second user', async () => { + await logout(page); + await signUpAndConfirm(page, user2); + }); + + await test.step('second user sees the map and opens it (no owner actions)', async () => { + await goHome(page); + await searchMaps(page, MAP_ONE.title); + await expect(mapRow(page, map1Id)).toBeVisible(); + await mapRow(page, map1Id).locator('a').first().click(); + await page.waitForURL(`**/map/${map1Id}`); + + await expect(page.getByText(MAP_ONE.title)).toBeVisible(); + await expect(page.getByRole('button', { name: 'Delete' })).toHaveCount(0); + await expect(page.getByRole('button', { name: 'Reupload' })).toHaveCount(0); + }); + + await test.step('second user favorites and downloads the map', async () => { + await favoriteMap(page); + await downloadAndVerify(page, map1Id, MAP_ONE); + }); + + await test.step('homepage now shows 2 favorites', async () => { + await goHome(page); + await searchMaps(page, MAP_ONE.title); + await expect(favoritesCell(page, map1Id)).toHaveText('2'); + }); + + await test.step('second user uploads a second, distinct map', async () => { + map2Id = await uploadMap(page, MAP_TWO); + }); + + await test.step('search finds each map by its distinct title', async () => { + await goHome(page); + await searchMaps(page, MAP_ONE.title); + await expect(mapRow(page, map1Id)).toBeVisible(); + await expect(mapRow(page, map2Id)).toHaveCount(0); + + await goHome(page); + await searchMaps(page, MAP_TWO.title); + await expect(mapRow(page, map2Id)).toBeVisible(); + await expect(mapRow(page, map1Id)).toHaveCount(0); + }); + + await test.step('artist / mapper / description filters select the right map', async () => { + for (const [label, value] of [ + ['Artist', MAP_ONE.artist], + ['Mapper', MAP_ONE.mapper], + ['Description', MAP_ONE.description], + ] as const) { + await goHome(page); + await applySimpleFilter(page, label, value); + await expect(mapRow(page, map1Id), `${label} filter should include map one`).toBeVisible(); + await expect(mapRow(page, map2Id), `${label} filter should exclude map two`).toHaveCount(0); + } + }); +}); diff --git a/e2e/helpers/auth.ts b/e2e/helpers/auth.ts new file mode 100644 index 0000000..fb13ba0 --- /dev/null +++ b/e2e/helpers/auth.ts @@ -0,0 +1,70 @@ +import { expect, Page } from '@playwright/test'; +import { getConfirmationLink } from './inbucket'; + +export type TestUser = { + username: string; + email: string; + password: string; +}; + +// Strong, fixed password (zxcvbn-friendly) with no overlap with the generated usernames/emails. +const PASSWORD = 'quartz-meadow-7Vx-galleon'; + +/** A fresh user with a process-unique username/email so re-runs never collide in the persisted DB. */ +export function makeUser(label: string): TestUser { + const unique = `${Date.now().toString(36)}${Math.floor(Math.random() * 1e6).toString(36)}`; + return { + username: `e2e_${label}_${unique}`, + email: `e2e_${label}_${unique}@example.com`, + password: PASSWORD, + }; +} + +export async function expectLoggedIn(page: Page, username: string) { + await expect(page.getByText(`Logged in as ${username}`)).toBeVisible(); +} + +export async function expectLoggedOut(page: Page) { + await expect(page.getByRole('link', { name: 'Login' })).toBeVisible(); +} + +/** + * Signs a brand-new user up through the real form, then completes email confirmation by following + * the link from the local mail catcher. Confirmation establishes a session, so the user lands logged + * in on the home page. + */ +export async function signUpAndConfirm(page: Page, user: TestUser) { + await page.goto('/signup'); + await page.getByLabel('Username').fill(user.username); + await page.getByLabel('Email').fill(user.email); + await page.getByLabel('Password').fill(user.password); + await page.getByRole('button', { name: 'Signup' }).click(); + + // Confirmations are on, so the form routes to the verification notice rather than logging in. + await page.waitForURL('**/signup/email-verification'); + await expect(page.getByText('Email verification needed')).toBeVisible(); + + const confirmLink = await getConfirmationLink(user.email); + // Visiting the link verifies the OTP server-side, sets the session cookies, and redirects to the + // site root - so the user ends up logged in on the home page. + await page.goto(confirmLink); + await page.waitForURL((url) => url.pathname === '/'); + + await expectLoggedIn(page, user.username); +} + +export async function login(page: Page, user: TestUser) { + await page.goto('/login'); + await page.getByLabel('Username/email').fill(user.username); + await page.getByLabel('Password').fill(user.password); + await page.getByRole('button', { name: 'Login' }).click(); + + // The presenter does a full navigation to the home page once the session is set. + await page.waitForURL((url) => url.pathname === '/'); + await expectLoggedIn(page, user.username); +} + +export async function logout(page: Page) { + await page.getByRole('link', { name: 'Logout' }).click(); + await expectLoggedOut(page); +} diff --git a/e2e/helpers/inbucket.ts b/e2e/helpers/inbucket.ts new file mode 100644 index 0000000..53fb920 --- /dev/null +++ b/e2e/helpers/inbucket.ts @@ -0,0 +1,87 @@ +/** + * Reads the signup confirmation email out of Supabase's local mail catcher and returns the + * `/signup/confirm` link, so the E2E flow can complete real email confirmation without SMTP. + * + * Supabase has shipped two different catchers under the `[inbucket]` config over time (Inbucket and, + * more recently, Mailpit) on the same port, with different REST APIs. We try both so the suite works + * regardless of which one the installed CLI bundles. + */ +const MAIL_BASE = process.env.SUPABASE_INBUCKET_URL || 'http://127.0.0.1:54324'; + +const CONFIRM_LINK = /(https?:\/\/[^\s"'<>]*\/signup\/confirm\?[^\s"'<>]*)/; + +function extractConfirmLink(body: string): string | undefined { + const match = body.match(CONFIRM_LINK); + if (!match) { + return undefined; + } + // Email bodies HTML-encode the ampersands between query params; undo that so the link is usable. + return match[1].replace(/&/g, '&'); +} + +async function fetchJson(url: string): Promise { + try { + const resp = await fetch(url); + if (!resp.ok) { + return undefined; + } + return await resp.json(); + } catch { + return undefined; + } +} + +// Mailpit: search by recipient, then fetch the message's rendered bodies. +async function tryMailpit(email: string): Promise { + const search = await fetchJson( + `${MAIL_BASE}/api/v1/search?query=${encodeURIComponent(`to:${email}`)}` + ); + const id = search?.messages?.[0]?.ID; + if (!id) { + return undefined; + } + const message = await fetchJson(`${MAIL_BASE}/api/v1/message/${id}`); + if (!message) { + return undefined; + } + return extractConfirmLink(`${message.HTML ?? ''}\n${message.Text ?? ''}`); +} + +// Inbucket: list the mailbox (named by the local part of the address), then fetch the newest message. +async function tryInbucket(email: string): Promise { + const mailbox = email.split('@')[0]; + const messages = await fetchJson(`${MAIL_BASE}/api/v1/mailbox/${mailbox}`); + if (!Array.isArray(messages) || messages.length === 0) { + return undefined; + } + // Pick the most recent message by date so we're agnostic to the API's list ordering (and pick the + // latest if a confirmation was ever resent). Tolerate lower/upper-case field names across versions. + const at = (m: any) => new Date(m.date ?? m.Date ?? 0).getTime(); + const newest = messages.reduce((a, b) => (at(b) >= at(a) ? b : a)); + const id = newest.id ?? newest.Id; + const message = await fetchJson(`${MAIL_BASE}/api/v1/mailbox/${mailbox}/${id}`); + const body = message?.body; + if (!body) { + return undefined; + } + return extractConfirmLink(`${body.html ?? ''}\n${body.text ?? ''}`); +} + +/** + * Polls the mail catcher until the confirmation email for `email` arrives, returning its + * `/signup/confirm` link. Throws if it never shows up within the timeout. + */ +export async function getConfirmationLink( + email: string, + { timeoutMs = 30_000, intervalMs = 1_000 } = {} +): Promise { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + const link = (await tryMailpit(email)) ?? (await tryInbucket(email)); + if (link) { + return link; + } + await new Promise((r) => setTimeout(r, intervalMs)); + } + throw new Error(`No confirmation email arrived for ${email} within ${timeoutMs}ms`); +} diff --git a/e2e/helpers/maps.ts b/e2e/helpers/maps.ts new file mode 100644 index 0000000..2fee125 --- /dev/null +++ b/e2e/helpers/maps.ts @@ -0,0 +1,67 @@ +import { expect, Locator, Page } from '@playwright/test'; +import { MapFixture } from '../fixtures'; + +/** + * Uploads a map through the real submit flow (presigned PUT to S3 + server-side validation) and + * returns the new map's id, parsed from the post-upload redirect to /map/{id}. + */ +export async function uploadMap(page: Page, fixture: MapFixture): Promise { + await page.goto('/map/submit'); + await page.locator('input[type="file"]').setInputFiles(fixture.zipPath); + await page.getByRole('button', { name: 'Submit' }).click(); + + // On success the presenter routes to the new map page; /map/submit is the only other /map/* path. + await page.waitForURL( + (url) => /^\/map\/[^/]+$/.test(url.pathname) && !url.pathname.endsWith('/submit'), + { + timeout: 60_000, + } + ); + const id = new URL(page.url()).pathname.split('/').pop()!; + await expect(page.getByText(fixture.title)).toBeVisible(); + return id; +} + +/** The home-page table row for a given map, located by its /map/{id} link. */ +export function mapRow(page: Page, id: string): Locator { + return page.locator('tr', { has: page.locator(`a[href="/map/${id}"]`) }); +} + +/** The favorites cell (5th column) of a map's row. */ +export function favoritesCell(page: Page, id: string): Locator { + return mapRow(page, id).locator('td').nth(4); +} + +/** Runs a free-text search from the home page and waits for the results to load. */ +export async function searchMaps(page: Page, query: string) { + await page.getByPlaceholder('Search for a song or artist...').fill(query); + await Promise.all([ + page.waitForResponse((r) => r.url().includes('/api/maps') && r.request().method() === 'GET'), + page.getByRole('button', { name: 'Search' }).click(), + ]); +} + +/** Opens the advanced-filter panel, sets one simple field, and applies the search. */ +export async function applySimpleFilter(page: Page, label: string, value: string) { + if ( + !(await page + .getByLabel(label) + .isVisible() + .catch(() => false)) + ) { + await page.getByRole('button', { name: 'Toggle filters' }).click(); + } + await page.getByLabel(label).fill(value); + await Promise.all([ + page.waitForResponse((r) => r.url().includes('/api/maps') && r.request().method() === 'GET'), + page.getByRole('button', { name: 'Search' }).click(), + ]); +} + +/** Resets the home page to a clean, unfiltered state. */ +export async function goHome(page: Page) { + await page.goto('/'); + await page.waitForResponse( + (r) => r.url().includes('/api/maps') && r.request().method() === 'GET' + ); +} diff --git a/e2e/helpers/zip.ts b/e2e/helpers/zip.ts new file mode 100644 index 0000000..1696d30 --- /dev/null +++ b/e2e/helpers/zip.ts @@ -0,0 +1,22 @@ +import { expect } from '@playwright/test'; +import * as unzipper from 'unzipper'; +import { MapFixture } from '../fixtures'; + +/** + * Asserts a downloaded map zip is the one we uploaded: it opens as a valid archive, contains every + * expected file entry, and its .rlrr still carries the fixture's title. The download path stores and + * serves the uploaded bytes verbatim, so this round-trips the whole upload -> S3 -> download flow. + */ +export async function assertZipMatchesFixture(zipBuffer: Buffer, fixture: MapFixture) { + const directory = await unzipper.Open.buffer(zipBuffer); + const filePaths = directory.files.filter((f) => f.type === 'File').map((f) => f.path); + + for (const entry of fixture.expectedEntries) { + expect(filePaths, `downloaded zip should contain ${entry}`).toContain(entry); + } + + const rlrr = directory.files.find((f) => f.path.endsWith('.rlrr')); + expect(rlrr, 'downloaded zip should contain a .rlrr').toBeTruthy(); + const metadata = JSON.parse((await rlrr!.buffer()).toString()); + expect(metadata.recordingMetadata.title).toBe(fixture.title); +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..f3cdfb4 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "//": "Standalone config for the Playwright E2E sources. Kept out of the app tsconfig (which only includes src/) so these test-only files never enter the Next/Vercel build, while still being type-checkable on their own and picked up by Playwright's loader.", + "extends": "../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "module": "commonjs", + "moduleResolution": "node", + "types": ["node"], + "noEmit": true, + "plugins": [] + }, + "include": ["**/*.ts", "../playwright.config.ts"] +} diff --git a/package.json b/package.json index 3de0314..0739277 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,14 @@ "build": "sudo docker compose -f docker/docker-compose.yml --env-file .env build", "start": "sudo docker compose -f docker/docker-compose.yml --env-file .env up --build", "typecheck": "bun tsc", + "typecheck:e2e": "bun tsc -p e2e/tsconfig.json", "lint": "eslint .", "format": "prettier . --write", "schema": "tools/update_schema.sh", "test": "bun run test:unit", "test:unit": "bun jest --config jest.config.unit.ts", - "test:integration": "dotenv -e .env.test -- bash tools/test.sh" + "test:integration": "dotenv -e .env.test -- bash tools/test.sh", + "test:e2e": "dotenv -e .env.e2e -- bash tools/e2e.sh" }, "dependencies": { "@aws-sdk/client-s3": "^3.958.0", @@ -65,6 +67,7 @@ "@babel/plugin-syntax-typescript": "^7.28.6", "@electric-sql/pglite": "^0.4.6", "@electric-sql/pglite-socket": "^0.1.6", + "@playwright/test": "^1.60.0", "@types/jest": "^29.5.5", "@types/pg": "^8.10.2", "@types/postcss-modules-values": "^4", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..b454715 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,40 @@ +import { defineConfig, devices } from '@playwright/test'; + +const baseURL = process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; + +/** + * Full-stack E2E config. These tests need the real Supabase stack + Minio already running and the + * env from .env.e2e (both orchestrated by tools/e2e.sh / `bun run test:e2e`). Playwright itself only + * boots the Next dev server via `webServer`. + * + * The suite is a single stateful user journey (one user uploads, a second sees it), so it runs + * serially in one worker with no retries - a retry would replay signups and duplicate state. + */ +export default defineConfig({ + testDir: './e2e', + testMatch: '**/*.e2e.ts', + tsconfig: './e2e/tsconfig.json', + fullyParallel: false, + workers: 1, + retries: 0, + // Generous per-test budget: the journey polls Inbucket for the confirmation email and does real + // uploads/downloads against S3. + timeout: 120_000, + expect: { timeout: 15_000 }, + forbidOnly: !!process.env.CI, + reporter: process.env.CI ? [['list'], ['html', { open: 'never' }]] : 'list', + use: { + baseURL, + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + }, + projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }], + webServer: { + command: 'bun next dev', + url: baseURL, + reuseExistingServer: !process.env.CI, + timeout: 120_000, + stdout: 'pipe', + stderr: 'pipe', + }, +}); diff --git a/src/ui/base/textbox/textbox.tsx b/src/ui/base/textbox/textbox.tsx index 8af1206..dc37283 100644 --- a/src/ui/base/textbox/textbox.tsx +++ b/src/ui/base/textbox/textbox.tsx @@ -36,6 +36,9 @@ export const Textbox = (props: TextboxProps) => { const inputProps = { className: styles.textbox, type: props.inputType || 'text', + // Associate the visible label with the control for assistive tech (the label is rendered as a + // sibling span, not a