File size: 2,445 Bytes
31d339a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""`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