"""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