104 lines
3.6 KiB
Python
104 lines
3.6 KiB
Python
"""
|
||
Тест DrHider — сравнение оригинал vs обфусцированный.
|
||
|
||
Файл: /home/naeel/nubes/contracts/contracts-flask/deploy/tests/test_drhider.py
|
||
"""
|
||
import sys, os, io, zipfile, json
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||
from services.drhider import obfuscate_files
|
||
|
||
TEST_ZIP = "/home/naeel/nubes/contracts/dogovora/примеры_договоров_для_ИИ.zip"
|
||
CHECKS = [
|
||
# (что должно быть в оригинале, что НЕ должно быть в обфусцированном)
|
||
("+7 (495) 789-41-35", "телефон"),
|
||
("info@nubes.ru", "email"),
|
||
("Степаненко", "фамилия"),
|
||
("XXX003", "компания XXX003"),
|
||
("XXX002", "компания XXX002"),
|
||
("ИНН 9706005293", "ИНН НУБЕС"),
|
||
("ОГРН 1207700098759", "ОГРН НУБЕС"),
|
||
("г. Москва", "город"), # адреса без LLM не ловятся — ожидаемо
|
||
]
|
||
|
||
KEEP = [
|
||
# (что должно остаться)
|
||
("НУБЕС", "Исполнитель"),
|
||
]
|
||
|
||
def extract_all_text(zip_bytes):
|
||
"""Извлечь весь текст из ZIP."""
|
||
texts = {}
|
||
with zipfile.ZipFile(io.BytesIO(zip_bytes)) as zf:
|
||
for name in zf.namelist():
|
||
if name == 'mapping.csv':
|
||
continue
|
||
data = zf.read(name)
|
||
if name.endswith('.docx'):
|
||
from docx import Document
|
||
doc = Document(io.BytesIO(data))
|
||
texts[name] = "\n".join(p.text for p in doc.paragraphs)
|
||
else:
|
||
texts[name] = data.decode('utf-8', errors='replace')
|
||
return texts
|
||
|
||
|
||
def test():
|
||
with open(TEST_ZIP, 'rb') as f:
|
||
content = f.read()
|
||
|
||
zip_data, mapping_csv = obfuscate_files([('test.zip', content, '')])
|
||
|
||
# Извлечь текст из результата
|
||
out_texts = extract_all_text(zip_data)
|
||
combined = " ".join(out_texts.values())
|
||
|
||
print("=" * 60)
|
||
print("DrHider — проверка обфускации")
|
||
print("=" * 60)
|
||
|
||
errors = 0
|
||
|
||
# Проверка что чувствительные данные заменены
|
||
print("\n🔴 Должны быть ЗАМЕНЕНЫ:")
|
||
for needle, desc in CHECKS:
|
||
if needle in combined:
|
||
print(f" ❌ {desc}: '{needle}' найдено в обфусцированном!")
|
||
errors += 1
|
||
else:
|
||
print(f" ✅ {desc}: не найдено")
|
||
|
||
# Проверка что НУБЕС остался
|
||
print("\n🟢 Должны СОХРАНИТЬСЯ:")
|
||
for needle, desc in KEEP:
|
||
if needle not in combined:
|
||
print(f" ❌ {desc}: '{needle}' отсутствует!")
|
||
errors += 1
|
||
else:
|
||
print(f" ✅ {desc}: на месте")
|
||
|
||
# Статистика mapping.csv
|
||
lines = mapping_csv.split('\n')
|
||
print(f"\n📋 mapping.csv: {len(lines)-2} сущностей заменено")
|
||
for line in lines[1:6]:
|
||
if line.strip():
|
||
print(f" {line}")
|
||
|
||
# Проверка структуры ZIP
|
||
with zipfile.ZipFile(io.BytesIO(zip_data)) as zf:
|
||
names = zf.namelist()
|
||
has_csv = 'mapping.csv' in names
|
||
no_zip = not any(n.endswith('.zip') for n in names)
|
||
print(f"\n📦 ZIP: {len(names)} файлов, mapping.csv={'✅' if has_csv else '❌'}, без .zip={'✅' if no_zip else '❌'}")
|
||
|
||
print(f"\n{'='*60}")
|
||
if errors:
|
||
print(f"❌ {errors} ошибок")
|
||
sys.exit(1)
|
||
else:
|
||
print("✅ ВСЕ ПРОВЕРКИ ПРОЙДЕНЫ")
|
||
sys.exit(0)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
test()
|