mirror of
https://github.com/coder/coder.git
synced 2026-06-03 21:18:24 +00:00
dba688662c
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" />
78 lines
2.3 KiB
TypeScript
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¶m.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¶m.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¶m.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();
|
|
});
|