Files
hoopscout/tests/test_scouting_views.py
2026-03-13 14:40:38 +01:00

222 lines
7.7 KiB
Python

from datetime import date
import pytest
from django.contrib.auth.models import User
from django.urls import reverse
from apps.players.models import Nationality, Player, Position, Role
from apps.scouting.models import FavoritePlayer, SavedSearch
@pytest.mark.django_db
def test_scouting_index_requires_login(client):
response = client.get(reverse("scouting:index"))
assert response.status_code == 302
assert reverse("users:login") in response.url
@pytest.mark.django_db
def test_saved_search_list_requires_login(client):
response = client.get(reverse("scouting:saved_search_list"))
assert response.status_code == 302
assert reverse("users:login") in response.url
@pytest.mark.django_db
def test_watchlist_requires_login(client):
response = client.get(reverse("scouting:watchlist"))
assert response.status_code == 302
assert reverse("users:login") in response.url
@pytest.mark.django_db
def test_create_saved_search_from_filters(client):
user = User.objects.create_user(username="scout", password="pass12345")
client.force_login(user)
nationality = Nationality.objects.create(name="Italy", iso2_code="IT", iso3_code="ITA")
position = Position.objects.create(code="PG", name="Point Guard")
response = client.post(
reverse("scouting:saved_search_create"),
data={
"name": "Italian guards",
"is_public": "on",
"q": "marco",
"nominal_position": str(position.id),
"nationality": str(nationality.id),
"age_max": "24",
"sort": "ppg_desc",
},
)
assert response.status_code == 302
saved = SavedSearch.objects.get(user=user, name="Italian guards")
assert saved.filters["q"] == "marco"
assert saved.filters["nominal_position"] == position.id
assert saved.filters["nationality"] == nationality.id
@pytest.mark.django_db
def test_saved_search_run_redirects_to_players(client):
user = User.objects.create_user(username="scout2", password="pass12345")
client.force_login(user)
saved = SavedSearch.objects.create(
user=user,
name="Run me",
filters={"q": "rossi", "sort": "name_asc"},
)
response = client.get(reverse("scouting:saved_search_run", kwargs={"pk": saved.pk}))
assert response.status_code == 302
assert response.url.startswith(reverse("players:index"))
assert "q=rossi" in response.url
@pytest.mark.django_db
def test_saved_search_update_renames_and_updates_filters(client):
user = User.objects.create_user(username="scout-update", password="pass12345")
client.force_login(user)
nationality = Nationality.objects.create(name="Germany", iso2_code="DE", iso3_code="DEU")
saved = SavedSearch.objects.create(
user=user,
name="Old Name",
filters={"q": "old", "sort": "name_asc"},
is_public=False,
)
response = client.post(
reverse("scouting:saved_search_edit", kwargs={"pk": saved.pk}),
data={
"name": "Updated Name",
"is_public": "on",
"filters_json": '{"q": "new", "nationality": %d, "sort": "ppg_desc"}' % nationality.id,
},
)
assert response.status_code == 302
saved.refresh_from_db()
assert saved.name == "Updated Name"
assert saved.is_public is True
assert saved.filters["q"] == "new"
assert saved.filters["nationality"] == nationality.id
assert saved.filters["sort"] == "ppg_desc"
@pytest.mark.django_db
def test_saved_search_delete_removes_entry(client):
user = User.objects.create_user(username="scout-delete", password="pass12345")
client.force_login(user)
saved = SavedSearch.objects.create(user=user, name="Delete Me", filters={"q": "x"})
response = client.post(reverse("scouting:saved_search_delete", kwargs={"pk": saved.pk}))
assert response.status_code == 302
assert not SavedSearch.objects.filter(pk=saved.pk).exists()
@pytest.mark.django_db
def test_saved_search_delete_htmx_renders_table(client):
user = User.objects.create_user(username="scout-delete-htmx", password="pass12345")
client.force_login(user)
saved = SavedSearch.objects.create(user=user, name="Delete HTMX", filters={"q": "x"})
response = client.post(
reverse("scouting:saved_search_delete", kwargs={"pk": saved.pk}),
HTTP_HX_REQUEST="true",
)
assert response.status_code == 200
body = response.content.decode().lower()
assert "no saved searches yet" in body
@pytest.mark.django_db
def test_favorite_toggle_adds_and_removes(client):
user = User.objects.create_user(username="scout3", password="pass12345")
client.force_login(user)
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="Ramos",
full_name="Juan Ramos",
birth_date=date(2000, 1, 1),
nationality=nationality,
nominal_position=position,
inferred_role=role,
)
add_resp = client.post(reverse("scouting:favorite_toggle", kwargs={"player_id": player.id}))
assert add_resp.status_code == 302
assert FavoritePlayer.objects.filter(user=user, player=player).exists()
remove_resp = client.post(reverse("scouting:favorite_toggle", kwargs={"player_id": player.id}))
assert remove_resp.status_code == 302
assert not FavoritePlayer.objects.filter(user=user, player=player).exists()
@pytest.mark.django_db
def test_favorite_toggle_htmx_returns_partial_button(client):
user = User.objects.create_user(username="scout4", password="pass12345")
client.force_login(user)
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,
)
response = client.post(
reverse("scouting:favorite_toggle", kwargs={"player_id": player.id}),
HTTP_HX_REQUEST="true",
data={"next": reverse("players:index")},
)
assert response.status_code == 200
assert "Remove favorite" in response.content.decode()
@pytest.mark.django_db
def test_save_search_htmx_feedback(client):
user = User.objects.create_user(username="scout5", password="pass12345")
client.force_login(user)
response = client.post(
reverse("scouting:saved_search_create"),
HTTP_HX_REQUEST="true",
data={"name": "HTMX Search", "q": "john", "sort": "name_asc"},
)
assert response.status_code == 200
assert "created" in response.content.decode().lower()
@pytest.mark.django_db
def test_watchlist_page_renders_favorite_player(client):
user = User.objects.create_user(username="watch-user", password="pass12345")
client.force_login(user)
nationality = Nationality.objects.create(name="Poland", iso2_code="PL", iso3_code="POL")
position = Position.objects.create(code="C", name="Center")
role = Role.objects.create(code="rim", name="Rim Protector")
player = Player.objects.create(
first_name="Adam",
last_name="Big",
full_name="Adam Big",
birth_date=date(2001, 1, 1),
nationality=nationality,
nominal_position=position,
inferred_role=role,
)
FavoritePlayer.objects.create(user=user, player=player)
response = client.get(reverse("scouting:watchlist"))
assert response.status_code == 200
assert "Adam Big" in response.content.decode()