""" Тесты replacer.py — apply_replacements. Запуск: python3 tests/test_replacer.py """ import sys import os sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from drhider.replacer import apply_replacements passed = 0 failed = 0 def check(name, condition): global passed, failed if condition: passed += 1 print(f" ✅ {name}") else: failed += 1 print(f" ❌ {name}") # ═══════════════════════════════════════════════════════════════ # apply_replacements # ═══════════════════════════════════════════════════════════════ print("\n=== apply_replacements ===") # 1. Простая замена text = "Директор Иванов И.И. подписал" mapping = {"Иванов И.И.": "Иванов_0001"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("простая замена", result == "Директор Иванов_0001 подписал") # 2. Длинное before короткого text = "ИНН 123456789012 и ИНН 1234567890" mapping = {"ИНН 123456789012": "ИНН_0001", "ИНН 1234567890": "ИНН_0002"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("длинное раньше короткого", "ИНН_0001" in result and "ИНН_0002" in result) check("12-значный не задет 10-значным", result == "ИНН_0001 и ИНН_0002") # 3. Границы слова text = "Email: test@mail.ru написать" mapping = {"test@mail.ru": "email_0001@fake"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("email заменён", "email_0001@fake" in result) # 4. Множественные замены text = "Иванов И.И. и Петров А.С. подписали" mapping = {"Иванов И.И.": "Иванов_0001", "Петров А.С.": "Петров_0002"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("две замены", "Иванов_0001" in result and "Петров_0002" in result) # 5. Спецсимволы в ключе text = 'ООО "Ромашка" заключила' mapping = {'ООО "Ромашка"': "ООО_Технология_0001"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("кавычки в ключе", "ООО_Технология_0001" in result) # 6. Кириллица text = "Москва, ул. Ленина, д. 42" mapping = {"Москва": "Москва_0001", "Ленина": "Ленина_0015"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("кириллица заменена", "Москва_0001" in result and "Ленина_0015" in result) # 7. Частичное совпадение не заменяется text = "Ивановский проспект" mapping = {"Иванов": "Иванов_0001"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("частичное совпадение — не заменено", result == "Ивановский проспект") # 8. Пустой mapping text = "ничего не меняется" result = apply_replacements(text, {}, []) check("пустой mapping", result == text) # 9. Markdown текст text = "**ООО Ромашка** заключила с **Иванов И.И.**" mapping = {"ООО Ромашка": "ООО_Технология_0001", "Иванов И.И.": "Иванов_0002"} keys = sorted(mapping.keys(), key=len, reverse=True) result = apply_replacements(text, mapping, keys) check("Markdown bold сохранён", "**ООО_Технология_0001**" in result) # ═══════════════════════════════════════════════════════════════ print(f"\n{'='*50}") print(f"Результат: {passed} OK, {failed} FAIL из {passed + failed}") if failed > 0: print("❌ ТЕСТЫ ПРОВАЛЕНЫ") sys.exit(1) else: print("✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ")