import { describe, it, expect, vi, beforeEach } from 'vitest' import { render, screen, fireEvent, waitFor } from '@testing-library/react' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import EditTaskModal from '../components/EditTaskModal' vi.mock('../api/client', () => ({ default: { post: vi.fn(), get: vi.fn(), put: vi.fn(), delete: vi.fn(), interceptors: { request: { use: vi.fn() }, response: { use: vi.fn() } }, }, })) vi.mock('../api/tasks', () => ({ tasksApi: { update: vi.fn(), delete: vi.fn(), }, })) import { tasksApi } from '../api/tasks' const mockTask = { id: 1, title: 'Test Task', description: 'Description', color: '#6366f1', icon: '📋', due_date: '2026-03-26', priority: 1, reminder_time: null, is_recurring: false, recurrence_type: null, recurrence_interval: 1, recurrence_end_date: null, } const renderModal = (props = {}) => { const qc = new QueryClient({ defaultOptions: { queries: { retry: false }, mutations: { retry: false } } }) return render( ) } describe('EditTaskModal', () => { beforeEach(() => { vi.clearAllMocks() }) it('does not render when open=false', () => { const qc = new QueryClient() render( ) expect(screen.queryByText('Редактировать задачу')).not.toBeInTheDocument() }) it('renders with task data pre-filled', () => { renderModal() const titleInput = screen.getByDisplayValue('Test Task') expect(titleInput).toBeInTheDocument() }) it('renders edit modal title', () => { renderModal() expect(screen.getByText('Редактировать задачу')).toBeInTheDocument() }) it('submits updated task', async () => { tasksApi.update.mockResolvedValueOnce({ id: 1, title: 'Updated' }) renderModal() const titleInput = screen.getByDisplayValue('Test Task') fireEvent.change(titleInput, { target: { value: 'Updated Task' } }) fireEvent.click(screen.getByText('Сохранить')) await waitFor(() => { expect(tasksApi.update).toHaveBeenCalled() }) }) it('shows delete confirmation button', () => { renderModal() // Button says "Удалить задачу" expect(screen.getByText('Удалить задачу')).toBeInTheDocument() }) it('shows delete confirmation when delete clicked', () => { renderModal() fireEvent.click(screen.getByText('Удалить задачу')) // Confirmation shows "Да, удалить" expect(screen.getByText('Да, удалить')).toBeInTheDocument() }) it('deletes task after confirmation', async () => { tasksApi.delete.mockResolvedValueOnce({}) renderModal() fireEvent.click(screen.getByText('Удалить задачу')) fireEvent.click(screen.getByText('Да, удалить')) await waitFor(() => { expect(tasksApi.delete).toHaveBeenCalledWith(1) }) }) })