@instructure/ui-tabs 10.14.0 → 10.14.1-snapshot-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _react2 = require("@testing-library/react");
6
+ var _vitest = require("vitest");
7
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
8
+ require("@testing-library/jest-dom");
9
+ var _index = require("../index");
10
+ var _Tab, _Tab2, _Tab3, _Tab4, _Tab5, _Tab6, _Tab7, _Tab8;
11
+ /*
12
+ * The MIT License (MIT)
13
+ *
14
+ * Copyright (c) 2015 - present Instructure, Inc.
15
+ *
16
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
17
+ * of this software and associated documentation files (the "Software"), to deal
18
+ * in the Software without restriction, including without limitation the rights
19
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
+ * copies of the Software, and to permit persons to whom the Software is
21
+ * furnished to do so, subject to the following conditions:
22
+ *
23
+ * The above copyright notice and this permission notice shall be included in all
24
+ * copies or substantial portions of the Software.
25
+ *
26
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ * SOFTWARE.
33
+ */
34
+ describe('<Tabs.Tab />', () => {
35
+ it('should render children', async () => {
36
+ (0, _react2.render)(_Tab || (_Tab = /*#__PURE__*/_react.default.createElement(_index.Tab, {
37
+ id: "foo",
38
+ index: 0,
39
+ controls: "foo-panel"
40
+ }, "Tab Label")));
41
+ const children = _react2.screen.getByText('Tab Label');
42
+ expect(children).toBeInTheDocument();
43
+ });
44
+ it('should have appropriate role attribute', async () => {
45
+ (0, _react2.render)(_Tab2 || (_Tab2 = /*#__PURE__*/_react.default.createElement(_index.Tab, {
46
+ id: "foo",
47
+ index: 0,
48
+ controls: "foo-panel"
49
+ }, "Tab Label")));
50
+ const tab = _react2.screen.getByRole('tab');
51
+ expect(tab).toBeInTheDocument();
52
+ });
53
+ it('should have appropriate aria attributes', async () => {
54
+ (0, _react2.render)(_Tab3 || (_Tab3 = /*#__PURE__*/_react.default.createElement(_index.Tab, {
55
+ id: "foo",
56
+ index: 0,
57
+ controls: "foo-panel"
58
+ }, "Tab Label")));
59
+ const tab = _react2.screen.getByRole('tab');
60
+ expect(tab).not.toHaveAttribute('aria-selected');
61
+ expect(tab).not.toHaveAttribute('aria-disabled');
62
+ });
63
+ it('should set the aria-selected attribute', async () => {
64
+ (0, _react2.render)(_Tab4 || (_Tab4 = /*#__PURE__*/_react.default.createElement(_index.Tab, {
65
+ id: "foo",
66
+ index: 0,
67
+ controls: "foo-panel",
68
+ isSelected: true
69
+ }, "Tab Label")));
70
+ const tab = _react2.screen.getByRole('tab');
71
+ expect(tab).toHaveAttribute('aria-selected', 'true');
72
+ });
73
+ it('should set the aria-disabled attribute', async () => {
74
+ (0, _react2.render)(_Tab5 || (_Tab5 = /*#__PURE__*/_react.default.createElement(_index.Tab, {
75
+ id: "foo",
76
+ index: 0,
77
+ controls: "foo-panel",
78
+ isDisabled: true
79
+ }, "Tab Label")));
80
+ const tab = _react2.screen.getByRole('tab');
81
+ expect(tab).toHaveAttribute('aria-disabled', 'true');
82
+ });
83
+ it('should set the tabindex to 0 when selected', async () => {
84
+ (0, _react2.render)(_Tab6 || (_Tab6 = /*#__PURE__*/_react.default.createElement(_index.Tab, {
85
+ id: "foo",
86
+ index: 0,
87
+ controls: "foo-panel",
88
+ isSelected: true
89
+ }, "Tab Label")));
90
+ const tab = _react2.screen.getByRole('tab');
91
+ expect(tab).toHaveAttribute('tabindex', '0');
92
+ });
93
+ it('should not set the tabindex when not selected', async () => {
94
+ (0, _react2.render)(_Tab7 || (_Tab7 = /*#__PURE__*/_react.default.createElement(_index.Tab, {
95
+ id: "foo",
96
+ index: 0,
97
+ controls: "foo-panel"
98
+ }, "Tab Label")));
99
+ const tab = _react2.screen.getByRole('tab');
100
+ expect(tab).not.toHaveAttribute('tabindex');
101
+ });
102
+ it('should remove the tabindex attribute when disabled', async () => {
103
+ (0, _react2.render)(_Tab8 || (_Tab8 = /*#__PURE__*/_react.default.createElement(_index.Tab, {
104
+ id: "foo",
105
+ index: 0,
106
+ controls: "foo-panel",
107
+ isDisabled: true
108
+ }, "Tab Label")));
109
+ const tab = _react2.screen.getByRole('tab');
110
+ expect(tab).not.toHaveAttribute('tabindex');
111
+ });
112
+ it('should call onClick when clicked', async () => {
113
+ const onClick = _vitest.vi.fn();
114
+ const index = 2;
115
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_index.Tab, {
116
+ id: "foo",
117
+ index: index,
118
+ controls: "foo-panel",
119
+ onClick: onClick
120
+ }, "Tab Label"));
121
+ const tab = _react2.screen.getByRole('tab');
122
+ await _userEvent.default.click(tab);
123
+ await (0, _react2.waitFor)(() => {
124
+ expect(onClick).toHaveBeenCalled();
125
+ const args = onClick.mock.calls[0][1];
126
+ expect(args).toHaveProperty('index', index);
127
+ });
128
+ });
129
+ it('should NOT call onClick when clicked and tab is disabled', async () => {
130
+ const onClick = _vitest.vi.fn();
131
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_index.Tab, {
132
+ id: "foo",
133
+ index: 0,
134
+ controls: "foo-panel",
135
+ onClick: onClick,
136
+ isDisabled: true
137
+ }, "Tab Label"));
138
+ const tab = _react2.screen.getByRole('tab');
139
+ await _userEvent.default.click(tab);
140
+ await (0, _react2.waitFor)(() => {
141
+ expect(onClick).not.toHaveBeenCalled();
142
+ });
143
+ });
144
+ it('should call onKeyDown when keys are pressed and tab is selected', async () => {
145
+ const onKeyDown = _vitest.vi.fn();
146
+ const index = 2;
147
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_index.Tab, {
148
+ id: "foo",
149
+ isSelected: true,
150
+ index: index,
151
+ controls: "foo-panel",
152
+ onKeyDown: onKeyDown
153
+ }, "Tab Label"));
154
+ const tab = _react2.screen.getByRole('tab');
155
+ await _userEvent.default.type(tab, '{enter}');
156
+ await (0, _react2.waitFor)(() => {
157
+ expect(onKeyDown).toHaveBeenCalled();
158
+ const args = onKeyDown.mock.calls[0][1];
159
+ expect(args).toHaveProperty('index', index);
160
+ });
161
+ });
162
+ it('should NOT call onKeyDown when keys are pressed and tab is disabled', async () => {
163
+ const onKeyDown = _vitest.vi.fn();
164
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_index.Tab, {
165
+ id: "foo",
166
+ index: 0,
167
+ controls: "foo-panel",
168
+ onKeyDown: onKeyDown,
169
+ isDisabled: true
170
+ }, "Tab Label"));
171
+ const tab = _react2.screen.getByRole('tab');
172
+ await _userEvent.default.type(tab, '{enter}');
173
+ await (0, _react2.waitFor)(() => {
174
+ expect(onKeyDown).not.toHaveBeenCalled();
175
+ });
176
+ });
177
+ });
@@ -3,11 +3,13 @@
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
4
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
5
5
  var _react = _interopRequireDefault(require("react"));
6
- var _index = require("../index");
7
6
  var _react2 = require("@testing-library/react");
8
7
  var _vitest = require("vitest");
8
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
9
9
  require("@testing-library/jest-dom");
10
- var _p, _Tabs, _Tabs2, _Tabs3;
10
+ var _runAxeCheck = require("@instructure/ui-axe-check/lib/runAxeCheck.js");
11
+ var _index = require("../index");
12
+ var _p, _Tabs, _Tabs2, _Tabs3, _Tabs4, _Tabs5, _Tabs6, _Tabs9, _Tabs$Panel, _Tabs$Panel2, _Tabs$Panel3, _Tabs10, _Tabs$Panel4, _Tabs$Panel5, _Tabs$Panel6, _Tabs11, _Tabs12, _Tabs13, _Tabs14, _Tabs15;
11
13
  /*
12
14
  * The MIT License (MIT)
13
15
  *
@@ -61,13 +63,20 @@ const TabExample = props => {
61
63
  }));
62
64
  };
63
65
  describe('<Tabs />', () => {
66
+ var _Tabs7, _Tabs8;
67
+ const tab1Content = 'Tab 1 content';
68
+ const tab2Content = 'Tab 2 content';
69
+ const tab3Content = 'Tab 3 content';
64
70
  let consoleErrorMock;
71
+ let consoleWarningMock;
65
72
  beforeEach(() => {
66
73
  // Mocking console to prevent test output pollution and expect for messages
67
74
  consoleErrorMock = _vitest.vi.spyOn(console, 'error').mockImplementation(() => {});
75
+ consoleWarningMock = _vitest.vi.spyOn(console, 'warn').mockImplementation(() => {});
68
76
  });
69
77
  afterEach(() => {
70
78
  consoleErrorMock.mockRestore();
79
+ consoleWarningMock.mockRestore();
71
80
  });
72
81
  it('should render the correct number of panels', () => {
73
82
  const _render = (0, _react2.render)(_Tabs || (_Tabs = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
@@ -79,10 +88,40 @@ describe('<Tabs />', () => {
79
88
  isDisabled: true
80
89
  }, "Tab 3 content")))),
81
90
  container = _render.container;
82
- expect(container.firstChild).toBeInTheDocument();
91
+ const panels = container.querySelectorAll('[role="tabpanel"]');
92
+ expect(panels.length).toBe(3);
83
93
  });
84
- it('should render same content for other tabs as for the active one', () => {
94
+ it('should render with null children', async () => {
85
95
  const _render2 = (0, _react2.render)(_Tabs2 || (_Tabs2 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
96
+ renderTitle: "First Tab"
97
+ }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
98
+ renderTitle: "Second Tab"
99
+ }, "Tab 2 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
100
+ renderTitle: "Third Tab",
101
+ isDisabled: true
102
+ }, "Tab 3 content"), null))),
103
+ container = _render2.container;
104
+ const panels = container.querySelectorAll('[role="tabpanel"]');
105
+ expect(panels.length).toBe(3);
106
+ });
107
+ it('should be okay with rendering without any children', async () => {
108
+ (0, _react2.render)(_Tabs3 || (_Tabs3 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null)));
109
+ expect(consoleErrorMock).not.toHaveBeenCalled();
110
+ });
111
+ it('should render correct number of tabs', async () => {
112
+ (0, _react2.render)(_Tabs4 || (_Tabs4 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
113
+ renderTitle: "First Tab"
114
+ }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
115
+ renderTitle: "Second Tab"
116
+ }, "Tab 2 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
117
+ renderTitle: "Third Tab",
118
+ isDisabled: true
119
+ }, "Tab 3 content"))));
120
+ const tabs = _react2.screen.getAllByRole('tab');
121
+ expect(tabs.length).toBe(3);
122
+ });
123
+ it('should render same content for other tabs as for the active one', () => {
124
+ const _render3 = (0, _react2.render)(_Tabs5 || (_Tabs5 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
86
125
  renderTitle: "First Tab",
87
126
  active: true
88
127
  }, "CONTENT"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
@@ -92,28 +131,30 @@ describe('<Tabs />', () => {
92
131
  }, "Child"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
93
132
  renderTitle: "Third Tab"
94
133
  }, "Child")))),
95
- container = _render2.container;
134
+ container = _render3.container;
96
135
  const tabContent = _react2.screen.getByText('CONTENT');
97
136
  expect(container).toBeInTheDocument();
98
137
  expect(tabContent).toBeInTheDocument();
99
138
  const childContent = _react2.screen.queryByText('Child');
100
139
  expect(childContent).toBeNull();
101
140
  });
102
- it('should render the same content in second tab when selected', () => {
141
+ it('should render the same content in second tab when selected', async () => {
103
142
  const onIndexChange = _vitest.vi.fn();
104
- const _render3 = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(TabExample, {
143
+ const _render4 = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(TabExample, {
105
144
  onIndexChange: onIndexChange
106
145
  })),
107
- container = _render3.container;
146
+ container = _render4.container;
108
147
  expect(container).toBeInTheDocument();
109
148
  const secondTab = _react2.screen.getAllByRole('tab')[1];
110
- _react2.fireEvent.click(secondTab);
111
- expect(onIndexChange).toHaveBeenCalledWith(1);
149
+ await _userEvent.default.click(secondTab);
150
+ await (0, _react2.waitFor)(() => {
151
+ expect(onIndexChange).toHaveBeenCalledWith(1);
152
+ });
112
153
  const panelContent = _react2.screen.queryByText('CONTENT');
113
154
  expect(panelContent).toBeInTheDocument();
114
155
  });
115
156
  it('should warn if multiple active tabs exist', () => {
116
- const _render4 = (0, _react2.render)(_Tabs3 || (_Tabs3 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
157
+ const _render5 = (0, _react2.render)(_Tabs6 || (_Tabs6 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
117
158
  renderTitle: "First Tab",
118
159
  active: true
119
160
  }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
@@ -123,8 +164,200 @@ describe('<Tabs />', () => {
123
164
  renderTitle: "Third Tab",
124
165
  isDisabled: true
125
166
  }, "Tab 3 content")))),
126
- container = _render4.container;
167
+ container = _render5.container;
127
168
  expect(container.firstChild).toBeInTheDocument();
128
169
  expect(consoleErrorMock.mock.calls[0][0]).toEqual('Warning: [Tabs] Only one Panel can be marked as active.');
129
170
  });
171
+ it('should default to selecting the first tab', async () => {
172
+ const _render6 = (0, _react2.render)(_Tabs7 || (_Tabs7 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
173
+ renderTitle: "First Tab"
174
+ }, tab1Content), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
175
+ renderTitle: "Second Tab"
176
+ }, tab2Content), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
177
+ renderTitle: "Third Tab",
178
+ isDisabled: true
179
+ }, tab3Content)))),
180
+ container = _render6.container;
181
+ const panelsContainer = container.querySelector('[class$="panelsContainer"]');
182
+ expect(panelsContainer).toHaveTextContent(tab1Content);
183
+ expect(_react2.screen.getByText(tab1Content)).toBeVisible();
184
+ expect(panelsContainer).not.toHaveTextContent(tab2Content);
185
+ expect(panelsContainer).not.toHaveTextContent(tab3Content);
186
+ });
187
+ it('should honor the isSelected prop', async () => {
188
+ const _render7 = (0, _react2.render)(_Tabs8 || (_Tabs8 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
189
+ renderTitle: "First Tab"
190
+ }, tab1Content), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
191
+ renderTitle: "Second Tab",
192
+ isSelected: true
193
+ }, tab2Content), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
194
+ renderTitle: "Third Tab",
195
+ isDisabled: true
196
+ }, tab3Content)))),
197
+ container = _render7.container;
198
+ const panelsContainer = container.querySelector('[class$="panelsContainer"]');
199
+ expect(panelsContainer).toHaveTextContent(tab2Content);
200
+ expect(_react2.screen.getByText(tab2Content)).toBeVisible();
201
+ expect(panelsContainer).not.toHaveTextContent(tab1Content);
202
+ expect(panelsContainer).not.toHaveTextContent(tab3Content);
203
+ });
204
+ it('should not allow selecting a disabled tab', async () => {
205
+ const _render8 = (0, _react2.render)(_Tabs9 || (_Tabs9 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
206
+ renderTitle: "First Tab"
207
+ }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
208
+ renderTitle: "Second Tab"
209
+ }, "Tab 2 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
210
+ renderTitle: "Third Tab",
211
+ isDisabled: true,
212
+ isSelected: true
213
+ }, "Tab 3 content")))),
214
+ container = _render8.container;
215
+ const panelsContainer = container.querySelector('[class$="panelsContainer"]');
216
+ const panels = container.querySelectorAll('[role="tabpanel"]');
217
+ expect(panelsContainer).toHaveTextContent(tab1Content);
218
+ expect(_react2.screen.getByText(tab1Content)).toBeVisible();
219
+ expect(panelsContainer).not.toHaveTextContent(tab2Content);
220
+ expect(panelsContainer).not.toHaveTextContent(tab3Content);
221
+ expect(panels.length).toBe(3);
222
+ expect(panels[0]).not.toHaveAttribute('aria-hidden', 'true');
223
+ expect(panels[1]).toHaveAttribute('aria-hidden', 'true');
224
+ expect(panels[2]).toHaveAttribute('aria-hidden', 'true');
225
+ });
226
+ it('should call onRequestTabChange when selection changes via click', async () => {
227
+ const onChange = _vitest.vi.fn();
228
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_index.Tabs, {
229
+ onRequestTabChange: onChange
230
+ }, _Tabs$Panel || (_Tabs$Panel = /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
231
+ renderTitle: "First Tab",
232
+ isSelected: true,
233
+ id: "one"
234
+ }, "Tab 1 content")), _Tabs$Panel2 || (_Tabs$Panel2 = /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
235
+ renderTitle: "Second Tab",
236
+ id: "two"
237
+ }, "Tab 2 content")), _Tabs$Panel3 || (_Tabs$Panel3 = /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
238
+ renderTitle: "Third Tab",
239
+ isDisabled: true,
240
+ id: "three"
241
+ }, "Tab 3 content"))));
242
+ const secondTab = _react2.screen.getByText('Second Tab');
243
+ await _userEvent.default.click(secondTab);
244
+ await (0, _react2.waitFor)(() => {
245
+ expect(onChange).toHaveBeenCalled();
246
+ const args = onChange.mock.calls[0][1];
247
+ expect(args).toHaveProperty('index', 1);
248
+ expect(args).toHaveProperty('id', 'two');
249
+ });
250
+ });
251
+ it('should focus the selected tab when shouldFocusOnRender is set', async () => {
252
+ (0, _react2.render)(_Tabs10 || (_Tabs10 = /*#__PURE__*/_react.default.createElement(_index.Tabs, {
253
+ shouldFocusOnRender: true
254
+ }, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
255
+ renderTitle: "First Tab"
256
+ }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
257
+ renderTitle: "Second Tab",
258
+ isSelected: true
259
+ }, "Tab 2 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
260
+ renderTitle: "Third Tab",
261
+ isDisabled: true
262
+ }, "Tab 3 content"))));
263
+ const secondTab = _react2.screen.getByText('Second Tab');
264
+ await (0, _react2.waitFor)(() => {
265
+ expect(document.activeElement).toBe(secondTab);
266
+ });
267
+ });
268
+ it('should not call onRequestTabChange when clicking a disabled tab', async () => {
269
+ const onChange = _vitest.vi.fn();
270
+ (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_index.Tabs, {
271
+ onRequestTabChange: onChange
272
+ }, _Tabs$Panel4 || (_Tabs$Panel4 = /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
273
+ renderTitle: "First Tab"
274
+ }, "Tab 1 content")), _Tabs$Panel5 || (_Tabs$Panel5 = /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
275
+ renderTitle: "Second Tab"
276
+ }, "Tab 2 content")), _Tabs$Panel6 || (_Tabs$Panel6 = /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
277
+ renderTitle: "Third Tab",
278
+ isDisabled: true
279
+ }, "Tab 3 content"))));
280
+ const thirdTab = _react2.screen.getByText('Third Tab');
281
+ await _userEvent.default.click(thirdTab);
282
+ await (0, _react2.waitFor)(() => {
283
+ expect(onChange).not.toHaveBeenCalled();
284
+ });
285
+ });
286
+ it('should meet a11y standards when set to the secondary variant', async () => {
287
+ const _render9 = (0, _react2.render)(_Tabs11 || (_Tabs11 = /*#__PURE__*/_react.default.createElement(_index.Tabs, {
288
+ variant: "secondary"
289
+ }, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
290
+ renderTitle: "First Tab"
291
+ }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
292
+ renderTitle: "Second Tab"
293
+ }, "Tab 2 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
294
+ renderTitle: "Third Tab",
295
+ isDisabled: true
296
+ }, "Tab 3 content")))),
297
+ container = _render9.container;
298
+ const axeCheck = await (0, _runAxeCheck.runAxeCheck)(container);
299
+ expect(axeCheck).toBe(true);
300
+ });
301
+ it('should meet a11y standards when set to the default variant', async () => {
302
+ const _render10 = (0, _react2.render)(_Tabs12 || (_Tabs12 = /*#__PURE__*/_react.default.createElement(_index.Tabs, {
303
+ variant: "default"
304
+ }, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
305
+ renderTitle: "First Tab"
306
+ }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
307
+ renderTitle: "Second Tab"
308
+ }, "Tab 2 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
309
+ renderTitle: "Third Tab",
310
+ isDisabled: true
311
+ }, "Tab 3 content")))),
312
+ container = _render10.container;
313
+ const axeCheck = await (0, _runAxeCheck.runAxeCheck)(container);
314
+ expect(axeCheck).toBe(true);
315
+ });
316
+ it('should link tabs with the corresponding panels via ids', async () => {
317
+ const _render11 = (0, _react2.render)(_Tabs13 || (_Tabs13 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
318
+ renderTitle: "First Tab"
319
+ }, "Tab 1 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
320
+ renderTitle: "Second Tab"
321
+ }, "Tab 2 content"), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
322
+ renderTitle: "Third Tab",
323
+ isDisabled: true
324
+ }, "Tab 3 content")))),
325
+ container = _render11.container;
326
+ const firstTab = _react2.screen.getByText('First Tab');
327
+ const firstPanel = container.querySelectorAll('[role="tabpanel"]')[0];
328
+ expect(firstTab).toHaveAttribute('aria-controls', firstPanel.id);
329
+ expect(firstPanel).toHaveAttribute('aria-labelledby', firstTab.id);
330
+ });
331
+ describe('with duplicate-named tabs', () => {
332
+ it('should still render the correct number of panels', async () => {
333
+ const _render12 = (0, _react2.render)(_Tabs14 || (_Tabs14 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
334
+ renderTitle: "A Tab"
335
+ }, "Contents of first tab."), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
336
+ renderTitle: "A Tab"
337
+ }, "Contents of second tab."), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
338
+ renderTitle: "A Tab",
339
+ isDisabled: true
340
+ }, "Contents of third tab.")))),
341
+ container = _render12.container;
342
+ const tabPanels = container.querySelectorAll('[role="tabpanel"]');
343
+ expect(tabPanels.length).toBe(3);
344
+ });
345
+ });
346
+ describe('with nodes as tab titles', () => {
347
+ it('should still render the correct number of panels', async () => {
348
+ const _render13 = (0, _react2.render)(_Tabs15 || (_Tabs15 = /*#__PURE__*/_react.default.createElement(_index.Tabs, null, /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
349
+ renderTitle: /*#__PURE__*/_react.default.createElement("div", null)
350
+ }, "Contents of first tab."), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
351
+ renderTitle: /*#__PURE__*/_react.default.createElement("span", null)
352
+ }, "Contents of second tab."), /*#__PURE__*/_react.default.createElement(_index.Tabs.Panel, {
353
+ renderTitle: /*#__PURE__*/_react.default.createElement("img", {
354
+ alt: "example"
355
+ }),
356
+ isDisabled: true
357
+ }, "Contents of third tab.")))),
358
+ container = _render13.container;
359
+ const tabPanels = container.querySelectorAll('[role="tabpanel"]');
360
+ expect(tabPanels.length).toBe(3);
361
+ });
362
+ });
130
363
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instructure/ui-tabs",
3
- "version": "10.14.0",
3
+ "version": "10.14.1-snapshot-1",
4
4
  "description": "A UI component library made by Instructure Inc.",
5
5
  "author": "Instructure, Inc. Engineering and Product Design",
6
6
  "module": "./es/index.js",
@@ -23,31 +23,32 @@
23
23
  },
24
24
  "license": "MIT",
25
25
  "devDependencies": {
26
- "@instructure/ui-babel-preset": "10.14.0",
27
- "@instructure/ui-color-utils": "10.14.0",
28
- "@instructure/ui-test-locator": "10.14.0",
29
- "@instructure/ui-test-utils": "10.14.0",
30
- "@instructure/ui-themes": "10.14.0",
26
+ "@instructure/ui-axe-check": "10.14.1-snapshot-1",
27
+ "@instructure/ui-babel-preset": "10.14.1-snapshot-1",
28
+ "@instructure/ui-color-utils": "10.14.1-snapshot-1",
29
+ "@instructure/ui-test-utils": "10.14.1-snapshot-1",
30
+ "@instructure/ui-themes": "10.14.1-snapshot-1",
31
31
  "@testing-library/jest-dom": "^6.6.3",
32
32
  "@testing-library/react": "^16.0.1",
33
+ "@testing-library/user-event": "^14.5.2",
33
34
  "vitest": "^2.1.8"
34
35
  },
35
36
  "dependencies": {
36
37
  "@babel/runtime": "^7.26.0",
37
- "@instructure/console": "10.14.0",
38
- "@instructure/debounce": "10.14.0",
39
- "@instructure/emotion": "10.14.0",
40
- "@instructure/shared-types": "10.14.0",
41
- "@instructure/ui-dom-utils": "10.14.0",
42
- "@instructure/ui-focusable": "10.14.0",
43
- "@instructure/ui-i18n": "10.14.0",
44
- "@instructure/ui-motion": "10.14.0",
45
- "@instructure/ui-prop-types": "10.14.0",
46
- "@instructure/ui-react-utils": "10.14.0",
47
- "@instructure/ui-testable": "10.14.0",
48
- "@instructure/ui-utils": "10.14.0",
49
- "@instructure/ui-view": "10.14.0",
50
- "@instructure/uid": "10.14.0",
38
+ "@instructure/console": "10.14.1-snapshot-1",
39
+ "@instructure/debounce": "10.14.1-snapshot-1",
40
+ "@instructure/emotion": "10.14.1-snapshot-1",
41
+ "@instructure/shared-types": "10.14.1-snapshot-1",
42
+ "@instructure/ui-dom-utils": "10.14.1-snapshot-1",
43
+ "@instructure/ui-focusable": "10.14.1-snapshot-1",
44
+ "@instructure/ui-i18n": "10.14.1-snapshot-1",
45
+ "@instructure/ui-motion": "10.14.1-snapshot-1",
46
+ "@instructure/ui-prop-types": "10.14.1-snapshot-1",
47
+ "@instructure/ui-react-utils": "10.14.1-snapshot-1",
48
+ "@instructure/ui-testable": "10.14.1-snapshot-1",
49
+ "@instructure/ui-utils": "10.14.1-snapshot-1",
50
+ "@instructure/ui-view": "10.14.1-snapshot-1",
51
+ "@instructure/uid": "10.14.1-snapshot-1",
51
52
  "keycode": "^2",
52
53
  "prop-types": "^15.8.1"
53
54
  },
@@ -21,7 +21,33 @@
21
21
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
  * SOFTWARE.
23
23
  */
24
- import { TabsLocator } from './TabsLocator'
25
24
 
26
- export { TabsLocator }
27
- export default TabsLocator
25
+ import React from 'react'
26
+ import { render, screen } from '@testing-library/react'
27
+ import '@testing-library/jest-dom'
28
+
29
+ import { Panel } from '../index'
30
+
31
+ describe('<Tabs.Panel />', () => {
32
+ it('should render children', async () => {
33
+ render(
34
+ <Panel isSelected renderTitle="Panel Title">
35
+ Panel contents
36
+ </Panel>
37
+ )
38
+ const children = screen.getByText('Panel contents')
39
+
40
+ expect(children).toBeInTheDocument()
41
+ })
42
+
43
+ it('should have appropriate role attribute', async () => {
44
+ const {container} = render(
45
+ <Panel isSelected renderTitle="Panel Title">
46
+ Panel contents
47
+ </Panel>
48
+ )
49
+ const tabPanel = container.querySelector('[class$="-panel"]')
50
+
51
+ expect(tabPanel).toHaveAttribute('role', 'tabpanel')
52
+ })
53
+ })