Files
awoooi/apps/web/tests/e2e/phase4-final-demo.spec.ts
OG T 196d269b92 feat: add all application source code
- apps/api: FastAPI backend with Dockerfile
- apps/web: Next.js frontend with Dockerfile
- apps/sensor: Signal collection agent
- packages: shared packages

Co-Authored-By: Claude <noreply@anthropic.com>
2026-03-22 18:57:44 +08:00

96 lines
3.4 KiB
TypeScript

import { test } from '@playwright/test';
/**
* Phase 4: Alpha 版最終火力展示
* =============================
* 模擬完整流程:
* 1. [SYSTEM] 接收告警
* 2. [AGENT] ClawBot 分析完成
* 3. [SECURITY] DevOps Access Denied
* 4. [HUMAN] CTO 成功簽核
*/
test('Phase 4 Alpha Demo - Full Flow', async ({ page }) => {
await page.setViewportSize({ width: 1920, height: 1200 });
// Navigate
await page.goto('http://localhost:3000/zh-TW/demo');
await page.waitForTimeout(4000);
// Screenshot 1: Initial state with approval cards
await page.screenshot({ path: 'test-results/phase4-alpha-01-initial.png', fullPage: true });
// Step 1: Trigger CRITICAL alert (generates SYSTEM + AGENT events)
console.log('[Demo] Step 1: Triggering CRITICAL alert...');
const triggerBtn = page.locator('button:has-text("嚴重")').first();
if (await triggerBtn.isVisible({ timeout: 3000 })) {
await triggerBtn.click();
await page.waitForTimeout(5000); // Wait for AI thinking animation
}
// Screenshot 2: After AI analysis
await page.screenshot({ path: 'test-results/phase4-alpha-02-ai-analysis.png', fullPage: true });
// Step 2: DevOps tries to sign CRITICAL (generates SECURITY event)
console.log('[Demo] Step 2: DevOps attempting CRITICAL sign...');
await page.evaluate(() => window.scrollTo(0, 500));
await page.waitForTimeout(500);
const approveBtn = page.locator('button:has-text("長按")').first();
if (await approveBtn.isVisible({ timeout: 3000 })) {
const box = await approveBtn.boundingBox();
if (box) {
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
await page.mouse.down();
await page.waitForTimeout(2500);
await page.mouse.up();
}
}
await page.waitForTimeout(1000);
// Screenshot 3: Access Denied
await page.screenshot({ path: 'test-results/phase4-alpha-03-access-denied.png' });
// Close modal
const closeBtn = page.locator('button:has-text("了解")');
if (await closeBtn.isVisible({ timeout: 2000 })) {
await closeBtn.click();
await page.waitForTimeout(500);
}
// Step 3: Switch to CTO
console.log('[Demo] Step 3: Switching to CTO...');
const ctoBtn = page.locator('button:has-text("CTO")').first();
await ctoBtn.scrollIntoViewIfNeeded();
await ctoBtn.click();
await page.waitForTimeout(500);
// Screenshot 4: CTO role active
await page.screenshot({ path: 'test-results/phase4-alpha-04-cto-role.png', fullPage: true });
// Step 4: CTO signs (generates HUMAN event)
console.log('[Demo] Step 4: CTO signing...');
await page.evaluate(() => window.scrollTo(0, 500));
const approveBtnCTO = page.locator('button:has-text("長按")').first();
if (await approveBtnCTO.isVisible({ timeout: 3000 })) {
const box = await approveBtnCTO.boundingBox();
if (box) {
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
await page.mouse.down();
await page.waitForTimeout(2500);
await page.mouse.up();
}
}
await page.waitForTimeout(1500);
// Screenshot 5: After CTO signature
await page.screenshot({ path: 'test-results/phase4-alpha-05-cto-signed.png', fullPage: true });
// Final: Full page with timeline
await page.evaluate(() => window.scrollTo(0, 0));
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/phase4-alpha-final.png', fullPage: true });
console.log('[Demo] Phase 4 Alpha Demo completed!');
});