@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
|
@@ -12,51 +12,26 @@ describe('Checkbox Component', () => {
|
|
|
12
12
|
|
|
13
13
|
describe('Rendering', () => {
|
|
14
14
|
it('should render checkbox with label', () => {
|
|
15
|
-
render(
|
|
16
|
-
<Checkbox
|
|
17
|
-
checked={false}
|
|
18
|
-
onChange={onChange}
|
|
19
|
-
label="Accept terms"
|
|
20
|
-
/>,
|
|
21
|
-
);
|
|
15
|
+
render(<Checkbox checked={false} onChange={onChange} label="Accept terms" />);
|
|
22
16
|
|
|
23
17
|
expect(screen.getByText('Accept terms')).toBeInTheDocument();
|
|
24
18
|
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
25
19
|
});
|
|
26
20
|
|
|
27
21
|
it('should render checkbox in checked state', () => {
|
|
28
|
-
render(
|
|
29
|
-
<Checkbox
|
|
30
|
-
checked={true}
|
|
31
|
-
onChange={onChange}
|
|
32
|
-
label="Accept terms"
|
|
33
|
-
/>,
|
|
34
|
-
);
|
|
22
|
+
render(<Checkbox checked={true} onChange={onChange} label="Accept terms" />);
|
|
35
23
|
|
|
36
24
|
expect(screen.getByRole('checkbox')).toBeChecked();
|
|
37
25
|
});
|
|
38
26
|
|
|
39
27
|
it('should render checkbox in unchecked state', () => {
|
|
40
|
-
render(
|
|
41
|
-
<Checkbox
|
|
42
|
-
checked={false}
|
|
43
|
-
onChange={onChange}
|
|
44
|
-
label="Accept terms"
|
|
45
|
-
/>,
|
|
46
|
-
);
|
|
28
|
+
render(<Checkbox checked={false} onChange={onChange} label="Accept terms" />);
|
|
47
29
|
|
|
48
30
|
expect(screen.getByRole('checkbox')).not.toBeChecked();
|
|
49
31
|
});
|
|
50
32
|
|
|
51
33
|
it('should render mini checkbox with reduced styling', () => {
|
|
52
|
-
render(
|
|
53
|
-
<Checkbox
|
|
54
|
-
checked={false}
|
|
55
|
-
onChange={onChange}
|
|
56
|
-
label="Mini"
|
|
57
|
-
mini={true}
|
|
58
|
-
/>,
|
|
59
|
-
);
|
|
34
|
+
render(<Checkbox checked={false} onChange={onChange} label="Mini" mini={true} />);
|
|
60
35
|
|
|
61
36
|
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
62
37
|
expect(screen.getByText('Mini')).toBeInTheDocument();
|
|
@@ -66,13 +41,7 @@ describe('Checkbox Component', () => {
|
|
|
66
41
|
describe('User interaction', () => {
|
|
67
42
|
it('should call onChange when checkbox is clicked', async () => {
|
|
68
43
|
const user = userEvent.setup();
|
|
69
|
-
render(
|
|
70
|
-
<Checkbox
|
|
71
|
-
checked={false}
|
|
72
|
-
onChange={onChange}
|
|
73
|
-
label="Accept"
|
|
74
|
-
/>,
|
|
75
|
-
);
|
|
44
|
+
render(<Checkbox checked={false} onChange={onChange} label="Accept" />);
|
|
76
45
|
|
|
77
46
|
const checkbox = screen.getByRole('checkbox');
|
|
78
47
|
await user.click(checkbox);
|
|
@@ -82,13 +51,7 @@ describe('Checkbox Component', () => {
|
|
|
82
51
|
|
|
83
52
|
it('should call onChange when label is clicked', async () => {
|
|
84
53
|
const user = userEvent.setup();
|
|
85
|
-
render(
|
|
86
|
-
<Checkbox
|
|
87
|
-
checked={false}
|
|
88
|
-
onChange={onChange}
|
|
89
|
-
label="Click label"
|
|
90
|
-
/>,
|
|
91
|
-
);
|
|
54
|
+
render(<Checkbox checked={false} onChange={onChange} label="Click label" />);
|
|
92
55
|
|
|
93
56
|
const label = screen.getByText('Click label');
|
|
94
57
|
await user.click(label);
|
|
@@ -99,27 +62,13 @@ describe('Checkbox Component', () => {
|
|
|
99
62
|
|
|
100
63
|
describe('Props', () => {
|
|
101
64
|
it('should handle value prop', () => {
|
|
102
|
-
render(
|
|
103
|
-
<Checkbox
|
|
104
|
-
checked={true}
|
|
105
|
-
onChange={onChange}
|
|
106
|
-
label="With value"
|
|
107
|
-
value="option1"
|
|
108
|
-
/>,
|
|
109
|
-
);
|
|
65
|
+
render(<Checkbox checked={true} onChange={onChange} label="With value" value="option1" />);
|
|
110
66
|
|
|
111
67
|
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
112
68
|
});
|
|
113
69
|
|
|
114
70
|
it('should display error styling when error is true', () => {
|
|
115
|
-
render(
|
|
116
|
-
<Checkbox
|
|
117
|
-
checked={false}
|
|
118
|
-
onChange={onChange}
|
|
119
|
-
label="Error state"
|
|
120
|
-
error={true}
|
|
121
|
-
/>,
|
|
122
|
-
);
|
|
71
|
+
render(<Checkbox checked={false} onChange={onChange} label="Error state" error={true} />);
|
|
123
72
|
|
|
124
73
|
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
125
74
|
expect(screen.getByText('Error state')).toBeInTheDocument();
|
|
@@ -128,37 +77,19 @@ describe('Checkbox Component', () => {
|
|
|
128
77
|
|
|
129
78
|
describe('Default props', () => {
|
|
130
79
|
it('should have mini default to false', () => {
|
|
131
|
-
const { container } = render(
|
|
132
|
-
<Checkbox
|
|
133
|
-
checked={true}
|
|
134
|
-
onChange={onChange}
|
|
135
|
-
label="Test"
|
|
136
|
-
/>,
|
|
137
|
-
);
|
|
80
|
+
const { container } = render(<Checkbox checked={true} onChange={onChange} label="Test" />);
|
|
138
81
|
|
|
139
82
|
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
140
83
|
});
|
|
141
84
|
|
|
142
85
|
it('should have error default to false', () => {
|
|
143
|
-
const { container } = render(
|
|
144
|
-
<Checkbox
|
|
145
|
-
checked={true}
|
|
146
|
-
onChange={onChange}
|
|
147
|
-
label="Test"
|
|
148
|
-
/>,
|
|
149
|
-
);
|
|
86
|
+
const { container } = render(<Checkbox checked={true} onChange={onChange} label="Test" />);
|
|
150
87
|
|
|
151
88
|
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
152
89
|
});
|
|
153
90
|
|
|
154
91
|
it('should have value default to empty string', () => {
|
|
155
|
-
render(
|
|
156
|
-
<Checkbox
|
|
157
|
-
checked={true}
|
|
158
|
-
onChange={onChange}
|
|
159
|
-
label="Test"
|
|
160
|
-
/>,
|
|
161
|
-
);
|
|
92
|
+
render(<Checkbox checked={true} onChange={onChange} label="Test" />);
|
|
162
93
|
|
|
163
94
|
expect(screen.getByRole('checkbox')).toBeInTheDocument();
|
|
164
95
|
});
|
|
@@ -166,26 +97,14 @@ describe('Checkbox Component', () => {
|
|
|
166
97
|
|
|
167
98
|
describe('Accessibility', () => {
|
|
168
99
|
it('should have proper label association', () => {
|
|
169
|
-
render(
|
|
170
|
-
<Checkbox
|
|
171
|
-
checked={false}
|
|
172
|
-
onChange={onChange}
|
|
173
|
-
label="Accessible label"
|
|
174
|
-
/>,
|
|
175
|
-
);
|
|
100
|
+
render(<Checkbox checked={false} onChange={onChange} label="Accessible label" />);
|
|
176
101
|
|
|
177
102
|
expect(screen.getByLabelText('Accessible label')).toBeInTheDocument();
|
|
178
103
|
});
|
|
179
104
|
|
|
180
105
|
it('should be keyboard accessible', async () => {
|
|
181
106
|
const user = userEvent.setup();
|
|
182
|
-
render(
|
|
183
|
-
<Checkbox
|
|
184
|
-
checked={false}
|
|
185
|
-
onChange={onChange}
|
|
186
|
-
label="Keyboard test"
|
|
187
|
-
/>,
|
|
188
|
-
);
|
|
107
|
+
render(<Checkbox checked={false} onChange={onChange} label="Keyboard test" />);
|
|
189
108
|
|
|
190
109
|
const checkbox = screen.getByRole('checkbox');
|
|
191
110
|
checkbox.focus();
|
|
@@ -203,16 +122,8 @@ describe('Checkbox Component', () => {
|
|
|
203
122
|
|
|
204
123
|
render(
|
|
205
124
|
<>
|
|
206
|
-
<Checkbox
|
|
207
|
-
|
|
208
|
-
onChange={onChange1}
|
|
209
|
-
label="Option 1"
|
|
210
|
-
/>
|
|
211
|
-
<Checkbox
|
|
212
|
-
checked={false}
|
|
213
|
-
onChange={onChange2}
|
|
214
|
-
label="Option 2"
|
|
215
|
-
/>
|
|
125
|
+
<Checkbox checked={true} onChange={onChange1} label="Option 1" />
|
|
126
|
+
<Checkbox checked={false} onChange={onChange2} label="Option 2" />
|
|
216
127
|
</>,
|
|
217
128
|
);
|
|
218
129
|
|
|
@@ -227,16 +138,8 @@ describe('Checkbox Component', () => {
|
|
|
227
138
|
|
|
228
139
|
render(
|
|
229
140
|
<>
|
|
230
|
-
<Checkbox
|
|
231
|
-
|
|
232
|
-
onChange={onChange1}
|
|
233
|
-
label="Option 1"
|
|
234
|
-
/>
|
|
235
|
-
<Checkbox
|
|
236
|
-
checked={false}
|
|
237
|
-
onChange={onChange2}
|
|
238
|
-
label="Option 2"
|
|
239
|
-
/>
|
|
141
|
+
<Checkbox checked={true} onChange={onChange1} label="Option 1" />
|
|
142
|
+
<Checkbox checked={false} onChange={onChange2} label="Option 2" />
|
|
240
143
|
</>,
|
|
241
144
|
);
|
|
242
145
|
|
|
@@ -147,10 +147,7 @@ describe('FormSection Component', () => {
|
|
|
147
147
|
|
|
148
148
|
it('should apply labelExtraStyle to the label', () => {
|
|
149
149
|
const { container } = render(
|
|
150
|
-
<FormSection
|
|
151
|
-
label="Styled Label"
|
|
152
|
-
labelExtraStyle={{ color: 'red', fontWeight: 'bold' }}
|
|
153
|
-
>
|
|
150
|
+
<FormSection label="Styled Label" labelExtraStyle={{ color: 'red', fontWeight: 'bold' }}>
|
|
154
151
|
<div>Content</div>
|
|
155
152
|
</FormSection>,
|
|
156
153
|
);
|
|
@@ -168,10 +165,7 @@ describe('FormSection Component', () => {
|
|
|
168
165
|
};
|
|
169
166
|
|
|
170
167
|
const { container } = render(
|
|
171
|
-
<FormSection
|
|
172
|
-
label="Multi-styled"
|
|
173
|
-
labelExtraStyle={extraStyle}
|
|
174
|
-
>
|
|
168
|
+
<FormSection label="Multi-styled" labelExtraStyle={extraStyle}>
|
|
175
169
|
<div>Content</div>
|
|
176
170
|
</FormSection>,
|
|
177
171
|
);
|
|
@@ -14,10 +14,10 @@ describe('HelpButton', () => {
|
|
|
14
14
|
const user = userEvent.setup();
|
|
15
15
|
const onClick = jest.fn();
|
|
16
16
|
render(<HelpButton onClick={onClick} />);
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
const button = screen.getByRole('button');
|
|
19
19
|
await user.click(button);
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
expect(onClick).toHaveBeenCalledTimes(1);
|
|
22
22
|
});
|
|
23
23
|
|
|
@@ -66,10 +66,10 @@ describe('HelpDialog', () => {
|
|
|
66
66
|
const user = userEvent.setup();
|
|
67
67
|
const onClose = jest.fn();
|
|
68
68
|
render(<HelpDialog {...defaultProps} onClose={onClose} />);
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
const okButton = screen.getByRole('button', { name: /OK/i });
|
|
71
71
|
await user.click(okButton);
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
expect(onClose).toHaveBeenCalledTimes(1);
|
|
74
74
|
});
|
|
75
75
|
|
|
@@ -77,7 +77,7 @@ describe('HelpDialog', () => {
|
|
|
77
77
|
const user = userEvent.setup();
|
|
78
78
|
const onClose = jest.fn();
|
|
79
79
|
render(<HelpDialog {...defaultProps} onClose={onClose} />);
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
// Simulate backdrop click by calling onClose (MUI Dialog prop)
|
|
82
82
|
const dialog = screen.getByRole('dialog', { hidden: true });
|
|
83
83
|
expect(dialog).toBeInTheDocument();
|
|
@@ -96,7 +96,7 @@ describe('HelpDialog', () => {
|
|
|
96
96
|
{content.map((line, i) => (
|
|
97
97
|
<div key={i}>{line}</div>
|
|
98
98
|
))}
|
|
99
|
-
</HelpDialog
|
|
99
|
+
</HelpDialog>,
|
|
100
100
|
);
|
|
101
101
|
expect(screen.getByText('Line 1')).toBeInTheDocument();
|
|
102
102
|
expect(screen.getByText('Line 2')).toBeInTheDocument();
|
|
@@ -123,10 +123,10 @@ describe('Help Component', () => {
|
|
|
123
123
|
it('opens dialog when help button is clicked', async () => {
|
|
124
124
|
const user = userEvent.setup();
|
|
125
125
|
render(<Help {...defaultProps} />);
|
|
126
|
-
|
|
126
|
+
|
|
127
127
|
const button = screen.getByRole('button');
|
|
128
128
|
await user.click(button);
|
|
129
|
-
|
|
129
|
+
|
|
130
130
|
expect(screen.getByText('Help Title')).toBeInTheDocument();
|
|
131
131
|
expect(screen.getByText('Help content')).toBeInTheDocument();
|
|
132
132
|
});
|
|
@@ -134,13 +134,13 @@ describe('Help Component', () => {
|
|
|
134
134
|
it('closes dialog when OK button is clicked', async () => {
|
|
135
135
|
const user = userEvent.setup();
|
|
136
136
|
render(<Help {...defaultProps} />);
|
|
137
|
-
|
|
137
|
+
|
|
138
138
|
const helpButton = screen.getByRole('button', { name: '' });
|
|
139
139
|
await user.click(helpButton);
|
|
140
|
-
|
|
140
|
+
|
|
141
141
|
const okButton = screen.getByRole('button', { name: /OK/i });
|
|
142
142
|
await user.click(okButton);
|
|
143
|
-
|
|
143
|
+
|
|
144
144
|
await waitFor(() => {
|
|
145
145
|
expect(screen.queryByText('Help Title')).not.toBeInTheDocument();
|
|
146
146
|
});
|
|
@@ -155,29 +155,29 @@ describe('Help Component', () => {
|
|
|
155
155
|
it('displays children prop', async () => {
|
|
156
156
|
const user = userEvent.setup();
|
|
157
157
|
render(<Help {...defaultProps} children="Custom help content" />);
|
|
158
|
-
|
|
158
|
+
|
|
159
159
|
const button = screen.getByRole('button');
|
|
160
160
|
await user.click(button);
|
|
161
|
-
|
|
161
|
+
|
|
162
162
|
expect(screen.getByText('Custom help content')).toBeInTheDocument();
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
it('can open and close dialog multiple times', async () => {
|
|
166
166
|
const user = userEvent.setup();
|
|
167
167
|
render(<Help {...defaultProps} />);
|
|
168
|
-
|
|
168
|
+
|
|
169
169
|
const helpButton = screen.getByRole('button', { name: '' });
|
|
170
|
-
|
|
170
|
+
|
|
171
171
|
await user.click(helpButton);
|
|
172
172
|
expect(screen.getByText('Help Title')).toBeInTheDocument();
|
|
173
|
-
|
|
173
|
+
|
|
174
174
|
let okButton = screen.getByRole('button', { name: /OK/i });
|
|
175
175
|
await user.click(okButton);
|
|
176
|
-
|
|
176
|
+
|
|
177
177
|
await waitFor(() => {
|
|
178
178
|
expect(screen.queryByText('Help Title')).not.toBeInTheDocument();
|
|
179
179
|
});
|
|
180
|
-
|
|
180
|
+
|
|
181
181
|
await user.click(helpButton);
|
|
182
182
|
expect(screen.getByText('Help Title')).toBeInTheDocument();
|
|
183
183
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { render, screen
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import userEvent from '@testing-library/user-event';
|
|
4
4
|
import Input from '../input';
|
|
5
5
|
|
|
@@ -12,9 +12,7 @@ describe('Input Component', () => {
|
|
|
12
12
|
|
|
13
13
|
describe('Rendering', () => {
|
|
14
14
|
it('should render input without label', () => {
|
|
15
|
-
const { container } = render(
|
|
16
|
-
<Input type="text" value="test" onChange={onChange} />,
|
|
17
|
-
);
|
|
15
|
+
const { container } = render(<Input type="text" value="test" onChange={onChange} />);
|
|
18
16
|
|
|
19
17
|
const input = container.querySelector('input');
|
|
20
18
|
expect(input).toBeInTheDocument();
|
|
@@ -22,9 +20,7 @@ describe('Input Component', () => {
|
|
|
22
20
|
});
|
|
23
21
|
|
|
24
22
|
it('should render input with label', () => {
|
|
25
|
-
render(
|
|
26
|
-
<Input type="text" label="Email" value="test@example.com" onChange={onChange} />,
|
|
27
|
-
);
|
|
23
|
+
render(<Input type="text" label="Email" value="test@example.com" onChange={onChange} />);
|
|
28
24
|
|
|
29
25
|
expect(screen.getByText('Email')).toBeInTheDocument();
|
|
30
26
|
const input = screen.getByDisplayValue('test@example.com');
|
|
@@ -32,49 +28,35 @@ describe('Input Component', () => {
|
|
|
32
28
|
});
|
|
33
29
|
|
|
34
30
|
it('should render input with different types', () => {
|
|
35
|
-
const { container: numberContainer } = render(
|
|
36
|
-
<Input type="number" value={123} onChange={onChange} />,
|
|
37
|
-
);
|
|
31
|
+
const { container: numberContainer } = render(<Input type="number" value={123} onChange={onChange} />);
|
|
38
32
|
expect(numberContainer.querySelector('input[type="number"]')).toBeInTheDocument();
|
|
39
33
|
|
|
40
|
-
const { container: emailContainer } = render(
|
|
41
|
-
<Input type="email" value="test@example.com" onChange={onChange} />,
|
|
42
|
-
);
|
|
34
|
+
const { container: emailContainer } = render(<Input type="email" value="test@example.com" onChange={onChange} />);
|
|
43
35
|
expect(emailContainer.querySelector('input[type="email"]')).toBeInTheDocument();
|
|
44
36
|
|
|
45
|
-
const { container: passwordContainer } = render(
|
|
46
|
-
<Input type="password" value="secret" onChange={onChange} />,
|
|
47
|
-
);
|
|
37
|
+
const { container: passwordContainer } = render(<Input type="password" value="secret" onChange={onChange} />);
|
|
48
38
|
expect(passwordContainer.querySelector('input[type="password"]')).toBeInTheDocument();
|
|
49
39
|
});
|
|
50
40
|
});
|
|
51
41
|
|
|
52
42
|
describe('Value handling', () => {
|
|
53
43
|
it('should handle string values', () => {
|
|
54
|
-
const { container } = render(
|
|
55
|
-
<Input type="text" value="hello" onChange={onChange} />,
|
|
56
|
-
);
|
|
44
|
+
const { container } = render(<Input type="text" value="hello" onChange={onChange} />);
|
|
57
45
|
expect(container.querySelector('input').value).toBe('hello');
|
|
58
46
|
});
|
|
59
47
|
|
|
60
48
|
it('should handle number values', () => {
|
|
61
|
-
const { container } = render(
|
|
62
|
-
<Input type="number" value={42} onChange={onChange} />,
|
|
63
|
-
);
|
|
49
|
+
const { container } = render(<Input type="number" value={42} onChange={onChange} />);
|
|
64
50
|
expect(container.querySelector('input').value).toBe('42');
|
|
65
51
|
});
|
|
66
52
|
|
|
67
53
|
it('should handle empty values', () => {
|
|
68
|
-
const { container } = render(
|
|
69
|
-
<Input type="text" value="" onChange={onChange} />,
|
|
70
|
-
);
|
|
54
|
+
const { container } = render(<Input type="text" value="" onChange={onChange} />);
|
|
71
55
|
expect(container.querySelector('input').value).toBe('');
|
|
72
56
|
});
|
|
73
57
|
|
|
74
58
|
it('should update when prop changes', () => {
|
|
75
|
-
const { container, rerender } = render(
|
|
76
|
-
<Input type="text" value="initial" onChange={onChange} />,
|
|
77
|
-
);
|
|
59
|
+
const { container, rerender } = render(<Input type="text" value="initial" onChange={onChange} />);
|
|
78
60
|
expect(container.querySelector('input').value).toBe('initial');
|
|
79
61
|
|
|
80
62
|
rerender(<Input type="text" value="updated" onChange={onChange} />);
|
|
@@ -85,9 +67,7 @@ describe('Input Component', () => {
|
|
|
85
67
|
describe('onChange behavior', () => {
|
|
86
68
|
it('should call onChange on input change', async () => {
|
|
87
69
|
const user = userEvent.setup();
|
|
88
|
-
const { container } = render(
|
|
89
|
-
<Input type="text" value="" onChange={onChange} />,
|
|
90
|
-
);
|
|
70
|
+
const { container } = render(<Input type="text" value="" onChange={onChange} />);
|
|
91
71
|
|
|
92
72
|
const input = container.querySelector('input');
|
|
93
73
|
await user.type(input, 'hello');
|
|
@@ -98,10 +78,8 @@ describe('Input Component', () => {
|
|
|
98
78
|
it('should handle custom error function', async () => {
|
|
99
79
|
const user = userEvent.setup();
|
|
100
80
|
const customError = jest.fn((value) => value.length < 3);
|
|
101
|
-
|
|
102
|
-
const { container } = render(
|
|
103
|
-
<Input type="text" value="" onChange={onChange} error={customError} />,
|
|
104
|
-
);
|
|
81
|
+
|
|
82
|
+
const { container } = render(<Input type="text" value="" onChange={onChange} error={customError} />);
|
|
105
83
|
|
|
106
84
|
const input = container.querySelector('input');
|
|
107
85
|
await user.type(input, 'ab');
|
|
@@ -114,10 +92,8 @@ describe('Input Component', () => {
|
|
|
114
92
|
it('should display error state when validation fails', async () => {
|
|
115
93
|
const user = userEvent.setup();
|
|
116
94
|
const customError = jest.fn(() => true);
|
|
117
|
-
|
|
118
|
-
const { container } = render(
|
|
119
|
-
<Input type="text" value="" onChange={onChange} error={customError} />,
|
|
120
|
-
);
|
|
95
|
+
|
|
96
|
+
const { container } = render(<Input type="text" value="" onChange={onChange} error={customError} />);
|
|
121
97
|
|
|
122
98
|
const input = container.querySelector('input');
|
|
123
99
|
await user.type(input, 'test');
|
|
@@ -128,10 +104,8 @@ describe('Input Component', () => {
|
|
|
128
104
|
it('should clear error state when validation passes', async () => {
|
|
129
105
|
const user = userEvent.setup();
|
|
130
106
|
const customError = jest.fn((value) => !value);
|
|
131
|
-
|
|
132
|
-
const { container } = render(
|
|
133
|
-
<Input type="text" value="" onChange={onChange} error={customError} />,
|
|
134
|
-
);
|
|
107
|
+
|
|
108
|
+
const { container } = render(<Input type="text" value="" onChange={onChange} error={customError} />);
|
|
135
109
|
|
|
136
110
|
const input = container.querySelector('input');
|
|
137
111
|
await user.type(input, 'test');
|
|
@@ -143,18 +117,14 @@ describe('Input Component', () => {
|
|
|
143
117
|
|
|
144
118
|
describe('Props spreading', () => {
|
|
145
119
|
it('should handle disabled state', () => {
|
|
146
|
-
const { container } = render(
|
|
147
|
-
<Input type="text" value="" onChange={onChange} disabled />,
|
|
148
|
-
);
|
|
120
|
+
const { container } = render(<Input type="text" value="" onChange={onChange} disabled />);
|
|
149
121
|
|
|
150
122
|
const input = container.querySelector('input');
|
|
151
123
|
expect(input).toBeDisabled();
|
|
152
124
|
});
|
|
153
125
|
|
|
154
126
|
it('should handle readonly state', () => {
|
|
155
|
-
const { container } = render(
|
|
156
|
-
<Input type="text" value="readonly" onChange={onChange} readOnly />,
|
|
157
|
-
);
|
|
127
|
+
const { container } = render(<Input type="text" value="readonly" onChange={onChange} readOnly />);
|
|
158
128
|
|
|
159
129
|
const input = container.querySelector('input');
|
|
160
130
|
expect(input).toHaveAttribute('readonly');
|
|
@@ -163,27 +133,21 @@ describe('Input Component', () => {
|
|
|
163
133
|
|
|
164
134
|
describe('Default props', () => {
|
|
165
135
|
it('should use default type of text', () => {
|
|
166
|
-
const { container } = render(
|
|
167
|
-
<Input value="" onChange={onChange} />,
|
|
168
|
-
);
|
|
136
|
+
const { container } = render(<Input value="" onChange={onChange} />);
|
|
169
137
|
|
|
170
138
|
const input = container.querySelector('input');
|
|
171
139
|
expect(input.type).toBe('text');
|
|
172
140
|
});
|
|
173
141
|
|
|
174
142
|
it('should use default error function that validates number type', () => {
|
|
175
|
-
const { container } = render(
|
|
176
|
-
<Input type="number" value="" onChange={onChange} />,
|
|
177
|
-
);
|
|
143
|
+
const { container } = render(<Input type="number" value="" onChange={onChange} />);
|
|
178
144
|
|
|
179
145
|
const input = container.querySelector('input');
|
|
180
146
|
expect(input).toBeInTheDocument();
|
|
181
147
|
});
|
|
182
148
|
|
|
183
149
|
it('should have noModelUpdateOnError default to false', () => {
|
|
184
|
-
const { container } = render(
|
|
185
|
-
<Input type="text" value="" onChange={onChange} />,
|
|
186
|
-
);
|
|
150
|
+
const { container } = render(<Input type="text" value="" onChange={onChange} />);
|
|
187
151
|
|
|
188
152
|
const input = container.querySelector('input');
|
|
189
153
|
expect(input).toBeInTheDocument();
|