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:
@@ -2,6 +2,7 @@ import React from 'react';
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
||||
import { MemoryRouter } from 'react-router-dom';
|
||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
||||
|
||||
vi.mock('@/api/mail', () => ({
|
||||
decodeMimeHeader: (s: string) => s,
|
||||
@@ -38,10 +39,24 @@ vi.mock('@/components/ui/Toast', () => ({
|
||||
useToast: () => ({ success: vi.fn(), error: vi.fn(), info: vi.fn(), warning: 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 { MailPage } from '@/pages/Mail';
|
||||
|
||||
const queryClient = new QueryClient({
|
||||
defaultOptions: { queries: { retry: false } },
|
||||
});
|
||||
|
||||
function renderWithRouter() {
|
||||
return render(<MemoryRouter><MailPage /></MemoryRouter>);
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<MemoryRouter><MailPage /></MemoryRouter>
|
||||
</QueryClientProvider>
|
||||
);
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -77,26 +92,9 @@ describe('MailPage', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('renders compose button', async () => {
|
||||
renderWithRouter();
|
||||
await waitFor(() => {
|
||||
expect(screen.getByTestId('compose-btn')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
it('renders shared mailbox selector', async () => {
|
||||
renderWithRouter();
|
||||
await waitFor(() => {
|
||||
expect(screen.getByTestId('shared-mailbox-selector')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
it('renders mail search bar', async () => {
|
||||
renderWithRouter();
|
||||
await waitFor(() => {
|
||||
expect(screen.getByTestId('mail-search-bar')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
// REMOVED: 'renders compose button' — compose is now a plugin toolbar action, not a direct page element
|
||||
// REMOVED: 'renders shared mailbox selector' — account selection integrated into folder tree, selector no longer exists
|
||||
// REMOVED: 'renders mail search bar' — search is now a plugin toolbar action
|
||||
|
||||
it('renders folders after loading', async () => {
|
||||
renderWithRouter();
|
||||
@@ -114,23 +112,8 @@ describe('MailPage', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('shows compose modal when compose button is clicked', async () => {
|
||||
renderWithRouter();
|
||||
await waitFor(() => {
|
||||
const btn = screen.getByTestId('compose-btn');
|
||||
fireEvent.click(btn);
|
||||
expect(screen.getByTestId('compose-modal')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
it('shows compose toolbar with bold and italic buttons', async () => {
|
||||
renderWithRouter();
|
||||
await waitFor(() => {
|
||||
const btn = screen.getByTestId('compose-btn');
|
||||
fireEvent.click(btn);
|
||||
expect(screen.getByTestId('compose-toolbar')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
// REMOVED: 'shows compose modal when compose button is clicked' — compose now opens as a window via windowStore, not a modal in the page
|
||||
// REMOVED: 'shows compose toolbar with bold and italic buttons' — compose form is in a separate window, not directly in MailPage
|
||||
|
||||
it('renders mail detail empty state initially', async () => {
|
||||
renderWithRouter();
|
||||
@@ -150,14 +133,5 @@ describe('MailPage', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('shows reply and forward buttons in mail detail', async () => {
|
||||
renderWithRouter();
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText('Test Subject')).toBeInTheDocument();
|
||||
});
|
||||
fireEvent.click(screen.getByText('Test Subject'));
|
||||
await waitFor(() => {
|
||||
expect(screen.getAllByTestId('mail-detail-toolbar').length).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
// REMOVED: 'shows reply and forward buttons in mail detail' — reply/forward are now plugin toolbar actions, not elements within mail-detail. mail-detail-toolbar testid no longer exists.
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user