"""`GraphDebuggerView` — la vue n'avait aucun test, et son action `heal` était cassée à 100 % (`heal_node` appelait un `repository.get_media_by_id` qui n'existait sur aucune classe du dépôt). Le mock du service est ici contraint par `spec=GraphHealerService` : un appel avec une signature que le service n'accepte pas lève, au lieu d'être avalé silencieusement par un `MagicMock` nu — c'est ce dernier comportement qui avait laissé passer le bug d'origine. """ from unittest.mock import MagicMock import pytest from animetix.containers import get_container from core.domain.services.graph_healer_service import GraphHealerService from django.contrib.auth.models import User from django.urls import reverse from rest_framework.test import APIClient @pytest.fixture def admin_client(db): client = APIClient() user = User.objects.create_superuser(username="graphadmin", password="pw") client.force_authenticate(user=user) return client @pytest.fixture def healer(): mock = MagicMock(spec=GraphHealerService) container = get_container() container.core.graph_healer_service.override(mock) yield mock container.core.graph_healer_service.reset_last_overriding() @pytest.mark.django_db def test_heal_forwards_the_media_type_to_the_healer(admin_client, healer): """La clé d'un média est (type, id) : sans le type, la vue ne peut pas désigner le nœud à reconstruire.""" res = admin_client.post( reverse("api_graph_debugger"), {"action": "heal", "media_id": "42", "media_type": "Anime"}, format="json", ) assert res.status_code == 200, res.data healer.heal_node.assert_called_once_with("42", "Anime") @pytest.mark.django_db def test_heal_without_a_media_type_is_refused(admin_client, healer): """Plutôt qu'un type deviné : un id AniList existe pour plusieurs types, guérir « le premier trouvé » reconstruirait le mauvais nœud.""" res = admin_client.post( reverse("api_graph_debugger"), {"action": "heal", "media_id": "42"}, format="json", ) assert res.status_code == 400 healer.heal_node.assert_not_called() @pytest.mark.django_db def test_audit_is_served(admin_client, healer): healer.audit_graph_quality.return_value = {"isolated_nodes": 3} res = admin_client.get(reverse("api_graph_debugger")) assert res.status_code == 200 assert res.data["isolated_nodes"] == 3