Files
coder/site/e2e/tests/workspaces/autoCreateWorkspace.spec.ts
T
Jake Howell dba688662c feat: add <ErrorAlert /> debug details (#22462)
Closes #22140

Short simple and sweet PR to add a bunch of details to our `<Alert />`
stacks. This means we aren't simply asking the user to read the
developer console and surface things easier.

- Implement `Response data` and `Stack trace` `<details />`
- Fix overflow in `ErrorAlert` debug accordions so long `Response data`
and `Stack Trace` content stays inside the alert.
- Add horizontal scroll wrappers around both `<pre>` blocks used in
debug details.
- Update `Alert` layout with `min-w-0` on flex containers so nested
content can shrink correctly and internal scrolling works as intended.

<img width="739" height="550" alt="preview-validation"
src="https://github.com/user-attachments/assets/a6f890d3-8f1f-4fd6-b9d0-882838db04a4"
/>
2026-03-06 03:48:01 +11:00

78 lines
2.3 KiB
TypeScript

import { expect, test } from "@playwright/test";
import { users } from "../../constants";
import {
createTemplate,
createWorkspace,
echoResponsesWithParameters,
login,
} from "../../helpers";
import { beforeCoderTest } from "../../hooks";
import { emptyParameter } from "../../parameters";
import type { RichParameter } from "../../provisionerGenerated";
test.describe.configure({ mode: "parallel" });
let template!: string;
test.beforeAll(async ({ browser }) => {
const page = await (await browser.newContext()).newPage();
await login(page, users.templateAdmin);
const richParameters: RichParameter[] = [
{ ...emptyParameter, name: "repo", displayName: "Repo", type: "string" },
];
template = await createTemplate(
page,
echoResponsesWithParameters(richParameters),
);
});
test.beforeEach(async ({ page }) => {
beforeCoderTest(page);
await login(page, users.member);
});
test("create workspace in auto mode", async ({ page }) => {
const name = "test-workspace";
await page.goto(
`/templates/${template}/workspace?mode=auto&param.repo=example&name=${name}`,
{
waitUntil: "domcontentloaded",
},
);
await page.getByRole("button", { name: /confirm and create/i }).click();
await expect(page).toHaveTitle(`${users.member.username}/${name} - Coder`);
});
test("use an existing workspace that matches the `match` parameter instead of creating a new one", async ({
page,
}) => {
const prevWorkspace = await createWorkspace(page, template);
await page.goto(
`/templates/${template}/workspace?mode=auto&param.repo=example&name=new-name&match=name:${prevWorkspace}`,
{
waitUntil: "domcontentloaded",
},
);
await page.getByRole("button", { name: /confirm and create/i }).click();
await expect(page).toHaveTitle(
`${users.member.username}/${prevWorkspace} - Coder`,
);
});
test("show error if `match` parameter is invalid", async ({ page }) => {
const prevWorkspace = await createWorkspace(page, template);
await page.goto(
`/templates/${template}/workspace?mode=auto&param.repo=example&name=new-name&match=not-valid-query:${prevWorkspace}`,
{
waitUntil: "domcontentloaded",
},
);
await page.getByRole("button", { name: /confirm and create/i }).click();
await expect(
page.getByRole("alert").getByRole("heading", {
name: "Invalid match value",
}),
).toBeVisible();
});