Files
drhider/tests/test_scanner.py
T

132 lines
4.8 KiB
Python

"""
Тесты scanner.py — scan_regex, _next_token.
Запуск: python3 tests/test_scanner.py
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from drhider.scanner import scan_regex, _next_token
passed = 0
failed = 0
def check(name, condition):
global passed, failed
if condition:
passed += 1
print(f" ✅ {name}")
else:
failed += 1
print(f" ❌ {name}")
# ═══════════════════════════════════════════════════════════════
# _next_token
# ═══════════════════════════════════════════════════════════════
print("\n=== _next_token ===")
counters = {}
# 1. Базовый токен
token = _next_token("person_name", counters)
check("person → Иванов/Петров/etc", token.endswith("_0001"))
check("счётчик увеличился", counters.get("person_Иванов", 0) == 1 or any(v == 1 for v in counters.values()))
# 2. Второй токен того же типа — новый номер
token2 = _next_token("person_name", counters)
check("второй person — новый счётчик", any(v >= 1 for v in counters.values()))
# 3. Разные типы — разные счётчики
token3 = _next_token("company", counters)
check("company ≠ person", token3 != token)
# 4. Неизвестный тип → fallback
counters2 = {}
token4 = _next_token("unknown_xyz", counters2)
check("неизвестный тип — Данные_0001", token4.startswith("Данные_") and "_0001" in token4)
# 5. phone
counters3 = {}
token5 = _next_token("phone", counters3)
check("phone — +7_000_000_0001", token5 == "+7_000_000_0001")
# 6. address
counters4 = {}
token6 = _next_token("address", counters4)
check("address — город_0001", token6.endswith("_0001") and len(token6) > 5)
# ═══════════════════════════════════════════════════════════════
# scan_regex
# ═══════════════════════════════════════════════════════════════
print("\n=== scan_regex ===")
# 1. Телефон
mapping = {}
counters = {}
scan_regex("Звоните +7 (495) 789-41-35", mapping, counters)
check("телефон найден", len(mapping) == 1)
check("телефон — токен", list(mapping.values())[0].startswith("+7_000_000_"))
# 2. Email
mapping = {}
counters = {}
scan_regex("Пишите на info@nubes.ru", mapping, counters)
check("email найден", len(mapping) == 1)
check("email — токен", list(mapping.values())[0].startswith("email_"))
# 3. ИНН
mapping = {}
counters = {}
scan_regex("ИНН 9706005293", mapping, counters)
check("ИНН найден", len(mapping) == 1)
check("ИНН — токен", list(mapping.values())[0].startswith("ИНН_"))
# 4. Компания
mapping = {}
counters = {}
scan_regex('ООО "Ромашка" заключила договор', mapping, counters)
check("компания найдена", len(mapping) == 1)
check("компания — токен", "_" in list(mapping.values())[0])
# 5. ФИО
mapping = {}
counters = {}
scan_regex("Директор Иванов И.И. подписал", mapping, counters)
check("ФИО найдено", len(mapping) == 1)
check("ФИО — токен", "_" in list(mapping.values())[0])
# 6. Множественные сущности
mapping = {}
counters = {}
scan_regex("ИНН 9706005293, КПП 772401001, ОГРН 1207700098759", mapping, counters)
check("три сущности", len(mapping) == 3)
# 7. Дубликаты не перезаписываются
mapping = {}
counters = {}
scan_regex("+7 (495) 789-41-35 и ещё +7 (495) 789-41-35", mapping, counters)
check("дубликат — одна запись", len(mapping) == 1)
# 8. Согласованность: один счётчик
mapping = {}
counters = {}
scan_regex("ИНН 9706005293 и КПП 772401001", mapping, counters)
inn_val = mapping["ИНН 9706005293"]
kpp_val = mapping["КПП 772401001"]
check("ИНН и КПП разные токены", inn_val != kpp_val)
# ═══════════════════════════════════════════════════════════════
print(f"\n{'='*50}")
print(f"Результат: {passed} OK, {failed} FAIL из {passed + failed}")
if failed > 0:
print("❌ ТЕСТЫ ПРОВАЛЕНЫ")
sys.exit(1)
else:
print("✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ")