@pie-lib/config-ui 13.1.0-beta.7 → 14.0.0-next.35

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.
Files changed (233) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +11 -0
  2. package/dist/alert-dialog.d.ts +44 -0
  3. package/dist/alert-dialog.js +47 -0
  4. package/dist/checkbox.d.ts +34 -0
  5. package/dist/checkbox.js +57 -0
  6. package/dist/choice-configuration/feedback-menu.d.ts +32 -0
  7. package/dist/choice-configuration/feedback-menu.js +85 -0
  8. package/dist/choice-configuration/index.d.ts +62 -0
  9. package/dist/choice-configuration/index.js +240 -0
  10. package/dist/choice-utils.d.ts +21 -0
  11. package/dist/choice-utils.js +15 -0
  12. package/dist/feedback-config/feedback-selector.d.ts +33 -0
  13. package/dist/feedback-config/feedback-selector.js +92 -0
  14. package/dist/feedback-config/group.d.ts +21 -0
  15. package/dist/feedback-config/group.js +33 -0
  16. package/dist/feedback-config/index.d.ts +48 -0
  17. package/dist/feedback-config/index.js +96 -0
  18. package/dist/form-section.d.ts +25 -0
  19. package/dist/form-section.js +25 -0
  20. package/dist/fraction-to-number.d.ts +7 -0
  21. package/dist/fraction-to-number.js +9 -0
  22. package/dist/help.d.ts +41 -0
  23. package/dist/help.js +62 -0
  24. package/dist/index.d.ts +31 -0
  25. package/dist/index.js +34 -0
  26. package/dist/input.d.ts +29 -0
  27. package/dist/input.js +65 -0
  28. package/dist/inputs.d.ts +63 -0
  29. package/dist/inputs.js +70 -0
  30. package/dist/langs.d.ts +41 -0
  31. package/dist/langs.js +76 -0
  32. package/dist/layout/config-layout.d.ts +10 -0
  33. package/dist/layout/config-layout.js +75 -0
  34. package/dist/layout/index.d.ts +11 -0
  35. package/dist/layout/index.js +10 -0
  36. package/dist/layout/layout-contents.d.ts +21 -0
  37. package/dist/layout/layout-contents.js +70 -0
  38. package/dist/layout/settings-box.d.ts +19 -0
  39. package/dist/layout/settings-box.js +32 -0
  40. package/dist/mui-box/index.d.ts +21 -0
  41. package/dist/mui-box/index.js +47 -0
  42. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/extends.js +12 -0
  43. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js +7 -0
  44. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +12 -0
  45. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +8 -0
  46. package/dist/node_modules/.bun/react-measure@2.5.2_6dbf9a050bc9aadb/node_modules/react-measure/dist/index.esm.js +122 -0
  47. package/dist/node_modules/.bun/resize-observer-polyfill@1.5.1/node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js +276 -0
  48. package/dist/number-text-field-custom.d.ts +51 -0
  49. package/dist/number-text-field-custom.js +192 -0
  50. package/dist/number-text-field.d.ts +47 -0
  51. package/dist/number-text-field.js +122 -0
  52. package/dist/radio-with-label.d.ts +25 -0
  53. package/dist/radio-with-label.js +27 -0
  54. package/dist/settings/display-size.d.ts +26 -0
  55. package/dist/settings/display-size.js +45 -0
  56. package/dist/settings/index.d.ts +45 -0
  57. package/dist/settings/index.js +63 -0
  58. package/dist/settings/panel.d.ts +27 -0
  59. package/dist/settings/panel.js +201 -0
  60. package/dist/settings/settings-radio-label.d.ts +25 -0
  61. package/dist/settings/settings-radio-label.js +29 -0
  62. package/dist/settings/toggle.d.ts +25 -0
  63. package/dist/settings/toggle.js +33 -0
  64. package/dist/tabs/index.d.ts +22 -0
  65. package/dist/tabs/index.js +39 -0
  66. package/dist/tags-input/index.d.ts +21 -0
  67. package/dist/tags-input/index.js +83 -0
  68. package/dist/two-choice.d.ts +43 -0
  69. package/dist/two-choice.js +79 -0
  70. package/dist/with-stateful-model.d.ts +42 -0
  71. package/dist/with-stateful-model.js +32 -0
  72. package/package.json +31 -19
  73. package/CHANGELOG.json +0 -32
  74. package/CHANGELOG.md +0 -2419
  75. package/lib/__tests__/alert-dialog.test.js +0 -262
  76. package/lib/__tests__/alert-dialog.test.js.map +0 -1
  77. package/lib/__tests__/checkbox.test.js +0 -227
  78. package/lib/__tests__/checkbox.test.js.map +0 -1
  79. package/lib/__tests__/choice-utils.test.js +0 -14
  80. package/lib/__tests__/choice-utils.test.js.map +0 -1
  81. package/lib/__tests__/form-section.test.js +0 -252
  82. package/lib/__tests__/form-section.test.js.map +0 -1
  83. package/lib/__tests__/help.test.js +0 -270
  84. package/lib/__tests__/help.test.js.map +0 -1
  85. package/lib/__tests__/input.test.js +0 -268
  86. package/lib/__tests__/input.test.js.map +0 -1
  87. package/lib/__tests__/langs.test.js +0 -541
  88. package/lib/__tests__/langs.test.js.map +0 -1
  89. package/lib/__tests__/number-text-field-custom.test.js +0 -362
  90. package/lib/__tests__/number-text-field-custom.test.js.map +0 -1
  91. package/lib/__tests__/number-text-field.test.js +0 -421
  92. package/lib/__tests__/number-text-field.test.js.map +0 -1
  93. package/lib/__tests__/radio-with-label.test.js +0 -233
  94. package/lib/__tests__/radio-with-label.test.js.map +0 -1
  95. package/lib/__tests__/settings-panel.test.js +0 -184
  96. package/lib/__tests__/settings-panel.test.js.map +0 -1
  97. package/lib/__tests__/settings.test.js +0 -653
  98. package/lib/__tests__/settings.test.js.map +0 -1
  99. package/lib/__tests__/tabs.test.js +0 -211
  100. package/lib/__tests__/tabs.test.js.map +0 -1
  101. package/lib/__tests__/two-choice.test.js +0 -124
  102. package/lib/__tests__/two-choice.test.js.map +0 -1
  103. package/lib/__tests__/with-stateful-model.test.js +0 -221
  104. package/lib/__tests__/with-stateful-model.test.js.map +0 -1
  105. package/lib/alert-dialog.js +0 -68
  106. package/lib/alert-dialog.js.map +0 -1
  107. package/lib/checkbox.js +0 -84
  108. package/lib/checkbox.js.map +0 -1
  109. package/lib/choice-configuration/__tests__/feedback-menu.test.js +0 -287
  110. package/lib/choice-configuration/__tests__/feedback-menu.test.js.map +0 -1
  111. package/lib/choice-configuration/__tests__/index.test.js +0 -253
  112. package/lib/choice-configuration/__tests__/index.test.js.map +0 -1
  113. package/lib/choice-configuration/feedback-menu.js +0 -129
  114. package/lib/choice-configuration/feedback-menu.js.map +0 -1
  115. package/lib/choice-configuration/index.js +0 -381
  116. package/lib/choice-configuration/index.js.map +0 -1
  117. package/lib/choice-utils.js +0 -42
  118. package/lib/choice-utils.js.map +0 -1
  119. package/lib/feedback-config/__tests__/feedback-config.test.js +0 -201
  120. package/lib/feedback-config/__tests__/feedback-config.test.js.map +0 -1
  121. package/lib/feedback-config/__tests__/feedback-selector.test.js +0 -177
  122. package/lib/feedback-config/__tests__/feedback-selector.test.js.map +0 -1
  123. package/lib/feedback-config/feedback-selector.js +0 -155
  124. package/lib/feedback-config/feedback-selector.js.map +0 -1
  125. package/lib/feedback-config/group.js +0 -61
  126. package/lib/feedback-config/group.js.map +0 -1
  127. package/lib/feedback-config/index.js +0 -146
  128. package/lib/feedback-config/index.js.map +0 -1
  129. package/lib/form-section.js +0 -44
  130. package/lib/form-section.js.map +0 -1
  131. package/lib/help.js +0 -106
  132. package/lib/help.js.map +0 -1
  133. package/lib/index.js +0 -186
  134. package/lib/index.js.map +0 -1
  135. package/lib/input.js +0 -106
  136. package/lib/input.js.map +0 -1
  137. package/lib/inputs.js +0 -105
  138. package/lib/inputs.js.map +0 -1
  139. package/lib/langs.js +0 -136
  140. package/lib/langs.js.map +0 -1
  141. package/lib/layout/__tests__/config.layout.test.js +0 -70
  142. package/lib/layout/__tests__/config.layout.test.js.map +0 -1
  143. package/lib/layout/__tests__/layout-content.test.js +0 -6
  144. package/lib/layout/__tests__/layout-content.test.js.map +0 -1
  145. package/lib/layout/config-layout.js +0 -137
  146. package/lib/layout/config-layout.js.map +0 -1
  147. package/lib/layout/index.js +0 -21
  148. package/lib/layout/index.js.map +0 -1
  149. package/lib/layout/layout-contents.js +0 -160
  150. package/lib/layout/layout-contents.js.map +0 -1
  151. package/lib/layout/settings-box.js +0 -57
  152. package/lib/layout/settings-box.js.map +0 -1
  153. package/lib/mui-box/index.js +0 -63
  154. package/lib/mui-box/index.js.map +0 -1
  155. package/lib/number-text-field-custom.js +0 -376
  156. package/lib/number-text-field-custom.js.map +0 -1
  157. package/lib/number-text-field.js +0 -229
  158. package/lib/number-text-field.js.map +0 -1
  159. package/lib/radio-with-label.js +0 -48
  160. package/lib/radio-with-label.js.map +0 -1
  161. package/lib/settings/display-size.js +0 -61
  162. package/lib/settings/display-size.js.map +0 -1
  163. package/lib/settings/index.js +0 -110
  164. package/lib/settings/index.js.map +0 -1
  165. package/lib/settings/panel.js +0 -392
  166. package/lib/settings/panel.js.map +0 -1
  167. package/lib/settings/settings-radio-label.js +0 -51
  168. package/lib/settings/settings-radio-label.js.map +0 -1
  169. package/lib/settings/toggle.js +0 -63
  170. package/lib/settings/toggle.js.map +0 -1
  171. package/lib/tabs/index.js +0 -75
  172. package/lib/tabs/index.js.map +0 -1
  173. package/lib/tags-input/__tests__/index.test.js +0 -183
  174. package/lib/tags-input/__tests__/index.test.js.map +0 -1
  175. package/lib/tags-input/index.js +0 -149
  176. package/lib/tags-input/index.js.map +0 -1
  177. package/lib/two-choice.js +0 -136
  178. package/lib/two-choice.js.map +0 -1
  179. package/lib/with-stateful-model.js +0 -61
  180. package/lib/with-stateful-model.js.map +0 -1
  181. package/src/__tests__/alert-dialog.test.jsx +0 -183
  182. package/src/__tests__/checkbox.test.jsx +0 -152
  183. package/src/__tests__/choice-utils.test.js +0 -12
  184. package/src/__tests__/form-section.test.jsx +0 -328
  185. package/src/__tests__/help.test.jsx +0 -184
  186. package/src/__tests__/input.test.jsx +0 -156
  187. package/src/__tests__/langs.test.jsx +0 -376
  188. package/src/__tests__/number-text-field-custom.test.jsx +0 -255
  189. package/src/__tests__/number-text-field.test.jsx +0 -263
  190. package/src/__tests__/radio-with-label.test.jsx +0 -155
  191. package/src/__tests__/settings-panel.test.js +0 -187
  192. package/src/__tests__/settings.test.jsx +0 -452
  193. package/src/__tests__/tabs.test.jsx +0 -188
  194. package/src/__tests__/two-choice.test.js +0 -110
  195. package/src/__tests__/with-stateful-model.test.jsx +0 -139
  196. package/src/alert-dialog.jsx +0 -75
  197. package/src/checkbox.jsx +0 -61
  198. package/src/choice-configuration/__tests__/feedback-menu.test.jsx +0 -151
  199. package/src/choice-configuration/__tests__/index.test.jsx +0 -234
  200. package/src/choice-configuration/feedback-menu.jsx +0 -96
  201. package/src/choice-configuration/index.jsx +0 -357
  202. package/src/choice-utils.js +0 -30
  203. package/src/feedback-config/__tests__/feedback-config.test.jsx +0 -141
  204. package/src/feedback-config/__tests__/feedback-selector.test.jsx +0 -97
  205. package/src/feedback-config/feedback-selector.jsx +0 -112
  206. package/src/feedback-config/group.jsx +0 -51
  207. package/src/feedback-config/index.jsx +0 -111
  208. package/src/form-section.jsx +0 -31
  209. package/src/help.jsx +0 -79
  210. package/src/index.js +0 -55
  211. package/src/input.jsx +0 -72
  212. package/src/inputs.jsx +0 -69
  213. package/src/langs.jsx +0 -111
  214. package/src/layout/__tests__/config.layout.test.jsx +0 -59
  215. package/src/layout/__tests__/layout-content.test.jsx +0 -3
  216. package/src/layout/config-layout.jsx +0 -103
  217. package/src/layout/index.js +0 -4
  218. package/src/layout/layout-contents.jsx +0 -117
  219. package/src/layout/settings-box.jsx +0 -32
  220. package/src/mui-box/index.jsx +0 -56
  221. package/src/number-text-field-custom.jsx +0 -333
  222. package/src/number-text-field.jsx +0 -215
  223. package/src/radio-with-label.jsx +0 -30
  224. package/src/settings/display-size.jsx +0 -53
  225. package/src/settings/index.js +0 -83
  226. package/src/settings/panel.jsx +0 -333
  227. package/src/settings/settings-radio-label.jsx +0 -32
  228. package/src/settings/toggle.jsx +0 -46
  229. package/src/tabs/index.jsx +0 -47
  230. package/src/tags-input/__tests__/index.test.jsx +0 -113
  231. package/src/tags-input/index.jsx +0 -116
  232. package/src/two-choice.jsx +0 -90
  233. package/src/with-stateful-model.jsx +0 -36
@@ -1,452 +0,0 @@
1
- import React from 'react';
2
- import { fireEvent, render, screen } from '@testing-library/react';
3
- import userEvent from '@testing-library/user-event';
4
- import Toggle from '../settings/toggle';
5
- import DisplaySize from '../settings/display-size';
6
- import SettingsRadioLabel from '../settings/settings-radio-label';
7
- import { Panel } from '../settings/panel';
8
-
9
- describe('Settings Components', () => {
10
- describe('Toggle', () => {
11
- it('renders toggle with label', () => {
12
- const toggle = jest.fn();
13
- render(<Toggle label="Enable Feature" checked={false} toggle={toggle} />);
14
-
15
- expect(screen.getByText('Enable Feature')).toBeInTheDocument();
16
- });
17
- });
18
-
19
- describe('DisplaySize', () => {
20
- const defaultProps = {
21
- size: { width: 500, height: 400 },
22
- label: 'Display Size',
23
- onChange: jest.fn(),
24
- };
25
-
26
- beforeEach(() => {
27
- jest.clearAllMocks();
28
- });
29
-
30
- it('renders label and input fields', () => {
31
- render(<DisplaySize {...defaultProps} />);
32
-
33
- expect(screen.getByText('Display Size')).toBeInTheDocument();
34
- expect(screen.getByLabelText('Width')).toBeInTheDocument();
35
- expect(screen.getByLabelText('Height')).toBeInTheDocument();
36
- });
37
-
38
- it('displays width and height values', () => {
39
- render(<DisplaySize {...defaultProps} />);
40
-
41
- const widthInput = screen.getByLabelText('Width');
42
- const heightInput = screen.getByLabelText('Height');
43
-
44
- expect(widthInput).toHaveValue(500);
45
- expect(heightInput).toHaveValue(400);
46
- });
47
-
48
- it('calls onChange when width changes', async () => {
49
- const user = userEvent.setup();
50
- const onChange = jest.fn();
51
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
52
-
53
- const widthInput = screen.getByLabelText('Width');
54
- await user.clear(widthInput);
55
- await user.type(widthInput, '600');
56
- fireEvent.blur(widthInput);
57
-
58
- expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ width: 600 }));
59
- });
60
-
61
- it('calls onChange when height changes', async () => {
62
- const user = userEvent.setup();
63
- const onChange = jest.fn();
64
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
65
-
66
- const heightInput = screen.getByLabelText('Height');
67
- await user.clear(heightInput);
68
- await user.type(heightInput, '500');
69
- fireEvent.blur(heightInput);
70
-
71
- expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ height: 500 }));
72
- });
73
-
74
- it('maintains other dimension when one changes', async () => {
75
- const user = userEvent.setup();
76
- const onChange = jest.fn();
77
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
78
-
79
- const widthInput = screen.getByLabelText('Width');
80
- await user.clear(widthInput);
81
- await user.type(widthInput, '700');
82
- fireEvent.blur(widthInput);
83
-
84
- expect(onChange).toHaveBeenCalledWith({
85
- width: 700,
86
- height: 400,
87
- });
88
- });
89
-
90
- it('enforces min value constraint', async () => {
91
- const user = userEvent.setup();
92
- const onChange = jest.fn();
93
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
94
-
95
- const widthInput = screen.getByLabelText('Width');
96
- await user.clear(widthInput);
97
- await user.type(widthInput, '100');
98
- fireEvent.blur(widthInput);
99
-
100
- // Should clamp to minimum 150
101
- expect(widthInput).toHaveValue(150);
102
- });
103
-
104
- it('enforces max value constraint', async () => {
105
- const user = userEvent.setup();
106
- const onChange = jest.fn();
107
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
108
-
109
- const widthInput = screen.getByLabelText('Width');
110
- await user.clear(widthInput);
111
- await user.type(widthInput, '2000');
112
- fireEvent.blur(widthInput);
113
-
114
- // Should clamp to maximum 1000
115
- expect(widthInput).toHaveValue(1000);
116
- });
117
-
118
- it('updates when size prop changes', () => {
119
- const { rerender } = render(<DisplaySize {...defaultProps} />);
120
-
121
- let widthInput = screen.getByLabelText('Width');
122
- expect(widthInput).toHaveValue(500);
123
-
124
- rerender(<DisplaySize {...defaultProps} size={{ width: 800, height: 600 }} />);
125
-
126
- widthInput = screen.getByLabelText('Width');
127
- expect(widthInput).toHaveValue(800);
128
- });
129
-
130
- it('handles boundary values at minimum', async () => {
131
- const user = userEvent.setup();
132
- const onChange = jest.fn();
133
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
134
-
135
- const widthInput = screen.getByLabelText('Width');
136
- const heightInput = screen.getByLabelText('Height');
137
-
138
- await user.clear(widthInput);
139
- await user.type(widthInput, '150');
140
- fireEvent.blur(widthInput);
141
-
142
- await user.clear(heightInput);
143
- await user.type(heightInput, '150');
144
- fireEvent.blur(heightInput);
145
-
146
- expect(widthInput).toHaveValue(150);
147
- expect(heightInput).toHaveValue(150);
148
- });
149
-
150
- it('handles boundary values at maximum', async () => {
151
- const user = userEvent.setup();
152
- const onChange = jest.fn();
153
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
154
-
155
- const widthInput = screen.getByLabelText('Width');
156
- const heightInput = screen.getByLabelText('Height');
157
-
158
- await user.clear(widthInput);
159
- await user.type(widthInput, '1000');
160
- fireEvent.blur(widthInput);
161
-
162
- await user.clear(heightInput);
163
- await user.type(heightInput, '1000');
164
- fireEvent.blur(heightInput);
165
-
166
- expect(widthInput).toHaveValue(1000);
167
- expect(heightInput).toHaveValue(1000);
168
- });
169
-
170
- it('handles decimal input values', async () => {
171
- const user = userEvent.setup();
172
- const onChange = jest.fn();
173
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
174
-
175
- const widthInput = screen.getByLabelText('Width');
176
- await user.clear(widthInput);
177
- await user.type(widthInput, '500.5');
178
- fireEvent.blur(widthInput);
179
-
180
- expect(widthInput).toBeInTheDocument();
181
- });
182
-
183
- it('handles empty input and resets to min', async () => {
184
- const user = userEvent.setup();
185
- const onChange = jest.fn();
186
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
187
-
188
- const widthInput = screen.getByLabelText('Width');
189
- await user.clear(widthInput);
190
- fireEvent.blur(widthInput);
191
-
192
- // Should reset to minimum value
193
- expect(widthInput).toHaveValue(150);
194
- });
195
-
196
- it('handles rapid width and height changes', async () => {
197
- const user = userEvent.setup();
198
- const onChange = jest.fn();
199
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
200
-
201
- const widthInput = screen.getByLabelText('Width');
202
-
203
- await user.clear(widthInput);
204
- await user.type(widthInput, '6');
205
- await user.type(widthInput, '0');
206
- await user.type(widthInput, '0');
207
- fireEvent.blur(widthInput);
208
-
209
- expect(onChange).toHaveBeenCalled();
210
- });
211
-
212
- it('clamps height at both boundaries', async () => {
213
- const user = userEvent.setup();
214
- const onChange = jest.fn();
215
- render(<DisplaySize {...defaultProps} onChange={onChange} />);
216
-
217
- const heightInput = screen.getByLabelText('Height');
218
-
219
- // Test below min
220
- await user.clear(heightInput);
221
- await user.type(heightInput, '50');
222
- fireEvent.blur(heightInput);
223
- expect(heightInput).toHaveValue(150);
224
-
225
- // Test above max
226
- await user.clear(heightInput);
227
- await user.type(heightInput, '2500');
228
- fireEvent.blur(heightInput);
229
- expect(heightInput).toHaveValue(1000);
230
- });
231
-
232
- it('displays custom label text', () => {
233
- render(<DisplaySize size={{ width: 500, height: 400 }} label="Custom Size Settings" onChange={jest.fn()} />);
234
-
235
- expect(screen.getByText('Custom Size Settings')).toBeInTheDocument();
236
- });
237
-
238
- it('renders with variant outlined', () => {
239
- const { container } = render(<DisplaySize {...defaultProps} />);
240
-
241
- const inputs = container.querySelectorAll('input');
242
- expect(inputs.length).toBe(2);
243
- });
244
- });
245
-
246
- describe('SettingsRadioLabel', () => {
247
- it('renders radio label', () => {
248
- const onChange = jest.fn();
249
- render(<SettingsRadioLabel label="Option 1" value="option1" checked={false} onChange={onChange} />);
250
-
251
- expect(screen.getByText('Option 1')).toBeInTheDocument();
252
- expect(screen.getByRole('radio')).toBeInTheDocument();
253
- });
254
-
255
- it('renders checked state', () => {
256
- const onChange = jest.fn();
257
- render(<SettingsRadioLabel label="Option 1" value="option1" checked={true} onChange={onChange} />);
258
-
259
- const radio = screen.getByRole('radio');
260
- expect(radio).toBeChecked();
261
- });
262
-
263
- it('renders unchecked state', () => {
264
- const onChange = jest.fn();
265
- render(<SettingsRadioLabel label="Option 1" value="option1" checked={false} onChange={onChange} />);
266
-
267
- const radio = screen.getByRole('radio');
268
- expect(radio).not.toBeChecked();
269
- });
270
-
271
- it('calls onChange when radio is clicked', async () => {
272
- const user = userEvent.setup();
273
- const onChange = jest.fn();
274
- render(<SettingsRadioLabel label="Option 1" value="option1" checked={false} onChange={onChange} />);
275
-
276
- const radio = screen.getByRole('radio');
277
- await user.click(radio);
278
-
279
- expect(onChange).toHaveBeenCalled();
280
- });
281
-
282
- it('displays label text correctly', () => {
283
- const onChange = jest.fn();
284
- const labelText = 'Custom Option Label';
285
- render(<SettingsRadioLabel label={labelText} value="custom" checked={false} onChange={onChange} />);
286
-
287
- expect(screen.getByText(labelText)).toBeInTheDocument();
288
- });
289
- });
290
-
291
- describe('Panel', () => {
292
- const defaultProps = {
293
- model: { toggleSetting: true, numberValue: 5 },
294
- configuration: { configValue: 'test' },
295
- groups: {
296
- 'General Settings': {
297
- toggleSetting: {
298
- type: 'toggle',
299
- label: 'Enable Feature',
300
- },
301
- },
302
- },
303
- onChangeModel: jest.fn(),
304
- onChangeConfiguration: jest.fn(),
305
- };
306
-
307
- beforeEach(() => {
308
- jest.clearAllMocks();
309
- });
310
-
311
- it('renders panel with group label', () => {
312
- render(<Panel {...defaultProps} />);
313
- expect(screen.getByText('General Settings')).toBeInTheDocument();
314
- });
315
-
316
- it('renders empty when groups is undefined', () => {
317
- const { container } = render(<Panel {...defaultProps} groups={undefined} />);
318
- expect(container.firstChild.children.length).toBe(0);
319
- });
320
-
321
- it('renders empty when groups is empty', () => {
322
- const { container } = render(<Panel {...defaultProps} groups={{}} />);
323
- expect(container.firstChild.children.length).toBe(0);
324
- });
325
-
326
- it('calls onChangeModel when model changes', async () => {
327
- const user = userEvent.setup();
328
- const onChangeModel = jest.fn();
329
- const { container } = render(<Panel {...defaultProps} onChangeModel={onChangeModel} />);
330
-
331
- const switchElement = container.querySelector('input[type="checkbox"]');
332
- await user.click(switchElement);
333
-
334
- expect(onChangeModel).toHaveBeenCalled();
335
- });
336
-
337
- it('calls onChangeConfiguration when configuration changes', async () => {
338
- const user = userEvent.setup();
339
- const onChangeConfiguration = jest.fn();
340
- const { container } = render(
341
- <Panel
342
- {...defaultProps}
343
- groups={{
344
- 'Config Group': {
345
- configValue: {
346
- type: 'toggle',
347
- label: 'Config Toggle',
348
- isConfigProperty: true,
349
- },
350
- },
351
- }}
352
- onChangeConfiguration={onChangeConfiguration}
353
- />,
354
- );
355
-
356
- const switchElement = container.querySelector('input[type="checkbox"]');
357
- await user.click(switchElement);
358
-
359
- expect(onChangeConfiguration).toHaveBeenCalled();
360
- });
361
-
362
- it('renders with modal when provided', () => {
363
- const modal = <div data-testid="test-modal">Modal Content</div>;
364
- render(<Panel {...defaultProps} modal={modal} />);
365
-
366
- expect(screen.getByTestId('test-modal')).toBeInTheDocument();
367
- expect(screen.getByText('Modal Content')).toBeInTheDocument();
368
- });
369
-
370
- it('renders multiple groups', () => {
371
- render(
372
- <Panel
373
- {...defaultProps}
374
- groups={{
375
- 'Group One': {
376
- setting1: {
377
- type: 'toggle',
378
- label: 'Setting One',
379
- },
380
- },
381
- 'Group Two': {
382
- setting2: {
383
- type: 'toggle',
384
- label: 'Setting Two',
385
- },
386
- },
387
- }}
388
- model={{ setting1: true, setting2: false }}
389
- />,
390
- );
391
-
392
- expect(screen.getByText('Group One')).toBeInTheDocument();
393
- expect(screen.getByText('Group Two')).toBeInTheDocument();
394
- });
395
-
396
- it('uses default callbacks when not provided', () => {
397
- const { container } = render(
398
- <Panel
399
- model={{ test: true }}
400
- groups={{
401
- 'Test Group': {
402
- test: { type: 'toggle', label: 'Test' },
403
- },
404
- }}
405
- />,
406
- );
407
-
408
- expect(container.firstChild).toBeInTheDocument();
409
- });
410
-
411
- it('filters out empty groups', () => {
412
- const { container } = render(
413
- <Panel
414
- {...defaultProps}
415
- groups={{
416
- 'Empty Group': {},
417
- 'General Settings': {
418
- toggleSetting: {
419
- type: 'toggle',
420
- label: 'Enable Feature',
421
- },
422
- },
423
- }}
424
- model={{ toggleSetting: true }}
425
- />,
426
- );
427
-
428
- expect(screen.getByText('General Settings')).toBeInTheDocument();
429
- expect(screen.queryByText('Empty Group')).not.toBeInTheDocument();
430
- });
431
-
432
- it('renders with null model', () => {
433
- const { container } = render(
434
- <Panel
435
- model={null}
436
- configuration={{}}
437
- groups={{
438
- 'General Settings': {
439
- toggleSetting: {
440
- type: 'toggle',
441
- label: 'Enable Feature',
442
- },
443
- },
444
- }}
445
- onChangeModel={jest.fn()}
446
- />,
447
- );
448
-
449
- expect(screen.getByText('General Settings')).toBeInTheDocument();
450
- });
451
- });
452
- });
@@ -1,188 +0,0 @@
1
- import React from 'react';
2
- import { render, screen } from '@testing-library/react';
3
- import userEvent from '@testing-library/user-event';
4
- import { Tabs } from '../tabs';
5
-
6
- describe('Tabs Component', () => {
7
- it('renders tabs with correct titles', () => {
8
- render(
9
- <Tabs>
10
- <div title="Tab 1">Content 1</div>
11
- <div title="Tab 2">Content 2</div>
12
- <div title="Tab 3">Content 3</div>
13
- </Tabs>,
14
- );
15
-
16
- expect(screen.getByText('Tab 1')).toBeInTheDocument();
17
- expect(screen.getByText('Tab 2')).toBeInTheDocument();
18
- expect(screen.getByText('Tab 3')).toBeInTheDocument();
19
- });
20
-
21
- it('renders first tab content by default', () => {
22
- render(
23
- <Tabs>
24
- <div title="Tab 1">Content 1</div>
25
- <div title="Tab 2">Content 2</div>
26
- <div title="Tab 3">Content 3</div>
27
- </Tabs>,
28
- );
29
-
30
- expect(screen.getByText('Content 1')).toBeInTheDocument();
31
- expect(screen.queryByText('Content 2')).not.toBeInTheDocument();
32
- expect(screen.queryByText('Content 3')).not.toBeInTheDocument();
33
- });
34
-
35
- it('switches to selected tab when clicked', async () => {
36
- const user = userEvent.setup();
37
- render(
38
- <Tabs>
39
- <div title="Tab 1">Content 1</div>
40
- <div title="Tab 2">Content 2</div>
41
- <div title="Tab 3">Content 3</div>
42
- </Tabs>,
43
- );
44
-
45
- const tab2 = screen.getByRole('tab', { name: 'Tab 2' });
46
- await user.click(tab2);
47
-
48
- expect(screen.queryByText('Content 1')).not.toBeInTheDocument();
49
- expect(screen.getByText('Content 2')).toBeInTheDocument();
50
- expect(screen.queryByText('Content 3')).not.toBeInTheDocument();
51
- });
52
-
53
- it('displays correct content when multiple tabs are clicked', async () => {
54
- const user = userEvent.setup();
55
- render(
56
- <Tabs>
57
- <div title="Tab 1">Content 1</div>
58
- <div title="Tab 2">Content 2</div>
59
- <div title="Tab 3">Content 3</div>
60
- </Tabs>,
61
- );
62
-
63
- await user.click(screen.getByRole('tab', { name: 'Tab 2' }));
64
- expect(screen.getByText('Content 2')).toBeInTheDocument();
65
-
66
- await user.click(screen.getByRole('tab', { name: 'Tab 3' }));
67
- expect(screen.getByText('Content 3')).toBeInTheDocument();
68
-
69
- await user.click(screen.getByRole('tab', { name: 'Tab 1' }));
70
- expect(screen.getByText('Content 1')).toBeInTheDocument();
71
- });
72
-
73
- it('applies custom className to root element', () => {
74
- const { container } = render(
75
- <Tabs className="custom-tabs-class">
76
- <div title="Tab 1">Content 1</div>
77
- </Tabs>,
78
- );
79
-
80
- const rootDiv = container.querySelector('.custom-tabs-class');
81
- expect(rootDiv).toBeInTheDocument();
82
- });
83
-
84
- it('handles tabs without title prop gracefully', () => {
85
- render(
86
- <Tabs>
87
- <div title="Tab 1">Content 1</div>
88
- <div>No Title Child</div>
89
- <div title="Tab 2">Content 2</div>
90
- </Tabs>,
91
- );
92
-
93
- const tabs = screen.getAllByRole('tab');
94
- // Should only have 2 tabs since one doesn't have a title
95
- expect(tabs).toHaveLength(2);
96
- expect(screen.getByText('Tab 1')).toBeInTheDocument();
97
- expect(screen.getByText('Tab 2')).toBeInTheDocument();
98
- });
99
-
100
- it('handles null children gracefully', () => {
101
- render(
102
- <Tabs>
103
- <div title="Tab 1">Content 1</div>
104
- {null}
105
- <div title="Tab 2">Content 2</div>
106
- </Tabs>,
107
- );
108
-
109
- const tabs = screen.getAllByRole('tab');
110
- expect(tabs).toHaveLength(2);
111
- });
112
-
113
- it('handles complex content in tabs', () => {
114
- render(
115
- <Tabs>
116
- <div title="Tab 1">
117
- <div>
118
- <h2>Tab 1 Header</h2>
119
- <p>Tab 1 description</p>
120
- <button>Button in Tab 1</button>
121
- </div>
122
- </div>
123
- <div title="Tab 2">
124
- <div>
125
- <h2>Tab 2 Header</h2>
126
- <input type="text" placeholder="Input in Tab 2" />
127
- </div>
128
- </div>
129
- </Tabs>,
130
- );
131
-
132
- expect(screen.getByText('Tab 1 Header')).toBeInTheDocument();
133
- expect(screen.getByRole('button', { name: 'Button in Tab 1' })).toBeInTheDocument();
134
-
135
- const tab2 = screen.getByRole('tab', { name: 'Tab 2' });
136
- expect(tab2).toBeInTheDocument();
137
- });
138
-
139
- it('renders all tabs in MuiTabs component', () => {
140
- const { container } = render(
141
- <Tabs>
142
- <div title="Tab A">Content A</div>
143
- <div title="Tab B">Content B</div>
144
- <div title="Tab C">Content C</div>
145
- </Tabs>,
146
- );
147
-
148
- const tabsComponent = container.querySelector('[role="tablist"]');
149
- expect(tabsComponent).toBeInTheDocument();
150
- });
151
-
152
- it('applies correct value prop to MuiTabs', async () => {
153
- const user = userEvent.setup();
154
- render(
155
- <Tabs>
156
- <div title="Tab 1">Content 1</div>
157
- <div title="Tab 2">Content 2</div>
158
- </Tabs>,
159
- );
160
-
161
- // Initially first tab should be selected (value 0)
162
- const tab1 = screen.getByRole('tab', { name: 'Tab 1' });
163
- expect(tab1).toHaveAttribute('aria-selected', 'true');
164
-
165
- // Click second tab
166
- await user.click(screen.getByRole('tab', { name: 'Tab 2' }));
167
- const tab2 = screen.getByRole('tab', { name: 'Tab 2' });
168
- expect(tab2).toHaveAttribute('aria-selected', 'true');
169
- expect(tab1).toHaveAttribute('aria-selected', 'false');
170
- });
171
-
172
- it('renders with empty children array', () => {
173
- const { container } = render(<Tabs>{[]}</Tabs>);
174
- expect(container).toBeInTheDocument();
175
- });
176
-
177
- it('handles long tab titles', () => {
178
- render(
179
- <Tabs>
180
- <div title="This is a very long tab title that should still render correctly">Content 1</div>
181
- <div title="Short">Content 2</div>
182
- </Tabs>,
183
- );
184
-
185
- expect(screen.getByText('This is a very long tab title that should still render correctly')).toBeInTheDocument();
186
- expect(screen.getByText('Short')).toBeInTheDocument();
187
- });
188
- });