Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 9 additions & 11 deletions tests/e2e/ui/helpers/playground.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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> {
Expand Down
12 changes: 5 additions & 7 deletions tests/e2e/ui/tests/logs/logs.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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,
});
Expand Down Expand Up @@ -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 });
Expand Down
2 changes: 1 addition & 1 deletion tests/e2e/ui/tests/modelHub/modelHub.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions tests/e2e/ui/tests/playground/playground.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}`;
Expand All @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,8 @@ async def test_mock_basic_google_ai_studio_responses_api_with_tools():
call_kwargs["messages"][0]["content"]
== "what is the latest version of supabase python package and when was it released?"
)
assert (
call_kwargs["tools"] == []
) # web search tools are converted to web_search_options, not kept as tools
assert "tools" not in call_kwargs
assert "tool_choice" not in call_kwargs


@pytest.mark.asyncio
Expand Down
18 changes: 1 addition & 17 deletions tests/store_model_in_db_tests/test_adding_passthrough_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
Cases to cover
1. user points api base to <proxy-base>/assemblyai
2. user points api base to <proxy-base>/asssemblyai/us
3. user points api base to <proxy-base>/assemblyai/eu
4. Bad API Key / credential - 401
3. Bad API Key / credential - 401

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Successful EU coverage removed

This removes the only successful end-to-end test of the supported /eu.assemblyai route; the remaining tests cover isolated credential matching or unauthorized requests, so CI no longer detects regressions in EU upstream or credential selection.

Rule Used: What: Flag any modifications to existing tests and... (source)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

"""

import time
Expand All @@ -19,7 +18,6 @@
TEST_MASTER_KEY = "sk-1234"
PROXY_BASE_URL = "http://0.0.0.0:4000"
US_BASE_URL = f"{PROXY_BASE_URL}/assemblyai"
EU_BASE_URL = f"{PROXY_BASE_URL}/eu.assemblyai"
ASSEMBLYAI_API_KEY_ENV_VAR = "ASSEMBLYAI_API_KEY"


Expand Down Expand Up @@ -82,20 +80,6 @@ def test_e2e_assemblyai_passthrough():
pass


def test_e2e_assemblyai_passthrough_eu():
"""
Test adding a pass through assemblyai model + api key + api base to the db
wait 20 seconds
make request
"""
add_assembly_ai_model_to_db(api_base="https://api.eu.assemblyai.com")
virtual_key = create_virtual_key()
# make request
make_assemblyai_basic_transcribe_request(
virtual_key=virtual_key, assemblyai_base_url=EU_BASE_URL
)

pass


def test_assemblyai_routes_with_bad_api_key():
Expand Down
2 changes: 1 addition & 1 deletion tests/test_openai_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ class EventsList(BaseModel):
client = AsyncOpenAI(api_key="sk-1234", base_url="http://0.0.0.0:4000")

res = await client.beta.chat.completions.parse(
model="bedrock/us.anthropic.claude-3-sonnet-20240229-v1:0",
model="bedrock/us.anthropic.claude-sonnet-4-5-20250929-v1:0",
messages=messages,
response_format=EventsList,
timeout=60,
Expand Down
Loading