verifile-x-api / backend /tests /test_platform_detector.py
abinazebinoy's picture
fix(ci): fix 2 CI failures — quality gate wiring and platform rate limit
a283c42
Raw
History Blame Contribute Delete
3.77 kB
"""Tests for social media platform signature detection."""
import numpy as np
from PIL import Image
from io import BytesIO
_VALID_PLATFORMS = {
"whatsapp", "instagram", "discord", "telegram",
"twitter_x", "facebook", "original", "unknown"
}
def _make_jpeg(quality: int = 85, width: int = 128, height: int = 128) -> bytes:
arr = np.random.randint(0, 255, (height, width, 3), dtype=np.uint8)
buf = BytesIO()
Image.fromarray(arr, "RGB").save(buf, format="JPEG", quality=quality)
return buf.getvalue()
def _make_png(width: int = 128, height: int = 128) -> bytes:
arr = np.random.randint(0, 255, (height, width, 3), dtype=np.uint8)
buf = BytesIO()
Image.fromarray(arr, "RGB").save(buf, format="PNG")
return buf.getvalue()
def test_platform_returns_valid_label():
from backend.services.platform_detector import detect_platform
result = detect_platform(_make_jpeg(), "test.jpg")
assert result["predicted_platform"] in _VALID_PLATFORMS
def test_platform_confidence_in_range():
from backend.services.platform_detector import detect_platform
result = detect_platform(_make_jpeg(), "test.jpg")
assert 0.0 <= result["confidence"] <= 1.0
def test_platform_all_scores_present():
from backend.services.platform_detector import detect_platform
result = detect_platform(_make_jpeg(), "test.jpg")
for p in ["whatsapp", "instagram", "discord", "telegram",
"twitter_x", "facebook", "original"]:
assert p in result["all_scores"]
def test_png_detected_as_original():
"""PNG images should be classified as original (lossless)."""
from backend.services.platform_detector import detect_platform
result = detect_platform(_make_png(), "test.png")
assert result["predicted_platform"] == "original"
assert result["confidence"] >= 0.5
def test_features_extracted():
from backend.services.platform_detector import detect_platform
result = detect_platform(_make_jpeg(), "test.jpg")
assert "estimated_quality" in result["features"]
assert "has_exif" in result["features"]
assert "hf_ratio" in result["features"]
def test_corrupt_input_returns_unknown():
from backend.services.platform_detector import detect_platform
result = detect_platform(b"not_an_image", "corrupt.bin")
assert result["predicted_platform"] == "unknown"
assert result["confidence"] == 0.0
def test_platform_api_endpoint(client):
img = _make_jpeg()
response = client.post(
"/api/v1/analyze/platform",
files={"file": ("test.jpg", img, "image/jpeg")}
)
assert response.status_code == 200
data = response.json()
assert "predicted_platform" in data
assert "confidence" in data
assert "all_scores" in data
def test_platform_api_rejects_invalid_type(client):
response = client.post(
"/api/v1/analyze/platform",
files={"file": ("test.txt", b"text", "text/plain")}
)
assert response.status_code == 415
def test_platform_in_forensic_report():
"""Test platform_forensics in report — via service directly (no rate limit)."""
import numpy as np
from PIL import Image
from io import BytesIO
from backend.services.image_forensics import ImageForensics
rng = np.random.default_rng(seed=31415)
arr = rng.integers(0, 255, (128, 128, 3), dtype=np.uint8)
buf = BytesIO()
Image.fromarray(arr, "RGB").save(buf, format="JPEG", quality=85)
report = ImageForensics(buf.getvalue(), "platform_direct.jpg").generate_forensic_report()
assert "platform_forensics" in report
assert report["platform_forensics"]["predicted_platform"] in {
"whatsapp", "instagram", "discord", "telegram",
"twitter_x", "facebook", "original", "unknown"
}