Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
f0a7c5a
test(e2e): add Workplace App settings coverage (36 settings, 71 scena…
sharmilaseenivasan17 Oct 20, 2026
4074e93
test(e2e): expand Workplace App settings coverage (11 settings, 21 sc…
sharmilaseenivasan17 Oct 20, 2026
8a33e55
test(e2e): add Landing settings coverage (3 settings, 3 scenarios)
sharmilaseenivasan17 Oct 20, 2026
6709a90
test(e2e): add Landing settings coverage (3 settings, 4 scenarios)
sharmilaseenivasan17 Oct 20, 2026
422a433
test(e2e): expand settings coverage (21 settings, 43 scenarios)
sharmilaseenivasan17 Oct 20, 2026
ddadb20
test(e2e): add Desk Booking settings coverage (11 settings, 23 scenar…
sharmilaseenivasan17 Oct 20, 2026
3534a22
test(e2e): expand settings coverage (10 settings, 20 scenarios)
sharmilaseenivasan17 Oct 21, 2026
4cdbd60
test(e2e): cover 10 additional workplace settings
sharmilaseenivasan17 Oct 21, 2026
5c4bc0f
test(e2e): add 12 workplace settings coverage specs
sharmilaseenivasan17 Oct 21, 2026
5f5f7ec
test(workplace): remove stale imports from visitor settings specs
sharmilaseenivasan17 Oct 21, 2026
13d4492
test(workplace): clean up outdated settings test status comments
sharmilaseenivasan17 Oct 21, 2026
d36d8a7
test(workplace): cover room booking recurrence and availability settings
sharmilaseenivasan17 Oct 22, 2026
a4979f8
test(e2e): cover room booking no standalone (1 setting, 1 scenario)
sharmilaseenivasan17 Oct 22, 2026
9142b0d
test(e2e): verify landing and explore colour settings
sharmilaseenivasan17 Oct 22, 2026
8a6f0f7
docs(e2e): record verified coverage (4 settings, 7 scenarios)
sharmilaseenivasan17 Oct 22, 2026
14fe543
test(e2e): cover concierge and parking settings (10 settings, 19 scen…
sharmilaseenivasan17 Oct 22, 2026
0659d70
test(e2e): cover 18 workplace settings (30 scenarios)
sharmilaseenivasan17 Oct 22, 2026
5378031
test(e2e): cover 7 unique Settings and 20 scenarios
sharmilaseenivasan17 Oct 26, 2026
1fc63f0
test(e2e): cover 6 unique Settings and 12 scenarios
sharmilaseenivasan17 Oct 26, 2026
15f5f36
test(e2e): cover 2 unique Settings and 4 scenarios
sharmilaseenivasan17 Oct 26, 2026
a82f04d
test(e2e): cover 6 unique Settings and 12 scenarios
sharmilaseenivasan17 Oct 27, 2026
8c45ed3
test(e2e): cover 6 unique Settings and 12 scenarios
sharmilaseenivasan17 Oct 27, 2026
9b802e2
test(e2e): cover 4 unique Settings and 8 scenarios
sharmilaseenivasan17 Oct 27, 2026
db9ff42
test(e2e): cover 7 unique Settings and 14 scenarios
sharmilaseenivasan17 Oct 27, 2026
9d14477
test(e2e): cover 3 unique Settings and 6 scenarios
sharmilaseenivasan17 Oct 27, 2026
41ac6a7
Merge remote-tracking branch 'origin/develop' into test/e2e-workplace…
sharmilaseenivasan17 Oct 27, 2026
99f8ac6
test(e2e): cover 2 unique Settings and 4 scenarios
sharmilaseenivasan17 Oct 27, 2026
e657539
test(e2e): address PR #595 review feedback for Workplace settings
sharmilaseenivasan17 Oct 28, 2026
b66f6e2
test(e2e): share the Workplace settings test harness
sharmilaseenivasan17 Oct 28, 2026
324424a
test(e2e): address remaining PR #595 review feedback for Workplace se…
sharmilaseenivasan17 Oct 29, 2026
6be84e5
test(e2e): cover 11 unique Settings and 22 scenarios for Workplace
sharmilaseenivasan17 Oct 29, 2026
2f6fd46
test(e2e): update test and QA reports; 214 unique Settings, 417 scena…
sharmilaseenivasan17 Oct 30, 2026
5c4f0bd
Merge remote-tracking branch 'origin/develop' into pr595-fixes
camreeves Oct 30, 2026
47b6463
test(e2e): cover the desks.has_assets override in bookings.has-assets
camreeves Oct 30, 2026
005490c
test(e2e): assert parking settings override their bookings keys
camreeves Oct 30, 2026
d057928
test(e2e): assert desk settings override their bookings keys
camreeves Oct 30, 2026
237e4e1
test(e2e): assert lockers.disabled_date_select locks the date and times
camreeves Oct 30, 2026
0a714d9
test(e2e): cover Daily then Doesn't repeat for daily all-day recurrence
camreeves Oct 30, 2026
d0769bd
test(e2e): split the closing-time start into its own bookable_hours case
camreeves Oct 30, 2026
1a6021c
test(e2e): expect no Show Devices toggle when explore.disable has dev…
camreeves Oct 30, 2026
a754949
chore(e2e): update the settings QA status for the review fixes
camreeves Oct 30, 2026
2382841
test(e2e): share one staff token fixture across the read-only setting…
camreeves Oct 30, 2026
f1f9e08
test(e2e): move the browser-only settings harness into settings-harness
camreeves Oct 30, 2026
99db6c1
chore(e2e): run the browser-only settings specs in their own project
camreeves Oct 30, 2026
4e6b713
ci(e2e): give the workplace e2e job 75 minutes beside the native wait
camreeves Oct 30, 2026
2a1457c
test(e2e): expect develop's desk time controls and exact bookable_hou…
camreeves Oct 30, 2026
27c17d2
test(e2e): give the settings harness one parameterised helper per cop…
camreeves Oct 30, 2026
efa9197
test(e2e): record a blocked settings request without closing the context
camreeves Oct 30, 2026
4c8292f
test(e2e): move the small parking request specs onto the settings har…
camreeves Oct 30, 2026
625389a
test(e2e): move the visitor invite settings specs onto the settings h…
camreeves Oct 30, 2026
e3378b0
chore(e2e): mark VIS-20 covered now the international tick is tested
camreeves Oct 30, 2026
6f05648
test(e2e): move the locker settings specs onto the shared harness
camreeves Oct 30, 2026
637f0d1
test(e2e): use the harness openDesk in the desk duration and auto-all…
camreeves Oct 30, 2026
9a19ebf
test(e2e): cover desks.allow_time_changes true beside the false case
camreeves Oct 30, 2026
1ee76dc
test(e2e): make force_current_user_for_booking_rules true able to fail
camreeves Oct 30, 2026
3254e41
chore(e2e): drop drafting notes from the browser-only explore headers
camreeves Oct 30, 2026
22b3a20
test(e2e): run the check-in settings specs on the harness, with no cl…
camreeves Oct 30, 2026
2ec85c2
test(e2e): give height-enabled and desk use-building-timezone the har…
camreeves Oct 30, 2026
940e908
test(e2e): move the schedule settings specs onto the shared harness
camreeves Oct 30, 2026
7b6c55c
test(e2e): move bookings.has-assets onto prepareSettings
camreeves Oct 30, 2026
07964ed
test(e2e): move the room meeting-options specs onto migrationAuditFor
camreeves Oct 30, 2026
288c464
test(e2e): check only the setting's fields in the strict room meeting…
camreeves Oct 30, 2026
10eb2cf
test(e2e): move the synthetic-organisation room specs onto syntheticO…
camreeves Oct 30, 2026
6625a59
test(e2e): make the room duration, timezone and host specs fail when …
camreeves Oct 30, 2026
333d277
test(e2e): cover assigned_resource_booking other_only and the new des…
camreeves Oct 30, 2026
8a73413
test(e2e): move desks.show_users onto the harness and serve one booki…
camreeves Oct 30, 2026
6004212
test(e2e): move the small parking booking specs onto the settings har…
camreeves Oct 30, 2026
da8abfe
test(e2e): build the larger parking booking specs from the harness fi…
camreeves Oct 30, 2026
b39af05
test(e2e): build the larger parking request specs from the harness fi…
camreeves Oct 30, 2026
17a7ebd
test(e2e): build the Explore settings specs from the harness fixtures
camreeves Oct 30, 2026
0485dc1
test(e2e): use the DeskFlow page object for the desk mode and locker …
camreeves Oct 30, 2026
51b0d03
test(e2e): build the general landing presentation specs on the shared…
camreeves Oct 30, 2026
5d93feb
test(e2e): move the remaining general settings specs onto the shared …
camreeves Oct 30, 2026
029806f
test(e2e): build the landing settings specs on the shared harness
camreeves Oct 30, 2026
8c93dbe
test(e2e): drop the 120 s timeout from the idle_timeout spec
camreeves Oct 30, 2026
79dfdc5
chore(e2e): format the general, landing, directory and chat settings …
camreeves Oct 30, 2026
cf48198
ci(e2e): run the settings suite in its own project, nightly
camreeves Oct 30, 2026
0396c0c
test(e2e): restore the 120 s timeout on the settings specs that had one
camreeves Oct 30, 2026
5faf86d
test(e2e): start the show-waitlist row in the future again
camreeves Oct 30, 2026
618595a
test(e2e): count only the parking type GETs in the hide-checkin fixtu…
camreeves Oct 30, 2026
75f48cb
test(e2e): assert the collapsed legend carries the hidden class again
camreeves Oct 30, 2026
0812479
test(e2e): say what NOW_MS guarantees in visitors-allow-editing
camreeves Oct 30, 2026
abfc4ea
test(e2e): share one identity-based meeting submission helper
camreeves Oct 30, 2026
d63f3a5
test(e2e): give the harness an all-socket audit and move six specs on…
camreeves Oct 30, 2026
382ec02
test(e2e): drop the unused Route and ORIGINS imports from catering-pr…
camreeves Oct 30, 2026
5f89836
ci(e2e): make the webServer timeout configurable, 15 min in settings-…
camreeves Oct 30, 2026
0726077
test(e2e): name the closing-time bookable_hours cases as current beha…
camreeves Oct 30, 2026
f7e11ff
test(e2e): keep setup failures out of the parking use_building_timezo…
camreeves Oct 30, 2026
e8d50fb
docs(qa): match the settings status to --list and the 30 Oct run
camreeves Oct 30, 2026
8df492c
chore(e2e): describe what the settings comments do, not why
camreeves Oct 30, 2026
cdbbbb5
style(e2e): format the chat and parking timezone settings specs
camreeves Oct 30, 2026
6d486a1
perf(e2e): pause the animated page background in every browser context
MrYuion Oct 31, 2026
0f6daca
test(e2e): wait for the rendered calendar, drawer and modal before ac…
MrYuion Oct 31, 2026
f50782c
ci(e2e): run the workplace suite on six workers
MrYuion Oct 31, 2026
3712ecd
perf(mocks): remove duplicate mock events with a set
MrYuion Oct 31, 2026
7eef4af
test(e2e): ignore closed-target errors from teardown in the settings …
MrYuion Oct 31, 2026
e3fec64
docs(e2e): record six CI workers and the shorter settings run
MrYuion Oct 31, 2026
878f931
test(e2e): clarify control socket refusal diagnostics
sharmilaseenivasan17 Nov 2, 2026
a5a7651
fix(e2e): disable Workplace HMR for CI stability (18 unique Settings,…
sharmilaseenivasan17 Nov 3, 2026
cb0cb2e
Merge develop into test/e2e-workplace-settings
camreeves Nov 3, 2026
07dcd27
test(e2e): update settings specs for develop's booking time and desk …
camreeves Nov 3, 2026
53e1b5c
ci(e2e): run the browser-only settings job on ubuntu-24.04
camreeves Nov 3, 2026
1906bbd
fix(e2e): harden settings harness teardown and split browser-only spe…
MrYuion Nov 3, 2026
2db5cef
style(e2e): format dense settings specs with Prettier
MrYuion Nov 3, 2026
345aeb7
test(e2e): move show_presence_indicators onto the browser-only harness
sharmilaseenivasan17 Nov 3, 2026
2e9a3f4
test(e2e): cover desks and lockers use_building_timezone overriding b…
sharmilaseenivasan17 Nov 3, 2026
64ed100
docs(e2e): update QA doc counts for the PPT-2871 override cases (445 …
sharmilaseenivasan17 Nov 3, 2026
3480ebc
Fix formatting in workplace settings status document
sharmilaseenivasan17 Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 139 additions & 7 deletions .github/workflows/e2e-advisory.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ concurrency:
permissions:
contents: read

# Which Playwright projects run on which trigger:
# push, schedule, workflow_dispatch `local` and `mock` (job `workplace`)
# schedule, workflow_dispatch also `settings` (job `workplace`, own step)
# push, schedule, workflow_dispatch `settings-browser` (job `settings-browser`,
# GitHub-hosted, no stack)
jobs:
workplace:
# The job name is what appears in the commit's Checks list, next to the
Expand All @@ -93,16 +98,21 @@ jobs:
# To fall back to GitHub-hosted, set `runs-on: ubuntu-latest` and restore
# the `Raise vm.max_map_count` step (see below).
runs-on: [self-hosted, placeos-e2e]
# Includes up to 120 minutes waiting for the native e2e job (see "Wait for
# the native e2e job to finish").
timeout-minutes: 165
# 120 minutes waiting for the native e2e job (see "Wait for the native e2e
# job to finish"), 45 for setup, the stack and the `local` and `mock`
# tests, and 60 for the `settings` step's own timeout on scheduled and
# manual runs.
timeout-minutes: 225
env:
E2E_BACKEND_URL: https://localhost:9443
# The runner is a 12-core, 16 GB Mac that also hosts the stack's
# containers, the Angular dev server and the browsers. Seeding reads
# this too (one staff user, desk and room set per worker), so it must
# be the same here as in the test step.
E2E_WORKERS: '4'
# be the same here as in the test step. Six workers became faster
# than four once the specs paused the animated page background
# (e2e/support/background.ts); before that the browsers used all
# the CPU.
E2E_WORKERS: '6'
TZ: 'Etc/UTC'
steps:
# persist-credentials: false — checkout otherwise leaves the token in
Expand Down Expand Up @@ -151,6 +161,8 @@ jobs:
- name: Reclaim the machine from any previous run
run: |
e2e/stack/down.sh --volumes || true
# The `settings` step's reports, which a push run does not rewrite.
rm -rf reports/e2e/workplace-settings reports/e2e/workplace-settings-results.json
# Playwright refuses to start its webServer if 4214 is held.
lsof -nP -iTCP:4214 -sTCP:LISTEN -t 2>/dev/null | xargs -r kill -9 || true
# Images the previous run's pull replaced. A running stack's images
Expand Down Expand Up @@ -260,11 +272,37 @@ jobs:
} >> "$GITHUB_STEP_SUMMARY"

- name: Run workplace e2e
run: bunx playwright test --config apps/workplace/playwright.config.ts
id: local
run: bunx playwright test --config apps/workplace/playwright.config.ts --project=local --project=mock

# The Workplace settings suite: about 400 tests, about 12 minutes on
# this machine with six workers. Scheduled and manual runs only. It
# also runs after a failed `local` step, but not when that step was
# skipped (the stack never came up).
#
# The PLAYWRIGHT_* variables and --output move this run's reports and
# test artifacts away from the `local` run's, which Playwright would
# otherwise overwrite.
- name: Run workplace settings e2e
id: settings
if: ${{ !cancelled() && steps.local.outcome != 'skipped' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }}
timeout-minutes: 60
env:
PLAYWRIGHT_HTML_OUTPUT_DIR: reports/e2e/workplace-settings
PLAYWRIGHT_JSON_OUTPUT_FILE: reports/e2e/workplace-settings-results.json
run: >-
bunx playwright test --config apps/workplace/playwright.config.ts
--project=settings --output=dist/.playwright/workplace-settings

- name: Summarise results
if: ${{ always() }}
run: node e2e/stack/ci-summary.mjs >> "$GITHUB_STEP_SUMMARY"
env:
SETTINGS_OUTCOME: ${{ steps.settings.outcome }}
run: |
node e2e/stack/ci-summary.mjs >> "$GITHUB_STEP_SUMMARY"
if [ "$SETTINGS_OUTCOME" != skipped ]; then
node e2e/stack/ci-summary.mjs reports/e2e/workplace-settings-results.json 'workplace settings e2e' >> "$GITHUB_STEP_SUMMARY"
fi

# Collect EVERY service, not a hand-picked list. The first run failed
# in Elasticsearch — which was not on the list — so the log that
Expand All @@ -289,6 +327,8 @@ jobs:
path: |
reports/e2e/workplace
reports/e2e/workplace-results.json
reports/e2e/workplace-settings
reports/e2e/workplace-settings-results.json
retention-days: 14
if-no-files-found: warn

Expand Down Expand Up @@ -359,3 +399,95 @@ jobs:
--header 'Content-Type: application/json' \
--data @- \
"$STATUS_URL"

# The settings specs that answer every request in the browser. They need the
# Workplace dev server but no PlaceOS stack, so this job runs on a
# GitHub-hosted runner beside the self-hosted one.
settings-browser:
name: 'workplace settings e2e, browser only (advisory, does not block builds)'
# The pinned Playwright has no Chromium build for ubuntu-latest (26.04).
runs-on: ubuntu-24.04
timeout-minutes: 30
env:
TZ: 'Etc/UTC'
# The config's webServer timeout, in ms: how long Playwright waits
# for `nx serve workplace` to answer.
E2E_WEBSERVER_TIMEOUT_MS: '900000'
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false

# Same bun version as the `workplace` job, build.yml and pull-request.yml.
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: '1.4.3'

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Setup version
run: bun run postinstall

- name: Install Playwright browser
run: bunx playwright install --with-deps chromium

# Playwright starts the Workplace dev server itself (the config's
# webServer). Its API proxy points at a backend that does not exist
# here; the specs answer those requests in the browser.
- name: Run workplace settings e2e (browser only)
run: bunx playwright test --config apps/workplace/playwright.config.ts --project=settings-browser

- name: Summarise results
if: ${{ always() }}
run: node e2e/stack/ci-summary.mjs reports/e2e/workplace-results.json 'workplace settings e2e, browser only' >> "$GITHUB_STEP_SUMMARY"

- name: Upload Playwright report
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: playwright-report-workplace-settings-browser
path: |
reports/e2e/workplace
reports/e2e/workplace-results.json
retention-days: 14
if-no-files-found: warn

- name: Upload failure artifacts
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: playwright-failures-workplace-settings-browser
path: dist/.playwright
retention-days: 14
if-no-files-found: warn

# The same notification as the `workplace` job's "Notify on failure".
- name: Notify on failure
if: ${{ failure() }}
continue-on-error: true
env:
STATUS_URL: ${{ secrets.STATUS_URL }}
CHAT_URL: ${{ secrets.CHAT_URL }}
REPO: ${{ github.repository }}
COMMIT: ${{ github.sha }}
BRANCH: ${{ github.ref_name }}
RUN_ID: ${{ github.run_id }}
run: |
node -e '
process.stdout.write(JSON.stringify({
chat_url: process.env.CHAT_URL,
name: process.env.REPO,
commit: process.env.COMMIT,
branch: process.env.BRANCH,
url: `https://github.com/${process.env.REPO}/actions/runs/${process.env.RUN_ID}`,
pipeline_name: "e2e settings-browser (advisory): FAILED",
status: "failure",
}));
' \
| curl --silent --show-error --fail \
--max-time 30 \
--header 'Content-Type: application/json' \
--data @- \
"$STATUS_URL"
15 changes: 7 additions & 8 deletions E2E_USER_STORIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ was built in. Extending there is a separate piece of work, not an oversight.
| VIS-17 | P1 | Declining that confirmation leaves the invite alone. | **done** — `local/visitor-cancel.spec.ts`. A dialog whose decline button also deletes is worse than one that fails to delete, and only this catches it. |
| VIS-18 | P1 | An address that is not an email is refused **before anything is sent**. | **done** — `local/visitor-validation.spec.ts`. Asserts on the network, not on a message: the backend stores whatever it is given, so the form is the only guard. Includes a control that a valid address does send. |
| VIS-19 | P2 | A visitor taken off the list before sending is not invited, and the rest still are. | **done** — `local/visitor-validation.spec.ts` |
| VIS-20 | P2 | A pass number and the international-visitor flag are stored with the invite. | **partial** — `local/visitor-details.spec.ts`. The pass number is stored. The international flag is `test.fixme`: with `visitors.allow_international` on, the new invite flow has no control for it and sends `international: false`. |
| VIS-20 | P2 | A pass number and the international-visitor flag are stored with the invite. | **done**: `local/visitor-details.spec.ts`. With `visitors.allow_international` on, the invite flow shows an international checkbox for a named visitor, and the tick is stored as `extension_data.international`. |
| VIS-21 | P2 | The company is stored, and the separate guest record carries the visitor's name. | **done** — `local/visitor-details.spec.ts`. The guest record is what reception reads and it outlives the booking. |
| VIS-22 | P1 | The start time and length chosen on the form are the ones stored. | **done** — `local/visitor-times.spec.ts`. Everything else here takes the default hour, so a form that ignored the picker would have passed the whole suite. |
| VIS-23 | P2 | A maximum visit length and bookable hours limit what the form offers. | **done** — `local/visitor-times.spec.ts`. Asserts on the options offered, because an out-of-range choice is absent rather than refused. Red-checked: without the settings the form offers 240 minutes against a 60 minute cap. |
Expand Down Expand Up @@ -287,8 +287,8 @@ PR #561 changed the components that these routes open:
assertions. `desk-flow.page.ts`, `meeting-flow.page.ts`, `invite-form.page.ts`,
`landing-new.page.ts` and `your-bookings.page.ts` are the page objects of the new views. The
page objects of the replaced views are deleted.
- **Four stories are blocked by the new views** and are `test.fixme`. They are in the table
"Blocked by the new views" below.
- **Four stories were blocked by the new views** and were `test.fixme`. The ones still blocked
are in the table "Blocked by the new views" below.
- **Six rows that were blocked on the replaced flows now pass**: ROOM-11, ROOM-13, ROOM-14,
ROOM-21, ROOM-22 and VIS-15.
- **After the move, a full local run of 161 tests has 154 passes, 7 `fixme` and no failure**
Expand Down Expand Up @@ -358,12 +358,11 @@ of WP-E2E-05, and its two checks of the success view are now in that test.

### Blocked by the new views

Each of these is `test.fixme` with the measurement in its comment. The first two passed on the
views before PR #561.
Each of these is `test.fixme` with the measurement in its comment. The first passed on the views
before PR #561.

| ID | Story | What blocks it |
|----|-------|----------------|
| VIS-20 (half) | The international-visitor flag is stored with the invite. | With `visitors.allow_international` on, the new invite flow has no control for the flag and sends `international: false`. |
| ROOM-28 | A meeting booked for a colleague is stored with that colleague as the host. | The new meeting flow cannot name a colleague on this stack. `events.can_book_for_anyone` renders no host field. `events.can_book_for_others` renders a select that is filled from `GET /calendars`, which answers `500` without a calendar tenant, so the select holds only the signed-in user. |
| NEW-DESK-03 | A desk can be selected when another desk of the building has no `features` list. | `desk-flow-select.component.ts` calls `.trim()` on the features of every desk with no guard. One desk without the list throws `TypeError: Cannot read properties of undefined (reading 'trim')`, and after that no row of the list shows as selected. The earlier flow read the list through `BookingFormService.features`, which has the guard. |

Expand Down Expand Up @@ -518,8 +517,8 @@ nothing, so the broker keeps its last value. source would need redis keyspace no
or through `use_bookings`?** Nobody has answered it. If the answer is "the calendar", the
green rows in §1b guard a path those customers never take. This needs a product answer, not more
specs.
- **Five rows are blocked on product fixes, not on test effort** (REG-08, REG-09, the
international half of VIS-20, ROOM-28 and NEW-DESK-03). The last three are gaps or faults of
- **Four rows are blocked on product fixes, not on test effort** (REG-08, REG-09, ROOM-28 and
NEW-DESK-03). The last two are gaps or faults of
the views that PR #561 made the default; §1c has them. All were found by this suite. Leaving
them visible here is the point — a blocked row is coverage information, a deleted row is not.
- **One row is blocked by the environment rather than by a bug** (AUTH-E2E-08), and it says
Expand Down
7 changes: 7 additions & 0 deletions apps/workplace/e2e/fixtures.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { test as base, expect } from '@playwright/test';
import { pauseBackground } from '../../../e2e/support/background';

/**
* Shared Playwright fixtures for the Workplace e2e suite.
Expand All @@ -16,8 +17,14 @@ import { test as base, expect } from '@playwright/test';
* Setting localStorage via `addInitScript` (before any app script runs) is
* therefore required for the app to be functional offline in tests. This
* fixture applies it to every test/page automatically.
*
* The context also pauses the animated page background (see background.ts).
*/
export const test = base.extend({
context: async ({ context }, use) => {
await pauseBackground(context);
await use(context);
},
page: async ({ page }, use) => {
await page.addInitScript(() =>
window.localStorage.setItem('mock', 'true'),
Expand Down
2 changes: 2 additions & 0 deletions apps/workplace/e2e/local/bookings-empty.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { type BrowserContext } from '@playwright/test';
import { apiFor, currentUser, ENGINE_API } from '../../../../e2e/support/api';
import { calendarBacked } from '../../../../e2e/support/calendar/calendar.api';
import { buildStorageState, mintToken } from '../../../../e2e/support/auth';
import { pauseBackground } from '../../../../e2e/support/background';
import { APP_URL, BACKEND_URL } from '../../../../e2e/support/env';
import { test as base, expect } from '../../../../e2e/support/fixtures';
import { SCHEDULE_DAYS, slotOn } from '../../../../e2e/support/bookings/bookings.env';
Expand Down Expand Up @@ -60,6 +61,7 @@ const test = base.extend({
context = await browser.newContext({
storageState: buildStorageState(token, APP_URL),
});
await pauseBackground(context);
await use(await context.newPage());
} finally {
testInfo.setTimeout(testInfo.timeout + 30_000);
Expand Down
2 changes: 2 additions & 0 deletions apps/workplace/e2e/local/bookings-limit.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
uniqueTitle,
} from '../../../../e2e/support/api';
import { buildStorageState, mintToken } from '../../../../e2e/support/auth';
import { pauseBackground } from '../../../../e2e/support/background';
import {
createBookingViaApi,
releaseFor,
Expand Down Expand Up @@ -84,6 +85,7 @@ test.describe('your bookings — high cancelled history', () => {
context = await browser.newContext({
storageState: buildStorageState(token, APP_URL),
});
await pauseBackground(context);
const page = await context.newPage();
page.on('response', async (response) => {
if (!response.url().includes(`${STAFF_API}/bookings`)) return;
Expand Down
2 changes: 2 additions & 0 deletions apps/workplace/e2e/local/visitor-delegate.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import {
listBookings,
uniqueTitle,
} from '../../../../e2e/support/api';
import { pauseBackground } from '../../../../e2e/support/background';
import { WORKERS, roleFor, staffEmail } from '../../../../e2e/support/env';
import { VISITOR_SLOTS, visitorFor } from '../../../../e2e/support/visitor/visitor.env';
import { deleteGuest, releaseVisitor } from '../../../../e2e/support/visitor/visitor.api';
Expand Down Expand Up @@ -176,6 +177,7 @@ test.describe('visitor invite on behalf of another host', () => {
storageState: host.role.storagePath,
ignoreHTTPSErrors: true,
});
await pauseBackground(host_ctx);
const host_page = await host_ctx.newPage();
try {
const theirs = new YourBookingsPage(host_page);
Expand Down
24 changes: 8 additions & 16 deletions apps/workplace/e2e/local/visitor-details.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,11 @@
* The pass number is behind `visitors.allow_pass_number`, off by default — the
* classic "only breaks for the customers who switched it on" shape.
*
* ## Three tests, and one of them is `fixme`
* ## Three tests
*
* The pass number and the international tick were one test (VIS-20) while the
* old form had both controls. The `visitor-flow-new` page has no control for
* the tick, so the two are split: the pass number stays covered, and the tick
* waits as `fixme`. See the note on that test.
* old form had both controls. They were split when the `visitor-flow-new` page
* lacked the tick; the page has it again, so each is now its own test.
*/
import { test, expect } from '../../../../e2e/support/fixtures';
import { deleteBooking, getBooking, uniqueTitle } from '../../../../e2e/support/api';
Expand Down Expand Up @@ -85,19 +84,12 @@ test.describe('visitor invite details', () => {
});

/**
* The other half of VIS-20. `fixme`, because the `visitor-flow-new` page
* has no control for the international tick.
*
* Measured with `visitors.allow_international` on: the page renders no
* `input[name$=".international"]` (count 0), and the invite it sends has
* `extension_data.international: false`. No file under `visitor-flow-new`
* reads the setting. The old form (`invite-visitor-form`) rendered the
* checkbox, but `/book/visitor` no longer opens that form.
*
* Written as it should pass once the page has the control. It fails today
* at `setCheckbox`, with "the checkbox is not on the page".
* The other half of VIS-20. With `visitors.allow_international` on,
* `visitor-flow-invites` shows a per-visitor international checkbox once a
* visitor is named; in single mode it is bound to the form's
* `international` field, so it renders as `input[name$=".international"]`.
*/
test.fixme('the international flag is stored with the invite', async ({
test('the international flag is stored with the invite', async ({
staffPage,
staffApi,
}, testInfo) => {
Expand Down
Loading
Loading