@moontra/moonui 5.0.0 → 5.1.0
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/dist/hooks/index.d.mts +15 -0
- package/dist/hooks/index.d.ts +15 -0
- package/dist/hooks/index.global.js +38 -0
- package/dist/hooks/index.global.js.map +1 -0
- package/dist/hooks/index.js +128 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +106 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.global.js +9 -9
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +17 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -11
- package/dist/index.mjs.map +1 -1
- package/dist/lib/theme.global.js.map +1 -1
- package/package.json +8 -3
- package/src/__tests__/hooks-exports-contract.test.ts +22 -0
- package/src/__tests__/use-intersection-observer.test.tsx +18 -4
- package/src/__tests__/use-local-storage.test.tsx +34 -20
- package/src/components/ui/__tests__/avatar.test.tsx +5 -7
- package/src/components/ui/__tests__/badge.test.tsx +19 -12
- package/src/components/ui/__tests__/breadcrumb.test.tsx +4 -7
- package/src/components/ui/__tests__/button.test.tsx +6 -3
- package/src/components/ui/__tests__/card.test.tsx +4 -1
- package/src/components/ui/__tests__/checkbox.test.tsx +4 -1
- package/src/components/ui/__tests__/command.test.tsx +268 -124
- package/src/components/ui/__tests__/data-table-basic.test.tsx +271 -0
- package/src/components/ui/__tests__/date-picker.test.tsx +184 -197
- package/src/components/ui/__tests__/progress.test.tsx +0 -1
- package/src/components/ui/__tests__/table.test.tsx +8 -2
- package/src/components/ui/__tests__/tabs.test.tsx +5 -3
- package/src/components/ui/__tests__/toast.test.tsx +461 -159
- package/src/components/ui/__tests__/tooltip.test.tsx +387 -264
- package/src/components/ui/command.tsx +11 -7
- package/src/components/ui/date-picker.tsx +12 -6
- package/src/components/ui/toast.tsx +3 -0
- package/src/hooks/index.ts +24 -0
- package/src/use-intersection-observer.tsx +10 -1
- package/src/use-local-storage.tsx +35 -1
- package/src/components/ui/__tests__/data-table.test.tsx +0 -256
- package/src/components/ui/data-table.stories.tsx +0 -511
|
@@ -1,320 +1,307 @@
|
|
|
1
1
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
2
3
|
import { DatePicker, DateRangePicker, DateTimePicker, MonthPicker } from '../date-picker';
|
|
3
4
|
import '@testing-library/jest-dom';
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* NOT (#283): Bu suite eskiden UYDURMA bir API'ye göre yazılmıştı —
|
|
8
|
+
* `date`/`onDateChange`, `dateRange`/`onDateRangeChange`, `month`/`onMonthChange`.
|
|
9
|
+
* Gerçek yüzey dört bileşende de `value`/`onChange`. Testlerin ÖLÇTÜĞÜ davranış
|
|
10
|
+
* korundu, yalnız çağrı biçimi kaynağa hizalandı.
|
|
11
|
+
*
|
|
12
|
+
* Tarihler `new Date(2024, 0, 15)` ile kuruluyor: `new Date('2024-01-15')` UTC
|
|
13
|
+
* gece yarısı demektir ve negatif ofsetli saat diliminde yerelde 14 Ocak'a
|
|
14
|
+
* düşüp testi saat dilimine bağımlı kılar.
|
|
15
|
+
*/
|
|
16
|
+
const JAN_15 = new Date(2024, 0, 15);
|
|
17
|
+
const JAN_20 = new Date(2024, 0, 20);
|
|
18
|
+
const SHORT_FORMAT = 'MMM d, yyyy';
|
|
19
|
+
|
|
5
20
|
describe('DatePicker Components', () => {
|
|
6
21
|
describe('DatePicker', () => {
|
|
7
22
|
it('renders correctly with default props', () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
23
|
+
render(<DatePicker onChange={jest.fn()} />);
|
|
24
|
+
|
|
11
25
|
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
12
26
|
expect(screen.getByText('Pick a date')).toBeInTheDocument();
|
|
13
27
|
});
|
|
14
28
|
|
|
15
29
|
it('displays selected date', () => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
30
|
+
render(
|
|
31
|
+
<DatePicker value={JAN_15} onChange={jest.fn()} formatString={SHORT_FORMAT} />
|
|
32
|
+
);
|
|
33
|
+
|
|
21
34
|
expect(screen.getByText('Jan 15, 2024')).toBeInTheDocument();
|
|
22
35
|
});
|
|
23
36
|
|
|
24
37
|
it('opens calendar when button is clicked', async () => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
await waitFor(() => {
|
|
32
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
33
|
-
});
|
|
38
|
+
render(<DatePicker onChange={jest.fn()} />);
|
|
39
|
+
|
|
40
|
+
fireEvent.click(screen.getByRole('button'));
|
|
41
|
+
|
|
42
|
+
expect(await screen.findByRole('dialog')).toBeInTheDocument();
|
|
34
43
|
});
|
|
35
44
|
|
|
36
|
-
it('calls
|
|
45
|
+
it('calls onChange when date is selected', async () => {
|
|
37
46
|
const mockOnChange = jest.fn();
|
|
38
|
-
render(<DatePicker
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
});
|
|
47
|
+
render(<DatePicker onChange={mockOnChange} />);
|
|
48
|
+
|
|
49
|
+
fireEvent.click(screen.getByRole('button'));
|
|
50
|
+
await screen.findByRole('dialog');
|
|
51
|
+
|
|
52
|
+
// Takvimdeki 15'i seç (dışarıdaki komşu ay günleri de "15" yazabilir)
|
|
53
|
+
fireEvent.click(screen.getAllByText('15')[0]);
|
|
54
|
+
|
|
55
|
+
await waitFor(() => expect(mockOnChange).toHaveBeenCalled());
|
|
48
56
|
});
|
|
49
57
|
|
|
50
58
|
it('handles disabled state', () => {
|
|
59
|
+
render(<DatePicker onChange={jest.fn()} disabled />);
|
|
60
|
+
|
|
61
|
+
expect(screen.getByRole('button')).toBeDisabled();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('clears the value with the clear affordance', async () => {
|
|
51
65
|
const mockOnChange = jest.fn();
|
|
52
|
-
render(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
66
|
+
render(
|
|
67
|
+
<DatePicker value={JAN_15} onChange={mockOnChange} formatString={SHORT_FORMAT} />
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// allowClear varsayılan olarak açık → değer varken temizle düğmesi çıkar
|
|
71
|
+
const buttons = screen.getAllByRole('button');
|
|
72
|
+
expect(buttons).toHaveLength(2);
|
|
73
|
+
|
|
74
|
+
fireEvent.click(buttons[1]);
|
|
75
|
+
|
|
76
|
+
await waitFor(() => expect(mockOnChange).toHaveBeenCalledWith(undefined));
|
|
56
77
|
});
|
|
57
78
|
});
|
|
58
79
|
|
|
59
80
|
describe('DateRangePicker', () => {
|
|
60
81
|
it('renders correctly with default props', () => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
82
|
+
render(<DateRangePicker onChange={jest.fn()} />);
|
|
83
|
+
|
|
64
84
|
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
65
85
|
expect(screen.getByText('Pick a date range')).toBeInTheDocument();
|
|
66
86
|
});
|
|
67
87
|
|
|
68
88
|
it('displays selected date range', () => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
render(<DateRangePicker dateRange={dateRange} onDateRangeChange={mockOnChange} />);
|
|
76
|
-
|
|
89
|
+
render(
|
|
90
|
+
<DateRangePicker value={{ from: JAN_15, to: JAN_20 }} onChange={jest.fn()} />
|
|
91
|
+
);
|
|
92
|
+
|
|
77
93
|
expect(screen.getByText('Jan 15, 2024 - Jan 20, 2024')).toBeInTheDocument();
|
|
78
94
|
});
|
|
79
95
|
|
|
80
96
|
it('displays partial date range', () => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
render(<DateRangePicker dateRange={dateRange} onDateRangeChange={mockOnChange} />);
|
|
88
|
-
|
|
97
|
+
render(
|
|
98
|
+
<DateRangePicker value={{ from: JAN_15, to: undefined }} onChange={jest.fn()} />
|
|
99
|
+
);
|
|
100
|
+
|
|
89
101
|
expect(screen.getByText('Jan 15, 2024')).toBeInTheDocument();
|
|
90
102
|
});
|
|
91
103
|
|
|
92
104
|
it('opens calendar when button is clicked', async () => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
await waitFor(() => {
|
|
100
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
101
|
-
});
|
|
105
|
+
render(<DateRangePicker onChange={jest.fn()} />);
|
|
106
|
+
|
|
107
|
+
fireEvent.click(screen.getByRole('button'));
|
|
108
|
+
|
|
109
|
+
expect(await screen.findByRole('dialog')).toBeInTheDocument();
|
|
102
110
|
});
|
|
103
111
|
});
|
|
104
112
|
|
|
105
113
|
describe('DateTimePicker', () => {
|
|
114
|
+
/**
|
|
115
|
+
* DateTimePicker tek bir buton DEĞİL: bir DatePicker (tarih butonu) +
|
|
116
|
+
* tarih seçiliyken beliren ayrı bir saat <select>'i render eder.
|
|
117
|
+
*/
|
|
106
118
|
it('renders correctly with default props', () => {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
119
|
+
render(<DateTimePicker onChange={jest.fn()} />);
|
|
120
|
+
|
|
110
121
|
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
111
|
-
expect(screen.getByText('Pick a date
|
|
122
|
+
expect(screen.getByText('Pick a date')).toBeInTheDocument();
|
|
123
|
+
// Tarih yokken saat seçici gizli
|
|
124
|
+
expect(screen.queryByRole('combobox')).not.toBeInTheDocument();
|
|
112
125
|
});
|
|
113
126
|
|
|
114
127
|
it('displays selected date and time', () => {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
render(
|
|
129
|
+
<DateTimePicker
|
|
130
|
+
value={new Date(2024, 0, 15, 14, 30)}
|
|
131
|
+
onChange={jest.fn()}
|
|
132
|
+
formatString={SHORT_FORMAT}
|
|
133
|
+
/>
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
expect(screen.getByText('Jan 15, 2024')).toBeInTheDocument();
|
|
137
|
+
expect(screen.getByRole('combobox')).toHaveValue('14:30');
|
|
121
138
|
});
|
|
122
139
|
|
|
123
|
-
it('opens calendar and time selector when
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
await waitFor(() => {
|
|
131
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
132
|
-
expect(screen.getByText('Time')).toBeInTheDocument();
|
|
133
|
-
});
|
|
140
|
+
it('opens calendar and shows the time selector when a date is set', async () => {
|
|
141
|
+
render(<DateTimePicker value={new Date(2024, 0, 15, 14, 30)} onChange={jest.fn()} />);
|
|
142
|
+
|
|
143
|
+
fireEvent.click(screen.getAllByRole('button')[0]);
|
|
144
|
+
|
|
145
|
+
expect(await screen.findByRole('dialog')).toBeInTheDocument();
|
|
146
|
+
expect(screen.getByRole('combobox')).toBeInTheDocument();
|
|
134
147
|
});
|
|
135
148
|
|
|
136
149
|
it('handles time selection', async () => {
|
|
137
150
|
const mockOnChange = jest.fn();
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
expect(mockOnChange).toHaveBeenCalled();
|
|
149
|
-
});
|
|
151
|
+
render(
|
|
152
|
+
<DateTimePicker value={new Date(2024, 0, 15, 14, 30)} onChange={mockOnChange} />
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
fireEvent.change(screen.getByRole('combobox'), { target: { value: '15:00' } });
|
|
156
|
+
|
|
157
|
+
await waitFor(() => expect(mockOnChange).toHaveBeenCalled());
|
|
158
|
+
const emitted = mockOnChange.mock.calls[0][0] as Date;
|
|
159
|
+
expect(emitted.getHours()).toBe(15);
|
|
160
|
+
expect(emitted.getMinutes()).toBe(0);
|
|
150
161
|
});
|
|
151
162
|
});
|
|
152
163
|
|
|
153
164
|
describe('MonthPicker', () => {
|
|
154
165
|
it('renders correctly with default props', () => {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
166
|
+
render(<MonthPicker onChange={jest.fn()} />);
|
|
167
|
+
|
|
158
168
|
expect(screen.getByRole('button')).toBeInTheDocument();
|
|
159
169
|
expect(screen.getByText('Pick a month')).toBeInTheDocument();
|
|
160
170
|
});
|
|
161
171
|
|
|
162
172
|
it('displays selected month', () => {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
render(<MonthPicker month={testDate} onMonthChange={mockOnChange} />);
|
|
167
|
-
|
|
173
|
+
render(<MonthPicker value={JAN_15} onChange={jest.fn()} />);
|
|
174
|
+
|
|
168
175
|
expect(screen.getByText('January 2024')).toBeInTheDocument();
|
|
169
176
|
});
|
|
170
177
|
|
|
171
178
|
it('opens month selector when button is clicked', async () => {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
await waitFor(() => {
|
|
179
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
180
|
-
});
|
|
179
|
+
render(<MonthPicker onChange={jest.fn()} />);
|
|
180
|
+
|
|
181
|
+
fireEvent.click(screen.getByRole('button'));
|
|
182
|
+
|
|
183
|
+
expect(await screen.findByRole('dialog')).toBeInTheDocument();
|
|
181
184
|
});
|
|
182
185
|
|
|
183
|
-
it('calls
|
|
186
|
+
it('calls onChange when month is selected', async () => {
|
|
184
187
|
const mockOnChange = jest.fn();
|
|
185
|
-
render(<MonthPicker
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
});
|
|
188
|
+
render(<MonthPicker onChange={mockOnChange} />);
|
|
189
|
+
|
|
190
|
+
fireEvent.click(screen.getByRole('button'));
|
|
191
|
+
await screen.findByRole('dialog');
|
|
192
|
+
|
|
193
|
+
// Izgaradaki ay düğmeleri kısa ad yazar (`month.slice(0, 3)`)
|
|
194
|
+
fireEvent.click(screen.getByText('Jan'));
|
|
195
|
+
|
|
196
|
+
await waitFor(() => expect(mockOnChange).toHaveBeenCalled());
|
|
195
197
|
});
|
|
196
198
|
});
|
|
197
199
|
|
|
198
200
|
describe('Common functionality', () => {
|
|
199
|
-
it('
|
|
200
|
-
const
|
|
201
|
-
render(<DatePicker
|
|
202
|
-
|
|
201
|
+
it('opens with the keyboard', async () => {
|
|
202
|
+
const user = userEvent.setup();
|
|
203
|
+
render(<DatePicker onChange={jest.fn()} />);
|
|
204
|
+
|
|
203
205
|
const button = screen.getByRole('button');
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
});
|
|
206
|
+
button.focus();
|
|
207
|
+
await user.keyboard('{Enter}');
|
|
208
|
+
|
|
209
|
+
expect(await screen.findByRole('dialog')).toBeInTheDocument();
|
|
209
210
|
});
|
|
210
211
|
|
|
211
212
|
it('closes calendar when clicking outside', async () => {
|
|
212
|
-
const
|
|
213
|
-
render(<DatePicker
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
|
|
226
|
-
});
|
|
213
|
+
const user = userEvent.setup();
|
|
214
|
+
render(<DatePicker onChange={jest.fn()} />);
|
|
215
|
+
|
|
216
|
+
fireEvent.click(screen.getByRole('button'));
|
|
217
|
+
await screen.findByRole('dialog');
|
|
218
|
+
|
|
219
|
+
// Radix DismissableLayer pointerdown dinler; user-event tam olay
|
|
220
|
+
// zincirini (pointerdown dahil) üretir, salt click yetmez.
|
|
221
|
+
await user.click(document.body);
|
|
222
|
+
|
|
223
|
+
await waitFor(() =>
|
|
224
|
+
expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
|
|
225
|
+
);
|
|
227
226
|
});
|
|
228
227
|
|
|
229
228
|
it('handles ESC key to close calendar', async () => {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
await waitFor(() => {
|
|
237
|
-
expect(screen.getByRole('dialog')).toBeInTheDocument();
|
|
238
|
-
});
|
|
239
|
-
|
|
229
|
+
render(<DatePicker onChange={jest.fn()} />);
|
|
230
|
+
|
|
231
|
+
fireEvent.click(screen.getByRole('button'));
|
|
232
|
+
await screen.findByRole('dialog');
|
|
233
|
+
|
|
240
234
|
fireEvent.keyDown(document, { key: 'Escape' });
|
|
241
|
-
|
|
242
|
-
await waitFor(() =>
|
|
243
|
-
expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
|
|
244
|
-
|
|
235
|
+
|
|
236
|
+
await waitFor(() =>
|
|
237
|
+
expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
|
|
238
|
+
);
|
|
245
239
|
});
|
|
246
240
|
|
|
247
241
|
it('applies custom className', () => {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const button = screen.getByRole('button');
|
|
252
|
-
expect(button).toHaveClass('custom-class');
|
|
242
|
+
render(<DatePicker onChange={jest.fn()} className="custom-class" />);
|
|
243
|
+
|
|
244
|
+
expect(screen.getByRole('button')).toHaveClass('custom-class');
|
|
253
245
|
});
|
|
254
246
|
});
|
|
255
247
|
|
|
256
248
|
describe('Accessibility', () => {
|
|
257
249
|
it('has proper ARIA attributes', () => {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
250
|
+
render(<DatePicker onChange={jest.fn()} />);
|
|
251
|
+
|
|
261
252
|
const button = screen.getByRole('button');
|
|
262
253
|
expect(button).toHaveAttribute('aria-haspopup', 'dialog');
|
|
263
254
|
expect(button).toHaveAttribute('aria-expanded', 'false');
|
|
264
255
|
});
|
|
265
256
|
|
|
266
257
|
it('updates aria-expanded when calendar is open', async () => {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
258
|
+
render(<DatePicker onChange={jest.fn()} />);
|
|
259
|
+
|
|
270
260
|
const button = screen.getByRole('button');
|
|
271
261
|
fireEvent.click(button);
|
|
272
|
-
|
|
273
|
-
await waitFor(() =>
|
|
274
|
-
expect(button).toHaveAttribute('aria-expanded', 'true');
|
|
275
|
-
});
|
|
262
|
+
|
|
263
|
+
await waitFor(() => expect(button).toHaveAttribute('aria-expanded', 'true'));
|
|
276
264
|
});
|
|
277
265
|
|
|
278
|
-
it('
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
266
|
+
it('exposes the visible value as the accessible name', () => {
|
|
267
|
+
// Eski test `aria-label="Open date picker"` bekliyordu; böyle bir label
|
|
268
|
+
// YOK ve olmamalı da — görünür metni ezen bir aria-label "label in name"
|
|
269
|
+
// kuralını ihlal eder. Doğru gereksinim: erişilebilir ad görünen değerdir.
|
|
270
|
+
// Ayrı render'lar: rerender'da AnimatePresence çıkış düğümü bir an için
|
|
271
|
+
// eski metni de DOM'da tuttuğu için ad geçici olarak birleşik görünür.
|
|
272
|
+
const { unmount } = render(<DatePicker onChange={jest.fn()} />);
|
|
273
|
+
expect(screen.getByRole('button', { name: 'Pick a date' })).toBeInTheDocument();
|
|
274
|
+
unmount();
|
|
275
|
+
|
|
276
|
+
render(
|
|
277
|
+
<DatePicker value={JAN_15} onChange={jest.fn()} formatString={SHORT_FORMAT} allowClear={false} />
|
|
278
|
+
);
|
|
279
|
+
expect(screen.getByRole('button', { name: 'Jan 15, 2024' })).toBeInTheDocument();
|
|
284
280
|
});
|
|
285
281
|
});
|
|
286
282
|
|
|
287
283
|
describe('Form integration', () => {
|
|
288
284
|
it('works with form validation', () => {
|
|
289
|
-
const mockOnChange = jest.fn();
|
|
290
|
-
const testDate = new Date('2024-01-15');
|
|
291
|
-
|
|
292
285
|
render(
|
|
293
286
|
<form>
|
|
294
|
-
<DatePicker
|
|
287
|
+
<DatePicker value={JAN_15} onChange={jest.fn()} allowClear={false} required />
|
|
295
288
|
</form>
|
|
296
289
|
);
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
expect(button).toBeValid();
|
|
290
|
+
|
|
291
|
+
expect(screen.getByRole('button')).toBeValid();
|
|
300
292
|
});
|
|
301
293
|
|
|
302
294
|
it('handles form reset', () => {
|
|
303
|
-
const mockOnChange = jest.fn();
|
|
304
|
-
const testDate = new Date('2024-01-15');
|
|
305
|
-
|
|
306
295
|
render(
|
|
307
296
|
<form>
|
|
308
|
-
<DatePicker
|
|
297
|
+
<DatePicker value={JAN_15} onChange={jest.fn()} allowClear={false} />
|
|
309
298
|
<button type="reset">Reset</button>
|
|
310
299
|
</form>
|
|
311
300
|
);
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
// Form reset should trigger appropriate behavior
|
|
301
|
+
|
|
302
|
+
fireEvent.click(screen.getByText('Reset'));
|
|
303
|
+
|
|
317
304
|
expect(screen.getAllByRole('button')).toHaveLength(2);
|
|
318
305
|
});
|
|
319
306
|
});
|
|
320
|
-
});
|
|
307
|
+
});
|
|
@@ -10,7 +10,6 @@ describe('Progress Component', () => {
|
|
|
10
10
|
const progress = screen.getByRole('progressbar')
|
|
11
11
|
expect(progress).toBeInTheDocument()
|
|
12
12
|
expect(progress).toHaveClass('relative')
|
|
13
|
-
expect(progress).toHaveClass('w-full')
|
|
14
13
|
expect(progress).toHaveClass('overflow-hidden')
|
|
15
14
|
expect(progress).toHaveClass('bg-muted')
|
|
16
15
|
})
|
|
@@ -231,8 +231,14 @@ describe('Table Components', () => {
|
|
|
231
231
|
|
|
232
232
|
describe('Empty Content', () => {
|
|
233
233
|
it('shows empty content when no children', () => {
|
|
234
|
-
|
|
235
|
-
|
|
234
|
+
// `emptyContent` TableBody tarafından render ediliyor; boş <Table/>
|
|
235
|
+
// içinde gövde olmadığı için hiçbir şey basılmaz.
|
|
236
|
+
render(
|
|
237
|
+
<Table>
|
|
238
|
+
<TableBody emptyContent="No data available" />
|
|
239
|
+
</Table>
|
|
240
|
+
)
|
|
241
|
+
|
|
236
242
|
expect(screen.getByText('No data available')).toBeInTheDocument()
|
|
237
243
|
})
|
|
238
244
|
|
|
@@ -171,7 +171,7 @@ describe('Tabs Components', () => {
|
|
|
171
171
|
)
|
|
172
172
|
|
|
173
173
|
const tabsList = screen.getByTestId('tabs-list')
|
|
174
|
-
expect(tabsList).toHaveClass('bg-transparent', 'gap-
|
|
174
|
+
expect(tabsList).toHaveClass('bg-transparent', 'gap-3', 'p-0')
|
|
175
175
|
})
|
|
176
176
|
|
|
177
177
|
it('renders underline variant correctly', () => {
|
|
@@ -370,7 +370,9 @@ describe('Tabs Components', () => {
|
|
|
370
370
|
)
|
|
371
371
|
|
|
372
372
|
const trigger = screen.getByTestId('tabs-trigger')
|
|
373
|
-
|
|
373
|
+
// `pills` tetikleyicisi `rounded-lg` + ham gri palet kullanıyor
|
|
374
|
+
// (token değil — bkz. #284).
|
|
375
|
+
expect(trigger).toHaveClass('rounded-lg', 'bg-gray-100')
|
|
374
376
|
})
|
|
375
377
|
|
|
376
378
|
it('renders cards variant correctly', () => {
|
|
@@ -766,7 +768,7 @@ describe('Tabs Components', () => {
|
|
|
766
768
|
)
|
|
767
769
|
|
|
768
770
|
expect(screen.getByTestId('tabs')).toBeInTheDocument()
|
|
769
|
-
expect(screen.getByTestId('tabs-list')).toHaveClass('bg-transparent', 'gap-
|
|
771
|
+
expect(screen.getByTestId('tabs-list')).toHaveClass('bg-transparent', 'gap-3')
|
|
770
772
|
expect(screen.getByTestId('tabs-trigger-1')).toHaveClass('h-10', 'px-4')
|
|
771
773
|
expect(screen.getByTestId('mock-icon')).toBeInTheDocument()
|
|
772
774
|
expect(screen.getByTestId('mock-badge')).toBeInTheDocument()
|