""" Тесты 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("✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ")