import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { Meal } from "@/components/Nutrition/models/meal";
import { useAddMealQuery, useEditMealQuery } from "@/components/Nutrition/queries";
import { MealForm } from "@/components/Nutrition/widgets/forms/MealForm";
import { TEST_MEAL_1 } from "@/tests/nutritionTestdata";
import type { Mock } from 'vitest';
vi.mock('@/components/Nutrition/queries');
describe('Test the MealForm component', () => {
const queryClient = new QueryClient();
let mutateAddMock = vi.fn();
let mutateEditMock = vi.fn();
let closeFnMock = vi.fn();
beforeEach(() => {
mutateAddMock = vi.fn();
mutateEditMock = vi.fn();
closeFnMock = vi.fn();
(useEditMealQuery as Mock).mockImplementation(() => ({ mutate: mutateEditMock }));
(useAddMealQuery as Mock).mockImplementation(() => ({ mutate: mutateAddMock }));
});
test('a new meal is correctly added', async () => {
// Arrange
const user = userEvent.setup();
// Act
render(
);
const nameInput = screen.getByLabelText('description');
await user.clear(nameInput);
await user.type(nameInput, '2nd breakfast');
const submitButton = screen.getByRole('button', { name: 'submit' });
await user.click(submitButton);
// Assert
expect(mutateEditMock).not.toHaveBeenCalled();
expect(closeFnMock).toHaveBeenCalled();
expect(mutateAddMock).toHaveBeenCalledWith(new Meal({
name: '2nd breakfast',
planId: 'aaaaaaaa-0000-0000-0000-000000000987',
time: expect.any(Date),
}));
});
test('an existing meal is correctly edited', async () => {
// Arrange
const user = userEvent.setup();
// Act
render(
);
const nameInput = screen.getByLabelText('description');
await user.clear(nameInput);
await user.type(nameInput, '2nd breakfast');
const submitButton = screen.getByRole('button', { name: 'submit' });
await user.click(submitButton);
// Assert
expect(mutateAddMock).not.toHaveBeenCalled();
expect(closeFnMock).toHaveBeenCalled();
expect(mutateEditMock).toHaveBeenCalledWith(
expect.objectContaining({
id: 'bbbbbbbb-0000-0000-0000-000000000078',
name: '2nd breakfast',
order: 2,
planId: 'aaaaaaaa-0000-0000-0000-000000000123',
time: TEST_MEAL_1.time
})
);
});
});