|
|
// 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();
|
|
|
});
|