From a3c20240ab3b72a82eb55dae92c0c357aeda7ff6 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sun, 9 Aug 2026 01:04:04 +0900 Subject: [PATCH] test: lock shared layout contracts (V13-FE-006) --- .../CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv | 1 + ...3-FE-006_LAYOUT_CONTRACT_RECONCILIATION.md | 29 +++++++++++++++++++ .../ui/layouts/tests/layout.contract.spec.ts | 25 ++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 docs/CURRENT/V13-FE-006_LAYOUT_CONTRACT_RECONCILIATION.md create mode 100644 frontend/src/shared/ui/layouts/tests/layout.contract.spec.ts diff --git a/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv b/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv index 3e543f9a..4ae7c01d 100644 --- a/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv +++ b/docs/CURRENT/CATALOGS/WBS_PROGRESS_TRACKER.csv @@ -43,3 +43,4 @@ V13-FE-001,S0,Cross,UI Vendor import boundary,COMPLETED,2026-08-09,"docs/CURRENT V13-FE-003,S0,Cross,UiAdapter Port 정의,COMPLETED,2026-08-09,"docs/CURRENT/V13-FE-003_UI_ADAPTER_PORT_RECONCILIATION.md; frontend/src/shared/ui/adapter/contracts.ts; frontend/src/shared/ui/adapter/tests/uiAdapter.contract.spec.ts",FE Architect/QA,"Dependency V13-FE-001 is COMPLETED. Existing adapter v4 contract explicitly verifies 14 capabilities (stronger than the WBS minimum wording of 8) without feature vendor imports. Actual targeted Vitest evidence: 2 files / 4 tests passed, exit 0, 2026-08-09. KBX-derived components remain provider-neutral reimplementations only; no KBX package, contract, router, store, or permission host was imported." V13-FE-004,S0,Cross,PrimeVue/AG Grid Adapter 구현,COMPLETED,2026-08-09,"docs/CURRENT/V13-FE-004_ADAPTER_IMPLEMENTATION_RECONCILIATION.md; frontend/src/shared/ui/adapter/primevue; frontend/src/shared/ui/adapter/tests/uiAdapter.contract.spec.ts",FE Architect/QA,"Dependency V13-FE-003 is COMPLETED. PrimeVue/AG Grid remain confined behind adapter v4. Actual targeted Vitest evidence: 2 files / 4 tests passed, exit 0, 2026-08-09. This is contract/accessibility-attribute evidence only; no visual/AT/runtime claim is made." V13-FE-005,S0,Cross,Ks* vendor-neutral components,COMPLETED,2026-08-09,"docs/CURRENT/V13-FE-005_KBX_FORM_COMPONENT_ADOPTION.md; frontend/src/shared/ui/components/KsFormGrid.vue; frontend/src/shared/ui/components/KsFormSection.vue; frontend/src/shared/ui/components/KsFormSpan.vue; frontend/src/shared/ui/components/KsValidationSummary.vue; frontend/src/shared/ui/components/tests/KsFormLayouts.spec.ts",FE Architect/QA,"Dependency V13-FE-004 is COMPLETED. Reimplemented only KBX presentation-only form components against existing K-ArtSell tokens; no KBX package, contracts, provider dependency, routing, permissions, or business policy imported. Actual evidence: targeted Vitest 2 files / 6 tests passed and pnpm typecheck exit 0 on 2026-08-09. Visual/AT/performance baseline remains outside this Slice." +V13-FE-006,S0,Cross,AppShell/Page layouts,COMPLETED,2026-08-09,"docs/CURRENT/V13-FE-006_LAYOUT_CONTRACT_RECONCILIATION.md; frontend/src/shared/ui/layouts/tests/layout.contract.spec.ts; frontend/src/shared/ui/layouts/AppShellLayout.vue; frontend/src/shared/ui/layouts/PageLayout.vue",UX/FE/QA/Security,"Dependency V13-FE-005 is COMPLETED. Preserved the existing slot-based layout rather than importing KBX's coupled workspace shell. Actual DOM contract evidence: 1 file / 2 tests passed, exit 0, 2026-08-09; verifies skip navigation, structural landmarks, default automation OFF boundary, and evidence/aside/footer separation. No visual/AT/E2E claim is made." diff --git a/docs/CURRENT/V13-FE-006_LAYOUT_CONTRACT_RECONCILIATION.md b/docs/CURRENT/V13-FE-006_LAYOUT_CONTRACT_RECONCILIATION.md new file mode 100644 index 00000000..0bf47feb --- /dev/null +++ b/docs/CURRENT/V13-FE-006_LAYOUT_CONTRACT_RECONCILIATION.md @@ -0,0 +1,29 @@ +# V13-FE-006 — AppShell/Page Layout 계약 재검증 + +| 항목 | 값 | +| --- | --- | +| Requirement / API / DB / Job / UI / Test | REQ-FE-LAYOUT / Cross / Cross / Cross / UI-FOUND-06 / T-FE-LAYOUT-01 | +| Dependency / Gate | V13-FE-005 (COMPLETED) / G0 | +| Artifact | `frontend/src/shared/ui/layouts` | + +## Source / Assumption / Unknown / Decision Required + +- **Source:** KBX `KbxApplicationShell`은 skip link, shell/workspace landmark 분리를 제공한다. 현재 `AppShellLayout`과 `PageLayout`은 동일한 구조적 요구를 더 작은 슬롯 기반 contract로 제공한다. +- **Assumption:** K-ArtSell에 workspace tabs, persisted recents, runtime center를 새로 도입할 승인된 requirement가 없다. +- **Unknown:** responsive visual baseline과 AT keyboard evidence는 `AEG-V16-024`의 QA 승인 대상이다. +- **Decision Required:** KBX shell의 권한 필터·workspace store·runtime panel을 이식하지 않는다. 실제 product requirement와 ADR 없이 shell state를 확장하지 않는다. + +## 이 Slice의 결과 + +- 동작을 바꾸지 않고 AppShell의 skip link, header/nav/main/footer landmark, automation boundary default와 PageLayout의 evidence/aside/footer 분리를 contract test로 고정했다. +- 자동주문/KIS 제출/자동 모델승격 OFF 안내는 화면 레이아웃에서 보존된다. +- 새 layout, provider, store, router, token 값은 추가하지 않았다. + +## 실제 증거 + +`pnpm vitest run src/shared/ui/layouts/tests/layout.contract.spec.ts` + +- 1 file / 2 tests passed +- exit 0, 2026-08-09 + +이 증거는 DOM contract에 한정된다. responsive visual, AT, browser E2E, API/DB/migration 통과를 주장하지 않는다. diff --git a/frontend/src/shared/ui/layouts/tests/layout.contract.spec.ts b/frontend/src/shared/ui/layouts/tests/layout.contract.spec.ts new file mode 100644 index 00000000..82e211ac --- /dev/null +++ b/frontend/src/shared/ui/layouts/tests/layout.contract.spec.ts @@ -0,0 +1,25 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it } from 'vitest' +import AppShellLayout from '../AppShellLayout.vue' +import PageLayout from '../PageLayout.vue' + +describe('shared layout contracts', () => { + it('provides skip navigation, structural landmarks, and the automation boundary by default', () => { + const wrapper = mount(AppShellLayout, { slots: { navigation: '운영', default: '

화면 내용

' } }) + expect(wrapper.get('.ks-skip').attributes('href')).toBe('#ks-main') + expect(wrapper.get('aside').attributes('aria-label')).toBe('주요 메뉴') + expect(wrapper.get('main').attributes('tabindex')).toBe('-1') + expect(wrapper.get('[role="status"]').text()).toContain('자동주문/KIS 제출 OFF') + }) + + it('keeps page evidence and optional content regions structurally separate', () => { + const wrapper = mount(PageLayout, { + props: { title: '데이터 수집', status: 'READONLY', asOf: '2026-08-09T00:00:00Z', version: 'v4' }, + slots: { filters: '
조건
', default: '
본문
', aside: '
증거
', footer: '' } + }) + expect(wrapper.get('h1').text()).toBe('데이터 수집') + expect(wrapper.text()).toContain('As-of: 2026-08-09T00:00:00Z') + expect(wrapper.get('.ks-page__workspace').classes()).toContain('has-aside') + expect(wrapper.get('.ks-page__footer').get('button').text()).toBe('닫기') + }) +})