From d1ab241cac0db7f700fadaaf62ffb3d2b51cf0c3 Mon Sep 17 00:00:00 2001 From: Dotta Date: Thu, 5 Nov 2026 17:20:57 -0600 Subject: [PATCH] fix(evals): scope company secret creation dialog waiter Co-Authored-By: Paperclip --- ...ernal-company-secret-create-dialog.test.ts | 34 +++++++++++++++++++ .../external-private-browser-worker.ts | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/runner-e2e/chat-catalog-domains/external-company-secret-create-dialog.test.ts diff --git a/tests/runner-e2e/chat-catalog-domains/external-company-secret-create-dialog.test.ts b/tests/runner-e2e/chat-catalog-domains/external-company-secret-create-dialog.test.ts new file mode 100644 index 00000000000..c12e2ba338c --- /dev/null +++ b/tests/runner-e2e/chat-catalog-domains/external-company-secret-create-dialog.test.ts @@ -0,0 +1,34 @@ +import { readFile } from "node:fs/promises"; +import { chromium, type Page } from "@playwright/test"; +import { stripTypeScriptTypes } from "node:module"; +import { expect, it } from "vitest"; + +it.skipIf(process.env.PAPERCLIP_CHAT_EVAL_SECRET_ROUTE_CANARY !== "1")("waits for the actual company create form to close while its details sheet stays open", async () => { + const source = await readFile(new URL("./external-private-browser-worker.ts", import.meta.url), "utf8"); + const start = source.indexOf(' if(input.mode === "company-secret-create"){'); + const end = source.indexOf(' if (input.mode === "gateway-token-rotation")', start); + expect(start >= 0 && end > start).toBe(true); + const code = stripTypeScriptTypes(`async function operation(input:any,page:any){${source.slice(start, end)}}`); + const operation = new Function(`${code};return operation`)() as (input: unknown, page: Page) => Promise<{ secretId: string; storageClean: boolean }>; + const ui = await readFile(new URL("../../../ui/src/pages/Secrets.tsx", import.meta.url), "utf8"); + expect(ui).toContain('{editingDefinition ? "Edit user-provided secret" : "Create secret"}'); + expect(ui).toContain("setCreateOpen(false)"); + expect(ui).toContain("setDetailSelection(result.item.id)"); + const browser = await chromium.launch({ headless: true, ...(process.env.PAPERCLIP_RUNNER_E2E_CHROMIUM_EXECUTABLE ? { executablePath: process.env.PAPERCLIP_RUNNER_E2E_CHROMIUM_EXECUTABLE } : {}) }); + const companyId = "11111111-1111-4111-8111-111111111111", secretId = "22222222-2222-4222-8222-222222222222"; + try { + for (const scenario of ["created", "failed POST", "missing form"]) { + const page = await browser.newPage(); page.setDefaultTimeout(700); + await page.route("**/*", async route => { + if (route.request().method() === "POST") return route.fulfill({ status: scenario === "failed POST" ? 400 : 201, contentType: "application/json", body: JSON.stringify({ id: secretId }) }); + await route.fulfill({ contentType: "text/html; charset=utf-8", body: `` }); + }); + const result = operation({ mode: "company-secret-create", companyId, setupURL: "http://127.0.0.1:3300/RUN/company/settings/secrets", credential: "synthetic-private-value" }, page); + if (scenario === "created") { + expect(await result).toMatchObject({ secretId, storageClean: true }); + expect(await page.getByRole("dialog", { name: "Deployment API key", exact: true }).isVisible()).toBe(true); + } else await expect(result).rejects.toThrow(); + await page.close(); + } + } finally { await browser.close(); } +}, 15000); diff --git a/tests/runner-e2e/chat-catalog-domains/external-private-browser-worker.ts b/tests/runner-e2e/chat-catalog-domains/external-private-browser-worker.ts index c79bcbfb740..dec2c43d0ec 100644 --- a/tests/runner-e2e/chat-catalog-domains/external-private-browser-worker.ts +++ b/tests/runner-e2e/chat-catalog-domains/external-private-browser-worker.ts @@ -232,7 +232,7 @@ async function main() { if(input.mode === "company-secret-create"){ if(!input.companyId||!/^[a-f0-9-]{36}$/i.test(input.companyId)||!new URL(input.setupURL).pathname.endsWith("/company/settings/secrets"))throw new Error("Invalid finite company secret operation"); await page.goto(input.setupURL,{waitUntil:"domcontentloaded"});await page.getByRole("button",{name:"New secret",exact:true}).click(); - const dialog=page.getByRole("dialog");await dialog.getByLabel("Name",{exact:true}).fill("Deployment API key"); + const dialog=page.getByRole("dialog",{name:"Create secret",exact:true});await dialog.getByLabel("Name",{exact:true}).fill("Deployment API key"); await dialog.getByLabel("Provider",{exact:true}).selectOption("local_encrypted"); await dialog.getByLabel("Value",{exact:true}).fill(input.credential); const created=page.waitForResponse(response=>new URL(response.url()).pathname===`/api/companies/${input.companyId}/secrets`&&response.request().method()==="POST"&&response.status()===201);