Files
leocrm/frontend/src/__tests__/dms/UploadDropzone.test.tsx
T
leocrm-bot 0962f3a961 T08a: Frontend DMS + Tags + Permissions UI — 33 tests, tsc clean, vite build pass
- DMS file browser: folder tree + file grid + upload dropzone + search + preview modal
- DMS share dialog: user/group share + public share links with password+expiry
- DMS bulk actions: bulk move + bulk delete with confirm dialogs
- DMS trash view: deleted files list with restore button
- Tags: TagPicker on company/contact detail pages (new tabs tab)
- Tags: TagCloud + BulkTagDialog for bulk tag assignment
- Permissions: share link creation, permission display, copy-link button
- API clients: dms.ts, tags.ts, permissions.ts
- Routes: /dms, /dms/trash added to router
- Sidebar: DMS nav link updated
- i18n: de.json + en.json translations for DMS/Tags/Permissions
- 33 new tests (5 test files), full regression 276/276 pass
- tsc --noEmit: 0 errors, vite build: 252 modules
2026-07-01 16:54:32 +02:00

64 lines
2.5 KiB
TypeScript

import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { UploadDropzone } from '@/components/dms/UploadDropzone';
const mockUploadFile = vi.fn();
vi.mock('@/api/dms', () => ({
uploadFile: (...args: unknown[]) => mockUploadFile(...args),
}));
vi.mock('@/components/ui/Toast', () => ({
useToast: () => ({ success: vi.fn(), error: vi.fn(), info: vi.fn(), warning: vi.fn() }),
}));
beforeEach(() => {
vi.clearAllMocks();
mockUploadFile.mockResolvedValue({ id: 'file1', name: 'test.pdf' });
});
describe('UploadDropzone', () => {
it('renders the dropzone area', () => {
render(<UploadDropzone folderId={null} onUploaded={vi.fn()} />);
expect(screen.getByTestId('upload-dropzone')).toBeInTheDocument();
});
it('renders drag-and-drop instruction text', () => {
render(<UploadDropzone folderId={null} onUploaded={vi.fn()} />);
expect(screen.getByText('Dateien hierher ziehen oder klicken zum Auswaehlen')).toBeInTheDocument();
});
it('opens file picker on click', () => {
render(<UploadDropzone folderId={null} onUploaded={vi.fn()} />);
const dropzone = screen.getByTestId('upload-dropzone');
const input = dropzone.querySelector('input[type="file"]') as HTMLInputElement;
expect(input).toBeTruthy();
expect(input.multiple).toBe(true);
});
it('uploads files when input changes', async () => {
const onUploaded = vi.fn();
render(<UploadDropzone folderId="f1" onUploaded={onUploaded} />);
const input = screen.getByTestId('upload-dropzone').querySelector('input[type="file"]') as HTMLInputElement;
const file = new File(['test content'], 'report.pdf', { type: 'application/pdf' });
fireEvent.change(input, { target: { files: [file] } });
await waitFor(() => {
expect(mockUploadFile).toHaveBeenCalledWith(file, 'f1');
});
await waitFor(() => {
expect(onUploaded).toHaveBeenCalled();
});
});
it('shows upload progress after file selection', async () => {
render(<UploadDropzone folderId={null} onUploaded={vi.fn()} />);
const input = screen.getByTestId('upload-dropzone').querySelector('input[type="file"]') as HTMLInputElement;
const file = new File(['data'], 'doc.pdf', { type: 'application/pdf' });
fireEvent.change(input, { target: { files: [file] } });
await waitFor(() => {
expect(screen.getByTestId('upload-progress-list')).toBeInTheDocument();
});
});
});