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.
74 lines
3.6 KiB
TypeScript
74 lines
3.6 KiB
TypeScript
// frontend/playwright/settings.spec.ts — 설정 페이지 E2E (탭 · 메일 연결 · 프로필 · LLM · a11y)
|
|
import AxeBuilder from "@axe-core/playwright";
|
|
import { expect, test } from "@playwright/test";
|
|
import { resetSeed } from "./fixtures/seed-reset";
|
|
|
|
test.describe.configure({ mode: "serial" });
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await resetSeed();
|
|
await page.goto("/settings");
|
|
await expect(page.getByRole("heading", { level: 1, name: "설정" })).toBeVisible();
|
|
});
|
|
|
|
test("6개 탭이 보이고 기본은 계정 탭", async ({ page }) => {
|
|
for (const t of ["계정", "메일", "연결", "AI · LLM", "외관", "데이터 · 보안"]) {
|
|
await expect(page.getByRole("button", { name: new RegExp("^" + t) })).toBeVisible();
|
|
}
|
|
await expect(page.getByRole("button", { name: /^계정/ })).toHaveClass(/active/);
|
|
await expect(page.getByRole("heading", { level: 2, name: "계정" })).toBeVisible();
|
|
});
|
|
|
|
test("메일 탭 — 연결된 계정 없음(빈 상태)", async ({ page }) => {
|
|
// phase-16+: 메일 mock 제거 → 빈 상태. Gmail/Outlook 을 '계정 추가'로 연결.
|
|
await page.getByRole("button", { name: /^메일/ }).click();
|
|
await expect(page.getByRole("heading", { level: 2, name: "메일 계정" })).toBeVisible();
|
|
await expect(page.locator(".cn-grid .cn-card")).toHaveCount(0);
|
|
await expect(page.getByText(/연결된 메일 계정이 없어요/)).toBeVisible();
|
|
});
|
|
|
|
test("메일 탭 — 계정 추가 메뉴(Gmail·Outlook, 미구성 비활성)", async ({ page }) => {
|
|
await page.getByRole("button", { name: /^메일/ }).click();
|
|
await page.getByRole("button", { name: /계정 추가/ }).click();
|
|
const menu = page.getByRole("menu", { name: /추가할 계정 제공자/ });
|
|
await expect(menu.getByRole("menuitem", { name: /Gmail/ })).toBeVisible();
|
|
// 자격증명 미설정 환경 → 두 provider 모두 비활성(관리자 설정 필요)
|
|
await expect(menu.getByRole("menuitem", { name: /Gmail/ })).toBeDisabled();
|
|
await expect(menu.getByRole("menuitem", { name: /Outlook/ })).toBeDisabled();
|
|
});
|
|
|
|
test("계정 탭 — 이름/역할 저장", async ({ page }) => {
|
|
await page.locator("#acc-name").fill("지우 리드");
|
|
await page.locator("#acc-role").fill("프로덕트 리드");
|
|
await page.getByRole("button", { name: /변경사항 저장/ }).click();
|
|
await expect(page.locator(".au-toast")).toContainText("저장");
|
|
});
|
|
|
|
test("AI·LLM 탭 — 연결 테스트 + 저장", async ({ page }) => {
|
|
await page.getByRole("button", { name: /^AI · LLM/ }).click();
|
|
await expect(page.getByRole("heading", { level: 2, name: "AI · LLM 연결" })).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: /연결 테스트/ }).click();
|
|
await expect(page.locator(".set-test")).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: /저장 후 적용/ }).click();
|
|
// 직전 테스트 토스트와 공존할 수 있어 특정 문구로 타겟팅.
|
|
await expect(page.getByText("LLM 설정을 저장했어요")).toBeVisible();
|
|
});
|
|
|
|
test("데이터 탭 — 시스템 정보 + 토큰 발급", async ({ page }) => {
|
|
await page.getByRole("button", { name: /^데이터 · 보안/ }).click();
|
|
await expect(page.getByRole("heading", { level: 3, name: "시스템" })).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: /^발급/ }).click();
|
|
await expect(page.locator(".set-reveal .sr-token")).toBeVisible();
|
|
});
|
|
|
|
test("설정 페이지 a11y — 위반 0건", async ({ page }) => {
|
|
const r = await new AxeBuilder({ page })
|
|
.withTags(["wcag2a", "wcag2aa", "wcag21aa"])
|
|
.disableRules(["color-contrast"])
|
|
.analyze();
|
|
expect(r.violations, JSON.stringify(r.violations, null, 2)).toEqual([]);
|
|
});
|