You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
2.9 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// frontend/playwright/federation.spec.ts
// 연합 E2E 사용자 여정: 대시보드 → 인박스 캡처 → 분류 좋아요(확인) →
// 작업 페이지(개인 여행 — 한국) 등장 → 리스크 레이더 → 대시보드 복귀.
// 백엔드는 ARI_ALLOW_TEST_RESET=1 LLM_PROVIDER=heuristic 로 기동 가정.
import { expect, test } from "@playwright/test";
import { resetSeed } from "./fixtures/seed-reset";
test.describe.configure({ mode: "serial" });
const RAW = "다음 주에 한국 놀러가는 비행기 티켓 사기";
test.beforeEach(async () => {
await resetSeed();
});
test("연합: 캡처 → 분류 → 확인 → 작업 트리 등장 → 리스크 → 대시보드 집계", async ({ page }) => {
// 0) 루트 → 대시보드 리다이렉트, 상단 내비 13항목
await page.goto("/");
await expect(page).toHaveURL(/\/dashboard$/);
await expect(page.getByRole("navigation").getByText("작업")).toBeVisible();
await expect(page.getByRole("navigation").getByText("인박스")).toBeVisible();
// 1) 인박스로 이동 후 캡처 (내비로 스코프 — 카드 CTA 와 구분)
const nav = page.getByRole("navigation");
await nav.getByRole("link", { name: "인박스" }).click();
await expect(page).toHaveURL(/\/inbox$/);
const composer = page.getByLabel("인박스에 빠르게 캡처");
await composer.fill(RAW);
await composer.press("Enter");
// 2) 분류 결과 — 작업 / 개인 여행 — 한국 / 구매(reason)
const card = page.locator(".sb-cap.fresh").first();
await expect(card.getByText("작업", { exact: true })).toBeVisible();
await expect(card.locator(".r-chip.proj")).toContainText("개인 여행 — 한국");
await expect(card.locator(".sb-reason")).toContainText("작업");
// 3) 좋아요(확인=실체화)
await card.getByRole("button", { name: /좋아요, 그렇게 해줘/ }).click();
await expect(card.locator(".sb-done")).toBeVisible();
// 4) 작업 페이지 → 개인 필터 → 여행 — 한국에 새 task 등장(개인도 숨기지 않음)
await nav.getByRole("link", { name: "작업" }).click();
await expect(page).toHaveURL(/\/tasks/);
await page.locator(".tree-row.folder", { hasText: "개인" }).click();
await expect(page.locator(".kcard-title", { hasText: "비행기 티켓" }).first()).toBeVisible();
// 5) 업무 필터 → 리스크 레이더 지연 위험
await page.locator(".tree-row.folder", { hasText: "업무" }).click();
const radar = page.locator(".rradar");
await expect(radar).toContainText("리스크 레이더");
await expect(radar).toContainText("지연 위험");
// 6) 대시보드 복귀 → 요약 갱신
await nav.getByRole("link", { name: "대시보드" }).click();
await expect(page).toHaveURL(/\/dashboard$/);
await expect(page.getByText("아리 브리핑")).toBeVisible();
await expect(page.getByRole("heading", { name: "할 일" })).toBeVisible();
});