111 lines
3.9 KiB
Python
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")
|