@simplysm/solid 13.0.70 → 13.0.71
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/README.md +1 -1
- package/dist/components/disclosure/Dropdown.d.ts +6 -4
- package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
- package/dist/components/disclosure/Dropdown.js +24 -8
- package/dist/components/disclosure/Dropdown.js.map +2 -2
- package/dist/components/disclosure/dialogZIndex.d.ts +2 -0
- package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
- package/dist/components/disclosure/dialogZIndex.js +4 -0
- package/dist/components/disclosure/dialogZIndex.js.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.js +16 -7
- package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
- package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
- package/dist/components/features/crud-sheet/CrudSheet.js +14 -5
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- package/dist/components/features/crudRegistry.d.ts +16 -0
- package/dist/components/features/crudRegistry.d.ts.map +1 -0
- package/dist/components/features/crudRegistry.js +37 -0
- package/dist/components/features/crudRegistry.js.map +6 -0
- package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
- package/dist/components/features/permission-table/PermissionTable.js +71 -86
- package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelect.js +2 -4
- package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts +2 -4
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +11 -46
- package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
- package/dist/components/form-control/select/Select.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.js +1 -1
- package/dist/components/form-control/select/Select.js.map +1 -1
- package/dist/helpers/createAppStructure.d.ts.map +1 -1
- package/dist/helpers/createAppStructure.js +3 -2
- package/dist/helpers/createAppStructure.js.map +1 -1
- package/dist/helpers/createHmrSafeContext.d.ts +3 -0
- package/dist/helpers/createHmrSafeContext.d.ts.map +1 -0
- package/dist/helpers/createHmrSafeContext.js +10 -0
- package/dist/helpers/createHmrSafeContext.js.map +6 -0
- package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
- package/dist/hooks/createSelectionGroup.js +3 -2
- package/dist/hooks/createSelectionGroup.js.map +2 -2
- package/package.json +6 -5
- package/src/components/disclosure/Dropdown.tsx +31 -17
- package/src/components/disclosure/dialogZIndex.ts +5 -0
- package/src/components/features/crud-detail/CrudDetail.tsx +16 -5
- package/src/components/features/crud-sheet/CrudSheet.tsx +13 -3
- package/src/components/features/crudRegistry.ts +60 -0
- package/src/components/features/permission-table/PermissionTable.tsx +49 -46
- package/src/components/features/shared-data/SharedDataSelect.tsx +2 -2
- package/src/components/features/shared-data/SharedDataSelectList.tsx +11 -36
- package/src/components/form-control/select/Select.tsx +1 -5
- package/src/helpers/createAppStructure.ts +3 -2
- package/src/helpers/createHmrSafeContext.ts +8 -0
- package/src/hooks/createSelectionGroup.tsx +4 -2
- package/tests/components/data/List.spec.tsx +52 -52
- package/tests/components/data/Pagination.spec.tsx +43 -43
- package/tests/components/data/Table.spec.tsx +4 -4
- package/tests/components/data/kanban/Kanban.selection.spec.tsx +21 -21
- package/tests/components/data/sheet/DataSheet.spec.tsx +50 -50
- package/tests/components/disclosure/Collapse.spec.tsx +24 -24
- package/tests/components/disclosure/Dialog.spec.tsx +33 -33
- package/tests/components/disclosure/DialogProvider.spec.tsx +9 -9
- package/tests/components/disclosure/Dropdown.spec.tsx +134 -14
- package/tests/components/disclosure/Tabs.spec.tsx +21 -21
- package/tests/components/disclosure/dialogZIndex.spec.ts +45 -0
- package/tests/components/display/Alert.spec.tsx +4 -4
- package/tests/components/display/Barcode.spec.tsx +7 -7
- package/tests/components/display/Card.spec.tsx +3 -3
- package/tests/components/display/Link.spec.tsx +5 -5
- package/tests/components/display/Tag.spec.tsx +4 -4
- package/tests/components/features/address/AddressSearch.spec.tsx +3 -3
- package/tests/components/features/crudRegistry.spec.ts +119 -0
- package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +8 -8
- package/tests/components/features/permission-table/PermissionTable.spec.tsx +43 -43
- package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +2 -17
- package/tests/components/feedback/busy/BusyContainer.spec.tsx +7 -7
- package/tests/components/feedback/notification/NotificationBell.spec.tsx +9 -9
- package/tests/components/feedback/print/Print.spec.tsx +4 -4
- package/tests/components/form-control/Button.spec.tsx +18 -18
- package/tests/components/form-control/checkbox/Checkbox.spec.tsx +20 -20
- package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +12 -12
- package/tests/components/form-control/checkbox/Radio.spec.tsx +21 -21
- package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +12 -12
- package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +10 -10
- package/tests/components/form-control/combobox/Combobox.spec.tsx +16 -16
- package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +7 -7
- package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +24 -24
- package/tests/components/form-control/field/DatePicker.spec.tsx +50 -50
- package/tests/components/form-control/field/DateTimePicker.spec.tsx +47 -47
- package/tests/components/form-control/field/NumberInput.spec.tsx +54 -54
- package/tests/components/form-control/field/TextInput.spec.tsx +49 -49
- package/tests/components/form-control/field/Textarea.spec.tsx +33 -33
- package/tests/components/form-control/field/TimePicker.spec.tsx +42 -42
- package/tests/components/form-control/numpad/Numpad.spec.tsx +40 -40
- package/tests/components/form-control/select/Select.spec.tsx +9 -9
- package/tests/components/form-control/select/SelectItem.spec.tsx +10 -10
- package/tests/helpers/createAppStructure.spec.tsx +57 -57
- package/tests/helpers/mergeStyles.spec.ts +31 -31
|
@@ -4,65 +4,65 @@ import { createSignal } from "solid-js";
|
|
|
4
4
|
import { DateOnly } from "@simplysm/core-common";
|
|
5
5
|
import { DatePicker } from "../../../../src/components/form-control/field/DatePicker";
|
|
6
6
|
|
|
7
|
-
describe("DatePicker
|
|
7
|
+
describe("DatePicker component", () => {
|
|
8
8
|
describe("basic rendering", () => {
|
|
9
|
-
it("
|
|
9
|
+
it("renders input type=number when unit=year", () => {
|
|
10
10
|
const { container } = render(() => <DatePicker unit="year" />);
|
|
11
11
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
12
12
|
expect(input).toBeTruthy();
|
|
13
13
|
expect(input.type).toBe("number");
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
-
it("
|
|
16
|
+
it("renders input type=month when unit=month", () => {
|
|
17
17
|
const { container } = render(() => <DatePicker unit="month" />);
|
|
18
18
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
19
19
|
expect(input).toBeTruthy();
|
|
20
20
|
expect(input.type).toBe("month");
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
it("
|
|
23
|
+
it("renders input type=date when unit=date", () => {
|
|
24
24
|
const { container } = render(() => <DatePicker unit="date" />);
|
|
25
25
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
26
26
|
expect(input).toBeTruthy();
|
|
27
27
|
expect(input.type).toBe("date");
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
-
it("autocomplete
|
|
30
|
+
it("defaults autocomplete to one-time-code", () => {
|
|
31
31
|
const { container } = render(() => <DatePicker />);
|
|
32
32
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
33
33
|
expect(input.autocomplete).toBe("one-time-code");
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
it("
|
|
36
|
+
it("defaults unit to date", () => {
|
|
37
37
|
const { container } = render(() => <DatePicker />);
|
|
38
38
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
39
39
|
expect(input.type).toBe("date");
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
describe("
|
|
44
|
-
it("DateOnly
|
|
43
|
+
describe("value conversion", () => {
|
|
44
|
+
it("displays DateOnly in yyyy format for year type", () => {
|
|
45
45
|
const dateOnly = new DateOnly(2025, 3, 15);
|
|
46
46
|
const { container } = render(() => <DatePicker unit="year" value={dateOnly} />);
|
|
47
47
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
48
48
|
expect(input.value).toBe("2025");
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
it("DateOnly
|
|
51
|
+
it("displays DateOnly in yyyy-MM format for month type", () => {
|
|
52
52
|
const dateOnly = new DateOnly(2025, 3, 15);
|
|
53
53
|
const { container } = render(() => <DatePicker unit="month" value={dateOnly} />);
|
|
54
54
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
55
55
|
expect(input.value).toBe("2025-03");
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
-
it("DateOnly
|
|
58
|
+
it("displays DateOnly in yyyy-MM-dd format for date type", () => {
|
|
59
59
|
const dateOnly = new DateOnly(2025, 3, 15);
|
|
60
60
|
const { container } = render(() => <DatePicker unit="date" value={dateOnly} />);
|
|
61
61
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
62
62
|
expect(input.value).toBe("2025-03-15");
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
it("
|
|
65
|
+
it("passes DateOnly converted from year input to onValueChange", () => {
|
|
66
66
|
const handleChange = vi.fn();
|
|
67
67
|
const { container } = render(() => <DatePicker unit="year" onValueChange={handleChange} />);
|
|
68
68
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
@@ -76,7 +76,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
76
76
|
expect(result.day).toBe(1);
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
it("
|
|
79
|
+
it("passes DateOnly converted from month input to onValueChange", () => {
|
|
80
80
|
const handleChange = vi.fn();
|
|
81
81
|
const { container } = render(() => <DatePicker unit="month" onValueChange={handleChange} />);
|
|
82
82
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
@@ -90,7 +90,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
90
90
|
expect(result.day).toBe(1);
|
|
91
91
|
});
|
|
92
92
|
|
|
93
|
-
it("
|
|
93
|
+
it("passes DateOnly converted from date input to onValueChange", () => {
|
|
94
94
|
const handleChange = vi.fn();
|
|
95
95
|
const { container } = render(() => <DatePicker unit="date" onValueChange={handleChange} />);
|
|
96
96
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
@@ -104,7 +104,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
104
104
|
expect(result.day).toBe(15);
|
|
105
105
|
});
|
|
106
106
|
|
|
107
|
-
it("
|
|
107
|
+
it("passes undefined to onValueChange on empty input", () => {
|
|
108
108
|
const handleChange = vi.fn();
|
|
109
109
|
const dateOnly = new DateOnly(2025, 3, 15);
|
|
110
110
|
const { container } = render(() => (
|
|
@@ -118,43 +118,43 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
118
118
|
});
|
|
119
119
|
});
|
|
120
120
|
|
|
121
|
-
describe("min/max
|
|
122
|
-
it("min
|
|
121
|
+
describe("min/max props", () => {
|
|
122
|
+
it("converts min to string for date type", () => {
|
|
123
123
|
const minDate = new DateOnly(2025, 1, 1);
|
|
124
124
|
const { container } = render(() => <DatePicker unit="date" min={minDate} />);
|
|
125
125
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
126
126
|
expect(input.min).toBe("2025-01-01");
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
-
it("max
|
|
129
|
+
it("converts max to string for date type", () => {
|
|
130
130
|
const maxDate = new DateOnly(2025, 12, 31);
|
|
131
131
|
const { container } = render(() => <DatePicker unit="date" max={maxDate} />);
|
|
132
132
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
133
133
|
expect(input.max).toBe("2025-12-31");
|
|
134
134
|
});
|
|
135
135
|
|
|
136
|
-
it("min
|
|
136
|
+
it("converts min to yyyy-MM format for month type", () => {
|
|
137
137
|
const minDate = new DateOnly(2025, 1, 15);
|
|
138
138
|
const { container } = render(() => <DatePicker unit="month" min={minDate} />);
|
|
139
139
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
140
140
|
expect(input.min).toBe("2025-01");
|
|
141
141
|
});
|
|
142
142
|
|
|
143
|
-
it("max
|
|
143
|
+
it("converts max to yyyy-MM format for month type", () => {
|
|
144
144
|
const maxDate = new DateOnly(2025, 12, 15);
|
|
145
145
|
const { container } = render(() => <DatePicker unit="month" max={maxDate} />);
|
|
146
146
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
147
147
|
expect(input.max).toBe("2025-12");
|
|
148
148
|
});
|
|
149
149
|
|
|
150
|
-
it("min
|
|
150
|
+
it("converts min to number for year type", () => {
|
|
151
151
|
const minDate = new DateOnly(2020, 1, 1);
|
|
152
152
|
const { container } = render(() => <DatePicker unit="year" min={minDate} />);
|
|
153
153
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
154
154
|
expect(input.min).toBe("2020");
|
|
155
155
|
});
|
|
156
156
|
|
|
157
|
-
it("max
|
|
157
|
+
it("converts max to number for year type", () => {
|
|
158
158
|
const maxDate = new DateOnly(2030, 12, 31);
|
|
159
159
|
const { container } = render(() => <DatePicker unit="year" max={maxDate} />);
|
|
160
160
|
const input = container.querySelector("input") as HTMLInputElement;
|
|
@@ -162,8 +162,8 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
162
162
|
});
|
|
163
163
|
});
|
|
164
164
|
|
|
165
|
-
describe("controlled
|
|
166
|
-
it("
|
|
165
|
+
describe("controlled pattern", () => {
|
|
166
|
+
it("updates input value when external state changes", () => {
|
|
167
167
|
const [value, setValue] = createSignal<DateOnly | undefined>(new DateOnly(2025, 1, 1));
|
|
168
168
|
const { container } = render(() => (
|
|
169
169
|
<DatePicker unit="date" value={value()} onValueChange={setValue} />
|
|
@@ -177,8 +177,8 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
177
177
|
});
|
|
178
178
|
});
|
|
179
179
|
|
|
180
|
-
describe("uncontrolled
|
|
181
|
-
it("
|
|
180
|
+
describe("uncontrolled pattern", () => {
|
|
181
|
+
it("manages value internally without onValueChange", () => {
|
|
182
182
|
const { container } = render(() => (
|
|
183
183
|
<DatePicker unit="date" value={new DateOnly(2025, 1, 1)} />
|
|
184
184
|
));
|
|
@@ -192,7 +192,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
192
192
|
});
|
|
193
193
|
|
|
194
194
|
describe("disabled state", () => {
|
|
195
|
-
it("
|
|
195
|
+
it("renders as div when disabled=true", () => {
|
|
196
196
|
const { container } = render(() => <DatePicker disabled value={new DateOnly(2025, 3, 15)} />);
|
|
197
197
|
const input = container.querySelector("input:not([aria-hidden])");
|
|
198
198
|
const div = container.querySelector("div.sd-date-field");
|
|
@@ -201,22 +201,22 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
201
201
|
expect(div).toBeTruthy();
|
|
202
202
|
});
|
|
203
203
|
|
|
204
|
-
it("
|
|
204
|
+
it("displays value when disabled", () => {
|
|
205
205
|
const { getByText } = render(() => (
|
|
206
206
|
<DatePicker unit="date" disabled value={new DateOnly(2025, 3, 15)} />
|
|
207
207
|
));
|
|
208
208
|
expect(getByText("2025-03-15")).toBeTruthy();
|
|
209
209
|
});
|
|
210
210
|
|
|
211
|
-
it("disabled
|
|
211
|
+
it("applies disabled style", () => {
|
|
212
212
|
const { container } = render(() => <DatePicker disabled value={new DateOnly(2025, 3, 15)} />);
|
|
213
213
|
const div = container.querySelector("div.sd-date-field") as HTMLElement;
|
|
214
214
|
expect(div.classList.contains("bg-base-100")).toBe(true);
|
|
215
215
|
});
|
|
216
216
|
});
|
|
217
217
|
|
|
218
|
-
describe("readonly
|
|
219
|
-
it("
|
|
218
|
+
describe("readonly state", () => {
|
|
219
|
+
it("renders as div when readonly=true", () => {
|
|
220
220
|
const { container } = render(() => <DatePicker readonly value={new DateOnly(2025, 3, 15)} />);
|
|
221
221
|
const input = container.querySelector("input:not([aria-hidden])");
|
|
222
222
|
const div = container.querySelector("div.sd-date-field");
|
|
@@ -225,7 +225,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
225
225
|
expect(div).toBeTruthy();
|
|
226
226
|
});
|
|
227
227
|
|
|
228
|
-
it("
|
|
228
|
+
it("displays value when readonly", () => {
|
|
229
229
|
const { getByText } = render(() => (
|
|
230
230
|
<DatePicker unit="date" readonly value={new DateOnly(2025, 3, 15)} />
|
|
231
231
|
));
|
|
@@ -233,22 +233,22 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
233
233
|
});
|
|
234
234
|
});
|
|
235
235
|
|
|
236
|
-
describe("size
|
|
237
|
-
it("
|
|
236
|
+
describe("size option", () => {
|
|
237
|
+
it("applies small padding when size=sm", () => {
|
|
238
238
|
const { container } = render(() => <DatePicker size="sm" />);
|
|
239
239
|
const wrapper = container.firstChild as HTMLElement;
|
|
240
240
|
expect(wrapper.classList.contains("py-0.5")).toBe(true);
|
|
241
241
|
});
|
|
242
242
|
|
|
243
|
-
it("
|
|
243
|
+
it("applies large padding when size=lg", () => {
|
|
244
244
|
const { container } = render(() => <DatePicker size="lg" />);
|
|
245
245
|
const wrapper = container.firstChild as HTMLElement;
|
|
246
246
|
expect(wrapper.classList.contains("py-2")).toBe(true);
|
|
247
247
|
});
|
|
248
248
|
});
|
|
249
249
|
|
|
250
|
-
describe("inset
|
|
251
|
-
it("
|
|
250
|
+
describe("inset style", () => {
|
|
251
|
+
it("applies relative to outer and inset style to content when inset=true", () => {
|
|
252
252
|
const { container } = render(() => <DatePicker inset />);
|
|
253
253
|
const outer = container.firstChild as HTMLElement;
|
|
254
254
|
expect(outer.classList.contains("relative")).toBe(true);
|
|
@@ -259,7 +259,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
259
259
|
expect(contentDiv.classList.contains("bg-primary-50")).toBe(true);
|
|
260
260
|
});
|
|
261
261
|
|
|
262
|
-
it("
|
|
262
|
+
it("shows content div and no input when inset + readonly", () => {
|
|
263
263
|
const { container } = render(() => (
|
|
264
264
|
<DatePicker inset readonly value={new DateOnly(2025, 3, 15)} />
|
|
265
265
|
));
|
|
@@ -273,7 +273,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
273
273
|
expect(outer.querySelector("input:not([aria-hidden])")).toBeFalsy();
|
|
274
274
|
});
|
|
275
275
|
|
|
276
|
-
it("
|
|
276
|
+
it("shows hidden content div and input when inset + editable", () => {
|
|
277
277
|
const { container } = render(() => <DatePicker inset value={new DateOnly(2025, 3, 15)} />);
|
|
278
278
|
const outer = container.firstChild as HTMLElement;
|
|
279
279
|
|
|
@@ -286,7 +286,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
286
286
|
expect(input.value).toBe("2025-03-15");
|
|
287
287
|
});
|
|
288
288
|
|
|
289
|
-
it("
|
|
289
|
+
it("shows NBSP in content div when inset + empty value", () => {
|
|
290
290
|
const { container } = render(() => <DatePicker inset readonly />);
|
|
291
291
|
const outer = container.firstChild as HTMLElement;
|
|
292
292
|
const contentDiv = outer.querySelector("[data-date-field-content]") as HTMLElement;
|
|
@@ -294,14 +294,14 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
294
294
|
});
|
|
295
295
|
});
|
|
296
296
|
|
|
297
|
-
describe("
|
|
298
|
-
it("
|
|
297
|
+
describe("dark mode style", () => {
|
|
298
|
+
it("applies dark mode border style", () => {
|
|
299
299
|
const { container } = render(() => <DatePicker />);
|
|
300
300
|
const wrapper = container.firstChild as HTMLElement;
|
|
301
301
|
expect(wrapper.classList.contains("dark:border-base-700")).toBe(true);
|
|
302
302
|
});
|
|
303
303
|
|
|
304
|
-
it("
|
|
304
|
+
it("applies dark mode background style", () => {
|
|
305
305
|
const { container } = render(() => <DatePicker />);
|
|
306
306
|
const wrapper = container.firstChild as HTMLElement;
|
|
307
307
|
expect(wrapper.classList.contains("dark:bg-primary-950/30")).toBe(true);
|
|
@@ -309,7 +309,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
309
309
|
});
|
|
310
310
|
|
|
311
311
|
describe("class merging", () => {
|
|
312
|
-
it("
|
|
312
|
+
it("merges custom class with existing styles", () => {
|
|
313
313
|
// eslint-disable-next-line tailwindcss/no-custom-classname
|
|
314
314
|
const { container } = render(() => <DatePicker class="my-custom-class" />);
|
|
315
315
|
const wrapper = container.firstChild as HTMLElement;
|
|
@@ -324,13 +324,13 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
324
324
|
expect(hiddenInput.validationMessage).toBe("This field is required");
|
|
325
325
|
});
|
|
326
326
|
|
|
327
|
-
it("required
|
|
327
|
+
it("is valid when required and value exists", () => {
|
|
328
328
|
const { container } = render(() => <DatePicker required value={new DateOnly(2024, 1, 1)} />);
|
|
329
329
|
const hiddenInput = container.querySelector("input[aria-hidden='true']") as HTMLInputElement;
|
|
330
330
|
expect(hiddenInput.validity.valid).toBe(true);
|
|
331
331
|
});
|
|
332
332
|
|
|
333
|
-
it("
|
|
333
|
+
it("sets error message when min is violated", () => {
|
|
334
334
|
const { container } = render(() => (
|
|
335
335
|
<DatePicker min={new DateOnly(2024, 6, 1)} value={new DateOnly(2024, 1, 1)} />
|
|
336
336
|
));
|
|
@@ -338,7 +338,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
338
338
|
expect(hiddenInput.validationMessage).not.toBe("");
|
|
339
339
|
});
|
|
340
340
|
|
|
341
|
-
it("min
|
|
341
|
+
it("is valid when min is satisfied", () => {
|
|
342
342
|
const { container } = render(() => (
|
|
343
343
|
<DatePicker min={new DateOnly(2024, 1, 1)} value={new DateOnly(2024, 6, 1)} />
|
|
344
344
|
));
|
|
@@ -346,7 +346,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
346
346
|
expect(hiddenInput.validity.valid).toBe(true);
|
|
347
347
|
});
|
|
348
348
|
|
|
349
|
-
it("
|
|
349
|
+
it("sets error message when max is violated", () => {
|
|
350
350
|
const { container } = render(() => (
|
|
351
351
|
<DatePicker max={new DateOnly(2024, 6, 1)} value={new DateOnly(2024, 12, 1)} />
|
|
352
352
|
));
|
|
@@ -354,7 +354,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
354
354
|
expect(hiddenInput.validationMessage).not.toBe("");
|
|
355
355
|
});
|
|
356
356
|
|
|
357
|
-
it("max
|
|
357
|
+
it("is valid when max is satisfied", () => {
|
|
358
358
|
const { container } = render(() => (
|
|
359
359
|
<DatePicker max={new DateOnly(2024, 12, 31)} value={new DateOnly(2024, 6, 1)} />
|
|
360
360
|
));
|
|
@@ -362,7 +362,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
362
362
|
expect(hiddenInput.validity.valid).toBe(true);
|
|
363
363
|
});
|
|
364
364
|
|
|
365
|
-
it("
|
|
365
|
+
it("sets error message returned by validate function", () => {
|
|
366
366
|
const { container } = render(() => (
|
|
367
367
|
<DatePicker value={new DateOnly(2024, 1, 1)} validate={() => "커스텀 에러"} />
|
|
368
368
|
));
|
|
@@ -370,7 +370,7 @@ describe("DatePicker 컴포넌트", () => {
|
|
|
370
370
|
expect(hiddenInput.validationMessage).toBe("커스텀 에러");
|
|
371
371
|
});
|
|
372
372
|
|
|
373
|
-
it("validate
|
|
373
|
+
it("is valid when validate function returns undefined", () => {
|
|
374
374
|
const { container } = render(() => (
|
|
375
375
|
<DatePicker value={new DateOnly(2024, 1, 1)} validate={() => undefined} />
|
|
376
376
|
));
|