Spaces:
Running
Running
| from unittest.mock import MagicMock | |
| import pytest | |
| from animetix.containers import container | |
| from dependency_injector import providers | |
| from django.contrib.auth.models import User | |
| from django.urls import reverse | |
| from rest_framework.test import APIClient | |
| def api_client(): | |
| return APIClient() | |
| def authenticated_user(api_client, db): | |
| user = User.objects.create_user(username="testuser", password="password") | |
| api_client.force_authenticate(user=user) | |
| return user | |
| def test_multiverse_gallery_view(api_client, authenticated_user, mock_container): | |
| # Mock Neo4j execute_query for Gallery | |
| # Record format: m (media), g (genre), characters (list of characters) | |
| mock_media = MagicMock() | |
| mock_media.get.side_effect = lambda key, default=None: { | |
| "name": "Synthetic Naruto", | |
| "description": "A synthetic ninja world", | |
| "cosmology": "Chakra system", | |
| }.get(key, default) | |
| mock_genre = MagicMock() | |
| mock_genre.get.side_effect = lambda key, default=None: { | |
| "name": "Shonen", | |
| }.get(key, default) | |
| mock_char = MagicMock() | |
| mock_char.get.side_effect = lambda key, default=None: { | |
| "name": "Boruto", | |
| }.get(key, default) | |
| mock_record = { | |
| "m": mock_media, | |
| "g": mock_genre, | |
| "characters": [mock_char], | |
| } | |
| mock_container.graph_persistence_port.execute_query.return_value = [mock_record] | |
| with container.persistence.graph_persistence_port.override( | |
| providers.Object(mock_container.graph_persistence_port) | |
| ): | |
| url = reverse("api_multiverse_gallery") | |
| response = api_client.get(url) | |
| assert response.status_code == 200 | |
| res_json = response.json() | |
| assert "nodes" in res_json | |
| assert "links" in res_json | |
| # Verify nodes formatting | |
| nodes = res_json["nodes"] | |
| assert any(n["id"] == "genre_Shonen" and n["type"] == "genre" for n in nodes) | |
| assert any( | |
| n["id"] == "Synthetic Naruto" | |
| and n["type"] == "universe" | |
| and n["metadata"]["description"] == "A synthetic ninja world" | |
| for n in nodes | |
| ) | |
| # Verify links formatting | |
| links = res_json["links"] | |
| assert any( | |
| link["source"] == "Synthetic Naruto" and link["target"] == "genre_Shonen" | |
| for link in links | |
| ) | |
| def test_multiverse_catalog_view(api_client, authenticated_user, mock_container): | |
| # Mock Neo4j execute_query calls for: | |
| # 1. Count query | |
| # 2. Main data query | |
| # 3. Available genres query | |
| mock_container.graph_persistence_port.execute_query.side_effect = [ | |
| [{"total": 1}], # Count result | |
| [ # Data result | |
| { | |
| "media": { | |
| "name": "Synthetic One Piece", | |
| "description": "Pirates and oceans", | |
| "cosmology": "Devil fruits", | |
| "created_at": "2026-06-19T00:00:00Z", | |
| }, | |
| "genre": {"name": "Shonen"}, | |
| "characters": [ | |
| {"name": "Luffy", "role": "Protagonist", "power_level": 9000} | |
| ], | |
| "char_count": 1, | |
| } | |
| ], | |
| [{"name": "Shonen", "count": 1}], # Genres result | |
| ] | |
| with container.persistence.graph_persistence_port.override( | |
| providers.Object(mock_container.graph_persistence_port) | |
| ): | |
| url = reverse("api_multiverse_catalog") | |
| response = api_client.get( | |
| url, | |
| { | |
| "search": "Pirate", | |
| "genre": "Shonen", | |
| "sort": "newest", | |
| "page": 1, | |
| "page_size": 10, | |
| }, | |
| ) | |
| assert response.status_code == 200 | |
| res_json = response.json() | |
| # Verify pagination | |
| assert "pagination" in res_json | |
| assert res_json["pagination"]["total"] == 1 | |
| assert res_json["pagination"]["total_pages"] == 1 | |
| # Verify results | |
| assert "results" in res_json | |
| assert len(res_json["results"]) == 1 | |
| univ = res_json["results"][0] | |
| assert univ["name"] == "Synthetic One Piece" | |
| assert univ["genre"] == "Shonen" | |
| assert len(univ["characters"]) == 1 | |
| assert univ["characters"][0]["name"] == "Luffy" | |
| # Verify filters echoed back | |
| assert "filters" in res_json | |
| assert res_json["filters"]["search"] == "Pirate" | |
| assert res_json["filters"]["genre"] == "Shonen" | |
| assert res_json["filters"]["sort"] == "newest" | |
| # Verify available genres list | |
| assert "available_genres" in res_json | |
| assert res_json["available_genres"][0]["name"] == "Shonen" | |
| assert res_json["available_genres"][0]["count"] == 1 | |