MCP Image Recognition Server

by mario-andreschak
Verified
  • tests
import os import pytest from PIL import Image, ImageDraw, ImageFont from src.image_recognition_server.utils.ocr import extract_text_from_image, OCRError @pytest.fixture def text_image(): """Create a test image with text.""" # Create a larger image with high contrast img = Image.new('RGB', (800, 200), color='white') d = ImageDraw.Draw(img) # Create a simple test string that's easier for OCR test_string = "TEST" # Draw text in large, clear font d.text((100, 50), test_string, fill='black', font=None) return img, test_string @pytest.fixture def empty_image(): """Create a blank test image.""" return Image.new('RGB', (100, 100), color='white') def test_basic_text_extraction(text_image): """Test extracting text from an image with clear text.""" img, expected_text = text_image result = extract_text_from_image(img) assert result is not None assert expected_text in result.upper() # Convert to uppercase for comparison def test_empty_image(empty_image): """Test handling of image with no text.""" result = extract_text_from_image(empty_image) assert result is None def test_tesseract_not_available(monkeypatch): """Test error handling when Tesseract isn't accessible.""" # Create a simple test image img = Image.new('RGB', (100, 100), color='white') # Mock pytesseract to raise an error def mock_image_to_string(*args, **kwargs): raise Exception("tesseract is not installed or it's not in your PATH") monkeypatch.setattr("pytesseract.image_to_string", mock_image_to_string) # Test with ocr_required=False result = extract_text_from_image(img, ocr_required=False) assert result is None # Test with ocr_required=True with pytest.raises(OCRError) as exc_info: extract_text_from_image(img, ocr_required=True) assert "Tesseract OCR is not installed" in str(exc_info.value) def test_custom_tesseract_path(monkeypatch): """Test using custom Tesseract path via env var.""" custom_path = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # Mock environment variable monkeypatch.setenv("TESSERACT_CMD", custom_path) # Mock pytesseract to verify the custom path was set def mock_image_to_string(*args, **kwargs): import pytesseract assert pytesseract.pytesseract.tesseract_cmd == custom_path return "Hello World" monkeypatch.setattr("pytesseract.image_to_string", mock_image_to_string) # Create a simple test image img = Image.new('RGB', (100, 100), color='white') result = extract_text_from_image(img) assert result == "Hello World" def test_ocr_required_flag(monkeypatch): """Test both True/False behaviors of ocr_required flag.""" img = Image.new('RGB', (100, 100), color='white') def mock_image_to_string(*args, **kwargs): return "" # Simulate no text found monkeypatch.setattr("pytesseract.image_to_string", mock_image_to_string) # Test with ocr_required=False (default) result = extract_text_from_image(img) assert result is None # Test with ocr_required=True result = extract_text_from_image(img, ocr_required=True) assert result is None # Should still be None since empty string is converted to None