191 lines
6.2 KiB
Python
191 lines
6.2 KiB
Python
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
|