Compare commits

...
Author SHA1 Message Date
Jeppe Bundgaard 398045b519 Merge remote-tracking branch 'origin/master' into codex/github-hosted-test-runners
# Conflicts:
#	.github/workflows/tests.yml
#	tests/e2e/self-serve-wash.spec.js
#	tests/unit/playwright-full-workflow.spec.js
2026-07-06 22:37:52 +02:00
Jeppe Bundgaard bfb1386d49 Merge remote-tracking branch 'origin/master' into codex/github-hosted-test-runners
# Conflicts:
#	.github/workflows/tests.yml
#	src/i18n/generated/de-v2.json
#	src/i18n/generated/global-v2.json
#	src/i18n/generated/no-v2.json
#	src/i18n/generated/sv-v2.json
#	src/i18n/source/de/phrases/compat/departments/index.json
#	src/i18n/source/de/phrases/compat/objects/index.json
#	src/i18n/source/de/phrases/compat/vehicles/index.json
#	src/i18n/source/global/shared/superuser_dashboard/index.json
#	src/i18n/source/no/phrases/compat/departments/index.json
#	src/i18n/source/no/phrases/compat/objects/index.json
#	src/i18n/source/no/phrases/compat/vehicles/index.json
#	src/i18n/source/sv/phrases/compat/departments/index.json
#	src/i18n/source/sv/phrases/compat/objects/index.json
#	src/i18n/source/sv/phrases/compat/vehicles/index.json
#	tests/e2e/self-serve-wash.spec.js
#	tests/unit/playwright-full-workflow.spec.js
2026-07-06 22:35:31 +02:00
Jeppe Bundgaard e495a099e4 Gate full E2E on focused regressions 2026-07-06 22:30:39 +02:00
Jeppe Bundgaard c4e29a896a Stabilize release assignment E2E selection 2026-07-06 21:26:16 +02:00
Jeppe Bundgaard 9f7ebad5fe Fix hosted full E2E i18n failures 2026-07-06 20:16:16 +02:00
Jeppe Bundgaard 98d0fbc8c9 Merge remote-tracking branch 'origin/master' into codex/github-hosted-test-runners
# Conflicts:
#	.github/workflows/tests.yml
2026-07-06 19:31:21 +02:00
Jeppe Bundgaard fef1fc3c12 Allow hosted runners for manual frontend tests 2026-07-06 19:26:28 +02:00
3 changed files with 12 additions and 5 deletions
+6
View File
@@ -350,6 +350,10 @@ async function readStoredToken(page: Page) {
} }
} }
async function waitForAppRootMounted(page: Page) {
await expect.poll(async () => page.locator("#app > *").count(), { timeout: AUTH_TIMEOUT }).toBeGreaterThan(0);
}
async function settleAuthenticatedNavigation(page: Page, targetPath: string, targetUrl: RegExp) { async function settleAuthenticatedNavigation(page: Page, targetPath: string, targetUrl: RegExp) {
await expect.poll(() => readStoredToken(page), { timeout: AUTH_TIMEOUT }).not.toBeNull(); await expect.poll(() => readStoredToken(page), { timeout: AUTH_TIMEOUT }).not.toBeNull();
const navigateToTarget = async () => { const navigateToTarget = async () => {
@@ -376,6 +380,8 @@ async function settleAuthenticatedNavigation(page: Page, targetPath: string, tar
await navigateToTarget(); await navigateToTarget();
await expect.poll(() => page.url(), { timeout: AUTH_TIMEOUT }).toMatch(targetUrl); await expect.poll(() => page.url(), { timeout: AUTH_TIMEOUT }).toMatch(targetUrl);
} }
await waitForAppRootMounted(page);
} }
/** /**
+5 -1
View File
@@ -2328,7 +2328,11 @@ test("superusers manage release settings, assignments, integrations, and sync op
await expect(page.getByTestId("release-assignment-subject-manual-user-909")).toContainText("User #909"); await expect(page.getByTestId("release-assignment-subject-manual-user-909")).toContainText("User #909");
await expect(page.getByTestId("release-assignment-subject-manual-subuser-909")).toContainText("Subuser #909"); await expect(page.getByTestId("release-assignment-subject-manual-subuser-909")).toContainText("Subuser #909");
await expect(page.getByTestId("release-assignment-subject-manual-customer-909")).toContainText("Customer #909"); await expect(page.getByTestId("release-assignment-subject-manual-customer-909")).toContainText("Customer #909");
await page.getByTestId("release-assignment-subject-manual-subuser-909").click({ force: true }); await page
.getByTestId("release-assignment-subject-autocomplete")
.getByRole("button", { name: /Subuser #909/ })
.click();
await expect(assignmentSubjectInput).toHaveValue("Subuser #909 - Use typed value subuser:909");
await page.getByTestId("release-assignment-form").getByRole("button", { name: "Assign" }).click(); await page.getByTestId("release-assignment-form").getByRole("button", { name: "Assign" }).click();
expect(state.assignmentPayloads[state.assignmentPayloads.length - 1]).toMatchObject({ expect(state.assignmentPayloads[state.assignmentPayloads.length - 1]).toMatchObject({
subject_type: "subuser", subject_type: "subuser",
+1 -4
View File
@@ -27,10 +27,7 @@ async function primeSession(page, { token, permissions, sessionData = {} }) {
await seedAuthenticatedState(page, token); await seedAuthenticatedState(page, token);
} }
async function mockSelectedSubuserGrant( async function mockSelectedSubuserGrant(page, { customerNumber = 12345679, permissions = ["SELFSERVE_LIST"] } = {}) {
page,
{ customerNumber = 12345679, permissions = ["user", "SELFSERVE_LIST", "SELFSERVE_ADD"] } = {}
) {
await page.route("**/subusers/me", async (route) => { await page.route("**/subusers/me", async (route) => {
await route.fulfill({ await route.fulfill({
status: 200, status: 200,