test(frontend): veraltete Testerwartungen an aktuelle UI angepasst — Tasks 3-Spalten-Layout mit Toolbar-Store statt Inline-Button, MiniAppBlock async-Fetch + DOMPurify-Attributentfernung, Router-QueryClientProvider, Toast-Mocks auf flache echte API-Signatur, automation-Mocks mockResolvedValue

This commit is contained in:
Agent Zero
2026-08-27 08:26:27 +02:00
parent 1a24e3e999
commit 1c52d3e502
6 changed files with 65 additions and 36 deletions
+13 -7
View File
@@ -3,7 +3,7 @@
*/
import { describe, it, expect, vi } from 'vitest';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { render, screen, fireEvent, waitFor, act } from '@testing-library/react';
import { TasksPage } from '@/pages/Tasks';
import * as tasksApi from '@/api/tasks';
@@ -12,6 +12,8 @@ vi.mock('react-i18next', () => ({
useTranslation: () => ({ t: (key: string) => key }),
}));
import { usePluginToolbarStore } from '@/store/pluginToolbarStore';
// Mock toast
vi.mock('@/components/ui/Toast', () => ({
useToast: () => ({
@@ -114,20 +116,24 @@ vi.mock('@/api/tasks', () => ({
describe('TasksPage', () => {
it('renders the tasks page with header', () => {
render(<TasksPage />);
expect(screen.getByTestId('tasks-page')).toBeInTheDocument();
expect(screen.getByText('tasks.title')).toBeInTheDocument();
expect(screen.getAllByTestId('tasks-page')[0]).toBeInTheDocument();
// Header + Detail-Karte beide nutzen tasks.title seit 3-Spalten-Layout
expect(screen.getAllByText('tasks.title').length).toBeGreaterThan(0);
});
it('renders task items from API', () => {
render(<TasksPage />);
expect(screen.getByText('Test Task')).toBeInTheDocument();
expect(screen.getByText('Test description')).toBeInTheDocument();
expect(screen.getAllByText('Test Task').length).toBeGreaterThan(0);
expect(screen.getAllByText('Test description').length).toBeGreaterThan(0);
});
it('opens create modal when create button is clicked', () => {
render(<TasksPage />);
const createBtn = screen.getByText('tasks.create');
fireEvent.click(createBtn);
// Seit UI-Overhaul Phase 4 lebt der Create-Button im PluginToolbarStore,
// nicht mehr als inline gerenderter Button.
const item = usePluginToolbarStore.getState().items.find((i) => i.id === 'new-task');
expect(item).toBeDefined();
act(() => { item!.onClick(); });
expect(screen.getByTestId('modal')).toBeInTheDocument();
expect(screen.getByTestId('task-title-input')).toBeInTheDocument();
});