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