mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-25 01:02:15 +00:00
test(ui): preserve form failure evidence
This commit is contained in:
parent
035271b510
commit
43f096dde8
2 changed files with 136 additions and 104 deletions
|
|
@ -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<boolean> => {
|
||||
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);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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<boolean> => {
|
||||
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<string, Record<string, unknown>>
|
||||
>(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<string, Record<string, unknown>>
|
||||
>(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);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue