@uploadista/react 0.0.20 → 0.1.0-beta.5
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/components/index.d.mts +3 -3
- package/dist/components/index.mjs +1 -1
- package/dist/index.d.mts +4 -548
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/upload-zone-CH8B2-hl.mjs +2 -0
- package/dist/upload-zone-CH8B2-hl.mjs.map +1 -0
- package/dist/{uploadista-provider-Cb13AK7Z.d.mts → uploadista-provider-DwKXudoT.d.mts} +558 -15
- package/dist/uploadista-provider-DwKXudoT.d.mts.map +1 -0
- package/dist/use-upload-BgaJmdwF.mjs.map +1 -1
- package/dist/use-uploadista-client-CkzVVmFT.d.mts.map +1 -1
- package/dist/use-uploadista-events-KhJ4knam.mjs.map +1 -1
- package/package.json +12 -9
- package/src/__tests__/event-utils.test.ts +179 -0
- package/src/__tests__/setup.ts +40 -0
- package/src/__tests__/uploadista-provider.test.tsx +316 -0
- package/src/__tests__/use-drag-drop.test.tsx +476 -0
- package/src/__tests__/use-upload.test.tsx +317 -0
- package/src/__tests__/use-uploadista-client.test.tsx +208 -0
- package/src/components/flow-primitives.tsx +3 -8
- package/src/components/index.tsx +37 -6
- package/src/components/upload-primitives.tsx +22 -19
- package/src/components/upload-zone.tsx +1 -2
- package/src/hooks/event-utils.ts +1 -1
- package/src/hooks/use-upload-events.ts +2 -5
- package/src/index.ts +89 -96
- package/vitest.config.ts +16 -0
- package/dist/flow-upload-list-BJSCZ4Ty.mjs +0 -2
- package/dist/flow-upload-list-BJSCZ4Ty.mjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/uploadista-provider-Cb13AK7Z.d.mts.map +0 -1
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { act, renderHook } from "@testing-library/react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { useDragDrop } from "../hooks/use-drag-drop";
|
|
4
|
+
|
|
5
|
+
// Helper to create mock files
|
|
6
|
+
function createMockFile(
|
|
7
|
+
name: string,
|
|
8
|
+
size: number,
|
|
9
|
+
type: string,
|
|
10
|
+
): File {
|
|
11
|
+
const file = new File(["x".repeat(size)], name, { type });
|
|
12
|
+
Object.defineProperty(file, "size", { value: size });
|
|
13
|
+
return file;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Helper to create mock DragEvent
|
|
17
|
+
function createDragEvent(files: File[]): React.DragEvent {
|
|
18
|
+
const dataTransfer = {
|
|
19
|
+
items: files.map((file) => ({
|
|
20
|
+
kind: "file",
|
|
21
|
+
getAsFile: () => file,
|
|
22
|
+
})),
|
|
23
|
+
files,
|
|
24
|
+
dropEffect: "none" as DataTransfer["dropEffect"],
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
preventDefault: vi.fn(),
|
|
29
|
+
stopPropagation: vi.fn(),
|
|
30
|
+
dataTransfer,
|
|
31
|
+
} as unknown as React.DragEvent;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe("useDragDrop", () => {
|
|
35
|
+
describe("initial state", () => {
|
|
36
|
+
it("should have correct initial state", () => {
|
|
37
|
+
const { result } = renderHook(() => useDragDrop());
|
|
38
|
+
|
|
39
|
+
expect(result.current.state).toEqual({
|
|
40
|
+
isDragging: false,
|
|
41
|
+
isOver: false,
|
|
42
|
+
isValid: true,
|
|
43
|
+
errors: [],
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should return dragHandlers object", () => {
|
|
48
|
+
const { result } = renderHook(() => useDragDrop());
|
|
49
|
+
|
|
50
|
+
expect(result.current.dragHandlers).toHaveProperty("onDragEnter");
|
|
51
|
+
expect(result.current.dragHandlers).toHaveProperty("onDragOver");
|
|
52
|
+
expect(result.current.dragHandlers).toHaveProperty("onDragLeave");
|
|
53
|
+
expect(result.current.dragHandlers).toHaveProperty("onDrop");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("should return inputProps with correct values", () => {
|
|
57
|
+
const { result } = renderHook(() => useDragDrop({ multiple: true }));
|
|
58
|
+
|
|
59
|
+
expect(result.current.inputProps.type).toBe("file");
|
|
60
|
+
expect(result.current.inputProps.multiple).toBe(true);
|
|
61
|
+
expect(result.current.inputProps.style).toEqual({ display: "none" });
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("should set accept attribute on inputProps", () => {
|
|
65
|
+
const { result } = renderHook(() =>
|
|
66
|
+
useDragDrop({ accept: ["image/*", ".pdf"] }),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
expect(result.current.inputProps.accept).toBe("image/*, .pdf");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe("drag state management", () => {
|
|
74
|
+
it("should set isDragging to true on dragEnter", () => {
|
|
75
|
+
const { result } = renderHook(() => useDragDrop());
|
|
76
|
+
const event = createDragEvent([]);
|
|
77
|
+
|
|
78
|
+
act(() => {
|
|
79
|
+
result.current.dragHandlers.onDragEnter(event);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
expect(result.current.state.isDragging).toBe(true);
|
|
83
|
+
expect(result.current.state.isOver).toBe(true);
|
|
84
|
+
expect(event.preventDefault).toHaveBeenCalled();
|
|
85
|
+
expect(event.stopPropagation).toHaveBeenCalled();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("should call onDragStateChange when drag starts", () => {
|
|
89
|
+
const onDragStateChange = vi.fn();
|
|
90
|
+
const { result } = renderHook(() => useDragDrop({ onDragStateChange }));
|
|
91
|
+
const event = createDragEvent([]);
|
|
92
|
+
|
|
93
|
+
act(() => {
|
|
94
|
+
result.current.dragHandlers.onDragEnter(event);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
expect(onDragStateChange).toHaveBeenCalledWith(true);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should set isDragging to false on dragLeave", () => {
|
|
101
|
+
const { result } = renderHook(() => useDragDrop());
|
|
102
|
+
const enterEvent = createDragEvent([]);
|
|
103
|
+
const leaveEvent = createDragEvent([]);
|
|
104
|
+
|
|
105
|
+
act(() => {
|
|
106
|
+
result.current.dragHandlers.onDragEnter(enterEvent);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
expect(result.current.state.isDragging).toBe(true);
|
|
110
|
+
|
|
111
|
+
act(() => {
|
|
112
|
+
result.current.dragHandlers.onDragLeave(leaveEvent);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
expect(result.current.state.isDragging).toBe(false);
|
|
116
|
+
expect(result.current.state.isOver).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("should track nested drag events correctly", () => {
|
|
120
|
+
const { result } = renderHook(() => useDragDrop());
|
|
121
|
+
const event = createDragEvent([]);
|
|
122
|
+
|
|
123
|
+
// Simulate entering parent, then child
|
|
124
|
+
act(() => {
|
|
125
|
+
result.current.dragHandlers.onDragEnter(event);
|
|
126
|
+
result.current.dragHandlers.onDragEnter(event);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
expect(result.current.state.isDragging).toBe(true);
|
|
130
|
+
|
|
131
|
+
// Leave child, should still be dragging
|
|
132
|
+
act(() => {
|
|
133
|
+
result.current.dragHandlers.onDragLeave(event);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
expect(result.current.state.isDragging).toBe(true);
|
|
137
|
+
|
|
138
|
+
// Leave parent, should stop dragging
|
|
139
|
+
act(() => {
|
|
140
|
+
result.current.dragHandlers.onDragLeave(event);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
expect(result.current.state.isDragging).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("should set dropEffect to copy on dragOver", () => {
|
|
147
|
+
const { result } = renderHook(() => useDragDrop());
|
|
148
|
+
const event = createDragEvent([]);
|
|
149
|
+
|
|
150
|
+
act(() => {
|
|
151
|
+
result.current.dragHandlers.onDragOver(event);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
expect(event.dataTransfer?.dropEffect).toBe("copy");
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
describe("file drop handling", () => {
|
|
159
|
+
it("should call onFilesReceived when valid files are dropped", () => {
|
|
160
|
+
const onFilesReceived = vi.fn();
|
|
161
|
+
const { result } = renderHook(() => useDragDrop({ onFilesReceived }));
|
|
162
|
+
|
|
163
|
+
const file = createMockFile("test.txt", 1000, "text/plain");
|
|
164
|
+
const event = createDragEvent([file]);
|
|
165
|
+
|
|
166
|
+
act(() => {
|
|
167
|
+
result.current.dragHandlers.onDrop(event);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
expect(onFilesReceived).toHaveBeenCalledWith([file]);
|
|
171
|
+
expect(result.current.state.isDragging).toBe(false);
|
|
172
|
+
expect(result.current.state.errors).toEqual([]);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("should reset drag state on drop", () => {
|
|
176
|
+
const { result } = renderHook(() => useDragDrop());
|
|
177
|
+
const enterEvent = createDragEvent([]);
|
|
178
|
+
const dropEvent = createDragEvent([createMockFile("test.txt", 100, "text/plain")]);
|
|
179
|
+
|
|
180
|
+
act(() => {
|
|
181
|
+
result.current.dragHandlers.onDragEnter(enterEvent);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
expect(result.current.state.isDragging).toBe(true);
|
|
185
|
+
|
|
186
|
+
act(() => {
|
|
187
|
+
result.current.dragHandlers.onDrop(dropEvent);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
expect(result.current.state.isDragging).toBe(false);
|
|
191
|
+
expect(result.current.state.isOver).toBe(false);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
describe("file validation - maxFiles", () => {
|
|
196
|
+
it("should reject when files exceed maxFiles limit", () => {
|
|
197
|
+
const onValidationError = vi.fn();
|
|
198
|
+
const onFilesReceived = vi.fn();
|
|
199
|
+
const { result } = renderHook(() =>
|
|
200
|
+
useDragDrop({ maxFiles: 2, onValidationError, onFilesReceived }),
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
const files = [
|
|
204
|
+
createMockFile("file1.txt", 100, "text/plain"),
|
|
205
|
+
createMockFile("file2.txt", 100, "text/plain"),
|
|
206
|
+
createMockFile("file3.txt", 100, "text/plain"),
|
|
207
|
+
];
|
|
208
|
+
const event = createDragEvent(files);
|
|
209
|
+
|
|
210
|
+
act(() => {
|
|
211
|
+
result.current.dragHandlers.onDrop(event);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
expect(onValidationError).toHaveBeenCalled();
|
|
215
|
+
expect(onFilesReceived).not.toHaveBeenCalled();
|
|
216
|
+
expect(result.current.state.errors).toContain(
|
|
217
|
+
"Maximum 2 files allowed. You selected 3 files.",
|
|
218
|
+
);
|
|
219
|
+
expect(result.current.state.isValid).toBe(false);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it("should accept files within maxFiles limit", () => {
|
|
223
|
+
const onFilesReceived = vi.fn();
|
|
224
|
+
const { result } = renderHook(() =>
|
|
225
|
+
useDragDrop({ maxFiles: 3, onFilesReceived }),
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const files = [
|
|
229
|
+
createMockFile("file1.txt", 100, "text/plain"),
|
|
230
|
+
createMockFile("file2.txt", 100, "text/plain"),
|
|
231
|
+
];
|
|
232
|
+
const event = createDragEvent(files);
|
|
233
|
+
|
|
234
|
+
act(() => {
|
|
235
|
+
result.current.dragHandlers.onDrop(event);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
expect(onFilesReceived).toHaveBeenCalledWith(files);
|
|
239
|
+
expect(result.current.state.errors).toEqual([]);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
describe("file validation - maxFileSize", () => {
|
|
244
|
+
it("should reject files exceeding maxFileSize", () => {
|
|
245
|
+
const onValidationError = vi.fn();
|
|
246
|
+
const onFilesReceived = vi.fn();
|
|
247
|
+
const maxFileSize = 1024 * 1024; // 1MB
|
|
248
|
+
const { result } = renderHook(() =>
|
|
249
|
+
useDragDrop({ maxFileSize, onValidationError, onFilesReceived }),
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
const file = createMockFile("large.txt", 2 * 1024 * 1024, "text/plain"); // 2MB
|
|
253
|
+
const event = createDragEvent([file]);
|
|
254
|
+
|
|
255
|
+
act(() => {
|
|
256
|
+
result.current.dragHandlers.onDrop(event);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
expect(onValidationError).toHaveBeenCalled();
|
|
260
|
+
expect(onFilesReceived).not.toHaveBeenCalled();
|
|
261
|
+
expect(result.current.state.isValid).toBe(false);
|
|
262
|
+
expect(result.current.state.errors[0]).toContain("exceeds maximum size");
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("should accept files within maxFileSize", () => {
|
|
266
|
+
const onFilesReceived = vi.fn();
|
|
267
|
+
const maxFileSize = 1024 * 1024; // 1MB
|
|
268
|
+
const { result } = renderHook(() =>
|
|
269
|
+
useDragDrop({ maxFileSize, onFilesReceived }),
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
const file = createMockFile("small.txt", 512 * 1024, "text/plain"); // 512KB
|
|
273
|
+
const event = createDragEvent([file]);
|
|
274
|
+
|
|
275
|
+
act(() => {
|
|
276
|
+
result.current.dragHandlers.onDrop(event);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
expect(onFilesReceived).toHaveBeenCalledWith([file]);
|
|
280
|
+
expect(result.current.state.errors).toEqual([]);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
describe("file validation - accept types", () => {
|
|
285
|
+
it("should accept files matching MIME type", () => {
|
|
286
|
+
const onFilesReceived = vi.fn();
|
|
287
|
+
const { result } = renderHook(() =>
|
|
288
|
+
useDragDrop({ accept: ["image/png"], onFilesReceived }),
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
const file = createMockFile("image.png", 100, "image/png");
|
|
292
|
+
const event = createDragEvent([file]);
|
|
293
|
+
|
|
294
|
+
act(() => {
|
|
295
|
+
result.current.dragHandlers.onDrop(event);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
expect(onFilesReceived).toHaveBeenCalledWith([file]);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it("should accept files matching wildcard MIME type", () => {
|
|
302
|
+
const onFilesReceived = vi.fn();
|
|
303
|
+
const { result } = renderHook(() =>
|
|
304
|
+
useDragDrop({ accept: ["image/*"], onFilesReceived }),
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
const file = createMockFile("photo.jpeg", 100, "image/jpeg");
|
|
308
|
+
const event = createDragEvent([file]);
|
|
309
|
+
|
|
310
|
+
act(() => {
|
|
311
|
+
result.current.dragHandlers.onDrop(event);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
expect(onFilesReceived).toHaveBeenCalledWith([file]);
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it("should accept files matching file extension", () => {
|
|
318
|
+
const onFilesReceived = vi.fn();
|
|
319
|
+
const { result } = renderHook(() =>
|
|
320
|
+
useDragDrop({ accept: [".pdf"], onFilesReceived }),
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
const file = createMockFile("document.pdf", 100, "application/pdf");
|
|
324
|
+
const event = createDragEvent([file]);
|
|
325
|
+
|
|
326
|
+
act(() => {
|
|
327
|
+
result.current.dragHandlers.onDrop(event);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
expect(onFilesReceived).toHaveBeenCalledWith([file]);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it("should reject files not matching accept types", () => {
|
|
334
|
+
const onValidationError = vi.fn();
|
|
335
|
+
const onFilesReceived = vi.fn();
|
|
336
|
+
const { result } = renderHook(() =>
|
|
337
|
+
useDragDrop({ accept: ["image/*"], onValidationError, onFilesReceived }),
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
const file = createMockFile("doc.txt", 100, "text/plain");
|
|
341
|
+
const event = createDragEvent([file]);
|
|
342
|
+
|
|
343
|
+
act(() => {
|
|
344
|
+
result.current.dragHandlers.onDrop(event);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
expect(onValidationError).toHaveBeenCalled();
|
|
348
|
+
expect(onFilesReceived).not.toHaveBeenCalled();
|
|
349
|
+
expect(result.current.state.errors[0]).toContain("not accepted");
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
it("should accept all files with wildcard accept", () => {
|
|
353
|
+
const onFilesReceived = vi.fn();
|
|
354
|
+
const { result } = renderHook(() =>
|
|
355
|
+
useDragDrop({ accept: ["*"], onFilesReceived }),
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
const file = createMockFile("any.xyz", 100, "application/octet-stream");
|
|
359
|
+
const event = createDragEvent([file]);
|
|
360
|
+
|
|
361
|
+
act(() => {
|
|
362
|
+
result.current.dragHandlers.onDrop(event);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
expect(onFilesReceived).toHaveBeenCalledWith([file]);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
describe("custom validator", () => {
|
|
370
|
+
it("should call custom validator and handle errors", () => {
|
|
371
|
+
const onValidationError = vi.fn();
|
|
372
|
+
const validator = vi.fn().mockReturnValue(["Custom error message"]);
|
|
373
|
+
const { result } = renderHook(() =>
|
|
374
|
+
useDragDrop({ validator, onValidationError }),
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
const file = createMockFile("test.txt", 100, "text/plain");
|
|
378
|
+
const event = createDragEvent([file]);
|
|
379
|
+
|
|
380
|
+
act(() => {
|
|
381
|
+
result.current.dragHandlers.onDrop(event);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
expect(validator).toHaveBeenCalledWith([file]);
|
|
385
|
+
expect(onValidationError).toHaveBeenCalled();
|
|
386
|
+
expect(result.current.state.errors).toContain("Custom error message");
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it("should pass validation when custom validator returns null", () => {
|
|
390
|
+
const onFilesReceived = vi.fn();
|
|
391
|
+
const validator = vi.fn().mockReturnValue(null);
|
|
392
|
+
const { result } = renderHook(() =>
|
|
393
|
+
useDragDrop({ validator, onFilesReceived }),
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
const file = createMockFile("test.txt", 100, "text/plain");
|
|
397
|
+
const event = createDragEvent([file]);
|
|
398
|
+
|
|
399
|
+
act(() => {
|
|
400
|
+
result.current.dragHandlers.onDrop(event);
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
expect(validator).toHaveBeenCalledWith([file]);
|
|
404
|
+
expect(onFilesReceived).toHaveBeenCalledWith([file]);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
describe("processFiles", () => {
|
|
409
|
+
it("should process files manually", () => {
|
|
410
|
+
const onFilesReceived = vi.fn();
|
|
411
|
+
const { result } = renderHook(() => useDragDrop({ onFilesReceived }));
|
|
412
|
+
|
|
413
|
+
const files = [createMockFile("test.txt", 100, "text/plain")];
|
|
414
|
+
|
|
415
|
+
act(() => {
|
|
416
|
+
result.current.processFiles(files);
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
expect(onFilesReceived).toHaveBeenCalledWith(files);
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
it("should validate files when processing manually", () => {
|
|
423
|
+
const onValidationError = vi.fn();
|
|
424
|
+
const { result } = renderHook(() =>
|
|
425
|
+
useDragDrop({ maxFiles: 1, onValidationError }),
|
|
426
|
+
);
|
|
427
|
+
|
|
428
|
+
const files = [
|
|
429
|
+
createMockFile("file1.txt", 100, "text/plain"),
|
|
430
|
+
createMockFile("file2.txt", 100, "text/plain"),
|
|
431
|
+
];
|
|
432
|
+
|
|
433
|
+
act(() => {
|
|
434
|
+
result.current.processFiles(files);
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
expect(onValidationError).toHaveBeenCalled();
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
describe("reset", () => {
|
|
442
|
+
it("should reset state to initial values", () => {
|
|
443
|
+
const { result } = renderHook(() => useDragDrop());
|
|
444
|
+
const event = createDragEvent([]);
|
|
445
|
+
|
|
446
|
+
act(() => {
|
|
447
|
+
result.current.dragHandlers.onDragEnter(event);
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
expect(result.current.state.isDragging).toBe(true);
|
|
451
|
+
|
|
452
|
+
act(() => {
|
|
453
|
+
result.current.reset();
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
expect(result.current.state).toEqual({
|
|
457
|
+
isDragging: false,
|
|
458
|
+
isOver: false,
|
|
459
|
+
isValid: true,
|
|
460
|
+
errors: [],
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
describe("multiple option", () => {
|
|
466
|
+
it("should set multiple to true by default", () => {
|
|
467
|
+
const { result } = renderHook(() => useDragDrop());
|
|
468
|
+
expect(result.current.inputProps.multiple).toBe(true);
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
it("should respect multiple option when set to false", () => {
|
|
472
|
+
const { result } = renderHook(() => useDragDrop({ multiple: false }));
|
|
473
|
+
expect(result.current.inputProps.multiple).toBe(false);
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
});
|