From 391bdd6e388f23daeded36d575477009245eb81d Mon Sep 17 00:00:00 2001 From: Pavlo Strunkin Date: Sat, 24 Oct 2026 12:28:51 +0300 Subject: [PATCH 1/2] test(e2e): cover SSO login, user deletion, the build menu and login errors; fix the build menu dialogs - oidc.spec: SSO button instead of the password form, the redirect to the provider, signing in with the token from the callback, provider and API refusals, /register sent to /login, auto redirect (incl. no bounce while handling the callback and none after logout), the SSO profile, and the password form when the API cannot say - userList: delete selected users, delete off until a selection, cannot delete yourself - buildMenu.spec: stop a running build, no stop for a finished one, edit the CI build id (incl. validation), delete a build and drop it from the url - login: refused login, invalid email not sent, return to the page that asked for the login, plain login lands on the projects - mocks: env-config.js overrides, OIDC flag and provider, /users/me, login, user deletion, build patch Fix: the build menu's edit and delete dialogs closed only on success. After a failure the open flag stayed set, and the next build's menu opened straight into the old dialog, prefilled with the old input, so "Edit" would change the wrong build's CI build id. Both now close on submit, with the menu. Co-Authored-By: Claude Opus 5.5 --- integration_tests/pages/Header.ts | 7 + integration_tests/pages/LoginPage.ts | 2 + integration_tests/pages/UserListPage.ts | 3 + .../pages/components/BuildList.ts | 22 ++ integration_tests/test/buildMenu.spec.ts | 198 ++++++++++++++++++ integration_tests/test/login.spec.ts | 72 ++++++- integration_tests/test/oidc.spec.ts | 168 +++++++++++++++ integration_tests/test/userList.spec.ts | 63 +++++- integration_tests/utils/mocks.ts | 71 ++++++- src/components/BuildList/index.tsx | 11 +- 10 files changed, 607 insertions(+), 10 deletions(-) create mode 100644 integration_tests/test/buildMenu.spec.ts create mode 100644 integration_tests/test/oidc.spec.ts diff --git a/integration_tests/pages/Header.ts b/integration_tests/pages/Header.ts index c3f69f5d..17e4d3fa 100644 --- a/integration_tests/pages/Header.ts +++ b/integration_tests/pages/Header.ts @@ -4,6 +4,7 @@ import { HEADER_AVATAR_MENU_ID, HEADER_HELP_MENU_ID, HEADER_HELP_MENU_BUTTON_TEST_ID, + HEADER_LOGOUT_BUTTON_TEST_ID, } from "~client/components/Header.locators"; import { TAKE_TOUR_BUTTON_TEST_ID } from "~client/components/GuidedTour.locators"; import { TourModal } from "./TourModal"; @@ -14,6 +15,7 @@ export class Header { takeTourButton = this.helpMenu.getByTestId(TAKE_TOUR_BUTTON_TEST_ID); avatarButton = this.page.getByTestId(HEADER_AVATAR_BUTTON_TEST_ID); avatarMenu = this.page.locator(`#${HEADER_AVATAR_MENU_ID}`); + logoutBtn = this.avatarMenu.getByTestId(HEADER_LOGOUT_BUTTON_TEST_ID); constructor(public page: Page) { this.page = page; @@ -30,6 +32,11 @@ export class Header { await this.avatarButton.click(); } + async logout() { + await this.openAvatarMenu(); + await this.logoutBtn.click(); + } + avatarMenuItem(name: string) { return this.avatarMenu.getByRole("menuitem", { name }); } diff --git a/integration_tests/pages/LoginPage.ts b/integration_tests/pages/LoginPage.ts index a15e9152..8f3634a4 100644 --- a/integration_tests/pages/LoginPage.ts +++ b/integration_tests/pages/LoginPage.ts @@ -9,4 +9,6 @@ export class LoginPage extends BasePage { "[aria-label='toggle password visibility']", ); loginForm = this.page.locator(`#${LOCATOR_LOGIN_FORM}`); + ssoBtn = this.page.getByTestId("oidcLoginBtn"); + registerLink = this.page.getByText("Create an account"); } diff --git a/integration_tests/pages/UserListPage.ts b/integration_tests/pages/UserListPage.ts index 5cfc1f6d..a9b4c3a1 100644 --- a/integration_tests/pages/UserListPage.ts +++ b/integration_tests/pages/UserListPage.ts @@ -5,6 +5,9 @@ import { Table } from "./components/Table"; export class UserListPage extends BasePage { table: Table; + deleteSelectedBtn = this.page.locator( + "button:has([data-testid='DeleteIcon'])", + ); constructor(page: Page) { super(page); diff --git a/integration_tests/pages/components/BuildList.ts b/integration_tests/pages/components/BuildList.ts index 5755f892..62879bcd 100644 --- a/integration_tests/pages/components/BuildList.ts +++ b/integration_tests/pages/components/BuildList.ts @@ -14,6 +14,28 @@ export class BuildList { this.page = page; } + // the menu of one build: stop, edit its CI build id, delete + menu = this.page.getByRole("menu"); + ciBuildIdInput = this.page.getByTestId("newCiBuildId"); + + getBuildItem(number: number) { + // "#1" is also the start of "#10" + return this.buildList + .locator(".MuiListItemButton-root") + .filter({ hasText: new RegExp(`#${number}(?!\\d)`) }); + } + + // the menu button only shows while the pointer is over its build + async openMenu(number: number) { + const item = this.getBuildItem(number); + await item.hover(); + await item.getByTestId("MoreVertIcon").click(); + } + + menuItem(name: "Stop" | "Edit CI Build" | "Delete") { + return this.menu.getByRole("menuitem", { name, exact: true }); + } + getBuildLocator(number: number) { return this.buildList.getByText(`#${number}`); } diff --git a/integration_tests/test/buildMenu.spec.ts b/integration_tests/test/buildMenu.spec.ts new file mode 100644 index 00000000..ad78baac --- /dev/null +++ b/integration_tests/test/buildMenu.spec.ts @@ -0,0 +1,198 @@ +import { expect } from "@playwright/test"; +import { test } from "fixtures"; +import { + TEST_BUILD_PASSED, + TEST_BUILD_UNRESOLVED, + TEST_PROJECT, +} from "~client/_test/test.data.helper"; +import { + API_URL, + mockApiError, + mockDeleteBuilds, + mockGetBuildDetails, + mockGetBuilds, + mockGetProjects, + mockGetTestRuns, + mockUpdateBuild, +} from "utils/mocks"; + +const project = TEST_PROJECT; +const runningBuild = { ...TEST_BUILD_UNRESOLVED, isRunning: true }; +const finishedBuild = TEST_BUILD_PASSED; + +const isPatchOf = + (id: string) => (request: { url(): string; method(): string }) => + request.url() === `${API_URL}/builds/${id}` && request.method() === "PATCH"; + +test.beforeEach(async ({ page }) => { + await mockGetProjects(page, [project]); + await mockGetBuilds(page, project.id, [runningBuild, finishedBuild]); + await mockGetBuildDetails(page, runningBuild); + await mockGetBuildDetails(page, finishedBuild); + await mockGetTestRuns(page, runningBuild.id, []); + await mockGetTestRuns(page, finishedBuild.id, []); +}); + +test("stops a running build", async ({ openProjectPage, page }) => { + await mockUpdateBuild(page, runningBuild); + const { buildList } = await openProjectPage(project.id); + + await buildList.openMenu(runningBuild.number); + const [request] = await Promise.all([ + page.waitForRequest(isPatchOf(runningBuild.id)), + buildList.menuItem("Stop").click(), + ]); + + expect(request.postDataJSON()).toEqual({ isRunning: false }); + await expect(buildList.menu).toBeHidden(); + await expect( + page.locator("#notistack-snackbar").filter({ + hasText: `${runningBuild.id} finished`, + }), + ).toBeVisible(); +}); + +test("offers no stop for a finished build", async ({ openProjectPage }) => { + const { buildList } = await openProjectPage(project.id); + + await buildList.openMenu(finishedBuild.number); + + await expect(buildList.menuItem("Edit CI Build")).toBeVisible(); + await expect(buildList.menuItem("Delete")).toBeVisible(); + await expect(buildList.menuItem("Stop")).toHaveCount(0); +}); + +test("changes the CI build id", async ({ openProjectPage, page }) => { + await mockUpdateBuild(page, finishedBuild); + const projectPage = await openProjectPage(project.id); + const { buildList, modal } = projectPage; + + await buildList.openMenu(finishedBuild.number); + await buildList.menuItem("Edit CI Build").click(); + await expect(modal.dialog).toContainText( + `Edit the ci build id for build: #${finishedBuild.number}`, + ); + await buildList.ciBuildIdInput.fill("release-42"); + const [request] = await Promise.all([ + page.waitForRequest(isPatchOf(finishedBuild.id)), + modal.confirmBtn.click(), + ]); + + expect(request.postDataJSON()).toEqual({ ciBuildId: "release-42" }); + await expect(modal.dialog).toBeHidden(); +}); + +test("does not save a CI build id that is too short", async ({ + openProjectPage, + page, +}) => { + const patches: string[] = []; + page.on("request", (request) => { + if (isPatchOf(finishedBuild.id)(request)) { + patches.push(request.url()); + } + }); + const { buildList, modal } = await openProjectPage(project.id); + + await buildList.openMenu(finishedBuild.number); + await buildList.menuItem("Edit CI Build").click(); + await buildList.ciBuildIdInput.fill("r"); + await modal.confirmBtn.click(); + + await expect( + modal.dialog.getByText("Enter at least two characters."), + ).toBeVisible(); + expect(patches).toEqual([]); +}); + +test("opens nothing by itself after a failed CI build id change", async ({ + openProjectPage, + page, +}) => { + await mockApiError( + page, + (url) => url.pathname === `/builds/${finishedBuild.id}`, + 500, + "Could not save", + ); + const { buildList, modal, notification } = await openProjectPage(project.id); + + await buildList.openMenu(finishedBuild.number); + await buildList.menuItem("Edit CI Build").click(); + await buildList.ciBuildIdInput.fill("release-42"); + await modal.confirmBtn.click(); + await expect(notification.message).toHaveText("Could not save"); + + // the next menu opens as a menu, not straight into the old edit dialog + await buildList.openMenu(runningBuild.number); + await expect(buildList.menu).toBeVisible(); + await expect(modal.dialog).toHaveCount(0); +}); + +test("deletes a build", async ({ openProjectPage, page }) => { + await mockDeleteBuilds(page); + const { buildList, modal } = await openProjectPage(project.id); + + await buildList.openMenu(finishedBuild.number); + await buildList.menuItem("Delete").click(); + await expect(modal.dialog).toContainText( + `Are you sure you want to delete build: #${finishedBuild.number}?`, + ); + await Promise.all([ + page.waitForRequest( + (request) => + request.url() === `${API_URL}/builds/${finishedBuild.id}` && + request.method() === "DELETE", + ), + modal.confirmBtn.click(), + ]); + + await expect( + page.locator("#notistack-snackbar").filter({ + hasText: `Build #${finishedBuild.number} deleted`, + }), + ).toBeVisible(); + await expect(modal.dialog).toBeHidden(); +}); + +test("lets go of a build once it is deleted", async ({ + openProjectPage, + page, +}) => { + await mockDeleteBuilds(page); + const { buildList, modal } = await openProjectPage( + project.id, + finishedBuild.id, + ); + + await buildList.openMenu(finishedBuild.number); + await buildList.menuItem("Delete").click(); + await modal.confirmBtn.click(); + + await expect(page).toHaveURL( + (url) => + url.pathname === `/${project.id}` && !url.searchParams.has("buildId"), + ); +}); + +test("opens nothing by itself after a failed delete", async ({ + openProjectPage, + page, +}) => { + await mockApiError( + page, + (url) => url.pathname === `/builds/${finishedBuild.id}`, + 500, + "Could not delete", + ); + const { buildList, modal, notification } = await openProjectPage(project.id); + + await buildList.openMenu(finishedBuild.number); + await buildList.menuItem("Delete").click(); + await modal.confirmBtn.click(); + await expect(notification.message).toHaveText("Could not delete"); + + await buildList.openMenu(runningBuild.number); + await expect(buildList.menu).toBeVisible(); + await expect(modal.dialog).toHaveCount(0); +}); diff --git a/integration_tests/test/login.spec.ts b/integration_tests/test/login.spec.ts index 8e809066..a65019bc 100644 --- a/integration_tests/test/login.spec.ts +++ b/integration_tests/test/login.spec.ts @@ -1,5 +1,8 @@ -import { test } from "fixtures"; +import { AUTH_USER, test } from "fixtures"; import { expect } from "@playwright/test"; +import { LoginPage, ProfilePage } from "pages"; +import { TEST_PROJECT } from "~client/_test/test.data.helper"; +import { API_URL, mockApiError, mockGetProjects, mockLogin } from "utils/mocks"; test("renders", async ({ loginPage }) => { await expect(loginPage.page).toHaveScreenshot("login-page.png"); @@ -29,3 +32,70 @@ test("show and hide password", async ({ loginPage }) => { await loginPage.showPasswordBtn.click(); expect(await loginPage.password.getAttribute("type")).toBe("password"); }); + +test("shows why the login was refused", async ({ loginPage, page }) => { + await mockApiError( + page, + `${API_URL}/users/login`, + 401, + "Invalid email or password", + ); + + await loginPage.email.fill("email@google.com"); + await loginPage.password.fill("wrong password"); + await loginPage.loginBtn.click(); + + await expect(loginPage.notification.message).toHaveText( + "Invalid email or password", + ); + await expect(page).toHaveURL(/\/login$/); + await expect(loginPage.loginForm).toBeVisible(); +}); + +test("does not send an email that is not one", async ({ loginPage, page }) => { + const logins: string[] = []; + page.on("request", (request) => { + if (request.url().endsWith("/users/login")) { + logins.push(request.url()); + } + }); + + await loginPage.email.fill("not an email"); + await loginPage.password.fill("123456"); + await loginPage.loginBtn.click(); + + await expect(page.getByText("Enter a valid email.")).toBeVisible(); + expect(logins).toEqual([]); +}); + +test("returns to the page that asked for the login", async ({ page }) => { + await mockGetProjects(page, [TEST_PROJECT]); + await mockLogin(page, AUTH_USER); + + await page.goto("/profile"); + await expect(page).toHaveURL(/\/login$/); + const loginPage = new LoginPage(page); + await loginPage.email.fill(AUTH_USER.email); + await loginPage.password.fill("123456"); + await loginPage.loginBtn.click(); + + await expect(page).toHaveURL(/\/profile$/); + await expect(new ProfilePage(page).firstName).toHaveValue( + AUTH_USER.firstName, + ); +}); + +test("goes to the projects after a plain login", async ({ + loginPage, + page, +}) => { + await mockGetProjects(page, [TEST_PROJECT]); + await mockLogin(page, AUTH_USER); + + await loginPage.email.fill(AUTH_USER.email); + await loginPage.password.fill("123456"); + await loginPage.loginBtn.click(); + + await expect(page).toHaveURL(/\/projects$/); + await expect(loginPage.header.avatarButton).toBeVisible(); +}); diff --git a/integration_tests/test/oidc.spec.ts b/integration_tests/test/oidc.spec.ts new file mode 100644 index 00000000..4b04a5a7 --- /dev/null +++ b/integration_tests/test/oidc.spec.ts @@ -0,0 +1,168 @@ +import { expect } from "@playwright/test"; +import { AUTH_USER, test } from "fixtures"; +import { LoginPage, ProfilePage } from "pages"; +import { TEST_PROJECT } from "~client/_test/test.data.helper"; +import { + API_URL, + mockApiError, + mockEnvConfig, + mockGetMe, + mockGetProjects, + mockOidcEnabled, + mockOidcProvider, +} from "utils/mocks"; + +const PROVIDER_URL = `${API_URL}/users/oidc/login`; + +// /users/me answers without the token; the app adds the one it was sent +const ssoUser = { ...AUTH_USER, token: undefined }; + +test.beforeEach(async ({ page }) => { + await mockGetProjects(page, [TEST_PROJECT]); + await mockOidcProvider(page); +}); + +test.describe("with SSO off", () => { + test("shows the password form when the API cannot say", async ({ page }) => { + // an older backend without the endpoint + await mockApiError(page, `${API_URL}/users/oidc/enabled`, 404, "Not Found"); + + await page.goto("/login"); + const loginPage = new LoginPage(page); + + await expect(loginPage.email).toBeVisible(); + await expect(loginPage.registerLink).toBeVisible(); + await expect(loginPage.ssoBtn).toHaveCount(0); + }); +}); + +test.describe("with SSO on", () => { + test.beforeEach(async ({ page }) => { + await mockOidcEnabled(page, true); + }); + + test("offers SSO instead of the password form", async ({ page }) => { + await page.goto("/login"); + const loginPage = new LoginPage(page); + + await expect(loginPage.ssoBtn).toBeVisible(); + await expect(loginPage.email).toHaveCount(0); + await expect(loginPage.password).toHaveCount(0); + await expect(loginPage.registerLink).toHaveCount(0); + }); + + test("sends the user to the identity provider", async ({ page }) => { + await page.goto("/login"); + + await new LoginPage(page).ssoBtn.click(); + + await expect(page).toHaveURL(PROVIDER_URL); + }); + + test("signs in with the token the provider sends back", async ({ page }) => { + await mockGetMe(page, ssoUser); + + const [request] = await Promise.all([ + page.waitForRequest(`${API_URL}/users/me`), + page.goto("/login#token=sso-token"), + ]); + + expect(request.headers()["authorization"]).toBe("Bearer sso-token"); + // the fragment holding the token is gone from the address + await expect(page).toHaveURL(/\/projects$/); + const stored = await page.evaluate(() => + JSON.parse(window.localStorage.getItem("user") ?? "null"), + ); + expect(stored).toMatchObject({ email: ssoUser.email, token: "sso-token" }); + await expect(new ProfilePage(page).header.avatarButton).toBeVisible(); + }); + + test("reports a login the provider refused", async ({ page }) => { + await page.goto("/login#error=access_denied"); + const loginPage = new LoginPage(page); + + await expect(loginPage.notification.message).toHaveText( + "SSO login failed.", + ); + await expect(page).toHaveURL(/\/login$/); + await expect(loginPage.ssoBtn).toBeVisible(); + }); + + test("reports a token the API does not accept", async ({ page }) => { + await mockApiError(page, `${API_URL}/users/me`, 401, "Unauthorized"); + + await page.goto("/login#token=expired-token"); + const loginPage = new LoginPage(page); + + await expect(loginPage.notification.message).toHaveText("Unauthorized"); + await expect(page).toHaveURL(/\/login$/); + expect( + await page.evaluate(() => window.localStorage.getItem("user")), + ).toBeNull(); + }); + + test("sends registration to the login page", async ({ page }) => { + await page.goto("/register"); + + await expect(page).toHaveURL(/\/login$/); + await expect(new LoginPage(page).ssoBtn).toBeVisible(); + }); + + test("leaves the email and password of an SSO user to the provider", async ({ + profilePage, + }) => { + await expect(profilePage.email).toBeDisabled(); + await expect(profilePage.passwordForm).toHaveCount(0); + // the names are still the user's to change + await expect(profilePage.firstName).toBeEnabled(); + }); +}); + +test.describe("with SSO on and auto redirect", () => { + test.beforeEach(async ({ page }) => { + await mockOidcEnabled(page, true); + await mockEnvConfig(page, { REACT_APP_OIDC_AUTO_REDIRECT: "true" }); + }); + + test("goes straight to the identity provider", async ({ page }) => { + await page.goto("/login"); + + await expect(page).toHaveURL(PROVIDER_URL); + }); + + test("does not bounce back to the provider with its answer", async ({ + page, + }) => { + await page.goto("/login#error=access_denied"); + const loginPage = new LoginPage(page); + + await expect(loginPage.notification.message).toHaveText( + "SSO login failed.", + ); + await expect(page).toHaveURL(/\/login$/); + }); + + test("stays on the login page after logging out", async ({ + projectListPage, + page, + }) => { + const providerRequests: string[] = []; + page.on("request", (request) => { + if (request.url() === PROVIDER_URL) { + providerRequests.push(request.url()); + } + }); + + await projectListPage.header.logout(); + + const loginPage = new LoginPage(page); + await expect(loginPage.ssoBtn).toBeVisible(); + await expect(page).toHaveURL(/\/login$/); + // the provider's session would sign the user straight back in + expect(providerRequests).toEqual([]); + + // asking for SSO again still works + await loginPage.ssoBtn.click(); + await expect(page).toHaveURL(PROVIDER_URL); + }); +}); diff --git a/integration_tests/test/userList.spec.ts b/integration_tests/test/userList.spec.ts index e8fb0fce..75164ad2 100644 --- a/integration_tests/test/userList.spec.ts +++ b/integration_tests/test/userList.spec.ts @@ -1,6 +1,12 @@ import { expect } from "@playwright/test"; -import { test } from "fixtures"; -import { mockGetProjects, mockGetUsers } from "utils/mocks"; +import { AUTH_USER, test } from "fixtures"; +import { UserListPage } from "pages/UserListPage"; +import { + API_URL, + mockDeleteUsers, + mockGetProjects, + mockGetUsers, +} from "utils/mocks"; import { EDITOR_USER, GUEST_USER, @@ -38,3 +44,56 @@ for (const [user, role] of assignRoleCases) { }); }); } + +test("deletes the selected users", async ({ userListPage, page }) => { + await mockDeleteUsers(page); + + await userListPage.table.checkRow(EDITOR_USER.id); + await userListPage.table.checkRow(GUEST_USER.id); + const [request] = await Promise.all([ + page.waitForRequest( + (request) => + request.url() === `${API_URL}/users` && request.method() === "DELETE", + ), + userListPage.deleteSelectedBtn.click(), + ]); + + expect(request.postDataJSON()).toEqual([EDITOR_USER.id, GUEST_USER.id]); + await expect(userListPage.notification.message).toHaveText("Removed"); + await expect(userListPage.table.getRow(EDITOR_USER.id)).toHaveCount(0); + await expect(userListPage.table.getRow(GUEST_USER.id)).toHaveCount(0); + await expect(userListPage.table.getRow(TEST_USER.id)).toBeVisible(); +}); + +test("offers no delete until a user is selected", async ({ userListPage }) => { + await expect(userListPage.table.getRow(TEST_USER.id)).toBeVisible(); + + await expect(userListPage.deleteSelectedBtn).toBeDisabled(); +}); + +test("does not let the signed-in user delete themself", async ({ + page, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + authUser, +}) => { + const self = { ...TEST_USER, ...AUTH_USER, token: undefined }; + await mockGetUsers(page, [self as unknown as User, EDITOR_USER]); + const deletes: string[] = []; + page.on("request", (request) => { + if (request.url() === `${API_URL}/users` && request.method() === "DELETE") { + deletes.push(request.url()); + } + }); + await page.goto("/users"); + const userListPage = new UserListPage(page); + + await userListPage.table.checkRow(self.id); + await userListPage.table.checkRow(EDITOR_USER.id); + await userListPage.deleteSelectedBtn.click(); + + await expect(userListPage.notification.message).toHaveText( + "You cannot delete yourself.", + ); + await expect(userListPage.table.getRow(EDITOR_USER.id)).toBeVisible(); + expect(deletes).toEqual([]); +}); diff --git a/integration_tests/utils/mocks.ts b/integration_tests/utils/mocks.ts index 7a80ffb5..cf611d3b 100644 --- a/integration_tests/utils/mocks.ts +++ b/integration_tests/utils/mocks.ts @@ -76,9 +76,8 @@ export const mockGetBuilds = async ( const take = Number(params.get("take")); const ciBuildId = params.get("ciBuildId"); const matching = ciBuildId - ? builds.filter( - (build) => - build.ciBuildId?.toLowerCase().includes(ciBuildId.toLowerCase()), + ? builds.filter((build) => + build.ciBuildId?.toLowerCase().includes(ciBuildId.toLowerCase()), ) : builds; @@ -229,3 +228,69 @@ export const mockMergeTestVariations = async (page: Page, build: Build) => { (route) => route.fulfill({ body: JSON.stringify(build) }), ); }; + +// the runtime settings env.sh writes to env-config.js, with some overridden; +// the app reads them once, when it loads +export const mockEnvConfig = async ( + page: Page, + overrides: Record, +) => { + return page.route("**/env-config.js", async (route) => { + const response = await route.fetch(); + const assignments = Object.entries(overrides) + .map(([key, value]) => `window._env_.${key} = ${JSON.stringify(value)};`) + .join("\n"); + return route.fulfill({ + response, + body: `${await response.text()}\n${assignments}`, + }); + }); +}; + +export const mockOidcEnabled = async (page: Page, enabled: boolean) => { + return page.route(`${API_URL}/users/oidc/enabled`, (route) => + route.fulfill({ body: JSON.stringify(enabled) }), + ); +}; + +// stands in for the API's redirect to the identity provider +export const mockOidcProvider = async (page: Page) => { + return page.route(`${API_URL}/users/oidc/login`, (route) => + route.fulfill({ + contentType: "text/html", + body: "

Identity provider

", + }), + ); +}; + +// the user behind a token, as /users/me answers: without the token itself +export const mockGetMe = async (page: Page, user: object) => { + return page.route(`${API_URL}/users/me`, (route) => + route.fulfill({ body: JSON.stringify(user) }), + ); +}; + +export const mockLogin = async (page: Page, user: object) => { + return page.route(`${API_URL}/users/login`, (route) => + route.fulfill({ body: JSON.stringify(user) }), + ); +}; + +export const mockDeleteUsers = async (page: Page) => { + return page.route(`${API_URL}/users`, (route, request) => + request.method() === "DELETE" + ? route.fulfill({ body: JSON.stringify(true) }) + : route.fallback(), + ); +}; + +// the API answers a build patch with the build as patched +export const mockUpdateBuild = async (page: Page, build: Build) => { + return page.route(`${API_URL}/builds/${build.id}`, (route, request) => + request.method() === "PATCH" + ? route.fulfill({ + body: JSON.stringify({ ...build, ...request.postDataJSON() }), + }) + : route.fallback(), + ); +}; diff --git a/src/components/BuildList/index.tsx b/src/components/BuildList/index.tsx index 64a5ed1b..838eb5e1 100644 --- a/src/components/BuildList/index.tsx +++ b/src/components/BuildList/index.tsx @@ -490,14 +490,16 @@ const BuildList: FunctionComponent = () => { .update(menuBuild.id, { ciBuildId: newCiBuildId, }) - .then(() => { - toggleEditDialogOpen(); - }) .catch((err) => enqueueSnackbar(err, { variant: "error", }), ); + // closed now, not on success: the dialog belongs to this menu's + // build, and left open after a failure it would come back for the + // next build whose menu is opened, holding this build's input + setEditDialogOpen(false); + setNewCiBuildId(""); handleMenuClose(); }} /> @@ -516,7 +518,6 @@ const BuildList: FunctionComponent = () => { onSubmit={() => { deleteBuild(buildDispatch, menuBuild.id) .then(() => { - toggleDeleteDialogOpen(); enqueueSnackbar( `Build #${menuBuild.number || menuBuild.id} deleted`, { @@ -538,6 +539,8 @@ const BuildList: FunctionComponent = () => { variant: "error", }), ); + // closed now, for the same reason as the edit dialog above + setDeleteDialogOpen(false); handleMenuClose(); }} /> From ef92bcde5c140de33b3bf7a900166c1e877e81f5 Mon Sep 17 00:00:00 2001 From: Pavlo Strunkin Date: Sat, 24 Oct 2026 12:39:53 +0300 Subject: [PATCH 2/2] test(e2e): screenshot the new screens; address SonarCloud findings Screenshot tests, baselines rendered in Docker with `npm run test:pw:docker:update -- missing ...`: - oidc: the SSO login page, the profile of an SSO user - buildMenu: the build menu, the CI build id dialog - errors: the project page whose builds did not load - userList: the list with users selected SonarCloud: the new mock helpers drop `async`, since they only return page.route's promise (S7503), and the build item regex uses String.raw (S7780). Co-Authored-By: Claude Opus 5.5 --- .../pages/components/BuildList.ts | 2 +- integration_tests/test/buildMenu.spec.ts | 19 ++++++++++++++++ .../build-edit-dialog.png | Bin 0 -> 39873 bytes .../build-menu.png | Bin 0 -> 30915 bytes integration_tests/test/errors.spec.ts | 21 ++++++++++++++++++ .../project-page-builds-error.png | Bin 0 -> 19278 bytes integration_tests/test/oidc.spec.ts | 13 +++++++++++ .../oidc.spec.ts-snapshots/login-page-sso.png | Bin 0 -> 11264 bytes .../profile-page-sso.png | Bin 0 -> 42121 bytes integration_tests/test/userList.spec.ts | 8 +++++++ .../user-list-selection.png | Bin 0 -> 25298 bytes integration_tests/utils/mocks.ts | 14 ++++++------ 12 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 integration_tests/test/buildMenu.spec.ts-snapshots/build-edit-dialog.png create mode 100644 integration_tests/test/buildMenu.spec.ts-snapshots/build-menu.png create mode 100644 integration_tests/test/errors.spec.ts-snapshots/project-page-builds-error.png create mode 100644 integration_tests/test/oidc.spec.ts-snapshots/login-page-sso.png create mode 100644 integration_tests/test/oidc.spec.ts-snapshots/profile-page-sso.png create mode 100644 integration_tests/test/userList.spec.ts-snapshots/user-list-selection.png diff --git a/integration_tests/pages/components/BuildList.ts b/integration_tests/pages/components/BuildList.ts index 62879bcd..91d7b1e3 100644 --- a/integration_tests/pages/components/BuildList.ts +++ b/integration_tests/pages/components/BuildList.ts @@ -22,7 +22,7 @@ export class BuildList { // "#1" is also the start of "#10" return this.buildList .locator(".MuiListItemButton-root") - .filter({ hasText: new RegExp(`#${number}(?!\\d)`) }); + .filter({ hasText: new RegExp(String.raw`#${number}(?!\d)`) }); } // the menu button only shows while the pointer is over its build diff --git a/integration_tests/test/buildMenu.spec.ts b/integration_tests/test/buildMenu.spec.ts index ad78baac..d9c227c7 100644 --- a/integration_tests/test/buildMenu.spec.ts +++ b/integration_tests/test/buildMenu.spec.ts @@ -33,6 +33,25 @@ test.beforeEach(async ({ page }) => { await mockGetTestRuns(page, finishedBuild.id, []); }); +test("renders the build menu", async ({ openProjectPage, page }) => { + const { buildList } = await openProjectPage(project.id); + + await buildList.openMenu(runningBuild.number); + await expect(buildList.menuItem("Stop")).toBeVisible(); + + await expect(page).toHaveScreenshot("build-menu.png"); +}); + +test("renders the CI build id dialog", async ({ openProjectPage, page }) => { + const { buildList, modal } = await openProjectPage(project.id); + + await buildList.openMenu(finishedBuild.number); + await buildList.menuItem("Edit CI Build").click(); + await expect(modal.dialog).toBeVisible(); + + await expect(page).toHaveScreenshot("build-edit-dialog.png"); +}); + test("stops a running build", async ({ openProjectPage, page }) => { await mockUpdateBuild(page, runningBuild); const { buildList } = await openProjectPage(project.id); diff --git a/integration_tests/test/buildMenu.spec.ts-snapshots/build-edit-dialog.png b/integration_tests/test/buildMenu.spec.ts-snapshots/build-edit-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..e0464fb47d9035c6886d834120b72e8eaca97c48 GIT binary patch literal 39873 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 literal 0 HcmV?d00001 diff --git a/integration_tests/test/buildMenu.spec.ts-snapshots/build-menu.png b/integration_tests/test/buildMenu.spec.ts-snapshots/build-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b8c970f50145c848746997cde3ac1caf0b3c40 GIT binary patch literal 30915 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 DhU7$} literal 0 HcmV?d00001 diff --git a/integration_tests/test/errors.spec.ts b/integration_tests/test/errors.spec.ts index 44c24981..f7f0f53e 100644 --- a/integration_tests/test/errors.spec.ts +++ b/integration_tests/test/errors.spec.ts @@ -100,6 +100,27 @@ test.describe("a failing API", () => { await expect(projectPage.buildList.emptyMessage).toBeHidden(); }); + test("renders the build list that did not load", async ({ + page, + openProjectPage, + }) => { + await mockGetProjects(page, [project]); + await mockApiError( + page, + (url) => url.origin === API_URL && url.pathname === "/builds", + 500, + "Could not load builds", + ); + + const projectPage = await openProjectPage(project.id); + await expect(projectPage.buildList.errorMessage).toBeVisible(); + // the toast would hide on its own partway through the comparison + await projectPage.notification.dismissBtn.click(); + await expect(projectPage.notification.message).toBeHidden(); + + await expect(page).toHaveScreenshot("project-page-builds-error.png"); + }); + test("stops loading when the test runs fail", async ({ page, openProjectPage, diff --git a/integration_tests/test/errors.spec.ts-snapshots/project-page-builds-error.png b/integration_tests/test/errors.spec.ts-snapshots/project-page-builds-error.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ec957362ba9a3b2d4e1b4658f6518535391ad2 GIT binary patch literal 19278 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 mNTha3+X47+ { await mockOidcEnabled(page, true); }); + test("renders the SSO login", async ({ page }) => { + await page.goto("/login"); + await expect(new LoginPage(page).ssoBtn).toBeVisible(); + + await expect(page).toHaveScreenshot("login-page-sso.png"); + }); + + test("renders the profile of an SSO user", async ({ profilePage, page }) => { + await expect(profilePage.email).toBeDisabled(); + + await expect(page).toHaveScreenshot("profile-page-sso.png"); + }); + test("offers SSO instead of the password form", async ({ page }) => { await page.goto("/login"); const loginPage = new LoginPage(page); diff --git a/integration_tests/test/oidc.spec.ts-snapshots/login-page-sso.png b/integration_tests/test/oidc.spec.ts-snapshots/login-page-sso.png new file mode 100644 index 0000000000000000000000000000000000000000..f3cd16b3e84f9a8e4a8d1bdfffb0d90df9baf1f7 GIT binary patch literal 11264 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 Af&c&j literal 0 HcmV?d00001 diff --git a/integration_tests/test/oidc.spec.ts-snapshots/profile-page-sso.png b/integration_tests/test/oidc.spec.ts-snapshots/profile-page-sso.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1d8f566b720173140e6c3263b120b3fec7d160 GIT binary patch literal 42121 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 { await expect(userListPage.table.getRow(TEST_USER.id)).toBeVisible(); }); +test("renders the selected users", async ({ userListPage, page }) => { + await userListPage.table.checkRow(EDITOR_USER.id); + await userListPage.table.checkRow(GUEST_USER.id); + await expect(userListPage.deleteSelectedBtn).toBeEnabled(); + + await expect(page).toHaveScreenshot("user-list-selection.png"); +}); + test("offers no delete until a user is selected", async ({ userListPage }) => { await expect(userListPage.table.getRow(TEST_USER.id)).toBeVisible(); diff --git a/integration_tests/test/userList.spec.ts-snapshots/user-list-selection.png b/integration_tests/test/userList.spec.ts-snapshots/user-list-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..a897ce95bdd89b3b8fca43f0b85165f24f9fd1ab GIT binary patch literal 25298 zcmd422T)Vn+dhg16%_%M1E{ovjUx!CNH0+lX#yew0+NXI8d~TO6$QnDpn%lSL0ae? zf*`$w-a|m?5JC^>|AoKryEFIB{O5n?&U`c1IpcBfBzv#D_Pd_9s3LX@3ye^Ar_WXEL!*OJoZgo!?6brBj}I~;&{;YXH#q! z{(*jr^~kz#?tJ{!_;Ybr{nU|J8MYbUzs2tiVp1~=%pz?pGiL>R&Xj-9rW#Cddnc1PX>yv(izk`DCcp@pIz`Rlt-2O#G?bl;q6whz7 z9A#nohxhQagM&N&r-OmCPq`T-x%O(~wX0p>;<-m{Y}VqVr^PQyNJPE`S4f#xe9BUo zlk0EgvaF_KT>tQqv6+PhRM5!CB>T#lb64N3Uw!vGU_k&^>J+il_s?-w7M8xh-XT^; z)RoK-h~3VuP9)llG!VZlRVZ!_H5mW-^Si;VTS`_;$?@hIYYswUTvGgbFl~(^YcniQ z4UFnD>VEmKn8_t2d1W|Hjn^C#Ob<0n zy&)|vooBq*n^cQfjfoj?N1NdMDv@DFW}-TCvyBVsli}s){K<#sTw+z1zf%{jgECEG z>lN)3WX`j&EPcD{`n1g6z}?+lORK|Jl=H?-IXO8gDJc~dm6fyJdxQvYO%~36pS_hR zl$06yM`(D??(3NV>(P8^?`4I5N*B(|f;msII@a$#+w|r=pHyLPu4Dg)t5>fEQTGUV z4D-{+NG0mtr~{FOww8;)m_4RJ9sJb0^nG1F6@Gt*^&;$iJfu>aQ7wCxg=OqVg@WQp zC9Bn3Zv#ES0mD+4k^k#QOAFUEm^ok2;F))Gqo-nBCLZw&)8fy#JZj)eh7Ztg6L|ry;S{ls8&in{b`}Sd?3tZdWF`Gph z88rUdC!9AL?om$UQQJ}-Om{Lu+}g|Z33npWXxsFoTyQRKVf}sX(yb^QAg{ML7hIf$7@GlOYd81*ZdGSJBC9i8taENGZ!Fod6w3IlV z+d}aTtTroCsIT16-qhT5TtY%dIfqF!#CfbUhmzTRRt2J5P`aoS%)2_RS!`!Ib8}Iq zhLn1r*lQBvFk|E5lDd*WCG9;B!99GA*#*f$Aw`Xq)Bbt6g!CRT1s@&0u+-(&{rVog z$|!Mc?pp1_n`34veqFMUW!zebPEI56oP59eTI*o}mi-5$#IF<5F?Q&QC+!8fh6{x-TP1v&XD^VMlJiVAns)!@IjopjnT_4Ww$dAu>)*V<;; z$*DQCtfRaQ3<+_9o!wkT6L5Bj#eN<O4l#!y=u=KDxSu z$YiqsQ#h;aV-rZNBkrw`g(^;EFXF`P0W33rQs?XLWFa@1Qnb;Vq(mZ2$~p2Mj5Ae+b%O#{mPu^Pkns~k zwXFwQJ6bwky1H{2S^0&|Rju@u_^4AaApMz!wuE;*sq?$#m*<6f9ZDZ@r*C_V8a>X; zy!2^xP~z~2dZvv5J4eR@c6MTH%oC_Ved6-hzVgb~L>RcW~^5GUD7gTxnQKUI^YYhRC=YS|> zW_?&0cDZeQAK(ySTUBwO@2bph-OB_4o^RF95kq&`7KRSvW-UrP^K$uOjg(Cuc`EKw zqlZ~L#i%wF9)|>2Sl(72Vds4;N37|3_!nWk)J{)N&)eJkTV`3AS5Lf5SF99VZ&&64 z#=bx8PRLR9f&%g+MrFeFV0_2jf)LM*Y^3xx6A@ z*?NY9=dbGkVZ-mfbL{E}+4WrLHm&xs8DzgICU%0m()DzC z+$3IX;yJZ4clgXR2OFC$No;^!wyU?}=1hL~y|SzyR>$(h#rVF)5aN@@OJ(0Tn3q`U zs@u@*Fyxgwp7K!^6r>3Ij_!Z5tLL3r8vK3_E@QRQt3z`&`B6hgNlkHS2|(`(-G5Q8 zh5%NN}`vpP9xXJl_n<6HoX;Ni~`4Umc*Ex`n<=8vfK-ulRMv4 z6m2p@&)9H8_p2SH&(kiCa^d#t8`wu;qep6CUPe6wVqajV>)g~#eJ@-rx2Y_c#(1*w zQCxHAago3N0@#=$19E2J^6{u;xyM|v07ChxpjC*`(^Wzxetoi%I2}N&Zxaf5Y-A*p zq&b>z%3YpY;L6N;q&QEgXQ~F3rgJzMOIlb&#|(cr%wCIlwP9RN*@GM99hrGZ>UnTU zJ2wx8f2fdSXk=UupBMZbmmHZ>O?@1~sP}NOK_DEr*gqS`-YXEpY%gR#z>1H5RyISy+bGYtezTQ-etsUL8qO|- zrIe7p2`BWa(`o^OPA7SO=U7xAJ+GQp2L)Jb%y%u;?RPds<;LGue#Q(TtxT^SDO=x@ z)5r_ras-e#6*NFzEWiTlWS^a#uuSU1<8|7F2Y@ z$^>&5o?lphtM*-9DVt3e$LhfM;I1?d9xNLDT{P_Ww3NjG&oI*+G$CYVWi2c&hOvpv zk7VL4n?rZk#-;0x-?q(;mX*a{m5LXiOfIbI zn7dOG(uc(wQ(x4=7eCm{^XQ1Dx9}M0^TrBIOXLlP*TgO z8W{~cLFyz)F(h7kAmdl=%1ZP+ztr*IXZ_*lbWDtbe1#BNM#EJm>}t5Gz(E~9?(#)h zlD57Q23FZzgnoYf9FG(C{Jxn za2~gcP`TSxV$&66>Vs7wowW2N;e3$WJ#x+H?M1AxyxX&Ey`;O>r`N2PDQ3O{TNQ8+ zHZ|+PGlxQIhHP^sLpT)!ALHnJNX<^q&6C$~!_Mm#MHk9h0zs%?0UJyP>qT zvLB|)B454r^;P6WSL22`MhDf_EovP;;Yw_RjCLs{x{~RIU9E@`!!y}C>mJWW^~g!3 z11lC3a|1z@O7G^Tl8;8qK{pM3x?G9G1i%edr#rj45`1On#x}M?xKwkTmZ$3%tY_yO zu(NmC>%)Zn?b{m>+?O!_<}9;J?SQwU{$9+y!QS$|gDZO4VxVjEnnguTzVq-zNp1|^ zt3R(On$<05-}Z_uufwR35vHiHE~g9-gKj`-nmv_dcwbZ+qRYM>GCkLZAbLGUyC&eq za_e&awfyGUS36~g@>J}yD<x4NaVL#ThqgxYuh(RJ6| zk2PA4f!olh2O!aCP@8hA@lc#(jU%nIugN<&Lu1q~$n5%&Ih1_GKdJD5{+c!*k zHiS0zf$ni8r>?$*5p)yj)Ty0z&v!j(EB9;oJxp)Xr={e<%M$bJY0(jdPfe=J{oS5C z^G>7euPcb|ERU#2U%cq-brCje4mH}HnkWJ5HhOoRPvxI-ilK$lWz4RRn|Ety=ZcBk zW7nJlE@J;xX%L+D93nqtH)Zbf%R1+fW2V;DB;eGt#pHlcKYS1gN14a}^FUYzdaKaf zVMsfEnjt$7K8Y6q!yYwJ&n%bo6N-OfzTwDSC1%vr^$k53SCeFC8sJ)|M%s3$4w%w72&4#wDdvbN`iO(`7LKD~T~t z1N)W{JoC{y;<OBT919>|Bj-9^-N)C<3nSR%8!DRsc z{W)f_P$HwML1A6>tBw)to$u{@K< zj|=m{9kEGxYxMxzto1>Kiv^psy3|}p1R=h*iUnvMdzB<5AJ+@{lBOlr?Vm-)$HxJO zF$ao_p8ZLAt9@hpdvBa*)dzF#KQ;Y?Bzzvc#y>xVs z8+cp#?dmvn?X7&BzFPiL2cf1jx>KfaYocQQsCaxB!(;H=!KSRNWUHRTAT8s-UrR%s_ zxGAo{5KsfV-o#h0UZtvq6+-L%ySP(VR|hh?paBG);b0xNGP&f5!2k9F%A@ZWWGoZl z7YnKY;5&+3SGnx|Os}=u2=L!uxRQt21uHRU2r-dSv2igKE%os}9i2}scqJ~~jh^WLUoY58bwf}Bo!-M|%6`eET+r0jdOr&N+u2SZ`q_lr8=Jsmq>pvb% ztbUrTSy!4`QnFjvOyIfcGSONZFP?tyiMJNw@gt-9hMI+=Lx|Pmh9^57Q14}j>K6l= zFlM{G&@;KVvmn7Cq%3bele4$i3-}DQ!g+k6+{y6KBM%P`|J{}0Y<<+6+|jU|+Gjsr zW$_JTkj$5?Z1)SY6(;fFWH z?8zLFSHcsQrJWK=R%SkY4XL%hVy8=Xo9&p_!2o?o)zQ(Jbg9Ip$?_VXHvYT(#RQ#ffu&b6p$u_Z7FK`k`2exj`I9IucukR=B{=rdSmNzyhj5WlPwh*67LujMo4FI{mpZ{BFQINRYFtzIeUzdE&a z=w74wjAirVKb8%=o_SC736vlFCgg;AZT;Sa_{EDC9gQqs2CP@xDLo}tm%@=&6DyK^ zlli%d@wE+W^SeA8s*{&5E0*aP>%}K10QeTPFfuZ-w49B)tdlm<2XqV0ds5+V<;oia||b22aWT^{Inr`X!gIqLvclF4MsCDMf%O#*n51`uENOZG%z` zN)xmM1EwfG2Z59iOahDXsgigp5=YoEPC{Z#>~QC<4~S0hqF_2j{XMUQMNQd4o~8MP zNX<)dt>~mAL4y2&d9+-0NIv)K5e=O#@mQ0`>oL(W(E~3fO~6XB{|>mx8+JZ`o*BS+ z%Hz(?$k-uFR>CmB1;HZgvXkSLkd>K30B2`@+X2NYZk+$5*4stBptG~H?^}F)ys@~b zXto_TdDd>ofKWFn#RBHx6nn2Yxc2{R2l0PzG!9H7nREc!0|Nsb{IZY1A27ovCSjsc z5J0S+EkBp|JfQ~RJ6rYhOpoI3-29meBySs}T=4_h54f<38aaU8XC@U*7K|@7O%6S%k9G+=SgIf{u zj0;XcfaS>xF4*|#RFuQ9g6isO4%J#yLZx21dv)Wbe zn-tRKrI6LnTf%E%gjDehtY^}Phcy^Acdf)~t z>x|3CJv>5#wnnpK^(UMSk|dWR4my+FSGmup{8RsulwpW>!c6|2C1P&WVjDZY?1?Wu z9jy4Z%uM#v*(?%QrPiz6OmBsDb-rN+I1rTlwAKed*1>1LGxaE>j8PBCc&~P?+Tl7{ zIlMuY5%5Mll!rzcV5nRGQ)=bVYucw|p|}3zP?fGzwaST5=vGUi!g4vrYrRe*``3NZ zo^~Pk-XE-^M$rZ4^mZwHV9mB9ckePPR>)?~n{ZlUD$rngJisd=4Ix}`!K|9Htbvbn zpIrN}9tJJx8qgZ8r+E$iemw{={aj4>&W5j}4VTO5P9UF9p*Ntlmg7z^3tIc{Z6>L; z^MlhK|DFL=L(2NuVkTD@n{YRVkR1F4yBt?K{wU^}{eJn7Zr@L8Or*lEuZIEx(Hjhn zSRryxosdBXQrPUeTxb2<&xQf1gAjl2#kcf9wfYF#5IaJgpR3WpF#_j5a<~+6l}Qk= z@mjCJHq^7(4k;T{q@=39+0!-d4;XWu_Y|#DqP9fwEO#yPX8)at!K=5;y*~2yTp^O) z+7eM`eAD?}c8*p-!1L`^4y6?4Th^OW`_NfJ1n1b|(ov}9_^ZqgHcw$BJra8og0T0e zzsa{4Xm=W~bd9=?ul&buY27MJqK>lcgHmi*%qeNAh2@|1?M~KM9|>-81L(N${O=cC zF@Ix&i*qX`;s&fLr(X6~Oj;Y%&T+0y+lP0JXENVfs8%tPW8qi%Jys(9Sh*B7ez2u4 z_^y3FqOLOnN0ij5j<M9J zVugDAByGDH$bSxzY_h&S-3n91H z1EBKTl@6?=6~CrsYEl_&!Pw-+Zz6lVA9p_Qk(qy0>NWfy8#h>5sPDx{%~9$dg}vAP zRup*9`eJp2?+vj-5Tn`vqDz1T;^xtlX9MPFn-L9u0bfh7%K@L3(rEx}%TQ;HUTl9V ztp8zzBlZ-S%UT%-Q~uS@@=;ihV%679zB{F0_wyawCwcegsqEW;wCoJ*$ zGd3H{)>azA;QnHFZ#i>bE12X)=A|FjOeVezBJr>ULyCFcVrlG1H;@QeF6 z4dvaf!E-_SDro`t4<;!XOwzO#W;{n$f1xmFh3p9zmozisQIGaSGIy%E)Uz2gecPe7 z>+W;GqdroQ?V1*SOap(BRccUHva-6` z1-v__H5&Gt=n?mYy`x%TT}3(Mn~HXeZ*o2SM_)?3?Ey$v@XvjonS~r5UFRN^#J#1` z-Hx=KZk15)0+a3sJ^Yc#X}le7D{K@sO>8`^aZ+e+-^mBROnH|np0=iP z6izRjjY%4-li|nqK&yAwA=ktvY+_d*v|WFMajK@(0|d2}eR|5iVm$2CJAk;cP)_Z#G zO(3bZeia)n=S+MbD#64vgZE30-r6!Vz7L*X5SCU`Q==~3ogfGAOSxm9l#5i$Pudw; za_Or%$T%tLk{H@nfu84}uAI73uk7o={}eT!iOL^QR5ij=h7jOM%wkUf7n~(wb-F%a zkb7sT|Kh~>u|{yldHprF9;kNdTVeNr9}Yh0?`^e6ImmKT4drPOe1FpR^Z#R2^ncH3 z{(t$2h=gN+KGSEDfI&$!Ll8ZQ!80!s*?T7f_FvXt1k+-FnP6}zIgpyyqmTJPJK}`g zS~dA|UImPKUa#qpH-p|jE9s@^GC-JlexpbFuz-F_P{c{1i5lwWvd-!&j zi^5Ijej9`_5Zhq=!p81z%64j)5M>h2kbRZ(6gQI?6C(=*zJBo57m=wwU>Cnif_?bQ z&8_he+f(mx8w4g4vuLk0x3Hi}T`N7!GHF>F=@+50_qM{}g$g(WL(+Gdv_;72weB5j z#kX@aPYn!C-~Vk6uSabDYC+O|3tt=~x2*oXRA^Dli55LP<1_7N2fPLo3&ikpHVXRi zq1$@(VlN891dn`H)_KgmP0++=59frg_x^E&@Ab=>w--NE&BvHWeOw(WVBdxY?GA%c zIF?3M15VbT#p-NnY3Um{A8qnUNQLr2y7!obC44Qvw08oq-w0L8lB#QQXaAdmrXFrWH=h5j#Lx-Y;Jwn>lF*9vl=AFr?p`Hg9e7hK`@bW&+G+}cZ0ZwYJja7! z%Q%e$5}aV{0nhME2B{gg1(e?2Ml+WNOIbRQR0onF{r*R@a>wDZVk=OZP;wZ^2-+K8 zl*5pFxb>B9*mQn9#Zu!#3@<@1V{;_lu$q+G_Gqj2_V#kNJ^d1)uS6*OqOYo; zd@RfY4~jbp@CF5CNhvAJT$Ij2cO3VpU|cYjP)n#V$2SCl$Qol4@||Hah|GqaOeu91 z=Ss>&Pd&X}@SV{a>(rT3do@iVCQv^cU{%5PoA{bu(5kUPuHD~m(5a+@BEY}KfZxA4 z9nj^cMiBq7J^KU0q!WwqG0x8Z&)^hKkxOAFuppUxZ_y(shO3Lh__RI2!~W>yT`4|z zpST$T&MF$6h~%Q@0w+MKVgJ{`n>^*OuQ2~LXYbU5rN^mCyUT;wuC3Q&gVi;7(M~U# zg$ckYiw{ghp_s84=kCdlX0tn>77@i(`3h8THOhT1a3Be@KV(LqN&^D~ROr;pD>31~ zd)?Jo02KlG$Nv0@*Q|ffg*@bCzx)P7DT52S-`uYuOa~NR!8$a{%-%6JHufN1Un9SnumFP1(b4g6f@6N^a)+1OF59Bpi-p|0!f;2fJE17l z{!h^;LdWw*@&cYi1{%XXXF1F7QFsKO1hCCi6mH5AN>TJR*{KBg^{MJvB6AzXq``x? z6CTEoZGFAOQemp2vGC!;2T*ZS-5ayQLYOpRu!LYt%IK_}X0L&c^I{{^$cQIcFHycY z*h))F>*mMXK_3yaDsh~W3i4PK1maZ$7QU$8REENixT5?h3*16J_k3_NV#IVd-3Ex` z;bE|>l{7WkD}nHTd-~$t;nmqNVa@Y6iRh1D012#(2*Li zOuzHzCP__=FImAC=j>2Hdtg*1`v?Frvx|A?hWJ3)aaJGTl~78TOuXDS6_3;~qHXUm z8T15clPxsG4nj3mS67$6%^wVOsuECboe==FfFY3N)^xlhsYr!1C7r9H;lDhP3Csl| z7*uj>?C8$j3eRVdxzB1_+uQKE&DObzgC&-;$N%Btb9kxBN3a~T|16-=s+m{p>lh}( zt!|;HnG@LTPnHm%6~f8Y)fGVZ5(0RGaCycf=2QSZoKq6YGc(t6648{cci2``0rK`I#52!5bmMugy%)wi0Vr3lBmjw`m# z9_PN&je;Qa*vETcs>sOfeo|ULtKc!mAvfi=5N8)!-w4+6tydCzx1a#OTNM+MyL;1s zZ;_qkZB}wDF*4GfN~jF$3)pPogMlQ_9LB|LkqS2O@$-ucR%eT~cevp>UFT=%>(YO1 z(i;aKB)vZnjJ*{ii8V+6C|COkmZ@wLrTIrQuV=GP~}Ly%RfHfv1mnA z!T={^Dack?|4Zfh6a0qMfdUq6lW7EJf4({>0^Yv%hgkei9^5q>@&JzLfogu1T_SPF z7Z9V<;9yOD@?kvU#4Yg8;(z|*%p4T||A!773?>7XGh>B7u1QNvv(>|+VVEy^iVhh1 z-XA?54f6dy2u!Q(L3k19cyJiZI*{&t{uAkc)p^W!ZfwV5Xg1Q>U}bK{g2dK;Hv$;= z*$_IYH3kTStBwM5e6vkh_|RI}N^9A%7o5v4*@X6&^^p{C)%3VQ{;}m_Pg$poW29ig zyTc~Jp4~SGAvs_S4 zb+n8AbU^1%X}5jkHvu$ar(c7)qyf>E1wQUV+Iz|KfJ^|U;}2pu45s$G2C>>STX?gQI zSiZuEAa`4qfCRk>a0JKjVM!reYAXZY-0RsTFmI5xqUI+udhIEVst;Ji4SfZOe}9$(a+4(;ErN%{@Bl~c^fk{*nF(|alno-@w)EzHcB4C0su zonH@U$aA6)@-RBMyfAUHn_-N61}}oBDZMpd;p7QD#Co(lQ9(LT@AW^FU+<+tTiFhF^7wXilu!kl-ncqI!~X5Wtv-pvCari#!G9YmjHT*tZQkn8UI?C6}FDni9%Q<(NQ@$Q6}7~cEgHPiqZS*r19 zz_i~Ys4+OTemM8#iY}!K#yFGgvY>QIbqrJ=7=TXV-I_Tp5rDtoy&G6r2v&fY%Hg~Q z0d*3Px%DmV#>!eL_8=7<6e$6-bd@DSm}IOlZH5iJ&Y467&*07XuuJ?2LYkF+w6LQx zBX}=c#S*~M;J~KS5b~QlNHJHd3RUKY*VfkBgptYuZhl|^u3!h!EZUAzrOQI94$px8 zxlpx?S-3pyvM`9(RK_@1mK)h;8Oi7d$_l85tXE9B9&nNN*9a0`k-jqs`VMRH!Bj!8 zd}`N9x&SSh0NpNtQHm<_FdjA!FhEp=?TmqH%7INj^cdy)>)qT3BxMlQR5yEP-zpf? zL>M6ZzOIhqV+j*mWtXZuH7ta7ao)=s<-fZN)&yT@aj^z5avs|B&j>u5W)MoN7=Ts7CHJaoGi6`%dR#qj;=dn zR-yRWb$g%7+%X@s-0kIN$#>)R*v3C!-M$!onfYjD^3+{@sWA1}0Ye@^WvbVHGT*ba z7j~~cD*sqjs%9yzO9~S>*B+@M;QkX3#~9Ej!})b#ex5^6@s>i5sOsiB;5xomGqse< zW7L5zsoC2mTkase`aXq186)QKH!uiw96O@R%lYemIjO-6v`y_>aYm>W%L(Y~UOEG8 z^^+QQYC6Ejk6QeE>mX?OJKHTUs#$~7YWJmWpjZC)hn#Z<>8pqX;iQl^vRB7?`nFS5 zvGLZXNyApOFk>UkT<;68*#rA#o(ak5e=Et)zou-@xIK}!DSUqD334!QxxIok_0he(QTnWkb;L#EEa}ydL^j>ndX~1iiv)ul1?EHFl z_Jz~2%+z8~1Yq3i!6IhAIkkTwj%;I*4C%74t>wbn_4C8VPxEqf_dpnL_>Py@%x+&* z&M7Q(_1`Nn0~{Gdb0CmeuMMttM=ReP6-cNbXq~uho|5!N`z}s%>=_03ASA@^z4P|% z__7{W`OTqw2V*WeND_T2P5p5qYN2ZYa)2%h*q;qcpRkfd1e6wi3D;o>22j+L-E{ze z<2JG2_Cd2_!zjj1_J*k7*2=3R>`{Yt+r3J&A(w8++P$FR zI{mCAoX7Ix?457HGmS5GvD0Os;Kw{bsfY z`{_Xds^5o)H;L*72M6D|^MkyIf<1jIF!4oB&DEC1&eqHcUX4>>^_6R40wV0c?{4w4 zZ*6Tw`IR7<44`){N~}8$xW0yP(5;i_Qa8a1(4PL8Sv+1Tc1^Y}21pN|`OfIskZq6$ z;lJdk0LNYQ+g`XVOau=%I~=sAgf|6E%|M@!31GNQ>{3(70Ho6txIHK`zwb1saH z|GdlsiUL#+|MU+1;4^lUZ5Y9Qdj?853jFx&mlOCtr7 zfOj?k27FLJhEXR*?^*%=Xdg)59X()srM-%)2QnGFQXo70nRF7$Yd{Ow{g9QM^!RT< zd3PHbvs_4D&?|Mo1w@_+2dot%Ncj^35|vY1U9@K2;>;Ia-(d-^nJF@GVLrt+6tgpdlTy+tYyN5MV*+Y2bJj*G&_ z*KT)qch?me10s66txqWXcEma9D^gNu@*vmQ>y0Xa%d*&80GnnSbMO@wrB4aZfSq-U z{eP4ScJ(C4{o%q%ofU^?rq=18{J=8i9&RETZq|Oa4;=hY65{_N-WlpHL_Ai4Ob_zp zlazE=*s0xF4eb4LbFl=} z?0mlmQ1nYBHag8A7w-rAw|;l54<+8Z^_tH)S>9^nh517W8z6mx~SuOU^p@$_)fm;Dtj*aY*7+A6b_ z*$@z)+;UqZY|NJQ}yoLy^{LodI7AMCZQ zziKueL`r&(QCRz1muSFUt`}tF!yYL z#B|-xM)NOK2>4otIT;{FKpOF~RV`H1KC-`|zxZY+LG#``kCDNoFO?vNRU)pbaj9%{ zOSjT?vMU8VciQ`^K#P*wgVo(psIJ~N$n`r@p4bPfP+;d6;p=Jb7dbgvCbhm4f_)GX zj#h-qHkkbLpFdziK~n{l40(n5b}T1mmCFaH-QSi5mM>Ee`k|Y6Vxd0tk9LWEdqM$g z(b3W6tA(r)3JX;L<4iD296a`#>C~9mNP#&Y@0l3og|FNo`Ob2q>%}fDic4bV-bSKS z=jWutj4s(F%Aq$pkK>Pjv}|Si(0|s9o~_7OmPYYOnCw`wP86;tKXC#KI`lmyzCd*CS=pW5&hpU-mYE=ED%$ zEY~MNgf%Y3VpMgv5~KQi$Bwh3q=-vCifdOU_?Or9QGvv}CFux4e; zD9;2(Z(|GI8bo1(H{U$0@D5+>-@m@OtI=8B>7&0-lt=%ibo3x=Q*FW|B`Lp#v7@?&6Pa#vE#B2HVWQj`qS;OY(jxvzer3xw|?(2 zolo(ifiLF0daFqdVdx}Z91+Q!Tpkq8aiIM`bZ=GpVjFn7U4ShenY;W@U3}JYeo(;{XTN{igcWO<&$}#}FBC zQ=t3=Axv1c#JtiKWaG6YpJ|+&6#B=wo$}t&)$GLcLR0Q-1b98U6`$a7I)s3fP9GE#yL6jX_04fOLGt>{fKFD%jwijVycSpK4G`lI=?AWl0h010V zJ7zdt1H0jl=zGbAO{U)+I?2vk$HXFO^aMVn(zQUWN*GWuR)G2}&#Fn%>S$ZyY$wMM zeJMX;p&sg*Er`k+_Wn8-UJzu-ZIJxh*0r@#eI40`-H}8&d|2FtCX)7QkM4J)*WG`)hahjwM`trjs|q(~UO{6&QSUiwUl7@Wd$)A1!SHTsH3|c4SNB2!5hCenmL8ZK)_$Qc+slM&m{i| z6mTU*Z}V?9;VKf)ets7spMX|A`NRBXpr5P0Z13--qb9}UX*UmgJxW(96qLmC>gtrg zMuKJ=2D1>g-^7lUc)EYb*RlKCV4CeW>BWygXzUU(I$NXYB>(&Sq@UaoyMzQj)yb%j z)U{gJlYQW?ol(77S#$Yxqqoz>&CqG(IWc93MzzoGd7$*I4+e8(lbU;lT)= zw=rV+6)%iovsL@IJK^i72N)LNB>VO}vPp9J(%3)sp`=3u9xR=x( z!Aj;#C^N}_5jT5w%y#e^tl=72+bJiT81{ zGb3AImjD)Jf^na&YXa39lQ4m;<@ZtzbG>+aaR5muLSne^yz)Y+=RLkk?%+s^kJ5@QF52ep@W6p=B^7d4%zIZ7T7WNl{-dc37D@HAzO2 zk&PT{7=@DA0#_PW(WtW%;$mX!l;$K1W%w&F!u825E`!;SQ;dCBu)|)|<@W(QW8dJV zrKNn=o}7viDDgt6`msZD$cDsGG*gM#4Vurja?WDEZN?U@^!XB1kPo1%_!+VIZL=-P z?rP!}X?iO4{rmT7|1ei!D0_r#KLijS@EKB(DT;K<|; z6@KKlH#SHitqPk(>Eqm*xni$bcuW;*=+X&-z{+`sy9S~3>(?L%=O?(%8E>@mqXBEb zTJOKhn2op+b~148beLYe7yYzG;QBYKPda+E7O78?5*Cn^Zx?}%szI=CBZ2^<2mWm1 z_v|Eh+NK6`a~;p5@nKFh|BSQyupEbd zW45`?R}p%!Aj9d`2G*wd7F95I>p7c!R>9*xJN6PIIvVqb=t;yoF^N5 z+wO&$hEf%!%hK-Y=+C3%;80gmutfa4juo@Uv}^1}!2R+gvsV`UeOC+&638Gm z`_VSr)@!H@IWDjBsVGyXPcv8WS-`*hjsh-x{+9j2_qO9V@T>x9aB3p?DIR2mO@L8v z8UZu`VyCOLvfXyiWkCm~Se#*v0|s75O@i4Qt3uCdUlm|AKVy5>-_wTiZCXM-Xdssm zKR{*-*^M$dSPL4n`nJwRouS?C9X2(|T#N=B0*>H&R!K$2fpmpgKhureKAb zSe_OeiTF%?Y(5O9eBr>s4)y9YOu+>E2V+!|;vw`D3(sDNH00oukwKs^g#90){>$pN zYnwU@nle}>;{NB%?gM|jMV#-zEiN(~k71!L8D2JM^BmX=Iq>CwrIuN1f%3|k7wMm3 zWr@hL>j&d(t^SXT|9|U08*6oXQK^eSJT^7rF%r$q&1?GoulA(`!$)V{ZO9uWnNk0+ ze+$6=b8}ZZJ5Twop3jARXwZ6hD%^=by|Xi3ySqx$l1BWX~^jeItMHs+`L`SisicLXJFx z)!gZCFApAkOtwG(+(NFl*;8EmtI6Yo_J|@~GijFCO83Z$8pT=vKR43_`^w_cN{&>+ zuX&CbldA`_!wa^=JvANIGg+#b3io9AXAQrK0uP_#$F?K;~7_ z7semu);7Fn{KCBWOu(2(5c)i_(F9XvE}cz$s6Hc%zqt&=L?M0)WTC`>-tVkz91V<6 zVU^8M(C{+?6GS$}5^J1R4E0q&PqGG+_H~DS?Ot-g9)!E_EOI~#mcVG|1~n@kuO4M>*ATFLLnA_-KE%!3t8Dus-J4+I+cO;druF*o4B!@Qx@3ZS3caalx}dFYA-6>aI$w^h+%P#n1o{pbB22Sh_y|NTJK4l z#zMZJ?E#yvSfIW>vYn_zzMb|6)SD=>RI?|8vN!k9=JZcAuP2W^mfoKiewLshCR=6s z^Bycj0qVGr88f@cxcz8H|>c-`hhpn)RpeREN zFf*F~l^uD&2;!fp7x`|cCBVt#0tj_irxXSGy@M9;ohhQOGq;Oj@*)p}&o~oopN^H< zp&dxd9>c?{`1%nGQWGRRU{g-?oU zZIx3`|2Kq>nAu<|tBD}z@@3AwMHaOSQsWv|D{ZBG>CyY>_P;W$@Q z*uy8gR?-Y|IXY>#dysidf=yVNHXmyzR}nt922*f&K%5TR+9oOdYR8gRE4$vo6fO${ z11qvO-%rF7er^1(4P5TefZ9w)Rd18!C-G zUR%d&gJyGHLQoV668gk!^hpsc0{#IfDs%a?BZdSqJ6ryM-SuU;+w7}#6@O6BS?_=u zKB|bKfzlFT!*eHA6*fA6X1?f6^6Vv};DJmkUS+4R`M!YcO@XuQZOs*lz*XjH$ukb+ zO5NB`4O_1z$Dl5sd6$-^K6}d9etA5PR5D?h!vD0z_C4?#!GHOa3;AnnTU#X$@And> zg9f;+fF_e|_4lgB^pkdm4byFXw+rO_ch<(yOvw(IzUutW1`&-+>aW$ugYFpd@hZ|Z zb-|ms3HBa?UM3N9T-32=N{@|=hg6^?8B6=WKWVC}l2-YWeHiMx-Bl`TULga6gI}^& zWRNdh+#Wmkf~Xs=*!>fArPR{iZd*l7yHMGIV6dydL^1MhYf?F=^AEG5hXkHbeoo^s zi1px(oyoKbqO7K_u9HDa6{vV1N%u!py?*?~w%~0UFW7Hf-S^Q`!LjF_qD7@4G z6cHyddukURKLuGiloO|vtJTuwGoG1M>?(c!sXFKpDU$))Hx-Ce(hcrEDhtWeOm>uu z32Zkh$1gWGH+~Rm06l%EtbWe&2f(`K{tnfkEe3Upe|D6qV7IEVQ(^bkbwZY_NEd$A zy~u@LO;GeK3j&MiQz_>GJ$GS}Smfl4RQDH~PI;+K(HEF&)Q%wk*E>p#I{G8SN>O^n zKYe>Z+-`RAynoN@GLjr=;Mrc9_I#VFcv3*#w`I$Q_}|)0DVsq_3E`@qX@WB;pKASg zmNxf)BOTlj9VfPbwWwF)YDCTNn#zAoX$~RbQLzu2I11AgK*CFsaWYQY$V9*9Dh1N4 zOR~1`NrSSp7QOXOh_`uz^K#l7;Y&z~Yk^>c^Kj~ozwE7WHSopyWF}b zXPLk@c18BXH~Sh$CDQIw1sVjm`^X_BK%og7jqhRtdEm!txFD)Pu|3@9Se8?fn4jf^ zl4^VMgl<{`=k=_Ak4$WAOibwE{q~Fe@E3`3aSGP$$y`$qmyW2kHaoBY!-)D7#Bvh` z;|QBx{0_YjYGAMlx&_zed>(XkbdYz^!FvD$uSr75o#LgyMigLt_%di`V}soILAC4v zo8f^?V^QUH$G*F3m2b=X-(wKc8ZtTXSMhH7Fs`VO`#x%D>_D;sxLKW25Or?NHEOYZ z5Jx6qWG$u`t1!E3zQ|zT&nOJ`5K3{0Ito2E{kqx{Pnnj9g(=KV2COT1Vf6nFTpW1c zG|;q4S%0m=xj*!yW4rRu#Dttw!_GLf7c{_ty>d2|*J+b@Az0Z`NR9YUGn==C5LGxL zz)Z2x)i#06TU9822}{7or4v@Mik{twvfh&g_O+~TLpQmU%?#P}^z~ow@CzyT{aOvK zbRQOxU=nxbqN82p1AiV`ObYPF1lJDDFA`xszXvjP?xWmxKz%Xc)hpIj+c>Y^b0GJ= z*~1EX&m?$4A)DgaVDYYoYC#(4d#I0!l%fQrS2K{4enX29x_W_Ad<~Clg6YTGkcAo6 z7V^#`1y1Yc@SbH%*NX!d_OrhY7{WxP|0)`|R$+|AL_<%{TH)aR(;o}c6wsOas5+u< z-7Fu3*>M9U40;JXBWP3o;>OqD&nZ{INog$YBG7V63zIi*N;f6AjhusVTS?Hu9A3?{m`l!UpR<1JUFWY^Yp*qXul+pF-p}{@x$UrC6+h=&bV&F2ib<~Vk#Lf$=6-CYBXW*H`}zq zSYIz=d4ASi%Gm0qPdsij$mT|RiTi&4+}&z~7ER$XI}?9d*)-leqn?la49Yy<>D9IxV<`KU?J7{a&)%kPT;JLV~EP=LTh+k_$adCUzeKD=oXGFSb~zYsA7onKqZ{;Yu!RWqZ`(UhJZ$)Vzu(A}mJck}@S%Wkpz*qy!P@-7WJziwa=yI5#Vv#G6+nOY z=Y$Cs!NC`uFZ&tRt)xbFv>z;xq=8#~@UmF+1BUZe;^Zax!HJ2>m-`<_8VDeYT0gqs zkI}-KiuZbx?-(FTU%V(|Jb&JK@6)0Cz(@#Kq>SAodGa3#C`L-kFT1YB1bg{$i0f;` zT9}YTPaG~JG<{o)1?!X%E;Ym9PHg;8Ne$+gfD``*JJ;_6@iJU{>$bn*u%BwqNz)VH zf3CHFSo3@uVDW?0Ybg&}%0BG#cWJ%;LhkUNQ~$^0|1%)}49K6}2!C1>3&LOj=l`&P zzd+!50TA|g|2l;4?^4SCbDh6Kck!1Cp8pG`@&AWr`%kZt^YoO|R6=jzFSsL@S=rDF zLWBzobP=jiQpSx#tfK5G#~316^PSobp*t&Abwc=^v5xG7bX7*+k^(J3N*8E1BUUH9 zNi@#cAscOo5(VZhXo%d{Xd`I}^dcU-2cnm1zzzalMut@cJlw#=@?|2;UTl9h^jXCY zuQs}(czx38yzd5*`gOx1LPE-xS|N**8^nFG2>-EV|{fUT>}_qX!U0Ns_TKTp=mz$-ag})*R{>XCtvy)#H{&s^U>(@W5kh<)Eq@MlL!X zqvO+_(AS}G$cfc*&K4x40XIl!o>1;{rm?zRWq6pk_d=Y6lE2k1LYk1Bj&F7E0^FC4 z%0z~AGey>XX$e`(rSDJG%%|wFvzIh?2|b|FBNsY8bw1H`{No8dU0lJ;`^4bNQJv6@ z&U9a_8C3tA3ckZ74vWruiok7@K3ofmiXlE#^$(n)q$6Uaj^T&h)E=%$9Y`uqkkTl) zz08wjRBNZ$YdT*t4Zhw+LDmJ;7!#!_UBON6hJI5e0D9ey8UcU^RlOV7Sqig(xqqT5 zt#Y~DbT;d5znsvK)=a&Zw^w_MsEfV~pS?yz=u>+wmn#n6x2h4Jgo)DH;RBPSJEhDa zr!o=9Agm!LU&2pf96jbd+DSB%d4)W#=_6oPbJ@OF6!)6D48p&?ne)cAruA@Z=DGL& zemf!1i|&Fxa)+c5#9ZAxh+YpRDO@?DVO?S#GRsQ?<>t_lV<3;1CNlJ#R5YA*@(+cU1L6D-mZFNGXpU0A14jUEZ)3nH6+VBnQ^MeF>h48jz zX(DltxuLcZHNCP;QdAz5l`>HB8tD-2$*oL!Bq zb9ga2T57d9X<|u3A0uVidd@<0wL{jIkx@0%(J@^U#A9%+O0O%N-!yQ7J|vuWB-%s9 zHaX4Kwp+$dGmKB++^{lOdXIFer)O`FC3nY+>mtngfNNu-9zaOB5`3b}WpTBB!W`^H z9~!Dl*l6GmmMx4MJ9E;l8F%Xa56sMU5NK5sP7oQm_w?gfYR%b+kx>U&8-<%Eb^0Dd zRG;feQ6;R_PasN%EC}QU2g>yCdiF2ZW}((?3Et2A^+TI$t%DpD5*mkjW%cidi&Yr2 z6`SibjWgl;YmMf`zU%1efwCpwg*mEz+-YRn8HiJvwc-!uxpqHaAc@A9leKV7HD|5c zVyG7|4nF6(t0CPZ57)}z*qEOJ98~{MI*JTjY)0NUtb^BNt>0_&l}BeGTyAgDtLc$2 z7W|%`MliQ`!7qTy5hSkV#xS*bHRgve@o+3(oY zw7=C%<;+WgtqlKr|IS3e&y4rTfVsxiwIdoZP1?X z;aqzDV)siyYPWm%74cb!>8`=`FGFJFa8nm^XcLRU~ zJ+Ff4xU;l$W%~0!k6DkFAakN>916K2 zK6~X+88C$ONhLBYNHG6!T<>ji_JWJ=ZepeuzQq`eq7Q!~hZnoqwtS0ym6#>JL+HGv zUb)B>bOl3=$2M9yZR=ojFK;Oo!En#6?o+G2@ur4TkkWQL;Wy-f(qlt6Ku zZQcsi2pVfB$n?$1NXxRdyA~iB=r&5pZXc+UGLE8ejILROP4+3Y3%F&M7e#Z;Gps2Z zp^mU(FFw-^ZVI-e4Ar3N<^1tQtf$ZBuLi9IyX$gkW9lpJgrO1oSa$UowmcdAsX!8O zF`i#)t|s(By$P!4?;bwNRBY_GWsMGv)8Y(9;(hQ00hcGnyV9kc%XGcspcc5C7s)x{ zhLrkD+TJBt3g`CPOh38P03)hEE4y zb>oc2uWt#H1>yar%`2F+yW6R)=e&Tcvh&7o>(_w>?OX0}Ud4`iiW?Y!#ClZb0Nqsl z&7yJAF}sl5ylgT)S^@n;$7MbbBfII~+-27Qb1{2t-+wM}b-o@YfB=f-)3mK zP1CE#K0;jXCp}>`&K4gFR9DhJ6WY?*Xo>B*U6tKu$tJ!I5C;zvWR|-036*)xmsB!V zZEeX;L=D|kRZ>cDWsr>Pj!`uJkVWcvt~`z<;XjLARl}22_U{&QEvurkiH#Wu=RfG} z#e*Sq5jA*j_YnTA*LrPiNBokp#J(i*&|UXyQB94UR;8!#uzEqVJYL-qi}5)0qK{w5 z)?B0N)+cII;hZY^Lyt_#^Aa;Pi})F|`hBu`!M89~wI<`F6n;IowWyYW&dEW+LcxLmKrC6=4MRED*cG+M^eB7pT< zH`usn354fIDVJ3Vi;u@d#Mz0>M4VB+H%TG!Tb==rPi$_5u*r{d`(j}9<0XNCgV#HD z5z{rjTkeTC8l&UhEH3ViCd%pu&l{T(=KJWb1J4z6#1)dD$djl?`nZi+vbYI0tQ58e z(S7GFM_m|a?|U7Di84;gP%Gkp;U&pvzv1^k6jeZHX$5;3EMX1D70_qMs&38miXc88 zvvc$T=4YYvO->RClG;A&wTc~J5Hg0bAw-1IADnnB>Zsl?PCbP!CgOM{Ey(8+sfX3e zsvyd_*jWaC<&?tx?~O&&=uc>s7vFuj^vJ^6?0+F@WE=@q4IAZjoNX%(V>-i0+^_g#0Ld0e z>4aKsCd5+r*7pq5;g_E@j%8P>V!2xk|yvK^plY4zm^u&(FYd55g`*pvkR|&yBYbvjB~BO literal 0 HcmV?d00001 diff --git a/integration_tests/utils/mocks.ts b/integration_tests/utils/mocks.ts index cf611d3b..cc5c024c 100644 --- a/integration_tests/utils/mocks.ts +++ b/integration_tests/utils/mocks.ts @@ -231,7 +231,7 @@ export const mockMergeTestVariations = async (page: Page, build: Build) => { // the runtime settings env.sh writes to env-config.js, with some overridden; // the app reads them once, when it loads -export const mockEnvConfig = async ( +export const mockEnvConfig = ( page: Page, overrides: Record, ) => { @@ -247,14 +247,14 @@ export const mockEnvConfig = async ( }); }; -export const mockOidcEnabled = async (page: Page, enabled: boolean) => { +export const mockOidcEnabled = (page: Page, enabled: boolean) => { return page.route(`${API_URL}/users/oidc/enabled`, (route) => route.fulfill({ body: JSON.stringify(enabled) }), ); }; // stands in for the API's redirect to the identity provider -export const mockOidcProvider = async (page: Page) => { +export const mockOidcProvider = (page: Page) => { return page.route(`${API_URL}/users/oidc/login`, (route) => route.fulfill({ contentType: "text/html", @@ -264,19 +264,19 @@ export const mockOidcProvider = async (page: Page) => { }; // the user behind a token, as /users/me answers: without the token itself -export const mockGetMe = async (page: Page, user: object) => { +export const mockGetMe = (page: Page, user: object) => { return page.route(`${API_URL}/users/me`, (route) => route.fulfill({ body: JSON.stringify(user) }), ); }; -export const mockLogin = async (page: Page, user: object) => { +export const mockLogin = (page: Page, user: object) => { return page.route(`${API_URL}/users/login`, (route) => route.fulfill({ body: JSON.stringify(user) }), ); }; -export const mockDeleteUsers = async (page: Page) => { +export const mockDeleteUsers = (page: Page) => { return page.route(`${API_URL}/users`, (route, request) => request.method() === "DELETE" ? route.fulfill({ body: JSON.stringify(true) }) @@ -285,7 +285,7 @@ export const mockDeleteUsers = async (page: Page) => { }; // the API answers a build patch with the build as patched -export const mockUpdateBuild = async (page: Page, build: Build) => { +export const mockUpdateBuild = (page: Page, build: Build) => { return page.route(`${API_URL}/builds/${build.id}`, (route, request) => request.method() === "PATCH" ? route.fulfill({