Files
hoopscout/tests/test_models_domain.py
2026-03-20 15:08:20 +01:00

111 lines
3.9 KiB
Python

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.teams.models import Team
@pytest.mark.django_db
def test_source_uid_uniqueness_is_scoped_by_source_name():
Season.objects.create(
source_uid="season-2024",
label="2024-2025",
start_date=date(2024, 10, 1),
end_date=date(2025, 6, 30),
)
Competition.objects.create(
source_name="lba",
source_uid="comp-001",
name="Serie A",
slug="serie-a",
competition_type=Competition.CompetitionType.LEAGUE,
)
Team.objects.create(source_name="lba", 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.objects.create(
source_name="lba",
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,
)
Competition.objects.create(
source_name="bcl",
source_uid="comp-001",
name="BCL",
slug="bcl",
competition_type=Competition.CompetitionType.INTERNATIONAL,
)
Team.objects.create(source_name="bcl", source_uid="team-001", name="AEK", slug="aek")
Player.objects.create(
source_name="bcl",
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,
)
assert Competition.objects.filter(source_uid="comp-001").count() == 2
assert Team.objects.filter(source_uid="team-001").count() == 2
assert Player.objects.filter(source_uid="player-001").count() == 2
with pytest.raises(IntegrityError):
Team.objects.create(source_name="lba", 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")