from datetime import date import pytest from django.contrib.auth.models import User from django.db import IntegrityError from apps.competitions.models import Competition, Season from apps.ingestion.models import ImportFile, ImportRun from apps.players.models import Nationality, Player, Position, Role from apps.scouting.models import FavoritePlayer, SavedSearch from apps.stats.models import PlayerSeason from apps.teams.models import Team @pytest.mark.django_db def test_player_unique_full_name_birth_date_constraint(): 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.objects.create( first_name="Marco", last_name="Rossi", full_name="Marco Rossi", birth_date=date(2001, 1, 1), nationality=nationality, nominal_position=position, inferred_role=role, source_uid="player-src-1", ) with pytest.raises(IntegrityError): Player.objects.create( first_name="Marco", last_name="Rossi", full_name="Marco Rossi", birth_date=date(2001, 1, 1), nationality=nationality, nominal_position=position, inferred_role=role, ) @pytest.mark.django_db def test_source_uid_uniqueness_on_core_entities(): season = Season.objects.create( source_uid="season-2024", label="2024-2025", start_date=date(2024, 10, 1), end_date=date(2025, 6, 30), ) competition = Competition.objects.create( source_uid="comp-001", name="Serie A", slug="serie-a", competition_type=Competition.CompetitionType.LEAGUE, ) team = Team.objects.create(source_uid="team-001", name="Virtus Bologna", slug="virtus-bologna") 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( source_uid="player-001", first_name="Juan", last_name="Perez", full_name="Juan Perez", birth_date=date(2000, 5, 1), nationality=nationality, nominal_position=position, inferred_role=role, ) PlayerSeason.objects.create( source_uid="ps-001", player=player, season=season, team=team, competition=competition, ) with pytest.raises(IntegrityError): Team.objects.create(source_uid="team-001", name="Another Team", slug="another-team") @pytest.mark.django_db def test_saved_search_unique_name_per_user_constraint(): user = User.objects.create_user(username="u1", password="pass12345") SavedSearch.objects.create(user=user, name="My Search", filters={"q": "rossi"}) with pytest.raises(IntegrityError): SavedSearch.objects.create(user=user, name="My Search", filters={"q": "martin"}) @pytest.mark.django_db def test_favorite_unique_player_per_user_constraint(): user = User.objects.create_user(username="u2", password="pass12345") nationality = Nationality.objects.create(name="France", iso2_code="FR", iso3_code="FRA") position = Position.objects.create(code="PF", name="Power Forward") role = Role.objects.create(code="big", name="Big") player = Player.objects.create( first_name="Pierre", last_name="Durand", full_name="Pierre Durand", birth_date=date(2001, 3, 3), nationality=nationality, nominal_position=position, inferred_role=role, ) FavoritePlayer.objects.create(user=user, player=player) with pytest.raises(IntegrityError): FavoritePlayer.objects.create(user=user, player=player) @pytest.mark.django_db def test_import_file_unique_path_within_import_run(): run = ImportRun.objects.create(source="daily_snapshot") ImportFile.objects.create(import_run=run, relative_path="players/2026-03-13.json") with pytest.raises(IntegrityError): ImportFile.objects.create(import_run=run, relative_path="players/2026-03-13.json")