Spaces:
Build error
Build error
| import pytest | |
| from django.contrib.auth.models import User | |
| from django.urls import reverse | |
| def premium_user(db): | |
| user = User.objects.create_user(username="premium_user", password="password") | |
| user.profile.tier = "premium" | |
| user.profile.save() | |
| return user | |
| def free_user(db): | |
| user = User.objects.create_user(username="free_user", password="password") | |
| user.profile.tier = "free" | |
| user.profile.save() | |
| return user | |
| 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 | |
| ) | |
| 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"] | |
| 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] | |
| 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"] | |
| 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"] | |