import { render, screen } from '@testing-library/react'; import userEvent from "@testing-library/user-event"; import { useLanguageQuery } from "@/components/Exercises"; import { useAddRoutineLogsQuery, useRoutineDetailQuery } from "@/components/Routines/queries"; import { SessionLogsForm } from '@/components/Routines/widgets/forms/SessionLogsForm'; import { DateTime } from "luxon"; import { testLanguages } from "@/tests/exerciseTestdata"; import { testRoutine1 } from "@/tests/workoutRoutinesTestData"; import type { Mock } from 'vitest'; vi.mock("@/components/Exercises/queries"); vi.mock("@/components/Routines/queries"); describe('SessionLogsForm', () => { const mockUseLanguageQuery = useLanguageQuery as Mock; const mockAddLogsQuery = useAddRoutineLogsQuery as Mock; const mockRoutineDetailQuery = useRoutineDetailQuery as Mock; const mockMutateAsync = vi.fn(); beforeEach(() => { vi.clearAllMocks(); mockRoutineDetailQuery.mockReturnValue({ isLoading: false, data: testRoutine1, }); mockAddLogsQuery.mockReturnValue({ isPending: false, data: {}, mutateAsync: mockMutateAsync, }); mockUseLanguageQuery.mockReturnValue({ isLoading: false, data: testLanguages, }); }); test('renders correct exercises from routine', async () => { render(); expect(screen.getByText('Squats')).toBeInTheDocument(); }); test('submits with correct parameters', async () => { // Arrange const user = userEvent.setup(); const originalData = { routine: 1, day: 5, exercise: 345, repetitions: 5, rir: 2, weight: 20, }; const updatedData = { ...originalData, repetitions: "17", weight: "42", }; // Act render(); const weightElements = screen.getAllByRole('textbox').filter(input => (input as HTMLInputElement).value === '20'); await user.click(weightElements[0]); await user.clear(weightElements[0]); await user.type(weightElements[0], "42"); const repsElements = screen.getAllByRole('textbox').filter(input => (input as HTMLInputElement).value === '5'); await user.click(repsElements[0]); await user.clear(repsElements[0]); await user.type(repsElements[0], "17"); await user.click(screen.getByRole('button', { name: /submit/i })); // Assert expect(mockMutateAsync.mock.calls[0][0].length).toEqual(4); expect(mockMutateAsync.mock.calls[0][0][0]).toMatchObject(updatedData); expect(mockMutateAsync.mock.calls[0][0][1]).toMatchObject(originalData); expect(mockMutateAsync.mock.calls[0][0][2]).toMatchObject(originalData); expect(mockMutateAsync.mock.calls[0][0][3]).toMatchObject(originalData); }); test('add log action buttons works', async () => { // Arrange const user = userEvent.setup(); // Act render(); await user.click(screen.getByTestId('AddIcon')); await user.click(screen.getByRole('button', { name: /submit/i })); // Assert - one more than before expect(mockMutateAsync.mock.calls[0][0].length).toEqual(5); }); test('delete exercise action buttons works', async () => { // Arrange const user = userEvent.setup(); // Act render(); await user.click(screen.getAllByTestId('DeleteOutlinedIcon')[0]); // Assert expect(screen.queryByText('Squats')).not.toBeInTheDocument(); }); });