feat(v2): implement scoped player search and detail flows

This commit is contained in:
Alfredo Di Stasio
2026-03-13 14:10:39 +01:00
parent eacff3d25e
commit 6fc583c79f
10 changed files with 137 additions and 129 deletions

View File

@ -83,8 +83,6 @@ def test_players_api_search_consistent_with_ui_filters(client):
nationality=nationality,
nominal_position=position,
inferred_role=role,
origin_competition=competition,
origin_team=team,
)
ps = PlayerSeason.objects.create(
player=matching,
@ -113,7 +111,7 @@ def test_players_api_search_consistent_with_ui_filters(client):
)
params = {
"origin_competition": competition.id,
"competition": competition.id,
"nominal_position": position.id,
"points_per_game_min": "10",
"sort": "ppg_desc",

View File

@ -110,8 +110,6 @@ def test_player_search_combined_filters_sorting_and_pagination(client):
nationality=nationality,
nominal_position=position,
inferred_role=role,
origin_competition=competition,
origin_team=team,
)
player_season = PlayerSeason.objects.create(
player=player,
@ -135,7 +133,7 @@ def test_player_search_combined_filters_sorting_and_pagination(client):
response = client.get(
reverse("players:index"),
data={
"origin_competition": competition.id,
"competition": competition.id,
"nominal_position": position.id,
"sort": "ppg_desc",
"page_size": 20,
@ -152,7 +150,7 @@ def test_player_search_combined_filters_sorting_and_pagination(client):
page2 = client.get(
reverse("players:index"),
data={
"origin_competition": competition.id,
"competition": competition.id,
"nominal_position": position.id,
"sort": "ppg_desc",
"page_size": 20,

View File

@ -4,7 +4,7 @@ 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.players.models import Nationality, Player, Position, Role
from apps.stats.models import PlayerSeason, PlayerSeasonStats
from apps.teams.models import Team
@ -127,14 +127,13 @@ def test_player_detail_page_loads(client):
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
assert "Summary" in body
assert "Season-by-Season Stats" in body
@pytest.mark.django_db
@ -242,3 +241,44 @@ def test_player_search_results_render_best_eligible_metric_labels(client):
assert "Best Eligible PPG" in body
assert "Best Eligible MPG" in body
assert "best eligible values per player" in body.lower()
@pytest.mark.django_db
def test_player_search_results_render_dash_for_missing_eligible_metrics(client):
nationality = Nationality.objects.create(name="Norway", iso2_code="NO", iso3_code="NOR")
position = Position.objects.create(code="PF", name="Power Forward")
role = Role.objects.create(code="big", name="Big")
season = Season.objects.create(label="2025-2026", start_date=date(2025, 9, 1), end_date=date(2026, 6, 30))
competition = Competition.objects.create(
name="BLNO",
slug="blno",
competition_type=Competition.CompetitionType.LEAGUE,
gender=Competition.Gender.MEN,
country=nationality,
)
team = Team.objects.create(name="Oslo", slug="oslo", country=nationality)
player = Player.objects.create(
first_name="Ole",
last_name="NoStats",
full_name="Ole NoStats",
birth_date=date(2001, 1, 1),
nationality=nationality,
nominal_position=position,
inferred_role=role,
)
PlayerSeason.objects.create(
player=player,
season=season,
team=team,
competition=competition,
games_played=0,
minutes_played=0,
)
response = client.get(reverse("players:index"), data={"season": season.id})
assert response.status_code == 200
body = response.content.decode()
assert "Ole NoStats" in body
# Missing eligible values are rendered as '-' rather than misleading zeros.
assert body.count(">-") > 0