from datetime import date import pytest from django.urls import reverse from apps.competitions.models import Competition, Season from apps.players.models import Nationality, Player, PlayerAlias, Position, Role from apps.stats.models import PlayerSeason, PlayerSeasonStats from apps.teams.models import Team @pytest.mark.django_db def test_player_search_filters_by_name_and_position(client): nationality = Nationality.objects.create(name="Italy", iso2_code="IT", iso3_code="ITA") guard = Position.objects.create(code="PG", name="Point Guard") center = Position.objects.create(code="C", name="Center") role = Role.objects.create(code="playmaker", name="Playmaker") p1 = Player.objects.create( first_name="Marco", last_name="Rossi", full_name="Marco Rossi", birth_date=date(2001, 1, 10), nationality=nationality, nominal_position=guard, inferred_role=role, height_cm=190, weight_kg=82, ) PlayerAlias.objects.create(player=p1, alias="M. Rossi") Player.objects.create( first_name="Luca", last_name="Bianchi", full_name="Luca Bianchi", birth_date=date(1998, 2, 3), nationality=nationality, nominal_position=center, inferred_role=role, height_cm=208, weight_kg=105, ) response = client.get( reverse("players:index"), data={"q": "ross", "nominal_position": guard.id}, ) assert response.status_code == 200 players = response.context["players"] assert len(players) == 1 assert players[0].full_name == "Marco Rossi" @pytest.mark.django_db def test_player_search_htmx_returns_partial(client): nationality = Nationality.objects.create(name="Spain", iso2_code="ES", iso3_code="ESP") position = Position.objects.create(code="SG", name="Shooting Guard") role = Role.objects.create(code="shooter", name="Shooter") season = Season.objects.create(label="2025-2026", start_date=date(2025, 9, 1), end_date=date(2026, 6, 1)) competition = Competition.objects.create( name="Liga ACB", slug="liga-acb", competition_type=Competition.CompetitionType.LEAGUE, gender=Competition.Gender.MEN, country=nationality, ) team = Team.objects.create(name="Madrid", slug="madrid", country=nationality) player = Player.objects.create( first_name="Juan", last_name="Perez", full_name="Juan Perez", birth_date=date(2000, 4, 12), nationality=nationality, nominal_position=position, inferred_role=role, height_cm=196, weight_kg=90, ) season_row = PlayerSeason.objects.create( player=player, season=season, team=team, competition=competition, games_played=30, minutes_played=900, ) PlayerSeasonStats.objects.create( player_season=season_row, points=16.2, rebounds=4.3, assists=3.1, steals=1.4, blocks=0.3, turnovers=1.8, fg_pct=49.5, three_pct=38.2, ft_pct=84.1, player_efficiency_rating=18.7, ) response = client.get( reverse("players:index"), HTTP_HX_REQUEST="true", data={"points_per_game_min": 15}, ) assert response.status_code == 200 assert "Results" in response.content.decode() assert "Juan Perez" in response.content.decode() @pytest.mark.django_db def test_player_detail_page_loads(client): nationality = Nationality.objects.create(name="France", iso2_code="FR", iso3_code="FRA") position = Position.objects.create(code="SF", name="Small Forward") role = Role.objects.create(code="wing", name="Wing") player = Player.objects.create( first_name="Paul", last_name="Martin", full_name="Paul Martin", birth_date=date(1999, 8, 14), nationality=nationality, nominal_position=position, inferred_role=role, height_cm=201, weight_kg=95, ) PlayerAlias.objects.create(player=player, alias="P. Martin") response = client.get(reverse("players:detail", kwargs={"pk": player.pk})) assert response.status_code == 200 body = response.content.decode() assert "Paul Martin" in body assert "P. Martin" in body