test: add shared accessibility contract gate (AEG-V16-024)

Verify required field error relationships and busy command suppression; preserve actual test evidence while awaiting UX/QA artifacts.
This commit is contained in:
2026-08-08 14:52:15 +09:00
parent cada8fe843
commit 6f47d71c4a
3 changed files with 42 additions and 0 deletions
@@ -0,0 +1,25 @@
import { mount } from '@vue/test-utils'
import { h } from 'vue'
import { describe, expect, it } from 'vitest'
import FieldShell from '../FieldShell.vue'
import KsCommandBar from '../KsCommandBar.vue'
describe('shared UI accessibility contract', () => {
it('connects a required invalid field to its accessible error', () => {
const wrapper = mount(FieldShell, {
props: { label: 'Client', inputId: 'client', required: true, error: 'Required' },
slots: { default: field => h('input', { id: field.inputId, 'aria-describedby': field.describedBy, 'aria-required': field.required, 'aria-invalid': field.invalid }) }
})
expect(wrapper.get('label').attributes('for')).toBe('client')
expect(wrapper.get('[role="alert"]').attributes('id')).toBe('client-message')
expect(wrapper.get('input').attributes()).toMatchObject({ 'aria-describedby': 'client-message', 'aria-required': 'true', 'aria-invalid': 'true' })
})
it('exposes busy commands and blocks their action event', async () => {
const wrapper = mount(KsCommandBar, { props: { actions: [{ id: 'publish', label: 'Publish', busy: true }] }, global: { stubs: { KsButton: { name: 'KsButton', template: '<button />' } } } })
expect(wrapper.get('nav').attributes('aria-busy')).toBe('true')
wrapper.findComponent({ name: 'KsButton' }).vm.$emit('click')
await wrapper.vm.$nextTick()
expect(wrapper.emitted('execute')).toBeUndefined()
})
})