diff --git a/src/components/Exercises/forms/VariationSelect.test.tsx b/src/components/Exercises/forms/VariationSelect.test.tsx index 0539e8b90..18642fd06 100644 --- a/src/components/Exercises/forms/VariationSelect.test.tsx +++ b/src/components/Exercises/forms/VariationSelect.test.tsx @@ -107,6 +107,21 @@ describe("VariationSelect", () => { expect(screen.queryByText("Skull crusher")).not.toBeInTheDocument(); }); + test("filters exercises by alias (case-insensitive)", async () => { + const user = userEvent.setup(); + renderSelect(); + const input = screen.getByRole("textbox", { name: /name/i }); + + // 'Beinverdicker' is an alias of the German translation of testExerciseSquats + await user.type(input, "beinverd"); + + expect(screen.getByText("Squats")).toBeInTheDocument(); + expect(screen.queryByText("Crunches")).not.toBeInTheDocument(); + expect(screen.queryByText("Benchpress")).not.toBeInTheDocument(); + expect(screen.queryByText("Curls")).not.toBeInTheDocument(); + expect(screen.queryByText("Skull crusher")).not.toBeInTheDocument(); + }); + test("hides the current exercise (exerciseId prop) from the standalone list", () => { // Squats has id 345 and no variation group, so passing its id should hide it renderSelect({ exerciseId: SQUATS_ID }); diff --git a/src/components/Exercises/forms/VariationSelect.tsx b/src/components/Exercises/forms/VariationSelect.tsx index 7e46add6b..8871cf275 100644 --- a/src/components/Exercises/forms/VariationSelect.tsx +++ b/src/components/Exercises/forms/VariationSelect.tsx @@ -149,7 +149,11 @@ export function VariationSelect({ let allExercises: Exercise[] = exercisesQuery.data; if (searchTerm !== '') { - allExercises = allExercises.filter((base) => base.getTranslation().name.toLowerCase().includes(searchTerm.toLowerCase())); + allExercises = allExercises.filter((base) => + base.getTranslation().name.toLowerCase().includes(searchTerm.toLowerCase()) + || base.translations.some((translation) => + translation.aliases.some((alias) => + alias.alias.toLowerCase().includes(searchTerm.toLowerCase())))); } // Group first (including current exercise, so groups show all members) diff --git a/src/components/Exercises/screens/Add/Step2Variations.test.tsx b/src/components/Exercises/screens/Add/Step2Variations.test.tsx index f16b3e34f..917af6400 100644 --- a/src/components/Exercises/screens/Add/Step2Variations.test.tsx +++ b/src/components/Exercises/screens/Add/Step2Variations.test.tsx @@ -6,7 +6,7 @@ import { Step2Variations } from "@/components/Exercises/screens/Add/Step2Variati import { useExercisesQuery } from "@/components/Exercises/queries"; import React from "react"; import { ExerciseSubmissionStateProvider } from "@/components/Exercises/screens/Add/state"; -import { testExerciseBenchPress, testExerciseCrunches, testExerciseCurls } from "@/tests/exerciseTestdata"; +import { testExerciseBenchPress, testExerciseCrunches, testExerciseCurls, testExerciseSquats } from "@/tests/exerciseTestdata"; import type { Mock } from 'vitest'; vi.mock('@/components/Exercises/queries'); @@ -161,4 +161,32 @@ describe("Test the add exercise step 2 component", () => { expect(screen.queryByText("Curls")).not.toBeInTheDocument(); expect(screen.queryByText("Crunches")).not.toBeInTheDocument(); }); + + test("can filter the exercises by alias", async () => { + // Arrange + const user = userEvent.setup(); + mockedUseExercisesQuery.mockImplementation(() => ({ + isLoading: false, + isSuccess: true, + data: [ + testExerciseBenchPress, + testExerciseCurls, + testExerciseCrunches, + testExerciseSquats, + ] + })); + + // Act + renderStep(); + const input = screen.getByRole('textbox', { name: /name/i }); + + // 'Beinverdicker' is an alias of the German translation of testExerciseSquats + await user.type(input, "beinverd"); + + // Assert + expect(screen.getByText("Squats")).toBeInTheDocument(); + expect(screen.queryByText("Benchpress")).not.toBeInTheDocument(); + expect(screen.queryByText("Curls")).not.toBeInTheDocument(); + expect(screen.queryByText("Crunches")).not.toBeInTheDocument(); + }); }); diff --git a/src/components/Exercises/screens/Add/Step2Variations.tsx b/src/components/Exercises/screens/Add/Step2Variations.tsx index 6fb4f9063..e2ecebdb3 100644 --- a/src/components/Exercises/screens/Add/Step2Variations.tsx +++ b/src/components/Exercises/screens/Add/Step2Variations.tsx @@ -120,7 +120,11 @@ export const Step2Variations = ({ onContinue, onBack }: StepProps) => { if (exercisesQuery.isSuccess) { exercises = exercisesQuery.data; if (searchTerm !== '') { - exercises = exercises.filter((base) => base.getTranslation().name.toLowerCase().includes(searchTerm.toLowerCase())); + exercises = exercises.filter((base) => + base.getTranslation().name.toLowerCase().includes(searchTerm.toLowerCase()) + || base.translations.some((translation) => + translation.aliases.some((alias) => + alias.alias.toLowerCase().includes(searchTerm.toLowerCase())))); } } groupedExercises = groupBy(exercises.filter(b => b.variationGroup !== null), (b: Exercise) => b.variationGroup!);