MorphGuard / scripts /test_demo_flow.py
juanquy's picture
Initial clean commit of modular MorphGuard
2978bba
Raw
History Blame Contribute Delete
5.66 kB
import os
import random
import requests
import time
import psycopg2
from pathlib import Path
# Configuration
BASE_URL = "http://localhost:5000"
DB_NAME = "morphguard"
DB_USER = "morphguard"
DB_PASS = "morphguard"
DB_HOST = "localhost"
# Update credentials if changed in your env
ADMIN_USER = "admin"
ADMIN_PASS = "morphguard_admin"
DATA_DIRS = {
"real": "/home/juanquy/dev/MorphGuard/data/datasets/morph_detection/real",
"morph": "/home/juanquy/dev/MorphGuard/data/datasets/morph_detection/morph",
"pexels": "/home/juanquy/dev/MorphGuard/data/real_faces/pexels"
}
def get_db_connection():
try:
conn = psycopg2.connect(
dbname=DB_NAME,
user=DB_USER,
password=DB_PASS,
host=DB_HOST
)
return conn
except Exception as e:
print(f"Error connecting to DB: {e}")
return None
def get_initial_metric_count(conn):
if not conn: return 0
try:
cur = conn.cursor()
cur.execute("SELECT COUNT(*) FROM detection_metrics;")
count = cur.fetchone()[0]
cur.close()
return count
except Exception as e:
print(f"Error querying metrics: {e}")
return 0
def collect_images(num_per_category=8):
images = []
print("Collecting images...")
for category, path in DATA_DIRS.items():
if not os.path.exists(path):
print(f"Warning: Path not found: {path}")
continue
# Recursive search for images
all_files = []
for root, dirs, files in os.walk(path):
for file in files:
if file.lower().endswith(('.jpg', '.jpeg', '.png')):
all_files.append(os.path.join(root, file))
if not all_files:
print(f"Warning: No images found in {path}")
continue
selected = random.sample(all_files, min(len(all_files), num_per_category))
print(f" - {category}: {len(selected)} images selected")
images.extend([(category, img) for img in selected])
random.shuffle(images)
return images
def test_api(images):
print(f"\nStarting API testing with {len(images)} images...")
success_count = 0
session = requests.Session()
# Login first
print("Attempting login...")
try:
login_resp = session.post(f"{BASE_URL}/login", data={'username': ADMIN_USER, 'password': ADMIN_PASS})
if login_resp.status_code != 200 and login_resp.url.endswith('/login'): # Redirect back to login means fail
# Try JSON login just in case
login_resp = session.post(f"{BASE_URL}/login", json={'username': ADMIN_USER, 'password': ADMIN_PASS})
if login_resp.status_code != 200 and 'Invalid credentials' in login_resp.text:
print("LOGIN FAILED: Check admin credentials.")
return 0
print("Login successful.")
except Exception as e:
print(f"Login error: {e}")
return 0
for i, (category, img_path) in enumerate(images, 1):
print(f"[{i}/{len(images)}] Testing {category} image: {os.path.basename(img_path)}", end=" ... ")
try:
with open(img_path, 'rb') as f:
start_time = time.time()
# Use session which stores cookie
response = session.post(
f"{BASE_URL}/api/detect",
files={'image': f}, # ERROR FIX: detection.py expects 'image', not 'file'
data={'mode': 'deep_forensics'} # Trigger forensics
)
duration = time.time() - start_time
if response.status_code == 200:
result = response.json()
# Check for standard response keys
if 'is_morphed' in result:
print(f"SUCCESS ({duration:.2f}s) - Morphed: {result['is_morphed']}, Conf: {result.get('confidence', 0):.2f}")
success_count += 1
else:
print(f"FAILED - Invalid JSON response: {result.keys()}")
else:
print(f"FAILED - Status {response.status_code}: {response.text[:100]}")
except Exception as e:
print(f"ERROR: {e}")
return success_count
def verify_db_metrics(initial_count):
print("\nVerifying Database Metrics...")
conn = get_db_connection()
if not conn:
print("Skipping DB verification due to connection error")
return
final_count = get_initial_metric_count(conn)
conn.close()
diff = final_count - initial_count
print(f"Metrics count: Initial={initial_count}, Final={final_count}, Added={diff}")
if diff > 0:
print("✅ DATABASE VERIFICATION PASSED: Metrics were recorded.")
else:
print("❌ DATABASE VERIFICATION FAILED: No new metrics found.")
def main():
# Wait for server to start if needed
print("Checking server status...")
try:
requests.get(BASE_URL)
except:
print("Waiting for server to start...")
time.sleep(5)
conn = get_db_connection()
initial_metrics = get_initial_metric_count(conn)
if conn: conn.close()
images = collect_images(8) # 8 * 3 = 24 images
if not images:
print("No images found to test! Check paths.")
return
successful_requests = test_api(images)
print(f"\nTest Complete: {successful_requests}/{len(images)} requests successful.")
verify_db_metrics(initial_metrics)
if __name__ == "__main__":
main()