diff --git a/app/components/malio/accordion/Accordion.test.ts b/app/components/malio/accordion/Accordion.test.ts index a329634..7640cb2 100644 --- a/app/components/malio/accordion/Accordion.test.ts +++ b/app/components/malio/accordion/Accordion.test.ts @@ -86,3 +86,51 @@ describe('MalioAccordion — rendu & mode multiple', () => { await nextTick() }) }) + +describe('MalioAccordion — mode single & contrôlé', () => { + it('opening a panel closes the others in single mode', async () => { + const wrapper = mountAccordion({mode: 'single'}) + const headers = wrapper.findAll('button[aria-expanded]') + await headers[0].trigger('click') + await headers[1].trigger('click') + expect(headers[0].attributes('aria-expanded')).toBe('false') + expect(headers[1].attributes('aria-expanded')).toBe('true') + }) + + it('emits a string in single mode', async () => { + const wrapper = mountAccordion({mode: 'single'}) + const headers = wrapper.findAll('button[aria-expanded]') + await headers[1].trigger('click') + expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['cat']) + }) + + it('emits empty string when closing the open panel in single mode', async () => { + const wrapper = mountAccordion({mode: 'single', modelValue: 'prix'}) + const headers = wrapper.findAll('button[aria-expanded]') + await headers[0].trigger('click') + expect(wrapper.emitted('update:modelValue')?.[0]).toEqual(['']) + }) + + it('respects modelValue array in controlled multiple mode', () => { + const wrapper = mountAccordion({modelValue: ['cat']}) + const headers = wrapper.findAll('button[aria-expanded]') + expect(headers[0].attributes('aria-expanded')).toBe('false') + expect(headers[1].attributes('aria-expanded')).toBe('true') + }) + + it('respects modelValue string in controlled single mode', () => { + const wrapper = mountAccordion({mode: 'single', modelValue: 'prix'}) + const headers = wrapper.findAll('button[aria-expanded]') + expect(headers[0].attributes('aria-expanded')).toBe('true') + expect(headers[1].attributes('aria-expanded')).toBe('false') + }) + + it('does not mutate local state in controlled mode (emits only)', async () => { + const wrapper = mountAccordion({modelValue: []}) + const headers = wrapper.findAll('button[aria-expanded]') + await headers[0].trigger('click') + // état piloté par le parent : sans mise à jour de la prop, reste fermé + expect(headers[0].attributes('aria-expanded')).toBe('false') + expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([['prix']]) + }) +})