test: lock shared layout contracts (V13-FE-006)

This commit is contained in:
2026-08-09 01:04:04 +09:00
parent e5da826329
commit a3c20240ab
3 changed files with 55 additions and 0 deletions
@@ -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."
1 WBS_ID Sprint Slice_ID Task Status Completion_Date Evidence_Link Owner Notes
43 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.
44 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.
45 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.
46 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.
@@ -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 통과를 주장하지 않는다.
@@ -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: '<a href="/ops">운영</a>', default: '<p>화면 내용</p>' } })
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: '<form>조건</form>', default: '<article>본문</article>', aside: '<section>증거</section>', footer: '<button>닫기</button>' }
})
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('닫기')
})
})