from django.contrib.auth.models import User from django.test import TestCase from exercise.models import Exercise from generator.models import UserPreference from generator.services.exercise_selector import ( ExerciseSelector, extract_movement_families, ) from registered_user.models import RegisteredUser class TestExerciseFamilyDedup(TestCase): def setUp(self): django_user = User.objects.create_user( username='family_dedup_user', password='testpass123', ) registered_user = RegisteredUser.objects.create( user=django_user, first_name='Family', last_name='Dedup', ) self.preference = UserPreference.objects.create( registered_user=registered_user, days_per_week=4, fitness_level=2, ) def test_high_pull_maps_to_clean_family(self): clean_pull_families = extract_movement_families('Barbell Clean Pull') high_pull_families = extract_movement_families('Barbell High Pull') self.assertIn('clean', clean_pull_families) self.assertIn('clean', high_pull_families) def test_high_pull_blocked_when_clean_family_already_used(self): high_pull = Exercise.objects.create( name='Barbell High Pull', movement_patterns='lower pull,lower pull - hip hinge', muscle_groups='glutes,hamstrings,traps', is_reps=True, is_duration=False, is_weight=True, is_compound=True, exercise_tier='secondary', complexity_rating=3, difficulty_level='intermediate', ) selector = ExerciseSelector(self.preference) selector.used_movement_families['clean'] = 1 selected = selector._weighted_pick( Exercise.objects.filter(pk=high_pull.pk), Exercise.objects.none(), count=1, ) self.assertEqual( selected, [], 'High-pull variant should be blocked when clean family is already used.', )