70 lines
3.0 KiB
TypeScript
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"]);
|
|
});
|