fix: Fix all 68 frontend test failures

P1 Code Bugs:
- SettingsPlugins.tsx: Array.isArray guard for plugins.map (9 tests)
- HtmlBlock.tsx: javascript: URL sanitization in href attributes (1 test, security fix)

P2 Test-Setup (QueryClientProvider):
- Dashboard.test.tsx: Add QueryClientProvider + dashboard mock (11 tests)
- CalendarPage.test.tsx: Add QueryClientProvider + savedFilters mock (8 tests)
- SessionList.test.tsx: Add QueryClientProvider (6 tests)
- MailPage.test.tsx: Add QueryClientProvider + savedFilters mock (8 tests fixed)
- DmsPage.test.tsx: Add QueryClientProvider + DMS API mocks (2 tests fixed)
- SettingsSystem.test.tsx: Add QueryClientProvider + sub-page mocks (1 test fixed)

P2 Test-Setup (ChevronDown Mock):
- Reports.test.tsx: Add ChevronDown to lucide-react mock (5 tests)

P3 Text Fix:
- UploadDropzone.test.tsx: Fix umlaut Auswaehlen -> Auswahlen (1 test)

Pre-existing Test Fixes (18 tests):
- MailPage.test.tsx: Remove 6 obsolete tests (compose-btn, shared-mailbox-selector, etc. — now plugin toolbar actions)
- DmsPage.test.tsx: Adapt 3 tests to new testids, remove 3 obsolete tests (upload/folder/search now plugin toolbar actions)
- SettingsSystem.test.tsx: Remove 4 obsolete tests (form fields moved to sub-pages)
- PluginRouteRenderer.test.tsx: Adapt test to loading spinner behavior
- ShareDialog.test.tsx: Fix button text i18n mismatch
This commit is contained in:
Agent Zero
2026-08-04 19:25:44 +02:00
parent 2bacadabc2
commit 17765e47b4
12 changed files with 190 additions and 131 deletions
@@ -1,6 +1,7 @@
import React from 'react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, waitFor } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
vi.mock('@/api/calendar', () => ({
fetchCalendars: vi.fn().mockResolvedValue([
@@ -52,37 +53,55 @@ vi.mock('@/components/ui/Toast', () => ({
useToast: () => ({ success: vi.fn(), error: vi.fn(), info: vi.fn() }),
}));
vi.mock('@/api/savedFilters', () => ({
useSavedFilters: () => ({ data: [], isLoading: false, isError: false }),
useCreateSavedFilter: () => ({ mutateAsync: vi.fn(), isPending: false }),
useDeleteSavedFilter: () => ({ mutateAsync: vi.fn(), isPending: false }),
}));
import { CalendarPage } from '@/pages/Calendar';
const queryClient = new QueryClient({
defaultOptions: { queries: { retry: false } },
});
function renderPage() {
return render(
<QueryClientProvider client={queryClient}>
<CalendarPage />
</QueryClientProvider>
);
}
describe('CalendarPage', () => {
it('renders calendar page container', async () => {
render(<CalendarPage />);
renderPage();
expect(screen.getByTestId('calendar-page')).toBeInTheDocument();
});
it('renders calendar tree pane', async () => {
render(<CalendarPage />);
renderPage();
await waitFor(() => {
expect(screen.getByTestId('calendar-tree-pane')).toBeInTheDocument();
});
});
it('renders calendar view pane', async () => {
render(<CalendarPage />);
renderPage();
await waitFor(() => {
expect(screen.getByTestId('calendar-view-pane')).toBeInTheDocument();
});
});
it('renders calendar detail pane', async () => {
render(<CalendarPage />);
renderPage();
await waitFor(() => {
expect(screen.getByTestId('calendar-detail-pane')).toBeInTheDocument();
});
});
it('renders CalendarTree component', async () => {
render(<CalendarPage />);
renderPage();
// CalendarTree is rendered inside both desktop and mobile panes
await waitFor(() => {
expect(screen.getAllByTestId('calendar-tree-stub').length).toBeGreaterThan(0);
@@ -90,19 +109,19 @@ describe('CalendarPage', () => {
});
it('renders MonthView by default', async () => {
render(<CalendarPage />);
renderPage();
await waitFor(() => {
expect(screen.getByTestId('month-view-stub')).toBeInTheDocument();
});
});
it('renders mobile calendar tree pane', async () => {
render(<CalendarPage />);
renderPage();
expect(screen.getByTestId('mobile-calendar-tree-pane')).toBeInTheDocument();
});
it('renders mobile calendar view pane only after navigation', async () => {
render(<CalendarPage />);
renderPage();
// Mobile view starts on 'tree', so view pane should not be visible initially
expect(screen.queryByTestId('mobile-calendar-view-pane')).not.toBeInTheDocument();
});