@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.
Files changed (98) hide show
  1. package/README.md +1 -1
  2. package/dist/components/disclosure/Dropdown.d.ts +6 -4
  3. package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
  4. package/dist/components/disclosure/Dropdown.js +24 -8
  5. package/dist/components/disclosure/Dropdown.js.map +2 -2
  6. package/dist/components/disclosure/dialogZIndex.d.ts +2 -0
  7. package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
  8. package/dist/components/disclosure/dialogZIndex.js +4 -0
  9. package/dist/components/disclosure/dialogZIndex.js.map +1 -1
  10. package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
  11. package/dist/components/features/crud-detail/CrudDetail.js +16 -7
  12. package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
  13. package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
  14. package/dist/components/features/crud-sheet/CrudSheet.js +14 -5
  15. package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
  16. package/dist/components/features/crudRegistry.d.ts +16 -0
  17. package/dist/components/features/crudRegistry.d.ts.map +1 -0
  18. package/dist/components/features/crudRegistry.js +37 -0
  19. package/dist/components/features/crudRegistry.js.map +6 -0
  20. package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
  21. package/dist/components/features/permission-table/PermissionTable.js +71 -86
  22. package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
  23. package/dist/components/features/shared-data/SharedDataSelect.js +2 -4
  24. package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
  25. package/dist/components/features/shared-data/SharedDataSelectList.d.ts +2 -4
  26. package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
  27. package/dist/components/features/shared-data/SharedDataSelectList.js +11 -46
  28. package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
  29. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  30. package/dist/components/form-control/select/Select.js +1 -1
  31. package/dist/components/form-control/select/Select.js.map +1 -1
  32. package/dist/helpers/createAppStructure.d.ts.map +1 -1
  33. package/dist/helpers/createAppStructure.js +3 -2
  34. package/dist/helpers/createAppStructure.js.map +1 -1
  35. package/dist/helpers/createHmrSafeContext.d.ts +3 -0
  36. package/dist/helpers/createHmrSafeContext.d.ts.map +1 -0
  37. package/dist/helpers/createHmrSafeContext.js +10 -0
  38. package/dist/helpers/createHmrSafeContext.js.map +6 -0
  39. package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
  40. package/dist/hooks/createSelectionGroup.js +3 -2
  41. package/dist/hooks/createSelectionGroup.js.map +2 -2
  42. package/package.json +6 -5
  43. package/src/components/disclosure/Dropdown.tsx +31 -17
  44. package/src/components/disclosure/dialogZIndex.ts +5 -0
  45. package/src/components/features/crud-detail/CrudDetail.tsx +16 -5
  46. package/src/components/features/crud-sheet/CrudSheet.tsx +13 -3
  47. package/src/components/features/crudRegistry.ts +60 -0
  48. package/src/components/features/permission-table/PermissionTable.tsx +49 -46
  49. package/src/components/features/shared-data/SharedDataSelect.tsx +2 -2
  50. package/src/components/features/shared-data/SharedDataSelectList.tsx +11 -36
  51. package/src/components/form-control/select/Select.tsx +1 -5
  52. package/src/helpers/createAppStructure.ts +3 -2
  53. package/src/helpers/createHmrSafeContext.ts +8 -0
  54. package/src/hooks/createSelectionGroup.tsx +4 -2
  55. package/tests/components/data/List.spec.tsx +52 -52
  56. package/tests/components/data/Pagination.spec.tsx +43 -43
  57. package/tests/components/data/Table.spec.tsx +4 -4
  58. package/tests/components/data/kanban/Kanban.selection.spec.tsx +21 -21
  59. package/tests/components/data/sheet/DataSheet.spec.tsx +50 -50
  60. package/tests/components/disclosure/Collapse.spec.tsx +24 -24
  61. package/tests/components/disclosure/Dialog.spec.tsx +33 -33
  62. package/tests/components/disclosure/DialogProvider.spec.tsx +9 -9
  63. package/tests/components/disclosure/Dropdown.spec.tsx +134 -14
  64. package/tests/components/disclosure/Tabs.spec.tsx +21 -21
  65. package/tests/components/disclosure/dialogZIndex.spec.ts +45 -0
  66. package/tests/components/display/Alert.spec.tsx +4 -4
  67. package/tests/components/display/Barcode.spec.tsx +7 -7
  68. package/tests/components/display/Card.spec.tsx +3 -3
  69. package/tests/components/display/Link.spec.tsx +5 -5
  70. package/tests/components/display/Tag.spec.tsx +4 -4
  71. package/tests/components/features/address/AddressSearch.spec.tsx +3 -3
  72. package/tests/components/features/crudRegistry.spec.ts +119 -0
  73. package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +8 -8
  74. package/tests/components/features/permission-table/PermissionTable.spec.tsx +43 -43
  75. package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +2 -17
  76. package/tests/components/feedback/busy/BusyContainer.spec.tsx +7 -7
  77. package/tests/components/feedback/notification/NotificationBell.spec.tsx +9 -9
  78. package/tests/components/feedback/print/Print.spec.tsx +4 -4
  79. package/tests/components/form-control/Button.spec.tsx +18 -18
  80. package/tests/components/form-control/checkbox/Checkbox.spec.tsx +20 -20
  81. package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +12 -12
  82. package/tests/components/form-control/checkbox/Radio.spec.tsx +21 -21
  83. package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +12 -12
  84. package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +10 -10
  85. package/tests/components/form-control/combobox/Combobox.spec.tsx +16 -16
  86. package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +7 -7
  87. package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +24 -24
  88. package/tests/components/form-control/field/DatePicker.spec.tsx +50 -50
  89. package/tests/components/form-control/field/DateTimePicker.spec.tsx +47 -47
  90. package/tests/components/form-control/field/NumberInput.spec.tsx +54 -54
  91. package/tests/components/form-control/field/TextInput.spec.tsx +49 -49
  92. package/tests/components/form-control/field/Textarea.spec.tsx +33 -33
  93. package/tests/components/form-control/field/TimePicker.spec.tsx +42 -42
  94. package/tests/components/form-control/numpad/Numpad.spec.tsx +40 -40
  95. package/tests/components/form-control/select/Select.spec.tsx +9 -9
  96. package/tests/components/form-control/select/SelectItem.spec.tsx +10 -10
  97. package/tests/helpers/createAppStructure.spec.tsx +57 -57
  98. 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("unit=year일 input type=number 렌더링된다", () => {
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("unit=month input unit=month가 렌더링된다", () => {
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("unit=date input unit=date가 렌더링된다", () => {
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 기본값은 one-time-code이다", () => {
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("기본 unit date이다", () => {
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 값이 year 타입에서 yyyy 형식으로 표시된다", () => {
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 값이 month 타입에서 yyyy-MM 형식으로 표시된다", () => {
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 값이 date 타입에서 yyyy-MM-dd 형식으로 표시된다", () => {
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("year 타입 입력 DateOnly로 변환되어 onValueChange로 전달된다", () => {
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("month 타입 입력 DateOnly로 변환되어 onValueChange로 전달된다", () => {
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("date 타입 입력 DateOnly로 변환되어 onValueChange로 전달된다", () => {
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(" 입력 undefined가 onValueChange로 전달된다", () => {
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 속성이 date 타입에서 문자열로 변환된다", () => {
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 속성이 date 타입에서 문자열로 변환된다", () => {
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 속성이 month 타입에서 yyyy-MM 형식으로 변환된다", () => {
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 속성이 month 타입에서 yyyy-MM 형식으로 변환된다", () => {
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 속성이 year 타입에서 숫자로 변환된다", () => {
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 속성이 year 타입에서 숫자로 변환된다", () => {
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("외부 상태 변경 input 값이 업데이트된다", () => {
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("onValueChange 없이 내부 상태로 값이 관리된다", () => {
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("disabled=true일 div 렌더링된다", () => {
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("disabled 상태에서 value 표시된다", () => {
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("readonly=true일 div 렌더링된다", () => {
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("readonly 상태에서 value 표시된다", () => {
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("size=sm일 작은 padding 적용된다", () => {
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("size=lg일 padding 적용된다", () => {
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("inset=true일 outer div에는 relative만, content div에 inset 스타일이 적용된다", () => {
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("inset + readonly일 때 content div 보이고 input 없다", () => {
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("inset + editable일 때 content div(hidden)와 input 모두 존재한다", () => {
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("inset + 값일 때 content div NBSP가 표시된다", () => {
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("다크 모드 border 스타일이 적용된다", () => {
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("다크 모드 background 스타일이 적용된다", () => {
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("사용자 정의 class 기존 스타일과 병합된다", () => {
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("min 위반 에러 메시지가 설정된다", () => {
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("max 위반 에러 메시지가 설정된다", () => {
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("validate 함수가 에러를 반환하면 에러 메시지가 설정된다", () => {
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 함수가 undefined를 반환하면 유효하다", () => {
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
  ));