File size: 3,359 Bytes
4e75170
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
"""tests/test_fusion.py"""
from __future__ import annotations

import pytest
from src.types import EngineResult, GeneratorLabel


def _make_result(engine, verdict, conf, explanation="Test"):
    return EngineResult(
        engine=engine, verdict=verdict, confidence=conf,
        explanation=explanation, processing_time_ms=100.0
    )


def test_fuser_imports():
    from src.fusion.fuser import Fuser
    assert Fuser is not None


def test_fuser_image_returns_detection_response(engine_result_fake):
    from src.fusion.fuser import Fuser
    from src.engines.coherence.detector import CoherenceDetector
    from src.engines.sstgnn.detector import SSTGNNDetector
    fuser    = Fuser()
    results  = [engine_result_fake, CoherenceDetector.image_stub(), SSTGNNDetector.image_stub()]
    response = fuser.fuse(results, media_type="image", total_ms=100.0)
    from src.types import DetectionResponse
    assert isinstance(response, DetectionResponse)
    assert response.verdict in ("FAKE", "REAL")
    assert 0.0 <= response.confidence <= 1.0
    assert len(response.engine_breakdown) == 3


def test_fuser_high_fake_confidence_returns_fake():
    from src.fusion.fuser import Fuser
    fuser   = Fuser()
    results = [
        _make_result("fingerprint", "FAKE", 0.95),
        _make_result("coherence",   "FAKE", 0.88),
        _make_result("sstgnn",      "FAKE", 0.82),
    ]
    resp = fuser.fuse(results, media_type="video", total_ms=500.0)
    assert resp.verdict == "FAKE"
    assert resp.confidence > 0.5


def test_fuser_high_real_confidence_returns_real():
    from src.fusion.fuser import Fuser
    fuser   = Fuser()
    results = [
        _make_result("fingerprint", "REAL", 0.93),
        _make_result("coherence",   "REAL", 0.88),
        _make_result("sstgnn",      "REAL", 0.85),
    ]
    resp = fuser.fuse(results, media_type="video", total_ms=500.0)
    assert resp.verdict == "REAL"


def test_fuser_empty_returns_default():
    from src.fusion.fuser import Fuser
    fuser = Fuser()
    resp  = fuser.fuse([], media_type="image", total_ms=0.0)
    assert resp.verdict in ("FAKE", "REAL")


def test_fuser_real_verdict_sets_generator_real():
    from src.fusion.fuser import Fuser
    fuser   = Fuser()
    results = [_make_result("fingerprint", "REAL", 0.95)]
    resp    = fuser.fuse(results, media_type="image", total_ms=100.0)
    if resp.verdict == "REAL":
        assert resp.attributed_generator == GeneratorLabel.real


def test_types_generator_label_count():
    assert len(GeneratorLabel) == 8


def test_types_generator_index_mapping():
    from src.types import GENERATOR_INDEX_TO_LABEL
    assert GENERATOR_INDEX_TO_LABEL[0] == GeneratorLabel.real
    assert GENERATOR_INDEX_TO_LABEL[1] == GeneratorLabel.unknown_gan
    assert GENERATOR_INDEX_TO_LABEL[2] == GeneratorLabel.stable_diffusion
    assert GENERATOR_INDEX_TO_LABEL[7] == GeneratorLabel.imagen


def test_engine_result_confidence_validator():
    with pytest.raises(Exception):
        EngineResult(
            engine="test", verdict="FAKE", confidence=1.5,
            explanation="x", processing_time_ms=1.0
        )


def test_engine_result_confidence_rounds():
    r = EngineResult(
        engine="test", verdict="FAKE", confidence=0.923456789,
        explanation="x", processing_time_ms=1.0
    )
    assert len(str(r.confidence).split(".")[-1]) <= 4