Files
worldquant-alpha-system/frontend/tests/mcp-keys.spec.ts
T
2026-09-11 23:05:01 +08:00

70 lines
3.0 KiB
TypeScript

import { expect, test } from "@playwright/test";
test("MCP Key menu creates, hides secrets on navigation, and revokes", async ({
page,
}) => {
await page.goto("/#mcp-keys");
await page.getByLabel("密码", { exact: true }).fill("browser-test-password");
await page.getByRole("button", { name: "进入工作空间" }).click();
await expect(
page.getByRole("heading", { name: "MCP Key", exact: true }),
).toBeVisible();
const headers = { "X-WQ-Request": "1" };
await page.request.put("/api/v1/account/credentials", {
headers,
data: { email: "test@example.com", password: "synthetic-password" },
});
await page.request.post("/api/v1/account/connect", { headers });
await expect
.poll(
async () =>
(await (await page.request.get("/api/v1/account")).json())
.connection_status,
)
.toBe("connected");
await page.getByRole("button", { name: "刷新列表", exact: true }).click();
await page.getByLabel("Key 名称").fill("Browser test reader");
await page.getByRole("button", { name: "创建 Key", exact: true }).click();
await expect(page.getByLabel("新 Key 明文")).toBeVisible();
const secret = await page.getByLabel("新 Key 明文").inputValue();
expect(secret).toMatch(/^wqmcp_/);
const listed = await (await page.request.get("/api/v1/mcp-tokens")).json();
expect(JSON.stringify(listed)).not.toContain(secret);
const item = listed.items.find(
(row: { name: string }) => row.name === "Browser test reader",
);
expect(item.scopes).toEqual(["research:read"]);
await page.screenshot({
path: "test-results/mcp-key-page.png",
fullPage: true,
mask: [page.getByLabel("新 Key 明文")],
});
await page
.getByRole("navigation", { name: "主导航", exact: true })
.getByRole("button", { name: "数据目录", exact: true })
.click();
await page
.getByRole("navigation", { name: "主导航", exact: true })
.getByRole("button", { name: "MCP Key", exact: true })
.click();
await expect(page.getByLabel("新 Key 明文")).toHaveCount(0);
const row = page.getByRole("row").filter({ hasText: "Browser test reader" });
await row.getByRole("button", { name: "撤销", exact: true }).click();
await row.getByRole("button", { name: "确认撤销", exact: true }).click();
await expect(row).toContainText("已撤销");
await page.reload();
await expect(
page.getByRole("heading", { name: "MCP Key", exact: true }),
).toBeVisible();
await expect(page.getByLabel("新 Key 明文")).toHaveCount(0);
await page.getByLabel("Key 名称").fill("Browser test template writer");
await page.getByRole("checkbox", { name: /保存研究模板/ }).check();
await page.getByRole("button", { name: "创建 Key", exact: true }).click();
await expect(page.getByLabel("新 Key 明文")).toBeVisible();
const writers = await (await page.request.get("/api/v1/mcp-tokens")).json();
const writer = writers.items.find(
(item: { name: string }) => item.name === "Browser test template writer",
);
expect(writer.scopes).toEqual(["research:read", "research:write"]);
});