132 lines
4.8 KiB
Python
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("✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ")
|