import { ExerciseOverview } from "@/components/Exercises/screens/ExerciseOverview";
import { getCategories } from "@/components/Exercises/api/category";
import { getEquipment } from "@/components/Exercises/api/equipment";
import { getExercises } from "@/components/Exercises/api/exercise";
import { getLanguages } from "@/components/Exercises/api/language";
import { getMuscles } from "@/components/Exercises/api/muscles";
import {
testCategories,
testEquipment,
testExerciseBenchPress,
testExerciseCrunches,
testExerciseCurls,
testExerciseSkullCrusher,
testExerciseSquats,
testLanguages,
testMuscles
} from "@/tests/exerciseTestdata";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { act, fireEvent, render, screen, waitFor, within } from '@testing-library/react';
import React from 'react';
import { BrowserRouter } from 'react-router-dom';
import type { Mock } from 'vitest';
vi.mock("@/components/Exercises/api/category");
vi.mock("@/components/Exercises/api/equipment");
vi.mock("@/components/Exercises/api/exercise");
vi.mock("@/components/Exercises/api/language");
vi.mock("@/components/Exercises/api/muscles");
const queryClient = new QueryClient();
describe("Test the ExerciseOverview component", () => {
beforeEach(() => {
(getLanguages as Mock).mockImplementation(() => Promise.resolve(testLanguages));
(getCategories as Mock).mockImplementation(() => Promise.resolve(testCategories));
(getMuscles as Mock).mockImplementation(() => Promise.resolve(testMuscles));
(getEquipment as Mock).mockImplementation(() => Promise.resolve(testEquipment));
(getExercises as Mock).mockImplementation(() => Promise.resolve([
testExerciseSquats,
testExerciseBenchPress,
testExerciseCurls,
testExerciseCrunches,
testExerciseSkullCrusher
]));
});
test('renders all exercises', async () => {
// Act
render(
);
// Assert
await waitFor(() => expect(getExercises).toHaveBeenCalledTimes(1));
expect(getCategories).toHaveBeenCalledTimes(1);
expect(getMuscles).toHaveBeenCalledTimes(1);
expect(getEquipment).toHaveBeenCalledTimes(1);
expect(await screen.findByText('Benchpress')).toBeInTheDocument();
expect(screen.getByText('Squats')).toBeInTheDocument();
expect(screen.getByText('Curls')).toBeInTheDocument();
expect(screen.getByText('Crunches')).toBeInTheDocument();
expect(screen.getByText('Skull crusher')).toBeInTheDocument();
});
test('filter one category', async () => {
// Act
render(
);
await act(() => Promise.resolve());
const { getByText: categoriesComponent } = within(screen.getByTestId('categories'));
fireEvent.click(categoriesComponent("Arms"));
// Assert
expect(screen.queryByText('Benchpress')).not.toBeInTheDocument();
expect(screen.queryByText('Squats')).not.toBeInTheDocument();
expect(screen.getByText('Curls')).toBeInTheDocument();
expect(screen.queryByText('Crunches')).not.toBeInTheDocument();
expect(screen.getByText('Skull crusher')).toBeInTheDocument();
});
test('filter two categories', async () => {
// Act
render(
);
await act(() => Promise.resolve());
const { getByText: categoriesComponent } = within(screen.getByTestId('categories'));
fireEvent.click(categoriesComponent("Arms"));
fireEvent.click(categoriesComponent("Legs"));
// Assert
expect(screen.getByText('Squats')).toBeInTheDocument();
expect(screen.getByText('Benchpress')).toBeInTheDocument();
expect(screen.getByText('Curls')).toBeInTheDocument();
expect(screen.queryByText('Crunches')).not.toBeInTheDocument();
expect(screen.getByText('Skull crusher')).toBeInTheDocument();
});
test('filter equipment', async () => {
// Act
render(
);
await act(() => Promise.resolve());
const { getByText: equipmentComponent } = within(screen.getByTestId('equipment'));
fireEvent.click(equipmentComponent("Barbell"));
// Assert
expect(screen.getByText('Squats')).toBeInTheDocument();
expect(screen.getByText('Benchpress')).toBeInTheDocument();
expect(screen.queryByText('Curls')).not.toBeInTheDocument();
expect(screen.queryByText('Crunches')).not.toBeInTheDocument();
expect(screen.getByText('Skull crusher')).toBeInTheDocument();
});
test('filter muscles', async () => {
// Act
render(
);
await act(() => Promise.resolve());
const { getByText: musclesComponent } = within(screen.getByTestId('muscles'));
fireEvent.click(musclesComponent("Biggus musculus"));
// Assert
expect(screen.getByText('Squats')).toBeInTheDocument();
expect(screen.queryByText('Benchpress')).not.toBeInTheDocument();
expect(screen.getByText('Curls')).toBeInTheDocument();
expect(screen.queryByText('Crunches')).not.toBeInTheDocument();
expect(screen.queryByText('Skull crusher')).not.toBeInTheDocument();
});
test('filter equipment and category', async () => {
// Act
render(
);
await act(() => Promise.resolve());
const { getByText: categoryComponent } = within(screen.getByTestId('categories'));
fireEvent.click(categoryComponent('Legs'));
const { getByText: equipmentComponent } = within(screen.getByTestId('equipment'));
fireEvent.click(equipmentComponent('Rocks'));
// Assert
expect(screen.getByText('Squats')).toBeInTheDocument();
expect(screen.getByText('Benchpress')).toBeInTheDocument();
expect(screen.queryByText('Curls')).not.toBeInTheDocument();
expect(screen.queryByText('Crunches')).not.toBeInTheDocument();
expect(screen.queryByText('Skull crusher')).not.toBeInTheDocument();
});
});