Files
tyx_AI_xhs/tests/e2e/wp6-04-audit.spec.ts
suyx 1c46311e05
Dada P0-A isolated Windows CI / validate-and-package (push) Failing after 59s
feat: implement sensitive operation audit retention (TASK-WP6-04)
2026-08-04 11:51:09 +08:00

52 lines
2.7 KiB
TypeScript

import { resolve } from "node:path";
import { expect, test } from "@playwright/test";
import { createServer, type ViteDevServer } from "vite";
import { wp604AuditApiFixture, wp604PrivateAuditApiFixture } from "../fixtures/wp6-04-audit.js";
let vite: ViteDevServer;
let webUrl: string;
const adminSession = {
acknowledged_private_content_notice_version: null,
admin: { role: "super_admin", status: "active", user_id: "00000000-0000-4000-8000-000000000604" },
audience: "admin",
authenticated: true,
csrf_token: "csrf-wp6-04-admin-0000000000000000000000000000000000",
current_private_content_notice_version: null,
expires_at: "2026-09-04T09:30:00.000Z",
notice_acknowledged: false,
};
test.beforeAll(async () => {
vite = await createServer({ configFile: resolve("apps/web/vite.config.ts"), root: resolve("apps/web"), server: { host: "127.0.0.1", port: 0 } });
await vite.listen();
const address = vite.httpServer?.address();
if (!address || typeof address === "string") throw new Error("Vite did not expose a test port.");
webUrl = `http://127.0.0.1:${address.port}`;
});
test.afterAll(async () => vite.close());
test("TDD-WP6-AUD-001-sensitive-operations renders two immutable, redacted audit lists", async ({ page }) => {
await page.route("**/api/v1/admin-auth/session", (route) => route.fulfill({ body: JSON.stringify(adminSession), contentType: "application/json", status: 200 }));
await page.route("**/api/v1/admin/audit/operations**", (route) => route.fulfill({ body: JSON.stringify(wp604AuditApiFixture), contentType: "application/json", status: 200 }));
await page.route("**/api/v1/admin/audit/private-content**", (route) => route.fulfill({ body: JSON.stringify(wp604PrivateAuditApiFixture), contentType: "application/json", status: 200 }));
await page.goto(`${webUrl}/admin/audit`);
await expect(page.getByRole("heading", { level: 2, name: "审计" })).toBeVisible();
await expect(page.getByRole("tab", { name: "后台操作审计" })).toHaveAttribute("aria-selected", "true");
await expect(page.getByRole("cell", { name: "user_status_change" })).toBeVisible();
await expect(page.getByRole("button", { name: "下一页" })).toBeVisible();
await page.getByRole("tab", { name: "私有内容访问审计" }).click();
await expect(page.getByRole("cell", { name: "prompt" })).toBeVisible();
await expect(page.getByRole("cell", { name: "00000000-0000-4000-8000-000000000644" })).toBeVisible();
await expect(page.getByText(/private prompt body|api key|absolute path/i)).toHaveCount(0);
await expect(page.getByRole("button", { name: /删除|编辑|清空/ })).toHaveCount(0);
const evidenceRoot = process.env.DADA_EVIDENCE_DIR_WP6_AUD;
if (evidenceRoot) await page.screenshot({ fullPage: true, path: resolve(evidenceRoot, "admin-audit.png") });
});