@pie-lib/config-ui 12.1.1-next.2 → 12.1.1-next.4
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.
- package/lib/__tests__/alert-dialog.test.js +1 -6
- package/lib/__tests__/checkbox.test.js +1 -1
- package/lib/__tests__/choice-utils.test.js +1 -3
- package/lib/__tests__/form-section.test.js +1 -1
- package/lib/__tests__/help.test.js +1 -9
- package/lib/__tests__/input.test.js +1 -1
- package/lib/__tests__/langs.test.js +1 -11
- package/lib/__tests__/number-text-field-custom.test.js +1 -3
- package/lib/__tests__/number-text-field.test.js +1 -1
- package/lib/__tests__/radio-with-label.test.js +1 -1
- package/lib/__tests__/settings-panel.test.js +1 -11
- package/lib/__tests__/settings.test.js +1 -1
- package/lib/__tests__/tabs.test.js +1 -1
- package/lib/__tests__/with-stateful-model.test.js +1 -12
- package/lib/alert-dialog.js +1 -2
- package/lib/alert-dialog.js.map +1 -1
- package/lib/checkbox.js +1 -11
- package/lib/checkbox.js.map +1 -1
- package/lib/choice-configuration/__tests__/feedback-menu.test.js +1 -1
- package/lib/choice-configuration/__tests__/index.test.js +1 -11
- package/lib/choice-configuration/feedback-menu.js +1 -6
- package/lib/choice-configuration/feedback-menu.js.map +1 -1
- package/lib/choice-configuration/index.js +1 -13
- package/lib/choice-configuration/index.js.map +1 -1
- package/lib/choice-utils.js +3 -14
- package/lib/choice-utils.js.map +1 -1
- package/lib/feedback-config/__tests__/feedback-config.test.js +1 -11
- package/lib/feedback-config/feedback-selector.js +1 -15
- package/lib/feedback-config/feedback-selector.js.map +1 -1
- package/lib/feedback-config/group.js +1 -6
- package/lib/feedback-config/group.js.map +1 -1
- package/lib/feedback-config/index.js +3 -20
- package/lib/feedback-config/index.js.map +1 -1
- package/lib/form-section.js +1 -2
- package/lib/form-section.js.map +1 -1
- package/lib/help.js +1 -3
- package/lib/help.js.map +1 -1
- package/lib/index.js +1 -8
- package/lib/index.js.map +1 -1
- package/lib/input.js +1 -9
- package/lib/input.js.map +1 -1
- package/lib/inputs.js +1 -11
- package/lib/inputs.js.map +1 -1
- package/lib/langs.js +1 -6
- package/lib/langs.js.map +1 -1
- package/lib/layout/config-layout.js +1 -10
- package/lib/layout/config-layout.js.map +1 -1
- package/lib/layout/index.js +1 -2
- package/lib/layout/index.js.map +1 -1
- package/lib/layout/layout-contents.js +1 -12
- package/lib/layout/layout-contents.js.map +1 -1
- package/lib/layout/settings-box.js +1 -3
- package/lib/layout/settings-box.js.map +1 -1
- package/lib/mui-box/index.js +1 -2
- package/lib/mui-box/index.js.map +1 -1
- package/lib/number-text-field-custom.js +9 -26
- package/lib/number-text-field-custom.js.map +1 -1
- package/lib/number-text-field.js +8 -16
- package/lib/number-text-field.js.map +1 -1
- package/lib/radio-with-label.js +1 -2
- package/lib/radio-with-label.js.map +1 -1
- package/lib/settings/display-size.js +1 -11
- package/lib/settings/display-size.js.map +1 -1
- package/lib/settings/index.js +1 -13
- package/lib/settings/index.js.map +1 -1
- package/lib/settings/panel.js +6 -22
- package/lib/settings/panel.js.map +1 -1
- package/lib/settings/settings-radio-label.js +1 -2
- package/lib/settings/settings-radio-label.js.map +1 -1
- package/lib/settings/toggle.js +1 -2
- package/lib/settings/toggle.js.map +1 -1
- package/lib/tabs/index.js +1 -5
- package/lib/tabs/index.js.map +1 -1
- package/lib/tags-input/__tests__/index.test.js +1 -1
- package/lib/tags-input/index.js +3 -11
- package/lib/tags-input/index.js.map +1 -1
- package/lib/two-choice.js +1 -14
- package/lib/two-choice.js.map +1 -1
- package/lib/with-stateful-model.js +1 -3
- package/lib/with-stateful-model.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/alert-dialog.test.jsx +13 -113
- package/src/__tests__/checkbox.test.jsx +17 -114
- package/src/__tests__/form-section.test.jsx +2 -8
- package/src/__tests__/help.test.jsx +18 -18
- package/src/__tests__/input.test.jsx +22 -58
- package/src/__tests__/langs.test.jsx +15 -96
- package/src/__tests__/number-text-field-custom.test.jsx +34 -217
- package/src/__tests__/number-text-field.test.jsx +21 -99
- package/src/__tests__/radio-with-label.test.jsx +19 -123
- package/src/__tests__/settings-panel.test.js +1 -1
- package/src/__tests__/settings.test.jsx +17 -80
- package/src/__tests__/tabs.test.jsx +2 -7
- package/src/__tests__/with-stateful-model.test.jsx +3 -9
- package/src/alert-dialog.jsx +19 -2
- package/src/checkbox.jsx +1 -9
- package/src/choice-configuration/__tests__/feedback-menu.test.jsx +6 -18
- package/src/choice-configuration/feedback-menu.jsx +7 -1
- package/src/choice-utils.js +1 -1
- package/src/feedback-config/__tests__/feedback-config.test.jsx +2 -2
- package/src/feedback-config/index.jsx +2 -1
- package/src/index.js +2 -2
- package/src/inputs.jsx +3 -16
- package/src/langs.jsx +9 -4
- package/src/layout/config-layout.jsx +2 -3
- package/src/number-text-field-custom.jsx +5 -3
- package/src/number-text-field.jsx +3 -2
- package/src/radio-with-label.jsx +1 -5
- package/src/settings/display-size.jsx +1 -1
- package/src/settings/index.js +1 -1
- package/src/settings/panel.jsx +4 -5
- package/src/settings/settings-radio-label.jsx +1 -5
- package/src/settings/toggle.jsx +1 -5
- package/src/tags-input/__tests__/index.test.jsx +1 -1
- package/src/tags-input/index.jsx +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { render, screen, waitFor
|
|
2
|
+
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
3
3
|
import userEvent from '@testing-library/user-event';
|
|
4
4
|
import { NumberTextField } from '../number-text-field';
|
|
5
5
|
|
|
@@ -29,16 +29,12 @@ describe('NumberTextField', () => {
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
it('renders with suffix', () => {
|
|
32
|
-
const { container } = render(
|
|
33
|
-
<NumberTextField {...defaultProps} suffix="px" />,
|
|
34
|
-
);
|
|
32
|
+
const { container } = render(<NumberTextField {...defaultProps} suffix="px" />);
|
|
35
33
|
expect(screen.getByText('px')).toBeInTheDocument();
|
|
36
34
|
});
|
|
37
35
|
|
|
38
36
|
it('renders without suffix when not provided', () => {
|
|
39
|
-
const { container } = render(
|
|
40
|
-
<NumberTextField {...defaultProps} />,
|
|
41
|
-
);
|
|
37
|
+
const { container } = render(<NumberTextField {...defaultProps} />);
|
|
42
38
|
const input = screen.getByRole('spinbutton');
|
|
43
39
|
expect(input).toBeInTheDocument();
|
|
44
40
|
});
|
|
@@ -56,30 +52,22 @@ describe('NumberTextField', () => {
|
|
|
56
52
|
});
|
|
57
53
|
|
|
58
54
|
it('renders with custom variant', () => {
|
|
59
|
-
const { container } = render(
|
|
60
|
-
<NumberTextField {...defaultProps} variant="outlined" />,
|
|
61
|
-
);
|
|
55
|
+
const { container } = render(<NumberTextField {...defaultProps} variant="outlined" />);
|
|
62
56
|
expect(container.querySelector('input')).toBeInTheDocument();
|
|
63
57
|
});
|
|
64
58
|
|
|
65
59
|
it('renders with disableUnderline variant', () => {
|
|
66
|
-
const { container } = render(
|
|
67
|
-
<NumberTextField {...defaultProps} disableUnderline={true} />,
|
|
68
|
-
);
|
|
60
|
+
const { container } = render(<NumberTextField {...defaultProps} disableUnderline={true} />);
|
|
69
61
|
expect(container.querySelector('input')).toBeInTheDocument();
|
|
70
62
|
});
|
|
71
63
|
|
|
72
64
|
it('renders with custom className', () => {
|
|
73
|
-
const { container } = render(
|
|
74
|
-
<NumberTextField {...defaultProps} className="custom-class" />,
|
|
75
|
-
);
|
|
65
|
+
const { container } = render(<NumberTextField {...defaultProps} className="custom-class" />);
|
|
76
66
|
expect(container.querySelector('.custom-class')).toBeInTheDocument();
|
|
77
67
|
});
|
|
78
68
|
|
|
79
69
|
it('renders with custom inputClassName', () => {
|
|
80
|
-
const { container } = render(
|
|
81
|
-
<NumberTextField {...defaultProps} inputClassName="input-class" />,
|
|
82
|
-
);
|
|
70
|
+
const { container } = render(<NumberTextField {...defaultProps} inputClassName="input-class" />);
|
|
83
71
|
expect(container.querySelector('.input-class')).toBeInTheDocument();
|
|
84
72
|
});
|
|
85
73
|
|
|
@@ -89,9 +77,7 @@ describe('NumberTextField', () => {
|
|
|
89
77
|
});
|
|
90
78
|
|
|
91
79
|
it('renders with margin normal', () => {
|
|
92
|
-
const { container } = render(
|
|
93
|
-
<NumberTextField {...defaultProps} />,
|
|
94
|
-
);
|
|
80
|
+
const { container } = render(<NumberTextField {...defaultProps} />);
|
|
95
81
|
expect(container.querySelector('input')).toBeInTheDocument();
|
|
96
82
|
});
|
|
97
83
|
});
|
|
@@ -153,13 +139,7 @@ describe('NumberTextField', () => {
|
|
|
153
139
|
describe('range constraints', () => {
|
|
154
140
|
it('handles only min constraint', async () => {
|
|
155
141
|
const user = userEvent.setup();
|
|
156
|
-
const { container } = render(
|
|
157
|
-
<NumberTextField
|
|
158
|
-
value={5}
|
|
159
|
-
min={3}
|
|
160
|
-
onChange={jest.fn()}
|
|
161
|
-
/>,
|
|
162
|
-
);
|
|
142
|
+
const { container } = render(<NumberTextField value={5} min={3} onChange={jest.fn()} />);
|
|
163
143
|
|
|
164
144
|
const input = screen.getByRole('spinbutton');
|
|
165
145
|
expect(input).toHaveValue(5);
|
|
@@ -167,25 +147,14 @@ describe('NumberTextField', () => {
|
|
|
167
147
|
|
|
168
148
|
it('handles only max constraint', async () => {
|
|
169
149
|
const user = userEvent.setup();
|
|
170
|
-
const { container } = render(
|
|
171
|
-
<NumberTextField
|
|
172
|
-
value={5}
|
|
173
|
-
max={10}
|
|
174
|
-
onChange={jest.fn()}
|
|
175
|
-
/>,
|
|
176
|
-
);
|
|
150
|
+
const { container } = render(<NumberTextField value={5} max={10} onChange={jest.fn()} />);
|
|
177
151
|
|
|
178
152
|
const input = screen.getByRole('spinbutton');
|
|
179
153
|
expect(input).toHaveValue(5);
|
|
180
154
|
});
|
|
181
155
|
|
|
182
156
|
it('handles no constraints', () => {
|
|
183
|
-
const { container } = render(
|
|
184
|
-
<NumberTextField
|
|
185
|
-
value={100}
|
|
186
|
-
onChange={jest.fn()}
|
|
187
|
-
/>,
|
|
188
|
-
);
|
|
157
|
+
const { container } = render(<NumberTextField value={100} onChange={jest.fn()} />);
|
|
189
158
|
|
|
190
159
|
const input = screen.getByRole('spinbutton');
|
|
191
160
|
expect(input).toHaveValue(100);
|
|
@@ -230,9 +199,7 @@ describe('NumberTextField', () => {
|
|
|
230
199
|
|
|
231
200
|
describe('props updates', () => {
|
|
232
201
|
it('updates value when prop changes', () => {
|
|
233
|
-
const { rerender } = render(
|
|
234
|
-
<NumberTextField {...defaultProps} value={5} />,
|
|
235
|
-
);
|
|
202
|
+
const { rerender } = render(<NumberTextField {...defaultProps} value={5} />);
|
|
236
203
|
|
|
237
204
|
let input = screen.getByRole('spinbutton');
|
|
238
205
|
expect(input).toHaveValue(5);
|
|
@@ -246,23 +213,9 @@ describe('NumberTextField', () => {
|
|
|
246
213
|
it('updates constraints when min/max props change', async () => {
|
|
247
214
|
const user = userEvent.setup();
|
|
248
215
|
const onChange = jest.fn();
|
|
249
|
-
const { rerender } = render(
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
min={1}
|
|
253
|
-
max={10}
|
|
254
|
-
onChange={onChange}
|
|
255
|
-
/>,
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
rerender(
|
|
259
|
-
<NumberTextField
|
|
260
|
-
value={5}
|
|
261
|
-
min={1}
|
|
262
|
-
max={8}
|
|
263
|
-
onChange={onChange}
|
|
264
|
-
/>,
|
|
265
|
-
);
|
|
216
|
+
const { rerender } = render(<NumberTextField value={5} min={1} max={10} onChange={onChange} />);
|
|
217
|
+
|
|
218
|
+
rerender(<NumberTextField value={5} min={1} max={8} onChange={onChange} />);
|
|
266
219
|
|
|
267
220
|
const input = screen.getByRole('spinbutton');
|
|
268
221
|
await user.clear(input);
|
|
@@ -276,23 +229,9 @@ describe('NumberTextField', () => {
|
|
|
276
229
|
|
|
277
230
|
it('re-clamps value when constraints become more restrictive', () => {
|
|
278
231
|
const onChange = jest.fn();
|
|
279
|
-
const { rerender } = render(
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
min={1}
|
|
283
|
-
max={10}
|
|
284
|
-
onChange={onChange}
|
|
285
|
-
/>,
|
|
286
|
-
);
|
|
287
|
-
|
|
288
|
-
rerender(
|
|
289
|
-
<NumberTextField
|
|
290
|
-
value={8}
|
|
291
|
-
min={1}
|
|
292
|
-
max={5}
|
|
293
|
-
onChange={onChange}
|
|
294
|
-
/>,
|
|
295
|
-
);
|
|
232
|
+
const { rerender } = render(<NumberTextField value={8} min={1} max={10} onChange={onChange} />);
|
|
233
|
+
|
|
234
|
+
rerender(<NumberTextField value={8} min={1} max={5} onChange={onChange} />);
|
|
296
235
|
|
|
297
236
|
// Component should re-clamp the value
|
|
298
237
|
expect(screen.getByRole('spinbutton')).toBeInTheDocument();
|
|
@@ -301,38 +240,21 @@ describe('NumberTextField', () => {
|
|
|
301
240
|
|
|
302
241
|
describe('fallback number logic', () => {
|
|
303
242
|
it('defaults to 0 when no min or max is provided', () => {
|
|
304
|
-
render(
|
|
305
|
-
<NumberTextField
|
|
306
|
-
value={undefined}
|
|
307
|
-
onChange={jest.fn()}
|
|
308
|
-
/>,
|
|
309
|
-
);
|
|
243
|
+
render(<NumberTextField value={undefined} onChange={jest.fn()} />);
|
|
310
244
|
|
|
311
245
|
const input = screen.getByRole('spinbutton');
|
|
312
246
|
expect(input).toHaveValue(0);
|
|
313
247
|
});
|
|
314
248
|
|
|
315
249
|
it('defaults to max when only max is provided', () => {
|
|
316
|
-
render(
|
|
317
|
-
<NumberTextField
|
|
318
|
-
value={undefined}
|
|
319
|
-
max={15}
|
|
320
|
-
onChange={jest.fn()}
|
|
321
|
-
/>,
|
|
322
|
-
);
|
|
250
|
+
render(<NumberTextField value={undefined} max={15} onChange={jest.fn()} />);
|
|
323
251
|
|
|
324
252
|
const input = screen.getByRole('spinbutton');
|
|
325
253
|
expect(input).toHaveValue(15);
|
|
326
254
|
});
|
|
327
255
|
|
|
328
256
|
it('defaults to min when only min is provided', () => {
|
|
329
|
-
render(
|
|
330
|
-
<NumberTextField
|
|
331
|
-
value={undefined}
|
|
332
|
-
min={5}
|
|
333
|
-
onChange={jest.fn()}
|
|
334
|
-
/>,
|
|
335
|
-
);
|
|
257
|
+
render(<NumberTextField value={undefined} min={5} onChange={jest.fn()} />);
|
|
336
258
|
|
|
337
259
|
const input = screen.getByRole('spinbutton');
|
|
338
260
|
expect(input).toHaveValue(5);
|
|
@@ -12,41 +12,20 @@ describe('RadioWithLabel Component', () => {
|
|
|
12
12
|
|
|
13
13
|
describe('Rendering', () => {
|
|
14
14
|
it('should render radio button with label', () => {
|
|
15
|
-
render(
|
|
16
|
-
<RadioWithLabel
|
|
17
|
-
label="Option 1"
|
|
18
|
-
value="option1"
|
|
19
|
-
checked={false}
|
|
20
|
-
onChange={onChange}
|
|
21
|
-
/>,
|
|
22
|
-
);
|
|
15
|
+
render(<RadioWithLabel label="Option 1" value="option1" checked={false} onChange={onChange} />);
|
|
23
16
|
|
|
24
17
|
expect(screen.getByText('Option 1')).toBeInTheDocument();
|
|
25
18
|
expect(screen.getByRole('radio')).toBeInTheDocument();
|
|
26
19
|
});
|
|
27
20
|
|
|
28
21
|
it('should render checked radio button', () => {
|
|
29
|
-
render(
|
|
30
|
-
<RadioWithLabel
|
|
31
|
-
label="Selected"
|
|
32
|
-
value="selected"
|
|
33
|
-
checked={true}
|
|
34
|
-
onChange={onChange}
|
|
35
|
-
/>,
|
|
36
|
-
);
|
|
22
|
+
render(<RadioWithLabel label="Selected" value="selected" checked={true} onChange={onChange} />);
|
|
37
23
|
|
|
38
24
|
expect(screen.getByRole('radio')).toBeChecked();
|
|
39
25
|
});
|
|
40
26
|
|
|
41
27
|
it('should render unchecked radio button', () => {
|
|
42
|
-
render(
|
|
43
|
-
<RadioWithLabel
|
|
44
|
-
label="Unselected"
|
|
45
|
-
value="unselected"
|
|
46
|
-
checked={false}
|
|
47
|
-
onChange={onChange}
|
|
48
|
-
/>,
|
|
49
|
-
);
|
|
28
|
+
render(<RadioWithLabel label="Unselected" value="unselected" checked={false} onChange={onChange} />);
|
|
50
29
|
|
|
51
30
|
expect(screen.getByRole('radio')).not.toBeChecked();
|
|
52
31
|
});
|
|
@@ -55,14 +34,7 @@ describe('RadioWithLabel Component', () => {
|
|
|
55
34
|
describe('User interaction', () => {
|
|
56
35
|
it('should call onChange when radio button is clicked', async () => {
|
|
57
36
|
const user = userEvent.setup();
|
|
58
|
-
render(
|
|
59
|
-
<RadioWithLabel
|
|
60
|
-
label="Option"
|
|
61
|
-
value="option"
|
|
62
|
-
checked={false}
|
|
63
|
-
onChange={onChange}
|
|
64
|
-
/>,
|
|
65
|
-
);
|
|
37
|
+
render(<RadioWithLabel label="Option" value="option" checked={false} onChange={onChange} />);
|
|
66
38
|
|
|
67
39
|
const radio = screen.getByRole('radio');
|
|
68
40
|
await user.click(radio);
|
|
@@ -72,14 +44,7 @@ describe('RadioWithLabel Component', () => {
|
|
|
72
44
|
|
|
73
45
|
it('should call onChange when label is clicked', async () => {
|
|
74
46
|
const user = userEvent.setup();
|
|
75
|
-
render(
|
|
76
|
-
<RadioWithLabel
|
|
77
|
-
label="Click me"
|
|
78
|
-
value="test"
|
|
79
|
-
checked={false}
|
|
80
|
-
onChange={onChange}
|
|
81
|
-
/>,
|
|
82
|
-
);
|
|
47
|
+
render(<RadioWithLabel label="Click me" value="test" checked={false} onChange={onChange} />);
|
|
83
48
|
|
|
84
49
|
const label = screen.getByText('Click me');
|
|
85
50
|
await user.click(label);
|
|
@@ -91,21 +56,11 @@ describe('RadioWithLabel Component', () => {
|
|
|
91
56
|
describe('Props', () => {
|
|
92
57
|
it('should accept different value types', () => {
|
|
93
58
|
const { container: stringContainer } = render(
|
|
94
|
-
<RadioWithLabel
|
|
95
|
-
label="String value"
|
|
96
|
-
value="string"
|
|
97
|
-
checked={false}
|
|
98
|
-
onChange={onChange}
|
|
99
|
-
/>,
|
|
59
|
+
<RadioWithLabel label="String value" value="string" checked={false} onChange={onChange} />,
|
|
100
60
|
);
|
|
101
61
|
|
|
102
62
|
const { container: numberContainer } = render(
|
|
103
|
-
<RadioWithLabel
|
|
104
|
-
label="Number value"
|
|
105
|
-
value={123}
|
|
106
|
-
checked={false}
|
|
107
|
-
onChange={onChange}
|
|
108
|
-
/>,
|
|
63
|
+
<RadioWithLabel label="Number value" value={123} checked={false} onChange={onChange} />,
|
|
109
64
|
);
|
|
110
65
|
|
|
111
66
|
expect(stringContainer.querySelector('input[type="radio"]')).toBeInTheDocument();
|
|
@@ -115,18 +70,8 @@ describe('RadioWithLabel Component', () => {
|
|
|
115
70
|
it('should display different labels', () => {
|
|
116
71
|
render(
|
|
117
72
|
<>
|
|
118
|
-
<RadioWithLabel
|
|
119
|
-
|
|
120
|
-
value="a"
|
|
121
|
-
checked={false}
|
|
122
|
-
onChange={onChange}
|
|
123
|
-
/>
|
|
124
|
-
<RadioWithLabel
|
|
125
|
-
label="Label B"
|
|
126
|
-
value="b"
|
|
127
|
-
checked={false}
|
|
128
|
-
onChange={onChange}
|
|
129
|
-
/>
|
|
73
|
+
<RadioWithLabel label="Label A" value="a" checked={false} onChange={onChange} />
|
|
74
|
+
<RadioWithLabel label="Label B" value="b" checked={false} onChange={onChange} />
|
|
130
75
|
</>,
|
|
131
76
|
);
|
|
132
77
|
|
|
@@ -139,24 +84,9 @@ describe('RadioWithLabel Component', () => {
|
|
|
139
84
|
it('should allow multiple radio buttons to be rendered', () => {
|
|
140
85
|
render(
|
|
141
86
|
<>
|
|
142
|
-
<RadioWithLabel
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
checked={true}
|
|
146
|
-
onChange={onChange}
|
|
147
|
-
/>
|
|
148
|
-
<RadioWithLabel
|
|
149
|
-
label="Option 2"
|
|
150
|
-
value="opt2"
|
|
151
|
-
checked={false}
|
|
152
|
-
onChange={onChange}
|
|
153
|
-
/>
|
|
154
|
-
<RadioWithLabel
|
|
155
|
-
label="Option 3"
|
|
156
|
-
value="opt3"
|
|
157
|
-
checked={false}
|
|
158
|
-
onChange={onChange}
|
|
159
|
-
/>
|
|
87
|
+
<RadioWithLabel label="Option 1" value="opt1" checked={true} onChange={onChange} />
|
|
88
|
+
<RadioWithLabel label="Option 2" value="opt2" checked={false} onChange={onChange} />
|
|
89
|
+
<RadioWithLabel label="Option 3" value="opt3" checked={false} onChange={onChange} />
|
|
160
90
|
</>,
|
|
161
91
|
);
|
|
162
92
|
|
|
@@ -175,29 +105,14 @@ describe('RadioWithLabel Component', () => {
|
|
|
175
105
|
|
|
176
106
|
render(
|
|
177
107
|
<>
|
|
178
|
-
<RadioWithLabel
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
checked={true}
|
|
182
|
-
onChange={onChange1}
|
|
183
|
-
/>
|
|
184
|
-
<RadioWithLabel
|
|
185
|
-
label="Option 2"
|
|
186
|
-
value="opt2"
|
|
187
|
-
checked={false}
|
|
188
|
-
onChange={onChange2}
|
|
189
|
-
/>
|
|
190
|
-
<RadioWithLabel
|
|
191
|
-
label="Option 3"
|
|
192
|
-
value="opt3"
|
|
193
|
-
checked={false}
|
|
194
|
-
onChange={onChange3}
|
|
195
|
-
/>
|
|
108
|
+
<RadioWithLabel label="Option 1" value="opt1" checked={true} onChange={onChange1} />
|
|
109
|
+
<RadioWithLabel label="Option 2" value="opt2" checked={false} onChange={onChange2} />
|
|
110
|
+
<RadioWithLabel label="Option 3" value="opt3" checked={false} onChange={onChange3} />
|
|
196
111
|
</>,
|
|
197
112
|
);
|
|
198
113
|
|
|
199
114
|
const radios = screen.getAllByRole('radio');
|
|
200
|
-
|
|
115
|
+
|
|
201
116
|
await user.click(radios[1]);
|
|
202
117
|
expect(onChange2).toHaveBeenCalled();
|
|
203
118
|
expect(onChange1).not.toHaveBeenCalled();
|
|
@@ -215,12 +130,7 @@ describe('RadioWithLabel Component', () => {
|
|
|
215
130
|
describe('Styling', () => {
|
|
216
131
|
it('should render with correct styling classes', () => {
|
|
217
132
|
const { container } = render(
|
|
218
|
-
<RadioWithLabel
|
|
219
|
-
label="Styled"
|
|
220
|
-
value="styled"
|
|
221
|
-
checked={false}
|
|
222
|
-
onChange={onChange}
|
|
223
|
-
/>,
|
|
133
|
+
<RadioWithLabel label="Styled" value="styled" checked={false} onChange={onChange} />,
|
|
224
134
|
);
|
|
225
135
|
|
|
226
136
|
expect(container.querySelector('[class*="MuiFormControlLabel"]')).toBeInTheDocument();
|
|
@@ -230,28 +140,14 @@ describe('RadioWithLabel Component', () => {
|
|
|
230
140
|
|
|
231
141
|
describe('Edge cases', () => {
|
|
232
142
|
it('should handle empty string label', () => {
|
|
233
|
-
render(
|
|
234
|
-
<RadioWithLabel
|
|
235
|
-
label=""
|
|
236
|
-
value="empty"
|
|
237
|
-
checked={false}
|
|
238
|
-
onChange={onChange}
|
|
239
|
-
/>,
|
|
240
|
-
);
|
|
143
|
+
render(<RadioWithLabel label="" value="empty" checked={false} onChange={onChange} />);
|
|
241
144
|
|
|
242
145
|
expect(screen.getByRole('radio')).toBeInTheDocument();
|
|
243
146
|
});
|
|
244
147
|
|
|
245
148
|
it('should handle long labels', () => {
|
|
246
149
|
const longLabel = 'This is a very long label that should wrap properly and not break the layout';
|
|
247
|
-
render(
|
|
248
|
-
<RadioWithLabel
|
|
249
|
-
label={longLabel}
|
|
250
|
-
value="long"
|
|
251
|
-
checked={false}
|
|
252
|
-
onChange={onChange}
|
|
253
|
-
/>,
|
|
254
|
-
);
|
|
150
|
+
render(<RadioWithLabel label={longLabel} value="long" checked={false} onChange={onChange} />);
|
|
255
151
|
|
|
256
152
|
expect(screen.getByText(longLabel)).toBeInTheDocument();
|
|
257
153
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import { Panel } from '../settings/panel';
|
|
4
|
-
import {
|
|
4
|
+
import { dropdown, numberField, numberFields, radio, toggle } from '../settings';
|
|
5
5
|
|
|
6
6
|
describe('Settings Panel', () => {
|
|
7
7
|
let onChange;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { render, screen
|
|
2
|
+
import { fireEvent, render, screen } from '@testing-library/react';
|
|
3
3
|
import userEvent from '@testing-library/user-event';
|
|
4
4
|
import Toggle from '../settings/toggle';
|
|
5
5
|
import DisplaySize from '../settings/display-size';
|
|
@@ -121,9 +121,7 @@ describe('Settings Components', () => {
|
|
|
121
121
|
let widthInput = screen.getByLabelText('Width');
|
|
122
122
|
expect(widthInput).toHaveValue(500);
|
|
123
123
|
|
|
124
|
-
rerender(
|
|
125
|
-
<DisplaySize {...defaultProps} size={{ width: 800, height: 600 }} />
|
|
126
|
-
);
|
|
124
|
+
rerender(<DisplaySize {...defaultProps} size={{ width: 800, height: 600 }} />);
|
|
127
125
|
|
|
128
126
|
widthInput = screen.getByLabelText('Width');
|
|
129
127
|
expect(widthInput).toHaveValue(800);
|
|
@@ -232,13 +230,7 @@ describe('Settings Components', () => {
|
|
|
232
230
|
});
|
|
233
231
|
|
|
234
232
|
it('displays custom label text', () => {
|
|
235
|
-
render(
|
|
236
|
-
<DisplaySize
|
|
237
|
-
size={{ width: 500, height: 400 }}
|
|
238
|
-
label="Custom Size Settings"
|
|
239
|
-
onChange={jest.fn()}
|
|
240
|
-
/>
|
|
241
|
-
);
|
|
233
|
+
render(<DisplaySize size={{ width: 500, height: 400 }} label="Custom Size Settings" onChange={jest.fn()} />);
|
|
242
234
|
|
|
243
235
|
expect(screen.getByText('Custom Size Settings')).toBeInTheDocument();
|
|
244
236
|
});
|
|
@@ -254,14 +246,7 @@ describe('Settings Components', () => {
|
|
|
254
246
|
describe('SettingsRadioLabel', () => {
|
|
255
247
|
it('renders radio label', () => {
|
|
256
248
|
const onChange = jest.fn();
|
|
257
|
-
render(
|
|
258
|
-
<SettingsRadioLabel
|
|
259
|
-
label="Option 1"
|
|
260
|
-
value="option1"
|
|
261
|
-
checked={false}
|
|
262
|
-
onChange={onChange}
|
|
263
|
-
/>
|
|
264
|
-
);
|
|
249
|
+
render(<SettingsRadioLabel label="Option 1" value="option1" checked={false} onChange={onChange} />);
|
|
265
250
|
|
|
266
251
|
expect(screen.getByText('Option 1')).toBeInTheDocument();
|
|
267
252
|
expect(screen.getByRole('radio')).toBeInTheDocument();
|
|
@@ -269,14 +254,7 @@ describe('Settings Components', () => {
|
|
|
269
254
|
|
|
270
255
|
it('renders checked state', () => {
|
|
271
256
|
const onChange = jest.fn();
|
|
272
|
-
render(
|
|
273
|
-
<SettingsRadioLabel
|
|
274
|
-
label="Option 1"
|
|
275
|
-
value="option1"
|
|
276
|
-
checked={true}
|
|
277
|
-
onChange={onChange}
|
|
278
|
-
/>
|
|
279
|
-
);
|
|
257
|
+
render(<SettingsRadioLabel label="Option 1" value="option1" checked={true} onChange={onChange} />);
|
|
280
258
|
|
|
281
259
|
const radio = screen.getByRole('radio');
|
|
282
260
|
expect(radio).toBeChecked();
|
|
@@ -284,14 +262,7 @@ describe('Settings Components', () => {
|
|
|
284
262
|
|
|
285
263
|
it('renders unchecked state', () => {
|
|
286
264
|
const onChange = jest.fn();
|
|
287
|
-
render(
|
|
288
|
-
<SettingsRadioLabel
|
|
289
|
-
label="Option 1"
|
|
290
|
-
value="option1"
|
|
291
|
-
checked={false}
|
|
292
|
-
onChange={onChange}
|
|
293
|
-
/>
|
|
294
|
-
);
|
|
265
|
+
render(<SettingsRadioLabel label="Option 1" value="option1" checked={false} onChange={onChange} />);
|
|
295
266
|
|
|
296
267
|
const radio = screen.getByRole('radio');
|
|
297
268
|
expect(radio).not.toBeChecked();
|
|
@@ -300,14 +271,7 @@ describe('Settings Components', () => {
|
|
|
300
271
|
it('calls onChange when radio is clicked', async () => {
|
|
301
272
|
const user = userEvent.setup();
|
|
302
273
|
const onChange = jest.fn();
|
|
303
|
-
render(
|
|
304
|
-
<SettingsRadioLabel
|
|
305
|
-
label="Option 1"
|
|
306
|
-
value="option1"
|
|
307
|
-
checked={false}
|
|
308
|
-
onChange={onChange}
|
|
309
|
-
/>
|
|
310
|
-
);
|
|
274
|
+
render(<SettingsRadioLabel label="Option 1" value="option1" checked={false} onChange={onChange} />);
|
|
311
275
|
|
|
312
276
|
const radio = screen.getByRole('radio');
|
|
313
277
|
await user.click(radio);
|
|
@@ -318,14 +282,7 @@ describe('Settings Components', () => {
|
|
|
318
282
|
it('displays label text correctly', () => {
|
|
319
283
|
const onChange = jest.fn();
|
|
320
284
|
const labelText = 'Custom Option Label';
|
|
321
|
-
render(
|
|
322
|
-
<SettingsRadioLabel
|
|
323
|
-
label={labelText}
|
|
324
|
-
value="custom"
|
|
325
|
-
checked={false}
|
|
326
|
-
onChange={onChange}
|
|
327
|
-
/>
|
|
328
|
-
);
|
|
285
|
+
render(<SettingsRadioLabel label={labelText} value="custom" checked={false} onChange={onChange} />);
|
|
329
286
|
|
|
330
287
|
expect(screen.getByText(labelText)).toBeInTheDocument();
|
|
331
288
|
});
|
|
@@ -357,34 +314,19 @@ describe('Settings Components', () => {
|
|
|
357
314
|
});
|
|
358
315
|
|
|
359
316
|
it('renders empty when groups is undefined', () => {
|
|
360
|
-
const { container } = render(
|
|
361
|
-
<Panel
|
|
362
|
-
{...defaultProps}
|
|
363
|
-
groups={undefined}
|
|
364
|
-
/>
|
|
365
|
-
);
|
|
317
|
+
const { container } = render(<Panel {...defaultProps} groups={undefined} />);
|
|
366
318
|
expect(container.firstChild.children.length).toBe(0);
|
|
367
319
|
});
|
|
368
320
|
|
|
369
321
|
it('renders empty when groups is empty', () => {
|
|
370
|
-
const { container } = render(
|
|
371
|
-
<Panel
|
|
372
|
-
{...defaultProps}
|
|
373
|
-
groups={{}}
|
|
374
|
-
/>
|
|
375
|
-
);
|
|
322
|
+
const { container } = render(<Panel {...defaultProps} groups={{}} />);
|
|
376
323
|
expect(container.firstChild.children.length).toBe(0);
|
|
377
324
|
});
|
|
378
325
|
|
|
379
326
|
it('calls onChangeModel when model changes', async () => {
|
|
380
327
|
const user = userEvent.setup();
|
|
381
328
|
const onChangeModel = jest.fn();
|
|
382
|
-
const { container } = render(
|
|
383
|
-
<Panel
|
|
384
|
-
{...defaultProps}
|
|
385
|
-
onChangeModel={onChangeModel}
|
|
386
|
-
/>
|
|
387
|
-
);
|
|
329
|
+
const { container } = render(<Panel {...defaultProps} onChangeModel={onChangeModel} />);
|
|
388
330
|
|
|
389
331
|
const switchElement = container.querySelector('input[type="checkbox"]');
|
|
390
332
|
await user.click(switchElement);
|
|
@@ -408,7 +350,7 @@ describe('Settings Components', () => {
|
|
|
408
350
|
},
|
|
409
351
|
}}
|
|
410
352
|
onChangeConfiguration={onChangeConfiguration}
|
|
411
|
-
|
|
353
|
+
/>,
|
|
412
354
|
);
|
|
413
355
|
|
|
414
356
|
const switchElement = container.querySelector('input[type="checkbox"]');
|
|
@@ -419,12 +361,7 @@ describe('Settings Components', () => {
|
|
|
419
361
|
|
|
420
362
|
it('renders with modal when provided', () => {
|
|
421
363
|
const modal = <div data-testid="test-modal">Modal Content</div>;
|
|
422
|
-
render(
|
|
423
|
-
<Panel
|
|
424
|
-
{...defaultProps}
|
|
425
|
-
modal={modal}
|
|
426
|
-
/>
|
|
427
|
-
);
|
|
364
|
+
render(<Panel {...defaultProps} modal={modal} />);
|
|
428
365
|
|
|
429
366
|
expect(screen.getByTestId('test-modal')).toBeInTheDocument();
|
|
430
367
|
expect(screen.getByText('Modal Content')).toBeInTheDocument();
|
|
@@ -449,7 +386,7 @@ describe('Settings Components', () => {
|
|
|
449
386
|
},
|
|
450
387
|
}}
|
|
451
388
|
model={{ setting1: true, setting2: false }}
|
|
452
|
-
|
|
389
|
+
/>,
|
|
453
390
|
);
|
|
454
391
|
|
|
455
392
|
expect(screen.getByText('Group One')).toBeInTheDocument();
|
|
@@ -465,7 +402,7 @@ describe('Settings Components', () => {
|
|
|
465
402
|
test: { type: 'toggle', label: 'Test' },
|
|
466
403
|
},
|
|
467
404
|
}}
|
|
468
|
-
|
|
405
|
+
/>,
|
|
469
406
|
);
|
|
470
407
|
|
|
471
408
|
expect(container.firstChild).toBeInTheDocument();
|
|
@@ -485,7 +422,7 @@ describe('Settings Components', () => {
|
|
|
485
422
|
},
|
|
486
423
|
}}
|
|
487
424
|
model={{ toggleSetting: true }}
|
|
488
|
-
|
|
425
|
+
/>,
|
|
489
426
|
);
|
|
490
427
|
|
|
491
428
|
expect(screen.getByText('General Settings')).toBeInTheDocument();
|
|
@@ -506,7 +443,7 @@ describe('Settings Components', () => {
|
|
|
506
443
|
},
|
|
507
444
|
}}
|
|
508
445
|
onChangeModel={jest.fn()}
|
|
509
|
-
|
|
446
|
+
/>,
|
|
510
447
|
);
|
|
511
448
|
|
|
512
449
|
expect(screen.getByText('General Settings')).toBeInTheDocument();
|
|
@@ -81,7 +81,6 @@ describe('Tabs Component', () => {
|
|
|
81
81
|
expect(rootDiv).toBeInTheDocument();
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
-
|
|
85
84
|
it('handles tabs without title prop gracefully', () => {
|
|
86
85
|
render(
|
|
87
86
|
<Tabs>
|
|
@@ -178,16 +177,12 @@ describe('Tabs Component', () => {
|
|
|
178
177
|
it('handles long tab titles', () => {
|
|
179
178
|
render(
|
|
180
179
|
<Tabs>
|
|
181
|
-
<div title="This is a very long tab title that should still render correctly">
|
|
182
|
-
Content 1
|
|
183
|
-
</div>
|
|
180
|
+
<div title="This is a very long tab title that should still render correctly">Content 1</div>
|
|
184
181
|
<div title="Short">Content 2</div>
|
|
185
182
|
</Tabs>,
|
|
186
183
|
);
|
|
187
184
|
|
|
188
|
-
expect(
|
|
189
|
-
screen.getByText('This is a very long tab title that should still render correctly'),
|
|
190
|
-
).toBeInTheDocument();
|
|
185
|
+
expect(screen.getByText('This is a very long tab title that should still render correctly')).toBeInTheDocument();
|
|
191
186
|
expect(screen.getByText('Short')).toBeInTheDocument();
|
|
192
187
|
});
|
|
193
188
|
});
|