@moontra/moonui 2.0.8 → 2.0.9
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/package.json +9 -2
- package/src/__tests__/use-intersection-observer.test.tsx +216 -0
- package/src/__tests__/use-local-storage.test.tsx +174 -0
- package/src/__tests__/use-pro-access.test.tsx +183 -0
- package/src/components/ui/__tests__/accordion.test.tsx +571 -0
- package/src/components/ui/__tests__/alert.test.tsx +484 -0
- package/src/components/ui/__tests__/aspect-ratio.test.tsx +492 -0
- package/src/components/ui/__tests__/avatar.test.tsx +382 -0
- package/src/components/ui/__tests__/badge.test.tsx +364 -0
- package/src/components/ui/__tests__/breadcrumb.test.tsx +687 -0
- package/src/components/ui/__tests__/button.test.tsx +91 -0
- package/src/components/ui/__tests__/card.test.tsx +104 -0
- package/src/components/ui/__tests__/checkbox.test.tsx +591 -0
- package/src/components/ui/__tests__/collapsible.test.tsx +592 -0
- package/src/components/ui/__tests__/color-picker.test.tsx +365 -0
- package/src/components/ui/__tests__/command.test.tsx +677 -0
- package/src/components/ui/__tests__/data-table.test.tsx +256 -0
- package/src/components/ui/__tests__/date-picker.test.tsx +320 -0
- package/src/components/ui/__tests__/dialog.test.tsx +764 -0
- package/src/components/ui/__tests__/input.test.tsx +318 -0
- package/src/components/ui/__tests__/label.test.tsx +103 -0
- package/src/components/ui/__tests__/popover.test.tsx +637 -0
- package/src/components/ui/__tests__/progress.test.tsx +382 -0
- package/src/components/ui/__tests__/radio-group.test.tsx +555 -0
- package/src/components/ui/__tests__/select.test.tsx +705 -0
- package/src/components/ui/__tests__/skeleton.test.tsx +253 -0
- package/src/components/ui/__tests__/slider.test.tsx +493 -0
- package/src/components/ui/__tests__/switch.test.tsx +372 -0
- package/src/components/ui/__tests__/table.test.tsx +824 -0
- package/src/components/ui/__tests__/tabs.test.tsx +887 -0
- package/src/components/ui/__tests__/toast.test.tsx +458 -0
- package/src/components/ui/__tests__/tooltip.test.tsx +583 -0
- package/src/components/ui/accordion.tsx +63 -0
- package/src/components/ui/alert.tsx +130 -0
- package/src/components/ui/aspect-ratio.tsx +72 -0
- package/src/components/ui/avatar.tsx +135 -0
- package/src/components/ui/badge.tsx +225 -0
- package/src/components/ui/breadcrumb.tsx +207 -0
- package/src/components/ui/button.stories.tsx +162 -0
- package/src/components/ui/button.tsx +221 -0
- package/src/components/ui/calendar.tsx +262 -0
- package/src/components/ui/card.stories.tsx +208 -0
- package/src/components/ui/card.tsx +141 -0
- package/src/components/ui/checkbox.tsx +256 -0
- package/src/components/ui/collapsible.tsx +129 -0
- package/src/components/ui/color-picker.tsx +664 -0
- package/src/components/ui/command.tsx +218 -0
- package/src/components/ui/data-table.stories.tsx +509 -0
- package/src/components/ui/data-table.tsx +623 -0
- package/src/components/ui/date-picker.stories.tsx +321 -0
- package/src/components/ui/date-picker.tsx +603 -0
- package/src/components/ui/dialog.tsx +332 -0
- package/src/components/ui/dropdown-menu.tsx +200 -0
- package/src/components/ui/file-upload.tsx +400 -0
- package/src/components/ui/github-stars.tsx +201 -0
- package/src/components/ui/index.ts +12 -0
- package/src/components/ui/input.stories.tsx +255 -0
- package/src/components/ui/input.tsx +219 -0
- package/src/components/ui/label.tsx +26 -0
- package/src/components/ui/locked-component.tsx +215 -0
- package/src/components/ui/moon-logo.tsx +97 -0
- package/src/components/ui/pagination.tsx +116 -0
- package/src/components/ui/popover.tsx +183 -0
- package/src/components/ui/progress.tsx +182 -0
- package/src/components/ui/radio-group.tsx +243 -0
- package/src/components/ui/select.tsx +273 -0
- package/src/components/ui/separator.tsx +140 -0
- package/src/components/ui/simple-editor.tsx +652 -0
- package/src/components/ui/skeleton.tsx +351 -0
- package/src/components/ui/slider.tsx +351 -0
- package/src/components/ui/switch.tsx +83 -0
- package/src/components/ui/table.tsx +322 -0
- package/src/components/ui/tabs.tsx +195 -0
- package/src/components/ui/textarea.tsx +46 -0
- package/src/components/ui/toast.tsx +313 -0
- package/src/components/ui/toggle.tsx +47 -0
- package/src/components/ui/tooltip.tsx +152 -0
- package/src/docs/theme-system.md +1194 -0
- package/src/index.tsx +39 -0
- package/src/lib/micro-interactions.ts +255 -0
- package/src/lib/theme.tsx +398 -0
- package/src/lib/utils.ts +69 -0
- package/src/styles/design-system.css +365 -0
- package/src/styles/index.css +4 -0
- package/src/styles/tailwind.css +6 -0
- package/src/styles/tokens.css +453 -0
- package/src/use-intersection-observer.tsx +154 -0
- package/src/use-local-storage.tsx +71 -0
- package/src/use-paddle.ts +138 -0
- package/src/use-performance-optimizer.ts +379 -0
- package/src/use-pro-access.ts +141 -0
- package/src/use-scroll-animation.ts +221 -0
- package/src/use-subscription.ts +37 -0
- package/src/use-toast.ts +32 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { render, screen } from '@testing-library/react'
|
|
3
|
+
import '@testing-library/jest-dom'
|
|
4
|
+
import { Progress } from '../progress'
|
|
5
|
+
|
|
6
|
+
describe('Progress Component', () => {
|
|
7
|
+
describe('Basic Rendering', () => {
|
|
8
|
+
it('renders correctly with default props', () => {
|
|
9
|
+
render(<Progress />)
|
|
10
|
+
const progress = screen.getByRole('progressbar')
|
|
11
|
+
expect(progress).toBeInTheDocument()
|
|
12
|
+
expect(progress).toHaveClass('relative')
|
|
13
|
+
expect(progress).toHaveClass('w-full')
|
|
14
|
+
expect(progress).toHaveClass('overflow-hidden')
|
|
15
|
+
expect(progress).toHaveClass('bg-muted')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('renders with custom value', () => {
|
|
19
|
+
render(<Progress value={50} />)
|
|
20
|
+
const progress = screen.getByRole('progressbar')
|
|
21
|
+
expect(progress).toHaveAttribute('aria-valuenow', '50')
|
|
22
|
+
expect(progress).toHaveAttribute('aria-valuemin', '0')
|
|
23
|
+
expect(progress).toHaveAttribute('aria-valuemax', '100')
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('applies custom className', () => {
|
|
27
|
+
render(<Progress className="custom-progress" />)
|
|
28
|
+
const progress = screen.getByRole('progressbar')
|
|
29
|
+
expect(progress).toHaveClass('custom-progress')
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('forwards ref correctly', () => {
|
|
33
|
+
const ref = React.createRef<HTMLDivElement>()
|
|
34
|
+
render(<Progress ref={ref} />)
|
|
35
|
+
expect(ref.current).toBeInstanceOf(HTMLDivElement)
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
describe('Value Handling', () => {
|
|
40
|
+
it('handles value normalization correctly', () => {
|
|
41
|
+
render(<Progress value={150} />)
|
|
42
|
+
const progress = screen.getByRole('progressbar')
|
|
43
|
+
expect(progress).toHaveAttribute('aria-valuenow', '100')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('handles negative values correctly', () => {
|
|
47
|
+
render(<Progress value={-10} />)
|
|
48
|
+
const progress = screen.getByRole('progressbar')
|
|
49
|
+
expect(progress).toHaveAttribute('aria-valuenow', '0')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('handles custom max value', () => {
|
|
53
|
+
render(<Progress value={50} max={200} />)
|
|
54
|
+
const progress = screen.getByRole('progressbar')
|
|
55
|
+
expect(progress).toHaveAttribute('aria-valuenow', '50')
|
|
56
|
+
expect(progress).toHaveAttribute('aria-valuemax', '200')
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('calculates percentage correctly with custom max', () => {
|
|
60
|
+
render(<Progress value={50} max={200} showValueLabel />)
|
|
61
|
+
const label = screen.getByText('25%')
|
|
62
|
+
expect(label).toBeInTheDocument()
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
describe('Variants', () => {
|
|
67
|
+
it('renders default variant correctly', () => {
|
|
68
|
+
render(<Progress variant="default" />)
|
|
69
|
+
const progress = screen.getByRole('progressbar')
|
|
70
|
+
expect(progress).toHaveClass('bg-muted')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('renders primary variant correctly', () => {
|
|
74
|
+
render(<Progress variant="primary" />)
|
|
75
|
+
const progress = screen.getByRole('progressbar')
|
|
76
|
+
expect(progress).toHaveClass('bg-primary/20')
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('renders secondary variant correctly', () => {
|
|
80
|
+
render(<Progress variant="secondary" />)
|
|
81
|
+
const progress = screen.getByRole('progressbar')
|
|
82
|
+
expect(progress).toHaveClass('bg-secondary/20')
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('renders success variant correctly', () => {
|
|
86
|
+
render(<Progress variant="success" />)
|
|
87
|
+
const progress = screen.getByRole('progressbar')
|
|
88
|
+
expect(progress).toHaveClass('bg-success/20')
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('renders warning variant correctly', () => {
|
|
92
|
+
render(<Progress variant="warning" />)
|
|
93
|
+
const progress = screen.getByRole('progressbar')
|
|
94
|
+
expect(progress).toHaveClass('bg-warning/20')
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('renders error variant correctly', () => {
|
|
98
|
+
render(<Progress variant="error" />)
|
|
99
|
+
const progress = screen.getByRole('progressbar')
|
|
100
|
+
expect(progress).toHaveClass('bg-error/20')
|
|
101
|
+
})
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
describe('Sizes', () => {
|
|
105
|
+
it('renders xs size correctly', () => {
|
|
106
|
+
render(<Progress size="xs" />)
|
|
107
|
+
const progress = screen.getByRole('progressbar')
|
|
108
|
+
expect(progress).toHaveClass('h-1')
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('renders sm size correctly', () => {
|
|
112
|
+
render(<Progress size="sm" />)
|
|
113
|
+
const progress = screen.getByRole('progressbar')
|
|
114
|
+
expect(progress).toHaveClass('h-1.5')
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
it('renders default size correctly', () => {
|
|
118
|
+
render(<Progress size="default" />)
|
|
119
|
+
const progress = screen.getByRole('progressbar')
|
|
120
|
+
expect(progress).toHaveClass('h-2')
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('renders md size correctly', () => {
|
|
124
|
+
render(<Progress size="md" />)
|
|
125
|
+
const progress = screen.getByRole('progressbar')
|
|
126
|
+
expect(progress).toHaveClass('h-2.5')
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
it('renders lg size correctly', () => {
|
|
130
|
+
render(<Progress size="lg" />)
|
|
131
|
+
const progress = screen.getByRole('progressbar')
|
|
132
|
+
expect(progress).toHaveClass('h-3')
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it('renders xl size correctly', () => {
|
|
136
|
+
render(<Progress size="xl" />)
|
|
137
|
+
const progress = screen.getByRole('progressbar')
|
|
138
|
+
expect(progress).toHaveClass('h-4')
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
describe('Radius', () => {
|
|
143
|
+
it('renders none radius correctly', () => {
|
|
144
|
+
render(<Progress radius="none" />)
|
|
145
|
+
const progress = screen.getByRole('progressbar')
|
|
146
|
+
expect(progress).toHaveClass('rounded-none')
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
it('renders sm radius correctly', () => {
|
|
150
|
+
render(<Progress radius="sm" />)
|
|
151
|
+
const progress = screen.getByRole('progressbar')
|
|
152
|
+
expect(progress).toHaveClass('rounded-sm')
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
it('renders default radius correctly', () => {
|
|
156
|
+
render(<Progress radius="default" />)
|
|
157
|
+
const progress = screen.getByRole('progressbar')
|
|
158
|
+
expect(progress).toHaveClass('rounded-md')
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
it('renders lg radius correctly', () => {
|
|
162
|
+
render(<Progress radius="lg" />)
|
|
163
|
+
const progress = screen.getByRole('progressbar')
|
|
164
|
+
expect(progress).toHaveClass('rounded-lg')
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
it('renders full radius correctly', () => {
|
|
168
|
+
render(<Progress radius="full" />)
|
|
169
|
+
const progress = screen.getByRole('progressbar')
|
|
170
|
+
expect(progress).toHaveClass('rounded-full')
|
|
171
|
+
})
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
describe('Animation', () => {
|
|
175
|
+
it('renders default animation correctly', () => {
|
|
176
|
+
render(<Progress animation="default" />)
|
|
177
|
+
const progress = screen.getByRole('progressbar')
|
|
178
|
+
expect(progress).toHaveClass('[&>div]:transition-all')
|
|
179
|
+
expect(progress).toHaveClass('[&>div]:duration-500')
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
it('renders smooth animation correctly', () => {
|
|
183
|
+
render(<Progress animation="smooth" />)
|
|
184
|
+
const progress = screen.getByRole('progressbar')
|
|
185
|
+
expect(progress).toHaveClass('[&>div]:transition-all')
|
|
186
|
+
expect(progress).toHaveClass('[&>div]:duration-700')
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('renders fast animation correctly', () => {
|
|
190
|
+
render(<Progress animation="fast" />)
|
|
191
|
+
const progress = screen.getByRole('progressbar')
|
|
192
|
+
expect(progress).toHaveClass('[&>div]:transition-all')
|
|
193
|
+
expect(progress).toHaveClass('[&>div]:duration-300')
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
it('renders none animation correctly', () => {
|
|
197
|
+
render(<Progress animation="none" />)
|
|
198
|
+
const progress = screen.getByRole('progressbar')
|
|
199
|
+
expect(progress).not.toHaveClass('[&>div]:transition-all')
|
|
200
|
+
})
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
describe('Indicator Variants', () => {
|
|
204
|
+
it('renders default indicator variant correctly', () => {
|
|
205
|
+
render(<Progress indicatorVariant="default" />)
|
|
206
|
+
const progress = screen.getByRole('progressbar')
|
|
207
|
+
const indicator = progress.querySelector('div')
|
|
208
|
+
expect(indicator).toHaveClass('bg-foreground')
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
it('renders primary indicator variant correctly', () => {
|
|
212
|
+
render(<Progress indicatorVariant="primary" />)
|
|
213
|
+
const progress = screen.getByRole('progressbar')
|
|
214
|
+
const indicator = progress.querySelector('div')
|
|
215
|
+
expect(indicator).toHaveClass('bg-primary')
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
it('renders secondary indicator variant correctly', () => {
|
|
219
|
+
render(<Progress indicatorVariant="secondary" />)
|
|
220
|
+
const progress = screen.getByRole('progressbar')
|
|
221
|
+
const indicator = progress.querySelector('div')
|
|
222
|
+
expect(indicator).toHaveClass('bg-secondary')
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
it('renders success indicator variant correctly', () => {
|
|
226
|
+
render(<Progress indicatorVariant="success" />)
|
|
227
|
+
const progress = screen.getByRole('progressbar')
|
|
228
|
+
const indicator = progress.querySelector('div')
|
|
229
|
+
expect(indicator).toHaveClass('bg-success')
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('renders warning indicator variant correctly', () => {
|
|
233
|
+
render(<Progress indicatorVariant="warning" />)
|
|
234
|
+
const progress = screen.getByRole('progressbar')
|
|
235
|
+
const indicator = progress.querySelector('div')
|
|
236
|
+
expect(indicator).toHaveClass('bg-warning')
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
it('renders error indicator variant correctly', () => {
|
|
240
|
+
render(<Progress indicatorVariant="error" />)
|
|
241
|
+
const progress = screen.getByRole('progressbar')
|
|
242
|
+
const indicator = progress.querySelector('div')
|
|
243
|
+
expect(indicator).toHaveClass('bg-error')
|
|
244
|
+
})
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
describe('Value Label', () => {
|
|
248
|
+
it('does not show value label by default', () => {
|
|
249
|
+
render(<Progress value={50} />)
|
|
250
|
+
expect(screen.queryByText('50%')).not.toBeInTheDocument()
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
it('shows value label when enabled', () => {
|
|
254
|
+
render(<Progress value={50} showValueLabel />)
|
|
255
|
+
const label = screen.getByText('50%')
|
|
256
|
+
expect(label).toBeInTheDocument()
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
it('shows custom value label', () => {
|
|
260
|
+
render(<Progress value={50} showValueLabel valueLabel="50/100" />)
|
|
261
|
+
const label = screen.getByText('50/100')
|
|
262
|
+
expect(label).toBeInTheDocument()
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
it('applies custom label className', () => {
|
|
266
|
+
render(<Progress value={50} showValueLabel labelClassName="custom-label" />)
|
|
267
|
+
const label = screen.getByText('50%')
|
|
268
|
+
expect(label).toHaveClass('custom-label')
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
it('shows correct percentage for custom max', () => {
|
|
272
|
+
render(<Progress value={25} max={50} showValueLabel />)
|
|
273
|
+
const label = screen.getByText('50%')
|
|
274
|
+
expect(label).toBeInTheDocument()
|
|
275
|
+
})
|
|
276
|
+
})
|
|
277
|
+
|
|
278
|
+
describe('Indeterminate State', () => {
|
|
279
|
+
it('renders indeterminate progress correctly', () => {
|
|
280
|
+
render(<Progress indeterminate />)
|
|
281
|
+
const progress = screen.getByRole('progressbar')
|
|
282
|
+
expect(progress).not.toHaveAttribute('aria-valuenow')
|
|
283
|
+
|
|
284
|
+
const indicator = progress.querySelector('div')
|
|
285
|
+
expect(indicator).toHaveClass('animate-indeterminate-progress')
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
it('does not show aria-valuenow when indeterminate', () => {
|
|
289
|
+
render(<Progress value={50} indeterminate />)
|
|
290
|
+
const progress = screen.getByRole('progressbar')
|
|
291
|
+
expect(progress).not.toHaveAttribute('aria-valuenow')
|
|
292
|
+
})
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
describe('Accessibility', () => {
|
|
296
|
+
it('has correct ARIA attributes', () => {
|
|
297
|
+
render(<Progress value={50} />)
|
|
298
|
+
const progress = screen.getByRole('progressbar')
|
|
299
|
+
expect(progress).toHaveAttribute('role', 'progressbar')
|
|
300
|
+
expect(progress).toHaveAttribute('aria-valuemin', '0')
|
|
301
|
+
expect(progress).toHaveAttribute('aria-valuemax', '100')
|
|
302
|
+
expect(progress).toHaveAttribute('aria-valuenow', '50')
|
|
303
|
+
})
|
|
304
|
+
|
|
305
|
+
it('supports custom ARIA attributes', () => {
|
|
306
|
+
render(<Progress value={50} aria-label="Loading progress" />)
|
|
307
|
+
const progress = screen.getByRole('progressbar')
|
|
308
|
+
expect(progress).toHaveAttribute('aria-label', 'Loading progress')
|
|
309
|
+
})
|
|
310
|
+
})
|
|
311
|
+
|
|
312
|
+
describe('Complex Combinations', () => {
|
|
313
|
+
it('renders with multiple props correctly', () => {
|
|
314
|
+
render(
|
|
315
|
+
<Progress
|
|
316
|
+
value={75}
|
|
317
|
+
variant="success"
|
|
318
|
+
size="lg"
|
|
319
|
+
radius="sm"
|
|
320
|
+
animation="fast"
|
|
321
|
+
indicatorVariant="primary"
|
|
322
|
+
showValueLabel
|
|
323
|
+
valueLabel="3/4 complete"
|
|
324
|
+
labelClassName="font-bold"
|
|
325
|
+
max={100}
|
|
326
|
+
/>
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
const progress = screen.getByRole('progressbar')
|
|
330
|
+
expect(progress).toHaveClass('bg-success/20')
|
|
331
|
+
expect(progress).toHaveClass('h-3')
|
|
332
|
+
expect(progress).toHaveClass('rounded-sm')
|
|
333
|
+
expect(progress).toHaveClass('[&>div]:duration-300')
|
|
334
|
+
|
|
335
|
+
const indicator = progress.querySelector('div')
|
|
336
|
+
expect(indicator).toHaveClass('bg-primary')
|
|
337
|
+
|
|
338
|
+
const label = screen.getByText('3/4 complete')
|
|
339
|
+
expect(label).toHaveClass('font-bold')
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
it('maintains displayName', () => {
|
|
343
|
+
expect(Progress.displayName).toBe('Progress')
|
|
344
|
+
})
|
|
345
|
+
})
|
|
346
|
+
|
|
347
|
+
describe('Edge Cases', () => {
|
|
348
|
+
it('handles zero value correctly', () => {
|
|
349
|
+
render(<Progress value={0} showValueLabel />)
|
|
350
|
+
const progress = screen.getByRole('progressbar')
|
|
351
|
+
expect(progress).toHaveAttribute('aria-valuenow', '0')
|
|
352
|
+
|
|
353
|
+
const label = screen.getByText('0%')
|
|
354
|
+
expect(label).toBeInTheDocument()
|
|
355
|
+
})
|
|
356
|
+
|
|
357
|
+
it('handles max value correctly', () => {
|
|
358
|
+
render(<Progress value={100} showValueLabel />)
|
|
359
|
+
const progress = screen.getByRole('progressbar')
|
|
360
|
+
expect(progress).toHaveAttribute('aria-valuenow', '100')
|
|
361
|
+
|
|
362
|
+
const label = screen.getByText('100%')
|
|
363
|
+
expect(label).toBeInTheDocument()
|
|
364
|
+
})
|
|
365
|
+
|
|
366
|
+
it('handles zero max value', () => {
|
|
367
|
+
render(<Progress value={50} max={0} showValueLabel />)
|
|
368
|
+
const progress = screen.getByRole('progressbar')
|
|
369
|
+
expect(progress).toHaveAttribute('aria-valuemax', '0')
|
|
370
|
+
|
|
371
|
+
const label = screen.getByText('0%')
|
|
372
|
+
expect(label).toBeInTheDocument()
|
|
373
|
+
})
|
|
374
|
+
|
|
375
|
+
it('passes through HTML attributes', () => {
|
|
376
|
+
render(<Progress data-testid="progress-test" id="progress-1" />)
|
|
377
|
+
const progress = screen.getByRole('progressbar')
|
|
378
|
+
expect(progress).toHaveAttribute('data-testid', 'progress-test')
|
|
379
|
+
expect(progress).toHaveAttribute('id', 'progress-1')
|
|
380
|
+
})
|
|
381
|
+
})
|
|
382
|
+
})
|