spin-frontend/e2e/member-domains.spec.ts
theorose49 f902fdb3ee
All checks were successful
build-and-push / build (push) Successful in 36s
test: Playwright E2E 자동화 도입 (14 스펙, 관리자/구성원 역할 커버)
- playwright.config.ts: 로컬 스택(5380/8380) 대상 headless chromium
- e2e/spin.spec.ts: 대시보드·네비·쪽지함·캘린더 일정 생성·프로젝트 생성 모달·검증, 구성원 역할(관리자 메뉴 숨김·관리 라우트 리다이렉트·프로필)
- e2e/project-flow.spec.ts: 프로젝트 상세 개요/작업자/메일 탭, 타임라인 작업 추가→상세 모달→칸반 카드
- e2e/member-domains.spec.ts: 근무·휴가 신청 검증, 인센티브 게이지, 대시보드 내 이슈
- ?as=user 로 역할 전환(api.ts 포워딩 활용), afterAll API 정리
- npm run test:e2e 스크립트, test-results/·playwright-report/ gitignore

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 10:14:39 +09:00

37 lines
1.8 KiB
TypeScript

import { test, expect } from "@playwright/test";
// 일반 구성원 관점의 핵심 도메인: 근무(휴가 신청 검증) + 인센티브 게이지.
// ?as=user 로 로드하면 앱 전체가 비관리자(김주임)로 동작.
test("근무 페이지 + 휴가 신청 모달 검증", async ({ page }) => {
await page.goto("/attendance?as=user");
await expect(page.getByRole("heading", { name: "근무" })).toBeVisible();
await expect(page.getByText("이번 달 출근일")).toBeVisible();
// 휴가/공가 탭 → 휴가 신청 모달
await page.getByRole("button", { name: "휴가/공가" }).click();
await page.getByRole("button", { name: "휴가 신청" }).click();
const submit = page.getByRole("button", { name: "신청", exact: true });
// 시작일 없으면 신청 비활성
await expect(submit).toBeDisabled();
await page.locator('.fixed input[type="date"]').first().fill("2026-09-10");
await expect(submit).toBeEnabled();
// 제출하지 않고 닫기(영속 데이터 오염 방지)
await page.getByRole("dialog").getByRole("button", { name: "취소" }).click();
});
test("인센티브 페이지 게이지 렌더", async ({ page }) => {
const errs: string[] = [];
page.on("pageerror", (e) => errs.push(e.message));
await page.goto("/incentive?as=user");
await expect(page.getByRole("heading", { name: "내 인센티브" })).toBeVisible();
// 게이지/할당량 섹션 렌더(연도 선택 존재)
await expect(page.locator("select").first()).toBeVisible();
expect(errs, errs.join("\n")).toHaveLength(0);
});
test("대시보드 인센티브 게이지 + 내 이슈 보드", async ({ page }) => {
await page.goto("/?as=user");
await expect(page.getByText(/안녕하세요/)).toBeVisible();
await expect(page.getByText("내 이슈")).toBeVisible();
});