Skip to content

Commit 289d4e8

Browse files
srividyaramasSriRamas23Copilot
authored
test(accordion): cover SPEC expansion ownership and disclosure anatomy (#4408)
Co-authored-by: Srividya Ramaswamy <sriramas@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4b66f3ef-85ac-4405-bd35-dcc167a077b1
1 parent 932eed7 commit 289d4e8

2 files changed

Lines changed: 51 additions & 0 deletions

File tree

‎.changeset/wise-owls-build.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
3+
---
4+
5+

‎packages/agentic/components/src/components/accordion/accordion.test.tsx‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,52 @@ function getTitleStyle(component: RenderResult): TextStyle {
3333
}
3434

3535
describe('Accordion', () => {
36+
it('ACC-001 ignores defaultExpanded while controlled and requests the inverse of each supplied value', async () => {
37+
const onExpandedChange = jest.fn();
38+
const component = await renderAccordion({ expanded: true, defaultExpanded: false, onExpandedChange });
39+
40+
await fireEvent.press(getHeader(component));
41+
await fireEvent.press(getHeader(component));
42+
expect(onExpandedChange.mock.calls).toEqual([[false], [false]]);
43+
expect(getHeader(component).props.accessibilityState.expanded).toBe(true);
44+
45+
await component.rerender(<Accordion expanded={false} defaultExpanded onExpandedChange={onExpandedChange} />);
46+
await fireEvent.press(getHeader(component));
47+
expect(onExpandedChange.mock.calls).toEqual([[false], [false], [true]]);
48+
expect(getHeader(component).props.accessibilityState.expanded).toBe(false);
49+
});
50+
51+
it('ACC-004 retains the body identity and hides descendants only while collapsed', async () => {
52+
const component = await renderAccordion({ bodyContent: { children: <Text>Persistent details</Text> } });
53+
const bodyId = getBody(component).props.id;
54+
55+
expect(getHeader(component).props.accessibilityControls).toBe(bodyId);
56+
expect(getHeader(component).props['aria-controls']).toBe(bodyId);
57+
expect(getBody(component).props.accessibilityElementsHidden).toBe(true);
58+
expect(getBody(component).props.importantForAccessibility).toBe('no-hide-descendants');
59+
expect(component.getByText('Persistent details', { includeHiddenElements: true })).toBeOnTheScreen();
60+
61+
await fireEvent.press(getHeader(component));
62+
expect(getBody(component).props.id).toBe(bodyId);
63+
expect(getBody(component).props.accessibilityElementsHidden).toBe(false);
64+
expect(getBody(component).props.importantForAccessibility).toBeUndefined();
65+
expect(component.getByText('Persistent details')).toBeOnTheScreen();
66+
67+
await fireEvent.press(getHeader(component));
68+
expect(getBody(component).props.id).toBe(bodyId);
69+
expect(getBody(component).props.accessibilityElementsHidden).toBe(true);
70+
expect(getBody(component).props.importantForAccessibility).toBe('no-hide-descendants');
71+
});
72+
73+
it.each(['chevronStart', 'chevronEnd'] as const)('ACC-002 omits null optional header slots in %s layout', async (layout) => {
74+
const component = await renderAccordion({ layout, title: null, leadingIcon: null, accessibilityLabel: 'Details' });
75+
expect(component.queryByTestId('accordion-title')).toBeNull();
76+
expect(component.queryByTestId('accordion-leading-icon')).toBeNull();
77+
expect(getHeader(component).children).toHaveLength(1);
78+
expect(getHeader(component).props.accessibilityLabel).toBe('Details');
79+
expect(component.getByTestId('accordion-chevron-icon').props.accessible).toBe(false);
80+
});
81+
3682
it('renders a default header, default icon, and hidden body wiring', async () => {
3783
const component = await renderAccordion({});
3884
const header = getHeader(component);

0 commit comments

Comments
 (0)