ocr-omr-backend / test_endpoints.py
AswinMathew's picture
Deploy OCR/OMR backend to HF Spaces
b8548e4 verified
raw
history blame
9.26 kB
"""
Test script for OCR/OMR backend endpoints.
Usage: python test_endpoints.py [base_url]
Default base_url: http://localhost:5000
"""
import sys
import os
import requests
BASE_URL = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:5000"
IMAGES_DIR = os.path.join(os.path.dirname(__file__), "Images")
results = []
# Track prerequisite passes for dependent tests
prereqs = {
"question_paper": False,
"omr_answer_key": False,
"process_omr": False,
}
def report(name, passed, detail=""):
status = "PASS" if passed else "FAIL"
results.append((name, status))
msg = f"[{status}] {name}"
if detail:
msg += f" -- {detail}"
print(msg)
return passed
def skip(name, reason):
results.append((name, "SKIP"))
print(f"[SKIP] {name} -- {reason}")
# ---------------------------------------------------------------------------
# 1. Health check
# ---------------------------------------------------------------------------
def test_health():
try:
r = requests.get(f"{BASE_URL}/health", timeout=10)
return report("/health", r.status_code == 200, f"status={r.status_code}")
except Exception as e:
return report("/health", False, str(e))
# ---------------------------------------------------------------------------
# 2. Root endpoint
# ---------------------------------------------------------------------------
def test_root():
try:
r = requests.get(f"{BASE_URL}/", timeout=10)
return report("/ (root)", r.status_code == 200, f"status={r.status_code}")
except Exception as e:
return report("/ (root)", False, str(e))
# ---------------------------------------------------------------------------
# 3. EasyOCR
# ---------------------------------------------------------------------------
def test_easyocr():
img = os.path.join(IMAGES_DIR, "test.jpg")
if not os.path.exists(img):
return report("/easyocr", False, "test.jpg not found")
try:
with open(img, "rb") as f:
r = requests.post(f"{BASE_URL}/easyocr", files={"images": f}, timeout=60)
ok = r.status_code == 200
detail = f"status={r.status_code}"
if ok:
data = r.json()
detail += f", keys={list(data.keys()) if isinstance(data, dict) else 'list'}"
return report("/easyocr", ok, detail)
except Exception as e:
return report("/easyocr", False, str(e))
# ---------------------------------------------------------------------------
# 4. Tesseract
# ---------------------------------------------------------------------------
def test_tesseract():
img = os.path.join(IMAGES_DIR, "OCRSheet.jpg")
if not os.path.exists(img):
return report("/tesseract", False, "OCRSheet.jpg not found")
try:
with open(img, "rb") as f:
r = requests.post(f"{BASE_URL}/tesseract", files={"images": f}, timeout=60)
ok = r.status_code == 200
return report("/tesseract", ok, f"status={r.status_code}")
except Exception as e:
return report("/tesseract", False, str(e))
# ---------------------------------------------------------------------------
# 5. Process question paper (PDF)
# ---------------------------------------------------------------------------
def test_question_paper_pdf():
img = os.path.join(IMAGES_DIR, "question_paper.pdf")
if not os.path.exists(img):
return report("/process_question_paper (pdf)", False, "question_paper.pdf not found")
try:
with open(img, "rb") as f:
r = requests.post(f"{BASE_URL}/process_question_paper", files={"file": f}, timeout=120)
ok = r.status_code == 200
detail = f"status={r.status_code}"
if ok:
data = r.json()
detail += f", questions={len(data.get('questions', []))}"
prereqs["question_paper"] = True
return report("/process_question_paper (pdf)", ok, detail)
except Exception as e:
return report("/process_question_paper (pdf)", False, str(e))
# ---------------------------------------------------------------------------
# 6. Process question paper (image)
# ---------------------------------------------------------------------------
def test_question_paper_png():
img = os.path.join(IMAGES_DIR, "question_paper.png")
if not os.path.exists(img):
return report("/process_question_paper (png)", False, "question_paper.png not found")
try:
with open(img, "rb") as f:
r = requests.post(f"{BASE_URL}/process_question_paper", files={"file": f}, timeout=120)
ok = r.status_code == 200
detail = f"status={r.status_code}"
if ok:
data = r.json()
detail += f", questions={len(data.get('questions', []))}"
prereqs["question_paper"] = True
return report("/process_question_paper (png)", ok, detail)
except Exception as e:
return report("/process_question_paper (png)", False, str(e))
# ---------------------------------------------------------------------------
# 7. Process OMR answer key
# ---------------------------------------------------------------------------
def test_omr_answer_key():
img = os.path.join(IMAGES_DIR, "omr_answer_key.pdf")
if not os.path.exists(img):
return report("/process_omr_answer_key", False, "omr_answer_key.pdf not found")
try:
with open(img, "rb") as f:
r = requests.post(f"{BASE_URL}/process_omr_answer_key", files={"file": f}, timeout=120)
ok = r.status_code == 200
detail = f"status={r.status_code}"
if ok:
data = r.json()
detail += f", success={data.get('success')}"
prereqs["omr_answer_key"] = True
return report("/process_omr_answer_key", ok, detail)
except Exception as e:
return report("/process_omr_answer_key", False, str(e))
# ---------------------------------------------------------------------------
# 8. Process OMR sheet
# ---------------------------------------------------------------------------
def test_process_omr():
img = os.path.join(IMAGES_DIR, "OMRSheet.jpg")
if not os.path.exists(img):
return report("/process_omr", False, "OMRSheet.jpg not found")
try:
with open(img, "rb") as f:
r = requests.post(f"{BASE_URL}/process_omr", files={"images": f}, timeout=180)
ok = r.status_code == 200
detail = f"status={r.status_code}"
if ok:
prereqs["process_omr"] = True
return report("/process_omr", ok, detail)
except Exception as e:
return report("/process_omr", False, str(e))
# ---------------------------------------------------------------------------
# 9. Evaluate OMR (depends on 7 + 8)
# ---------------------------------------------------------------------------
def test_evaluate_omr():
if not prereqs["omr_answer_key"] or not prereqs["process_omr"]:
skip("/evaluate_omr", "requires /process_omr_answer_key and /process_omr to pass first")
return
try:
r = requests.post(f"{BASE_URL}/evaluate_omr", timeout=120)
ok = r.status_code == 200
return report("/evaluate_omr", ok, f"status={r.status_code}")
except Exception as e:
return report("/evaluate_omr", False, str(e))
# ---------------------------------------------------------------------------
# 10. Evaluate answers (depends on 5/6)
# ---------------------------------------------------------------------------
def test_evaluate_answers():
if not prereqs["question_paper"]:
skip("/evaluate_answers", "requires /process_question_paper to pass first")
return
img = os.path.join(IMAGES_DIR, "test.jpg")
if not os.path.exists(img):
return report("/evaluate_answers", False, "test.jpg not found")
try:
with open(img, "rb") as f:
r = requests.post(f"{BASE_URL}/evaluate_answers", files={"student_answers": f}, timeout=120)
ok = r.status_code == 200
return report("/evaluate_answers", ok, f"status={r.status_code}")
except Exception as e:
return report("/evaluate_answers", False, str(e))
# ---------------------------------------------------------------------------
# Run all tests in order
# ---------------------------------------------------------------------------
if __name__ == "__main__":
print(f"\nTesting backend at: {BASE_URL}\n" + "=" * 60)
test_health()
test_root()
test_easyocr()
test_tesseract()
test_question_paper_pdf()
test_question_paper_png()
test_omr_answer_key()
test_process_omr()
test_evaluate_omr()
test_evaluate_answers()
# Summary
print("\n" + "=" * 60)
passed = sum(1 for _, s in results if s == "PASS")
failed = sum(1 for _, s in results if s == "FAIL")
skipped = sum(1 for _, s in results if s == "SKIP")
total = len(results)
print(f"Results: {passed}/{total} passed, {failed} failed, {skipped} skipped")
sys.exit(0 if failed == 0 else 1)