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,102 @@
|
||||
"""
|
||||
Тесты 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("✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ")
|
||||
Reference in New Issue
Block a user