SmartCertify-ML / tests /test_image_analysis.py
Harsh Yadav
CREATE : Trained the model
6de2f28
"""Tests for image analysis module."""
import pytest
import numpy as np
import sys
from pathlib import Path
from PIL import Image
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
class TestImagePreprocessing:
"""Test image preprocessing utilities."""
def test_preprocess_image(self):
from app.models.image_analysis.preprocess import preprocess_image
img = Image.new("RGB", (400, 300), color=(255, 255, 245))
result = preprocess_image(img)
assert result.shape == (3, 224, 224)
assert result.dtype == np.float32
def test_base64_roundtrip(self):
from app.models.image_analysis.preprocess import (
image_to_base64, load_image_from_base64,
)
original = Image.new("RGB", (100, 100), color=(128, 128, 128))
b64 = image_to_base64(original)
assert isinstance(b64, str)
assert len(b64) > 0
restored = load_image_from_base64(b64)
assert restored is not None
assert restored.size == (100, 100)
def test_generate_synthetic_tampered(self):
from app.models.image_analysis.preprocess import generate_synthetic_tampered_images
samples = generate_synthetic_tampered_images(n_samples=5)
assert len(samples) == 5
for s in samples:
assert s["authentic"].shape == (3, 224, 224)
assert s["tampered"].shape == (3, 224, 224)
assert s["tampering_type"] in [
"pixel_alter", "text_overlay", "compression", "blur", "crop_paste"
]
class TestCNNModel:
"""Test CNN model structure."""
def test_model_forward_pass(self):
import torch
from app.models.image_analysis.cnn_model import TamperingDetectorCNN
model = TamperingDetectorCNN(num_classes=2)
model.eval()
# Random input
x = torch.randn(1, 3, 224, 224)
with torch.no_grad():
output = model(x)
assert output.shape == (1, 2)
def test_analyze_image_function(self):
from app.models.image_analysis.cnn_model import analyze_image
img = Image.new("RGB", (300, 200), color=(255, 255, 245))
result = analyze_image(img, certificate_id="test-123")
assert "is_tampered" in result
assert "tamper_probability" in result
assert "confidence" in result
assert result["certificate_id"] == "test-123"
class TestAnomalyDetection:
"""Test anomaly detection."""
def test_detect_anomaly_structure(self):
from app.models.anomaly.isolation_forest import detect_anomaly
cert_data = {
"issuer_reputation_score": 0.1,
"certificate_age_days": 10,
"metadata_completeness_score": 0.2,
"ocr_confidence_score": 0.5,
"template_match_score": 0.1,
"domain_verification_status": 0,
"previous_verification_count": 0,
"time_since_last_verification_days": 300,
}
result = detect_anomaly(cert_data)
if "error" not in result:
assert "is_anomaly" in result
assert "anomaly_score" in result
assert "anomaly_rank" in result
assert result["anomaly_rank"] in ["LOW", "MEDIUM", "HIGH"]