DIVYANSHI SINGH
Root project layout configured for deployment
b0bec61
"""
test_utils.py — 3 assert-based tests for utils.py using real test images.
Run with: pytest test_utils.py -v
"""
import numpy as np
import sys
from pathlib import Path
# Ensure the project root is on the path
sys.path.insert(0, str(Path(__file__).parent))
from utils import preprocess_image, pil_to_cv2
from PIL import Image
# ---------------------------------------------------------------------------
# Test 1: preprocess_image returns a uint8 numpy array
# ---------------------------------------------------------------------------
def test_preprocess_returns_uint8_numpy_array():
"""preprocess_image must return a numpy array with dtype uint8."""
result = preprocess_image("test_images/bill_1_perfect.jpg")
assert isinstance(result, np.ndarray), "Output must be a numpy array"
assert result.dtype == np.uint8, f"Expected uint8, got {result.dtype}"
print("PASS: test_preprocess_returns_uint8_numpy_array")
# ---------------------------------------------------------------------------
# Test 2: preprocess_image output has 3 channels (BGR)
# ---------------------------------------------------------------------------
def test_preprocess_output_is_3_channel():
"""preprocess_image must return a 3-channel (H, W, 3) array for PaddleOCR."""
result = preprocess_image("test_images/bill_2_skewed.jpg")
assert result.ndim == 3, f"Expected 3D array (H,W,C), got shape {result.shape}"
assert result.shape[2] == 3, f"Expected 3 channels (BGR), got {result.shape[2]}"
print("PASS: test_preprocess_output_is_3_channel")
# ---------------------------------------------------------------------------
# Test 3: pil_to_cv2 correctly converts a PIL image to a BGR uint8 array
# ---------------------------------------------------------------------------
def test_pil_to_cv2_returns_bgr_uint8():
"""pil_to_cv2 must return uint8 array and flip RGB channels to BGR."""
# Create a simple RGB PIL image with a known red pixel
pil_img = Image.new("RGB", (100, 100), color=(255, 0, 0)) # pure red in RGB
result = pil_to_cv2(pil_img)
assert isinstance(result, np.ndarray), "Output must be numpy array"
assert result.dtype == np.uint8, f"Expected uint8, got {result.dtype}"
assert result.ndim == 3 and result.shape[2] == 3, "Expected (H,W,3) array"
# In BGR: red pixel (255,0,0) RGB becomes (0,0,255) BGR
r_channel = result[50, 50, 2] # BGR index 2 = Red
b_channel = result[50, 50, 0] # BGR index 0 = Blue
assert r_channel == 255, f"Expected Red=255 in BGR[2], got {r_channel}"
assert b_channel == 0, f"Expected Blue=0 in BGR[0], got {b_channel}"
print("PASS: test_pil_to_cv2_returns_bgr_uint8")
if __name__ == "__main__":
test_preprocess_returns_uint8_numpy_array()
test_preprocess_output_is_3_channel()
test_pil_to_cv2_returns_bgr_uint8()
print("\nAll utils tests passed!")