phase4: implement player search filters, htmx results, and detail page
This commit is contained in:
137
tests/test_players_views.py
Normal file
137
tests/test_players_views.py
Normal 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
|
||||
Reference in New Issue
Block a user