File size: 2,325 Bytes
7b0cda0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import numpy as np
import cv2
import pytest
from unittest.mock import patch
from src.pipeline import extract_text # поправь название модуля
# ---------------------------------------------------------
# ВСПОМОГАТЕЛЬНАЯ ФУНКЦИЯ: создаём тестовую картинку
# ---------------------------------------------------------
def make_test_image():
"""
Создаёт искусственное изображение 200×300 + цветовой диапазон,
чтобы extract_text мог найти один "сенсор".
"""
img = np.zeros((200, 300, 3), dtype=np.uint8)
# Рисуем титул (верхний левый угол) — просто белую полосу
img[0:45, 0:120] = (255, 255, 255)
# Рисуем сенсор в центре картинки
cv2.rectangle(img, (100, 80), (200, 97), (0, 255, 0), -1)
return img
# ---------------------------------------------------------
# ГЛАВНЫЙ ТЕСТ extract_text
# ---------------------------------------------------------
@patch("src.pipeline.ocr_title")
@patch("src.pipeline.ocr_sensors")
def test_extract_text(mock_ocr_sensors, mock_ocr_title):
img = make_test_image()
# Цветовой диапазон, по которому найдётся наш зелёный прямоугольник
color_ranges = {
"green": (
[50, 80, 80], # нижняя граница HSV
[80, 255, 255] # верхняя граница HSV
)
}
# --- подменяем OCR ---
mock_ocr_title.return_value = "TITLE_OK"
mock_ocr_sensors.return_value = [
{"text": "123", "score": 0.95},
]
# --- вызываем тестируемую функцию ---
title, sensors = extract_text(img, color_ranges)
# --- ПРОВЕРКИ ---
# титул
assert title == "TITLE_OK"
# сенсоры
assert isinstance(sensors, list)
assert len(sensors) == 1
s = sensors[0]
assert s["text"] == "123"
assert s["score"] == 0.95
# координаты должны быть внутри изображения
assert 0 <= s["x"] <= img.shape[1]
assert 0 <= s["y"] <= img.shape[0]
assert s["w"] > 0
assert s["h"] > 0 |