animetix-brain / tests /api /test_multiverse_api.py
MissawB's picture
Upload folder using huggingface_hub
b1e14ec verified
Raw
History Blame Contribute Delete
4.84 kB
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
@pytest.fixture
def api_client():
return APIClient()
@pytest.fixture
def authenticated_user(api_client, db):
user = User.objects.create_user(username="testuser", password="password")
api_client.force_authenticate(user=user)
return user
@pytest.mark.django_db
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
)
@pytest.mark.django_db
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