v5.1.0: тесты builder(20), extractor(15), scanner(20), replacer(10) — 65 тестов, 0 ошибок
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
"""
|
||||
Тесты 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("✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ")
|
||||
Reference in New Issue
Block a user