import { mockEnqueueSnackbar } from '@mocks/jest/helpers'; import { server } from '@mocks/jest/server'; import { screen, waitFor } from '@testing-library/react'; import { AddExpenseItemButtonHelper, AddExpenseItemFormHelper } from '@tests/helpers'; describe('Test AddExpenseItemButton', () => { test('should correct render button', () => { const { buttonElem } = AddExpenseItemButtonHelper.renderButton(); expect(buttonElem).toBeInTheDocument(); expect(buttonElem).toBeVisible(); expect(buttonElem).toBeEnabled(); expect(buttonElem).toHaveTextContent('Добавить элемент'); const modal = screen.queryByRole('presentation'); expect(modal).not.toBeInTheDocument(); }); test('should open modal after click', async () => { const { modalElem } = await AddExpenseItemButtonHelper.openModal(); expect(modalElem).toBeInTheDocument(); expect(modalElem).toBeVisible(); }); describe('should close modal after success request', () => { let modalElem: HTMLElement; const requestSpy = jest.fn(); beforeEach(async () => { server.use(AddExpenseItemButtonHelper.submitHandler(requestSpy)); modalElem = (await AddExpenseItemButtonHelper.openModal()).modalElem; await AddExpenseItemFormHelper.fillForm({ amount: '12', count: '1', date: '29.08.2025', description: 'Описание элемента', title: 'Название элемента', }); }); test('should send correct request', () => { expect(requestSpy).toHaveBeenCalledTimes(1); expect(requestSpy).toHaveBeenCalledWith({ amount: 12, count: 1, currency: 'RUB', date: '2025-08-29T00:00:00.000Z', description: 'Описание элемента', payment: null, title: 'Название элемента', }); }); test('should close modal after submit', async () => { await waitFor(() => { expect(modalElem).not.toBeInTheDocument(); }); }); test('should show success notification', () => { expect(mockEnqueueSnackbar).toHaveBeenCalledTimes(1); expect(mockEnqueueSnackbar).toHaveBeenCalledWith('Расход "Название элемента" успешно добавлен', { variant: 'success' }); }); }); describe('should not close modal after failed request', () => { let modalElem: HTMLElement; const requestSpy = jest.fn(); beforeEach(async () => { server.use(AddExpenseItemButtonHelper.submitHandler(requestSpy, 500)); modalElem = (await AddExpenseItemButtonHelper.openModal()).modalElem; await AddExpenseItemFormHelper.fillForm({ amount: '12', count: '1', date: '29.08.2025', description: 'Описание элемента', title: 'Название элемента', }); }); test('should not close modal after submit', () => { expect(modalElem).toBeInTheDocument(); }); test('should show error notification', () => { expect(mockEnqueueSnackbar).toHaveBeenCalledTimes(1); expect(mockEnqueueSnackbar).toHaveBeenCalledWith('Ошибка при добавлении расхода', { variant: 'error' }); }); }); });