feat(players): add origin competition/team model and filtering
This commit is contained in:
@ -25,6 +25,7 @@ def test_run_full_sync_creates_domain_objects(settings):
|
||||
assert Player.objects.count() >= 1
|
||||
assert PlayerSeason.objects.count() >= 1
|
||||
assert PlayerSeasonStats.objects.count() >= 1
|
||||
assert Player.objects.filter(origin_competition__isnull=False).exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
|
||||
190
tests/test_player_origin.py
Normal file
190
tests/test_player_origin.py
Normal file
@ -0,0 +1,190 @@
|
||||
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, PlayerCareerEntry, Position, Role
|
||||
from apps.players.services.origin import refresh_player_origin, refresh_player_origins
|
||||
from apps.teams.models import Team
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_origin_derivation_uses_earliest_meaningful_career_entry():
|
||||
nationality = Nationality.objects.create(name="Italy", iso2_code="IT", iso3_code="ITA")
|
||||
position = Position.objects.create(code="PG", name="Point Guard")
|
||||
role = Role.objects.create(code="playmaker", name="Playmaker")
|
||||
|
||||
player = Player.objects.create(
|
||||
first_name="Marco",
|
||||
last_name="Rossi",
|
||||
full_name="Marco Rossi",
|
||||
birth_date=date(2000, 1, 1),
|
||||
nationality=nationality,
|
||||
nominal_position=position,
|
||||
inferred_role=role,
|
||||
)
|
||||
|
||||
comp_early = Competition.objects.create(
|
||||
name="Lega 2",
|
||||
slug="lega-2",
|
||||
competition_type=Competition.CompetitionType.LEAGUE,
|
||||
gender=Competition.Gender.MEN,
|
||||
)
|
||||
comp_late = Competition.objects.create(
|
||||
name="Lega 1",
|
||||
slug="lega-1",
|
||||
competition_type=Competition.CompetitionType.LEAGUE,
|
||||
gender=Competition.Gender.MEN,
|
||||
)
|
||||
team_early = Team.objects.create(name="Bologna B", slug="bologna-b", country=nationality)
|
||||
team_late = Team.objects.create(name="Bologna A", slug="bologna-a", country=nationality)
|
||||
|
||||
season_early = Season.objects.create(label="2017-2018", start_date=date(2017, 9, 1), end_date=date(2018, 6, 30))
|
||||
season_late = Season.objects.create(label="2019-2020", start_date=date(2019, 9, 1), end_date=date(2020, 6, 30))
|
||||
|
||||
PlayerCareerEntry.objects.create(
|
||||
player=player,
|
||||
team=team_late,
|
||||
competition=comp_late,
|
||||
season=season_late,
|
||||
start_date=date(2019, 9, 15),
|
||||
)
|
||||
PlayerCareerEntry.objects.create(
|
||||
player=player,
|
||||
team=team_early,
|
||||
competition=comp_early,
|
||||
season=season_early,
|
||||
start_date=date(2017, 9, 15),
|
||||
)
|
||||
|
||||
changed = refresh_player_origin(player)
|
||||
|
||||
assert changed is True
|
||||
player.refresh_from_db()
|
||||
assert player.origin_competition == comp_early
|
||||
assert player.origin_team == team_early
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_origin_unknown_when_no_meaningful_career_entries():
|
||||
nationality = Nationality.objects.create(name="Spain", iso2_code="ES", iso3_code="ESP")
|
||||
position = Position.objects.create(code="SF", name="Small Forward")
|
||||
role = Role.objects.create(code="wing", name="Wing")
|
||||
|
||||
player = Player.objects.create(
|
||||
first_name="Juan",
|
||||
last_name="Perez",
|
||||
full_name="Juan Perez",
|
||||
birth_date=date(2001, 5, 1),
|
||||
nationality=nationality,
|
||||
nominal_position=position,
|
||||
inferred_role=role,
|
||||
)
|
||||
|
||||
changed = refresh_player_origin(player)
|
||||
|
||||
assert changed is False
|
||||
player.refresh_from_db()
|
||||
assert player.origin_competition is None
|
||||
assert player.origin_team is None
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_player_search_filters_by_origin_competition(client):
|
||||
nationality = Nationality.objects.create(name="France", iso2_code="FR", iso3_code="FRA")
|
||||
position = Position.objects.create(code="SG", name="Shooting Guard")
|
||||
role = Role.objects.create(code="scorer", name="Scorer")
|
||||
|
||||
origin_a = Competition.objects.create(
|
||||
name="LNB Pro A",
|
||||
slug="lnb-pro-a-origin",
|
||||
competition_type=Competition.CompetitionType.LEAGUE,
|
||||
gender=Competition.Gender.MEN,
|
||||
)
|
||||
origin_b = Competition.objects.create(
|
||||
name="LNB Pro B",
|
||||
slug="lnb-pro-b-origin",
|
||||
competition_type=Competition.CompetitionType.LEAGUE,
|
||||
gender=Competition.Gender.MEN,
|
||||
)
|
||||
|
||||
p1 = Player.objects.create(
|
||||
first_name="A",
|
||||
last_name="One",
|
||||
full_name="A One",
|
||||
birth_date=date(2000, 1, 1),
|
||||
nationality=nationality,
|
||||
nominal_position=position,
|
||||
inferred_role=role,
|
||||
origin_competition=origin_a,
|
||||
)
|
||||
Player.objects.create(
|
||||
first_name="B",
|
||||
last_name="Two",
|
||||
full_name="B Two",
|
||||
birth_date=date(2000, 1, 1),
|
||||
nationality=nationality,
|
||||
nominal_position=position,
|
||||
inferred_role=role,
|
||||
origin_competition=origin_b,
|
||||
)
|
||||
|
||||
response = client.get(reverse("players:index"), data={"origin_competition": origin_a.id})
|
||||
|
||||
assert response.status_code == 200
|
||||
players = list(response.context["players"])
|
||||
assert len(players) == 1
|
||||
assert players[0].id == p1.id
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_backfill_refresh_player_origins_updates_existing_players():
|
||||
nationality = Nationality.objects.create(name="Germany", iso2_code="DE", iso3_code="DEU")
|
||||
position = Position.objects.create(code="PF", name="Power Forward")
|
||||
role = Role.objects.create(code="big", name="Big")
|
||||
competition = Competition.objects.create(
|
||||
name="BBL",
|
||||
slug="bbl-origin",
|
||||
competition_type=Competition.CompetitionType.LEAGUE,
|
||||
gender=Competition.Gender.MEN,
|
||||
)
|
||||
team = Team.objects.create(name="Berlin", slug="berlin-origin", country=nationality)
|
||||
season = Season.objects.create(label="2018-2019", start_date=date(2018, 9, 1), end_date=date(2019, 6, 30))
|
||||
|
||||
p1 = Player.objects.create(
|
||||
first_name="F1",
|
||||
last_name="L1",
|
||||
full_name="Player One",
|
||||
birth_date=date(1999, 1, 1),
|
||||
nationality=nationality,
|
||||
nominal_position=position,
|
||||
inferred_role=role,
|
||||
)
|
||||
p2 = Player.objects.create(
|
||||
first_name="F2",
|
||||
last_name="L2",
|
||||
full_name="Player Two",
|
||||
birth_date=date(1998, 1, 1),
|
||||
nationality=nationality,
|
||||
nominal_position=position,
|
||||
inferred_role=role,
|
||||
)
|
||||
|
||||
PlayerCareerEntry.objects.create(
|
||||
player=p1,
|
||||
team=team,
|
||||
competition=competition,
|
||||
season=season,
|
||||
start_date=date(2018, 9, 10),
|
||||
)
|
||||
|
||||
updated = refresh_player_origins(Player.objects.filter(id__in=[p1.id, p2.id]))
|
||||
|
||||
assert updated == 1
|
||||
p1.refresh_from_db()
|
||||
p2.refresh_from_db()
|
||||
assert p1.origin_competition == competition
|
||||
assert p1.origin_team == team
|
||||
assert p2.origin_competition is None
|
||||
assert p2.origin_team is None
|
||||
Reference in New Issue
Block a user