import { describe, expect, it } from 'vitest'; import { el, setFieldInvalid } from './dom'; describe('setFieldInvalid', () => { const field = (describedBy?: string) => el('input', { 'aria-describedby': describedBy }); it('markiert das Feld und verweist auf die Fehlerzeile', () => { const input = field(); setFieldInvalid(input, 'fehler', true); expect(input.getAttribute('aria-invalid')).toBe('true'); expect(input.getAttribute('aria-describedby')).toBe('fehler'); }); it('der Hinweis des Feldes bleibt davor stehen', () => { const input = field('hinweis'); setFieldInvalid(input, 'fehler', true); expect(input.getAttribute('aria-describedby')).toBe('hinweis fehler'); }); it('mehrfach markiert verweist es nur einmal auf die Fehlerzeile', () => { const input = field('a b'); setFieldInvalid(input, 'fehler', true); setFieldInvalid(input, 'fehler', true); expect(input.getAttribute('aria-describedby')).toBe('a b fehler'); }); it('zurücknehmen entfernt Markierung und Verweis, die Hinweise bleiben', () => { const input = field('hinweis'); setFieldInvalid(input, 'fehler', true); setFieldInvalid(input, 'fehler', false); expect(input.hasAttribute('aria-invalid')).toBe(false); expect(input.getAttribute('aria-describedby')).toBe('hinweis'); }); it('ohne Hinweis verschwindet aria-describedby ganz', () => { const input = field(); setFieldInvalid(input, 'fehler', true); setFieldInvalid(input, 'fehler', false); expect(input.hasAttribute('aria-describedby')).toBe(false); expect(input.hasAttribute('aria-invalid')).toBe(false); }); it('ein Feld, das nie markiert war, bleibt beim Zurücknehmen unberührt', () => { const plain = field(); setFieldInvalid(plain, 'fehler', false); expect(plain.getAttributeNames()).toEqual([]); const withHint = field('hinweis'); setFieldInvalid(withHint, 'fehler', false); expect(withHint.getAttribute('aria-describedby')).toBe('hinweis'); }); it('eine andere Fehlerzeile bleibt, wo sie ist (nur die genannte ID wird verwaltet)', () => { const input = field('hinweis anderer'); setFieldInvalid(input, 'fehler', true); setFieldInvalid(input, 'fehler', false); expect(input.getAttribute('aria-describedby')).toBe('hinweis anderer'); }); });