import { mockEnqueueSnackbar } from '@mocks/jest/helpers'; import { server } from '@mocks/jest/server'; import { screen, waitFor } from '@testing-library/react'; import { EditIncomeItemButtonHelper, EditIncomeItemFormHelper } from '@tests/helpers'; describe('TestEditIncomeItemButton', () => { test('should correct render button', () => { const { buttonElem } = EditIncomeItemButtonHelper.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 EditIncomeItemButtonHelper.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(EditIncomeItemButtonHelper.submitHandler(requestSpy)); modalElem = (await EditIncomeItemButtonHelper.openModal()).modalElem; await EditIncomeItemFormHelper.fillForm({ amount: 12, date: '29.08.2025', description: 'Описание элемента', title: 'Название элемента', }); }); test('should send correct request', () => { expect(requestSpy).toHaveBeenCalledTimes(1); expect(requestSpy).toHaveBeenCalledWith({ amount: 12, currency: 'RUB', date: '2025-08-29T00:00:00.000Z', description: 'Описание элемента', target: 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(EditIncomeItemButtonHelper.submitHandler(requestSpy, 500)); modalElem = (await EditIncomeItemButtonHelper.openModal()).modalElem; await EditIncomeItemFormHelper.fillForm({ amount: 12, 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' }); }); }); });