phase4: implement player search filters, htmx results, and detail page

This commit is contained in:
Alfredo Di Stasio
2026-03-10 10:52:50 +01:00
parent fc7289a343
commit c83bc96b6c
12 changed files with 982 additions and 7 deletions

137
tests/test_players_views.py Normal file
View File

@ -0,0 +1,137 @@
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