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()