MorphGuard / tests /test_detection_api.py
juanquy's picture
Initial clean commit of modular MorphGuard
2978bba
Raw
History Blame Contribute Delete
4.52 kB
import pytest
import io
from unittest.mock import patch, MagicMock
def test_detect_unauthorized(client):
"""Test that detection endpoints require authorization."""
response = client.post('/api/detect')
assert response.status_code == 401
assert 'Unauthorized' in response.get_json()['error']
response = client.post('/api/detect/deepfake')
assert response.status_code == 401
assert 'Unauthorized' in response.get_json()['error']
def test_detect_no_image(client):
"""Test /api/detect with authorized session but no image."""
with client.session_transaction() as sess:
sess['logged_in'] = True
sess['role'] = 'admin'
response = client.post('/api/detect')
assert response.status_code == 400
assert 'No image provided' in response.get_json()['error']
def test_detect_success(client, app):
"""Test /api/detect successfully detects morphing."""
with client.session_transaction() as sess:
sess['logged_in'] = True
sess['role'] = 'admin'
# Create a mock image file
data = {
'image': (io.BytesIO(b"dummy image data"), 'test.jpg'),
'mode': 'fast',
'detection_type': 'morph'
}
with patch('src.routes.detection.secure_filename', return_value='test.jpg'), \
patch('src.routes.detection.os.path.join', return_value='static/uploads/test.jpg'), \
patch('src.routes.detection.open', create=True) as mock_open:
# Mocking file save
mock_file = MagicMock()
data['image'] = (mock_file, 'test.jpg')
response = client.post('/api/detect', data=data, content_type='multipart/form-data')
assert response.status_code == 200
json_data = response.get_json()
assert json_data['is_morphed'] is True
assert json_data['confidence'] == 0.88
assert json_data['tier'] == 'Tier1_Fast'
app.mg_api.detect_morph.assert_called_once()
def test_detect_deepfake_standalone_success(client, app):
"""Test /api/detect/deepfake standalone endpoint."""
with client.session_transaction() as sess:
sess['logged_in'] = True
data = {
'image': (io.BytesIO(b"dummy image data"), 'test.jpg')
}
with patch('src.routes.detection.secure_filename', return_value='test.jpg'), \
patch('src.routes.detection.os.path.join', return_value='static/uploads/test.jpg'):
response = client.post('/api/detect/deepfake', data=data, content_type='multipart/form-data')
assert response.status_code == 200
json_data = response.get_json()
assert json_data['is_deepfake'] is True
assert json_data['deepfake_score'] == 0.95
assert 'artifacts' in json_data
app.deepfake_detector.detect.assert_called_once()
def test_detect_invalid_file_extension(client):
"""Test /api/detect returns 400 for invalid file extensions."""
with client.session_transaction() as sess:
sess['logged_in'] = True
data = {
'image': (io.BytesIO(b"dummy data"), 'test.txt')
}
response = client.post('/api/detect', data=data, content_type='multipart/form-data')
assert response.status_code == 400
assert 'Invalid file type' in response.get_json()['error']
def test_detect_invalid_mode(client):
"""Test /api/detect returns 400 for invalid modes."""
with client.session_transaction() as sess:
sess['logged_in'] = True
data = {
'image': (io.BytesIO(b"dummy data"), 'test.jpg'),
'mode': 'super_deep'
}
response = client.post('/api/detect', data=data, content_type='multipart/form-data')
assert response.status_code == 400
assert 'Invalid mode' in response.get_json()['error']
def test_detect_v1_success(client, app):
"""Test /api/v1/detect successfully detects morphing."""
with client.session_transaction() as sess:
sess['logged_in'] = True
data = {
'image': (io.BytesIO(b"dummy image data"), 'test.jpg'),
'mode': 'fast'
}
with patch('src.routes.detection.secure_filename', return_value='test.jpg'), \
patch('src.routes.detection.os.path.join', return_value='static/uploads/test.jpg'):
response = client.post('/api/v1/detect', data=data, content_type='multipart/form-data')
assert response.status_code == 200
json_data = response.get_json()
assert json_data['is_morphed'] is True