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