유스케이스 TDD 16테마 스펙과 접근성 제품 결함 수정

- 지원 티켓 작성 UI 신설(설정)·관리자 해결 노트 입력 신설(Admin): 서버 계약은 있었으나
  웹 진입점이 없던 2결함
- a11y: outline 채널 포커스 링(ui/shell css), 세션바 44px 터치 타깃, 청록 하드코딩
  그라디언트를 테마 토큰으로 교체, 설정 라벨/헤딩/대비·리뷰 44px·모바일 오버플로 수정
- uc-*.spec.ts 16테마 239 시나리오 신규(수집 1109 tests/61 files), 기존 스펙 5종 계약 드리프트 교정
- breakpoint-sweep: widthsFor 솎아내기가 실기기 대표 폭(360/390/1024)을 탈락시키는 테스트 결함 수정
  — keep 시드를 전체 DEVICE_WIDTHS로, 3연폭 예외는 솎아내기 발생 여부 기준으로
- 검증: tsc PASS, 병렬 게이트 1040 passed(데스크톱 밀도 충돌 1건 해소 후 focused 68/68 GREEN),
  직렬 게이트 52/5/4 삼각화 — breakpoint(테스트 결함)·kb(낡은 dev API 재기동)·voice(일시적) 해소,
  교사 재평가 2건은 엔진 구독 한도(resets 3pm)로 skip 후 재검증 대기
- 문서/SSOT: HANDOFF·TODO·대시보드·testing 가이드 동기화, 증거 usecase-tdd-2026-08-18.json,
  SSOT 체커 PASS(59)
This commit is contained in:
Yun Chan 2026-08-18 11:47:58 +09:00
parent 4771b97c3a
commit cf899b7f15
37 changed files with 11989 additions and 67 deletions

View file

@ -119,35 +119,21 @@ test.describe("full sweep — shared shell, GNB, and routing guards", () => {
// checklist: shell-appshell-role-theming
// 역할별 셸 진입 시 body[data-role]이 learner/instructor/admin으로 설정된다.
test("applies body[data-role] theming for each role shell", async ({ page }) => {
let currentUser = meResponse();
await page.route("**/api/auth/me", async (route) => {
await route.fulfill({
status: 200,
contentType: "application/json",
body: JSON.stringify(currentUser),
});
});
// /auth/me만 fixture로 고정하면 나머지 실 API 호출(/api/sessions 등)이 쿠키 없이
// 401을 돌려주고, api 클라이언트의 AUTH_EXPIRED 이벤트가 AuthProvider의 user를
// 비워 body[data-role]을 제거한다(실제 세션 만료 계약). 역할 테마는 역할별 실
// dev-login 세션으로 검증한다.
await signInAsLearner(page);
await page.goto("/learn");
await expect(page.locator(".lh-root")).toBeVisible({ timeout: 15_000 });
await expect(page.locator("body")).toHaveAttribute("data-role", "learner");
currentUser = meResponse({
role: "teacher",
email: "shell.teacher@hs.ac.kr",
display_name: "Shell Teacher",
});
await signInAsTeacher(page);
await page.goto("/teach");
await expect(page.locator(".vg-topbar")).toBeVisible({ timeout: 15_000 });
await expect(page.locator("body")).toHaveAttribute("data-role", "instructor");
currentUser = meResponse({
role: "admin",
email: "shell.admin@twentyoz.kr",
display_name: "Shell Admin",
admin_access: true,
super_admin: true,
});
await signInAsAdmin(page);
await page.goto("/admin");
await expect(page.locator(".vg-topbar")).toBeVisible({ timeout: 15_000 });
await expect(page.locator("body")).toHaveAttribute("data-role", "admin");