import pytest from django.contrib.auth.models import User from django.urls import reverse @pytest.fixture def premium_user(db): user = User.objects.create_user(username="premium_user", password="password") user.profile.tier = "premium" user.profile.save() return user @pytest.fixture def free_user(db): user = User.objects.create_user(username="free_user", password="password") user.profile.tier = "free" user.profile.save() return user @pytest.mark.django_db def test_graph_neighbors_premium_access(client, premium_user, mock_container): client.force_login(premium_user) # Mock the return value of get_neighborhood mock_data = {"nodes": [{"id": "1"}], "links": []} mock_container.graph_persistence_port.get_neighborhood.return_value = mock_data from animetix.containers import container # noqa: E402 from dependency_injector import providers # noqa: E402 with container.persistence.graph_persistence_port.override( providers.Object(mock_container.graph_persistence_port) ): url = reverse("api_graph_neighbors") response = client.get(url, {"id": "123", "type": "Anime", "depth": 2}) assert response.status_code == 200 res_json = response.json() assert res_json["nodes"] == mock_data["nodes"] assert res_json["links"] == mock_data["links"] mock_container.graph_persistence_port.get_neighborhood.assert_called_once_with( "123", "Anime", 2 ) @pytest.mark.django_db def test_graph_neighbors_free_access(client, free_user, mock_container): # Premium gating was removed: free users can explore the graph too. client.force_login(free_user) mock_data = {"nodes": [{"id": "1"}], "links": []} mock_container.graph_persistence_port.get_neighborhood.return_value = mock_data from animetix.containers import container # noqa: E402 from dependency_injector import providers # noqa: E402 with container.persistence.graph_persistence_port.override( providers.Object(mock_container.graph_persistence_port) ): url = reverse("api_graph_neighbors") response = client.get(url, {"id": "123", "type": "Anime"}) assert response.status_code == 200 assert response.json()["nodes"] == mock_data["nodes"] @pytest.mark.django_db def test_graph_neighbors_unauthenticated_denied(client): url = reverse("api_graph_neighbors") response = client.get(url, {"id": "123", "type": "Anime"}) # DRF returns 403 if permission_classes = [IsAuthenticated] and not logged in # but since it's an API, it might return 401 depending on authentication settings. # Default DRF behavior for SessionAuthentication/BasicAuthentication is 403 for Forbidden if CSRF fails, # or 403 for Not Authenticated if not provided. assert response.status_code in [401, 403] @pytest.mark.django_db def test_graph_neighbors_missing_params(client, premium_user): client.force_login(premium_user) url = reverse("api_graph_neighbors") response = client.get(url, {"id": "123"}) # missing type assert response.status_code == 400 assert "required" in response.json()["error"] @pytest.mark.django_db def test_graph_neighbors_invalid_depth(client, premium_user): client.force_login(premium_user) url = reverse("api_graph_neighbors") response = client.get(url, {"id": "123", "type": "Anime", "depth": "invalid"}) assert response.status_code == 400 assert "integer" in response.json()["error"]