mirror of
https://github.com/BerriAI/litellm.git
synced 2026-08-28 05:25:59 +00:00
test(e2e/ui): address the migrated dashboard controls by role, not antd classes
The playground, logs drawer and AI Hub modal moved off antd, so the specs that reached for .ant-select, .ant-drawer-content, .ant-modal and .ant-radio-button-wrapper no longer match anything and time out. Address the same controls through their accessible role and name instead, which holds across the component library swap and reads closer to what a user does.
This commit is contained in:
parent
d7d10be063
commit
edc1d65558
4 changed files with 18 additions and 22 deletions
|
|
@ -10,16 +10,15 @@ import { Page } from "../fixtures/pages";
|
|||
*/
|
||||
export const onlyVisible = (locator: Locator): Locator => locator.filter({ visible: true }).first();
|
||||
|
||||
/** The model dropdown, addressed by the placeholder it shows before selection. */
|
||||
export const modelSelect = (page: PlaywrightPage): Locator =>
|
||||
onlyVisible(page.locator('.ant-select:has(.ant-select-selection-placeholder:text-is("Select a Model"))'));
|
||||
/** The model combobox, addressed by the placeholder its search input shows before selection. */
|
||||
export const modelSelect = (page: PlaywrightPage): Locator => onlyVisible(page.getByPlaceholder("Select a Model"));
|
||||
|
||||
/** Send button is icon-only (an up-arrow), so there is no accessible name. */
|
||||
export const sendButton = (page: PlaywrightPage): Locator => onlyVisible(page.locator("button:has(.anticon-arrow-up)"));
|
||||
export const sendButton = (page: PlaywrightPage): Locator =>
|
||||
onlyVisible(page.getByRole("button", { name: "Send message" }));
|
||||
|
||||
/** The Virtual Key Source dropdown, addressed by its currently selected label. */
|
||||
export const keySourceSelect = (page: PlaywrightPage, current: string): Locator =>
|
||||
onlyVisible(page.locator(`.ant-select:has(.ant-select-selection-item[title="${current}"])`));
|
||||
/** The Virtual Key Source dropdown, addressed by the accessible name on its trigger. */
|
||||
export const keySourceSelect = (page: PlaywrightPage): Locator =>
|
||||
onlyVisible(page.getByLabel("Virtual Key Source"));
|
||||
|
||||
export async function openPlayground(page: PlaywrightPage): Promise<void> {
|
||||
await navigateToPage(page, Page.LlmPlayground);
|
||||
|
|
@ -33,9 +32,8 @@ export async function selectModel(page: PlaywrightPage, model: string): Promise<
|
|||
const select = modelSelect(page);
|
||||
await select.click();
|
||||
// Virtualized: options outside the rendered window are absent from the DOM, so search first.
|
||||
await select.locator("input.ant-select-selection-search-input").fill(model);
|
||||
// antd portals its dropdown to the body; options carry the value as `title`.
|
||||
await onlyVisible(page.locator(`.ant-select-item-option[title="${model}"]`)).click({ timeout: 15_000 });
|
||||
await select.fill(model);
|
||||
await onlyVisible(page.getByRole("option", { name: model, exact: true })).click({ timeout: 15_000 });
|
||||
}
|
||||
|
||||
export async function sendMessage(page: PlaywrightPage, message: string): Promise<void> {
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ test.describe("Logs page", () => {
|
|||
|
||||
// Expand: clicking the row opens the detail drawer for that request.
|
||||
await row.click();
|
||||
const drawer = page.locator(".ant-drawer-content").first();
|
||||
const drawer = page.getByRole("dialog").first();
|
||||
await expect(drawer).toBeVisible({ timeout: 20_000 });
|
||||
await expect(drawer.getByText("Request & Response")).toBeVisible({
|
||||
timeout: 20_000,
|
||||
|
|
@ -91,7 +91,7 @@ test.describe("Logs page", () => {
|
|||
|
||||
const row = await openLogsForRequest(page, requestId);
|
||||
await row.click();
|
||||
const drawer = page.locator(".ant-drawer-content").first();
|
||||
const drawer = page.getByRole("dialog").first();
|
||||
await expect(drawer).toBeVisible({ timeout: 20_000 });
|
||||
|
||||
// Copy request: the Input card's copy button puts the prompt on the clipboard.
|
||||
|
|
@ -120,7 +120,7 @@ test.describe("Logs page", () => {
|
|||
const row = await openLogsForRequest(page, requestId);
|
||||
await row.click();
|
||||
|
||||
const drawer = page.locator(".ant-drawer-content").first();
|
||||
const drawer = page.getByRole("dialog").first();
|
||||
await expect(drawer.getByText("Request & Response")).toBeVisible({
|
||||
timeout: 20_000,
|
||||
});
|
||||
|
|
@ -159,14 +159,12 @@ test.describe("Logs page", () => {
|
|||
const row = await openLogsForRequest(page, requestId);
|
||||
await row.click();
|
||||
|
||||
const drawer = page.locator(".ant-drawer-content").first();
|
||||
const drawer = page.getByRole("dialog").first();
|
||||
await expect(drawer.getByText("Request & Response")).toBeVisible({
|
||||
timeout: 20_000,
|
||||
});
|
||||
|
||||
// antd Radio.Button hides the <input> under its <label>, which intercepts
|
||||
// the pointer event — click the label, not the radio.
|
||||
await drawer.locator("label.ant-radio-button-wrapper").filter({ hasText: "JSON" }).click();
|
||||
await drawer.getByRole("tab", { name: "JSON" }).click();
|
||||
|
||||
const requestTab = drawer.getByRole("tab", { name: "Request" });
|
||||
await expect(requestTab).toBeVisible({ timeout: 10_000 });
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ test.describe("AI Hub (internal admin view)", () => {
|
|||
// Open the "Select Models to Make Public" modal
|
||||
await page.getByRole("button", { name: /Select Models to Make Public/i }).click();
|
||||
|
||||
const modal = page.locator(".ant-modal:visible").filter({ hasText: "Make Models Public" });
|
||||
const modal = page.getByRole("dialog", { name: "Make Models Public" });
|
||||
await expect(modal).toBeVisible({ timeout: 5_000 });
|
||||
|
||||
// Guard: the "Select All (N)" label only shows a count when filteredData
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ test.describe("Playground", () => {
|
|||
await openPlayground(page);
|
||||
|
||||
// "Current UI Session" is the default: the logged-in admin's key, nothing pasted.
|
||||
await expect(onlyVisible(page.getByTitle("Current UI Session"))).toBeVisible();
|
||||
await expect(keySourceSelect(page)).toContainText("Current UI Session");
|
||||
|
||||
await selectModel(page, model);
|
||||
const prompt = `playground ping for ${model}`;
|
||||
|
|
@ -35,8 +35,8 @@ test.describe("Playground", () => {
|
|||
await openPlayground(page);
|
||||
|
||||
// Switch the source to "Virtual Key" and paste the key we just minted.
|
||||
await keySourceSelect(page, "Current UI Session").click();
|
||||
await onlyVisible(page.locator('.ant-select-item-option[title="Virtual Key"]')).click({ timeout: 15_000 });
|
||||
await keySourceSelect(page).click();
|
||||
await onlyVisible(page.getByRole("option", { name: "Virtual Key" })).click({ timeout: 15_000 });
|
||||
|
||||
const keyInput = onlyVisible(page.getByPlaceholder("Enter custom Virtual Key"));
|
||||
await expect(keyInput).toBeVisible({ timeout: 10_000 });
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue