From 43f096dde8ef6c0a0c20036f0a595a7608ea2ea1 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Thu, 17 Sep 2026 23:18:43 -0700 Subject: [PATCH] test(ui): preserve form failure evidence --- tests/e2e/ui/tests/prompts/addPrompt.spec.ts | 116 +++++++++------- .../tests/tagManagement/tagManagement.spec.ts | 124 ++++++++++-------- 2 files changed, 136 insertions(+), 104 deletions(-) diff --git a/tests/e2e/ui/tests/prompts/addPrompt.spec.ts b/tests/e2e/ui/tests/prompts/addPrompt.spec.ts index 2b254c78b10..b601b7e8c06 100644 --- a/tests/e2e/ui/tests/prompts/addPrompt.spec.ts +++ b/tests/e2e/ui/tests/prompts/addPrompt.spec.ts @@ -3,7 +3,6 @@ import { test, expect } from "@playwright/test"; import { ADMIN_STORAGE_PATH } from "../../constants"; import { Page as DashboardPage } from "../../fixtures/pages"; import { navigateToPage } from "../../helpers/navigation"; -import { readBack } from "../../helpers/roundTrip"; import { masterKey, uniqueSuffix } from "../../helpers/traffic"; test.use({ storageState: ADMIN_STORAGE_PATH }); @@ -14,58 +13,75 @@ test.describe("Prompt upload form", () => { }) => { const promptId = `e2e-prompt-${uniqueSuffix()}`; const promptContent = "Hello {{name}}"; - await navigateToPage(page, DashboardPage.Prompts); - await page.getByRole("button", { name: "Upload .prompt File" }).click(); + const cleanup = async (): Promise => { + try { + const response = await page.request.delete( + `/prompts/${encodeURIComponent(promptId)}?environment=development`, + { + headers: { Authorization: `Bearer ${masterKey()}` }, + }, + ); + return response.ok(); + } catch { + return false; + } + }; + const testOutcome = await (async () => { + try { + await navigateToPage(page, DashboardPage.Prompts); + await page.getByRole("button", { name: "Upload .prompt File" }).click(); + await expect( + page.getByRole("dialog", { name: "Add New Prompt" }), + ).toBeVisible(); + await page.getByLabel("Prompt ID").fill(promptId); + await page.locator('input[type="file"]').setInputFiles({ + name: "e2e.prompt", + mimeType: "text/plain", + buffer: Buffer.from( + `model: fake-openai-gpt-4\ntemplate: "${promptContent}"\n`, + ), + }); + await expect(page.getByText("Selected: e2e.prompt")).toBeVisible(); + await page.getByRole("button", { name: "Create Prompt" }).click(); + + await expect + .poll(async () => { + const response = await page.request.get( + `/prompts/${encodeURIComponent(promptId)}/info?environment=development`, + { + headers: { Authorization: `Bearer ${masterKey()}` }, + }, + ); + return response.ok(); + }) + .toBe(true); + await expect + .poll(async () => { + const response = await page.request.get( + `/prompts/${encodeURIComponent(promptId)}/info?environment=development`, + { + headers: { Authorization: `Bearer ${masterKey()}` }, + }, + ); + if (!response.ok()) return undefined; + const promptInfo = (await response.json()) as { + raw_prompt_template?: { content?: string }; + }; + return promptInfo.raw_prompt_template?.content; + }) + .toContain(promptContent); + await expect(page.getByText(promptId, { exact: true })).toBeVisible(); + return { passed: true as const }; + } catch (error) { + return { passed: false as const, error }; + } + })(); try { - await expect( - page.getByRole("dialog", { name: "Add New Prompt" }), - ).toBeVisible(); - await page.getByLabel("Prompt ID").fill(promptId); - await page.locator('input[type="file"]').setInputFiles({ - name: "e2e.prompt", - mimeType: "text/plain", - buffer: Buffer.from( - `model: fake-openai-gpt-4\ntemplate: "${promptContent}"\n`, - ), - }); - await expect(page.getByText("Selected: e2e.prompt")).toBeVisible(); - await page.getByRole("button", { name: "Create Prompt" }).click(); - - await expect - .poll(async () => { - const response = await page.request.get( - `/prompts/${encodeURIComponent(promptId)}/info?environment=development`, - { - headers: { Authorization: `Bearer ${masterKey()}` }, - }, - ); - return response.ok(); - }) - .toBe(true); - await expect - .poll(async () => { - const response = await page.request.get( - `/prompts/${encodeURIComponent(promptId)}/info?environment=development`, - { - headers: { Authorization: `Bearer ${masterKey()}` }, - }, - ); - if (!response.ok()) return undefined; - const promptInfo = (await response.json()) as { - raw_prompt_template?: { content?: string }; - }; - return promptInfo.raw_prompt_template?.content; - }) - .toContain(promptContent); - await expect(page.getByText(promptId, { exact: true })).toBeVisible(); + if (!testOutcome.passed) throw testOutcome.error; } finally { - await page.request.delete( - `/prompts/${encodeURIComponent(promptId)}?environment=development`, - { - headers: { Authorization: `Bearer ${masterKey()}` }, - }, - ); + const cleanupSucceeded = await cleanup(); + if (testOutcome.passed) expect(cleanupSucceeded).toBe(true); } }); }); diff --git a/tests/e2e/ui/tests/tagManagement/tagManagement.spec.ts b/tests/e2e/ui/tests/tagManagement/tagManagement.spec.ts index 785211463dd..4223324ff09 100644 --- a/tests/e2e/ui/tests/tagManagement/tagManagement.spec.ts +++ b/tests/e2e/ui/tests/tagManagement/tagManagement.spec.ts @@ -13,64 +13,80 @@ test.describe("Tag management", () => { const tagName = `e2e-tag-${uniqueSuffix()}`; const description = "synthetic tag description"; const updatedDescription = `${description} updated`; + const cleanup = async (): Promise => { + try { + const response = await page.request.post("/tag/delete", { + headers: { + Authorization: `Bearer ${masterKey()}`, + "Content-Type": "application/json", + }, + data: { name: tagName }, + }); + return response.ok(); + } catch { + return false; + } + }; + const testOutcome = await (async () => { + try { + await navigateToPage(page, DashboardPage.TagManagement); + await page.getByRole("button", { name: "+ Create New Tag" }).click(); + await expect( + page.getByRole("dialog", { name: "Create New Tag" }), + ).toBeVisible(); + await page.getByLabel("Tag Name").fill(tagName); + await page.getByLabel("Description").fill(description); + await page.getByRole("button", { name: "Create Tag" }).click(); - await navigateToPage(page, DashboardPage.TagManagement); - await page.getByRole("button", { name: "+ Create New Tag" }).click(); + await expect + .poll(async () => { + const response = await readBack< + Record> + >(page, "/tag/list"); + return Object.values(response).some((tag) => tag.name === tagName); + }) + .toBe(true); + await expect(page.getByText(tagName, { exact: true })).toBeVisible(); + + await page.getByText(tagName, { exact: true }).click(); + await expect(page.getByText("Tag Name:")).toBeVisible(); + await page.getByRole("button", { name: "Edit Tag" }).click(); + await page.getByLabel("Description").fill(updatedDescription); + const updateBody = await captureRequestBody( + page, + { method: "POST", urlIncludes: "/tag/update" }, + () => page.getByRole("button", { name: "Save Changes" }).click(), + ); + expect(updateBody).toMatchObject({ + name: tagName, + description: updatedDescription, + }); + + await expect + .poll(async () => { + const infoResponse = await page.request.post("/tag/info", { + headers: { Authorization: `Bearer ${masterKey()}` }, + data: { names: [tagName] }, + }); + expect(infoResponse.ok()).toBe(true); + const info = (await infoResponse.json()) as Record< + string, + { description?: string } + >; + return info[tagName]?.description; + }) + .toBe(updatedDescription); + return { passed: true as const }; + } catch (error) { + return { passed: false as const, error }; + } + })(); try { - await expect( - page.getByRole("dialog", { name: "Create New Tag" }), - ).toBeVisible(); - await page.getByLabel("Tag Name").fill(tagName); - await page.getByLabel("Description").fill(description); - await page.getByRole("button", { name: "Create Tag" }).click(); - - await expect - .poll(async () => { - const response = await readBack< - Record> - >(page, "/tag/list"); - return Object.values(response).some((tag) => tag.name === tagName); - }) - .toBe(true); - await expect(page.getByText(tagName, { exact: true })).toBeVisible(); - - await page.getByText(tagName, { exact: true }).click(); - await expect(page.getByText("Tag Name:")).toBeVisible(); - await page.getByRole("button", { name: "Edit Tag" }).click(); - await page.getByLabel("Description").fill(updatedDescription); - const updateBody = await captureRequestBody( - page, - { method: "POST", urlIncludes: "/tag/update" }, - () => page.getByRole("button", { name: "Save Changes" }).click(), - ); - expect(updateBody).toMatchObject({ - name: tagName, - description: updatedDescription, - }); - - await expect - .poll(async () => { - const infoResponse = await page.request.post("/tag/info", { - headers: { Authorization: `Bearer ${masterKey()}` }, - data: { names: [tagName] }, - }); - expect(infoResponse.ok()).toBe(true); - const info = (await infoResponse.json()) as Record< - string, - { description?: string } - >; - return info[tagName]?.description; - }) - .toBe(updatedDescription); + if (!testOutcome.passed) throw testOutcome.error; } finally { - await page.request.post("/tag/delete", { - headers: { - Authorization: `Bearer ${masterKey()}`, - "Content-Type": "application/json", - }, - data: { name: tagName }, - }); + const cleanupSucceeded = await cleanup(); + if (testOutcome.passed) expect(cleanupSucceeded).toBe(true); } }); });