Skip to content

Commit aeb3691

Browse files
committed
Add tests
1 parent ec9e566 commit aeb3691

1 file changed

Lines changed: 193 additions & 1 deletion

File tree

packages/react-core/src/components/JumpLinks/__tests__/JumpLinks.test.tsx

Lines changed: 193 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { render } from '@testing-library/react';
1+
import { render, screen } from '@testing-library/react';
22
import { JumpLinks } from '../JumpLinks';
33
import { JumpLinksItem } from '../JumpLinksItem';
44
import { JumpLinksList } from '../JumpLinksList';
@@ -78,3 +78,195 @@ test('expandable vertical with subsection', () => {
7878
);
7979
expect(asFragment()).toMatchSnapshot();
8080
});
81+
82+
// Revamped tests begin here
83+
84+
const jumpLinksItems = (
85+
<>
86+
<JumpLinksItem href="#">Inactive section</JumpLinksItem>
87+
<JumpLinksItem href="#" isActive>
88+
Active section
89+
</JumpLinksItem>
90+
<JumpLinksItem href="#">Inactive section</JumpLinksItem>
91+
</>
92+
);
93+
94+
const expandableJumpLinksItems = (
95+
<>
96+
<JumpLinksItem href="#">Inactive section</JumpLinksItem>
97+
<JumpLinksItem href="#">
98+
Section with active subsection
99+
<JumpLinksList>
100+
<JumpLinksItem href="#" isActive>
101+
Active subsection
102+
</JumpLinksItem>
103+
<JumpLinksItem href="#">Inactive subsection</JumpLinksItem>
104+
<JumpLinksItem href="#">Inactive subsection</JumpLinksItem>
105+
</JumpLinksList>
106+
</JumpLinksItem>
107+
<JumpLinksItem href="#">Inactive section</JumpLinksItem>
108+
<JumpLinksItem href="#">Inactive section</JumpLinksItem>
109+
</>
110+
);
111+
112+
test('renders label be default', () => {
113+
render(<JumpLinks label="Jump to section">{jumpLinksItems}</JumpLinks>);
114+
expect(screen.getByText(/Jump to section/i)).toBeTruthy();
115+
});
116+
117+
test('does not render label when alwaysShowLabel is false', () => {
118+
render(
119+
<JumpLinks label="Jump to section" alwaysShowLabel={false}>
120+
{jumpLinksItems}
121+
</JumpLinks>
122+
);
123+
expect(screen.queryByText(/Jump to section/i)).toBeFalsy();
124+
});
125+
126+
test('uses aria-labelledby over aria-label when label and alwaysShowLabel are passed in', () => {
127+
render(<JumpLinks label="Jump to section">{expandableJumpLinksItems}</JumpLinks>);
128+
const navigation = screen.getByRole('navigation', { name: /Jump to section/i });
129+
expect(navigation).toHaveAttribute('aria-labelledby');
130+
expect(navigation).not.toHaveAttribute('aria-label');
131+
});
132+
133+
test('uses aria-labelledby over aria-label when expandable is passed in', () => {
134+
render(<JumpLinks expandable={{ default: 'expandable' }}>{expandableJumpLinksItems}</JumpLinks>);
135+
const navigation = screen.getByRole('navigation', { name: /Toggle jump links/i });
136+
expect(navigation).toHaveAttribute('aria-labelledby');
137+
expect(navigation).not.toHaveAttribute('aria-label');
138+
});
139+
140+
test('random id is used with aria-labelledby by default in expandable case', () => {
141+
render(<JumpLinks expandable={{ default: 'expandable' }}>{expandableJumpLinksItems}</JumpLinks>);
142+
const navigation = screen.getByRole('navigation', { name: /Toggle jump links/i });
143+
expect(navigation).toHaveAttribute('aria-labelledby', 'unique_id_mock');
144+
});
145+
146+
test('random id is used with aria-labelledby by default in label case', () => {
147+
render(
148+
<JumpLinks label="Jump to section" alwaysShowLabel>
149+
{expandableJumpLinksItems}
150+
</JumpLinks>
151+
);
152+
const navigation = screen.getByRole('navigation', { name: /Jump to section/i });
153+
expect(navigation).toHaveAttribute('aria-labelledby', 'unique_id_mock');
154+
});
155+
156+
test('custom labelId is used with aria-labelledby when it is passed in in expandable case', () => {
157+
render(
158+
<JumpLinks labelId="custom-id" expandable={{ default: 'expandable' }}>
159+
{expandableJumpLinksItems}
160+
</JumpLinks>
161+
);
162+
const navigation = screen.getByRole('navigation', { name: /Toggle jump links/i });
163+
expect(navigation).toHaveAttribute('aria-labelledby', 'custom-id');
164+
});
165+
166+
test('custom labelId is used with aria-labelledby when it is passed in in label case', () => {
167+
render(
168+
<JumpLinks label="Jump to section" labelId="custom-id" alwaysShowLabel>
169+
{expandableJumpLinksItems}
170+
</JumpLinks>
171+
);
172+
const navigation = screen.getByRole('navigation', { name: /Jump to section/i });
173+
expect(navigation).toHaveAttribute('aria-labelledby', 'custom-id');
174+
});
175+
176+
test('uses aria-label instead of aria-labelledby by default', () => {
177+
render(<JumpLinks aria-label="Custom aria label">{jumpLinksItems}</JumpLinks>);
178+
const navigation = screen.getByRole('navigation', { name: /Custom aria label/i });
179+
expect(navigation).toHaveAttribute('aria-label', 'Custom aria label');
180+
expect(navigation).not.toHaveAttribute('aria-labelledby');
181+
});
182+
183+
test('uses aria-label instead of aria-labelledby when label is provided but alwaysShowLabel is false', () => {
184+
render(
185+
<JumpLinks label="Jump to section" aria-label="Custom aria label" alwaysShowLabel={false}>
186+
{jumpLinksItems}
187+
</JumpLinks>
188+
);
189+
const navigation = screen.getByRole('navigation', { name: /Custom aria label/i });
190+
expect(navigation).toHaveAttribute('aria-label', 'Custom aria label');
191+
expect(navigation).not.toHaveAttribute('aria-labelledby');
192+
});
193+
194+
test('aria-labelledby is used with provided labelId even when aria-label is also provided in expandable case', () => {
195+
render(
196+
<JumpLinks labelId="custom-id" aria-label="Custom aria label" expandable={{ default: 'expandable' }}>
197+
{expandableJumpLinksItems}
198+
</JumpLinks>
199+
);
200+
const navigation = screen.getByRole('navigation');
201+
expect(navigation).toHaveAttribute('aria-labelledby', 'custom-id');
202+
expect(navigation).not.toHaveAttribute('aria-label');
203+
});
204+
205+
test('aria-labelledby is used with provided labelId even when aria-label is also provided in label case', () => {
206+
render(
207+
<JumpLinks labelId="custom-id" aria-label="Custom aria label" label="Jump to section">
208+
{jumpLinksItems}
209+
</JumpLinks>
210+
);
211+
const navigation = screen.getByRole('navigation');
212+
expect(navigation).toHaveAttribute('aria-labelledby', 'custom-id');
213+
expect(navigation).not.toHaveAttribute('aria-label');
214+
});
215+
216+
test('does not throw error when there is a label passed in"', () => {
217+
const warnMock = jest.fn() as any;
218+
global.console = { warn: warnMock } as any;
219+
render(
220+
<JumpLinks alwaysShowLabel label="Jump to section">
221+
{jumpLinksItems}
222+
</JumpLinks>
223+
);
224+
expect(warnMock).not.toHaveBeenCalled();
225+
});
226+
227+
test('does not throw error when there is an aria-label passed in"', () => {
228+
const warnMock = jest.fn() as any;
229+
global.console = { warn: warnMock } as any;
230+
render(
231+
<JumpLinks alwaysShowLabel aria-label="Jump to section">
232+
{jumpLinksItems}
233+
</JumpLinks>
234+
);
235+
expect(warnMock).not.toHaveBeenCalled();
236+
});
237+
238+
test('throws error when no label or ariaLabel are passed in', () => {
239+
const warnMock = jest.fn() as any;
240+
global.console = { warn: warnMock } as any;
241+
render(<JumpLinks alwaysShowLabel>{jumpLinksItems}</JumpLinks>);
242+
expect(warnMock).toHaveBeenCalled();
243+
});
244+
245+
test('does not throw error when there is a toggleAriaLabel and expandable prop passed in', () => {
246+
const warnMock = jest.fn() as any;
247+
global.console = { warn: warnMock } as any;
248+
render(
249+
<JumpLinks label="Jump to section" toggleAriaLabel="Jump to section" expandable={{ default: 'expandable' }}>
250+
{expandableJumpLinksItems}
251+
</JumpLinks>
252+
);
253+
expect(warnMock).not.toHaveBeenCalled();
254+
});
255+
256+
test('does not throw error when there is an aria-label and expandable prop passed in', () => {
257+
const warnMock = jest.fn() as any;
258+
global.console = { warn: warnMock } as any;
259+
render(
260+
<JumpLinks aria-label="Jump to section" expandable={{ default: 'expandable' }}>
261+
{expandableJumpLinksItems}
262+
</JumpLinks>
263+
);
264+
expect(warnMock).not.toHaveBeenCalled();
265+
});
266+
267+
test('throws error when there is no toggle aria-label or aria-label but expandable is passed in', () => {
268+
const warnMock = jest.fn() as any;
269+
global.console = { warn: warnMock } as any;
270+
render(<JumpLinks expandable={{ default: 'expandable' }}>{expandableJumpLinksItems}</JumpLinks>);
271+
expect(warnMock).toHaveBeenCalled();
272+
});

0 commit comments

Comments
 (0)