docs: архитектурный анализ + History + gitignore (2026-06-27)
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
"""
|
||||
scenarios.py — Сценарии симуляции (A–F по схеме Опуса).
|
||||
|
||||
Каждый сценарий — функция, принимающая Session и пути к файлам.
|
||||
"""
|
||||
|
||||
import time, os, glob, random
|
||||
from actions import Session, upload_files_from_dir
|
||||
|
||||
OUT = os.path.join(os.path.dirname(__file__), "..", "testgen", "out")
|
||||
|
||||
def scenario_A_happy(session):
|
||||
"""Хэппи-путь: загрузить контракт → classify → группы → compare."""
|
||||
print("\n=== A: Хэппи-путь ===")
|
||||
valid = os.path.join(OUT, "valid")
|
||||
files = sorted(glob.glob(os.path.join(valid, "*XXX001*")))[:4] # договор + 2 спеки + 1 допник
|
||||
session.upload_files(files)
|
||||
session.classify()
|
||||
session.get_groups()
|
||||
session.apply_and_compare(0)
|
||||
|
||||
def scenario_B_zigzag(session):
|
||||
"""Зигзаг: загрузил → удалил → добавил → classify."""
|
||||
print("\n=== B: Зигзаг ===")
|
||||
valid = os.path.join(OUT, "valid")
|
||||
all_f = sorted(glob.glob(os.path.join(valid, "*.docx")))
|
||||
|
||||
# Загрузить 3
|
||||
session.upload_files(all_f[:3])
|
||||
# Удалить 1 (через sync — отправляем keep_ids без одного)
|
||||
# Эмулируем: sync с текущим списком без первого
|
||||
keep = [f['doc_id'] for f in session.files[1:]]
|
||||
import requests
|
||||
requests.post("https://contracts.kube5s.ru/api/sync", json={'keep_ids': keep}, timeout=10, verify=False)
|
||||
session.files = session.files[1:]
|
||||
print(f" ✕ удалён 1 файл, осталось {len(session.files)}")
|
||||
|
||||
# Добавить ещё 2
|
||||
session.upload_files(all_f[3:5])
|
||||
session.classify()
|
||||
session.get_groups()
|
||||
|
||||
def scenario_C_bulk(session):
|
||||
"""Bulk: загрузить все валидные разом."""
|
||||
print("\n=== C: Bulk (все валидные) ===")
|
||||
valid = os.path.join(OUT, "valid")
|
||||
all_f = sorted(glob.glob(os.path.join(valid, "*.docx")))
|
||||
session.upload_files(all_f, delay=0.1)
|
||||
session.classify()
|
||||
session.get_groups()
|
||||
|
||||
def scenario_D_stupid(session):
|
||||
"""Тупые действия: дубликаты, удалить всё, мусор."""
|
||||
print("\n=== D: Тупые действия ===")
|
||||
valid = os.path.join(OUT, "valid")
|
||||
errors = os.path.join(OUT, "errors")
|
||||
|
||||
# Загрузить файл дважды (эмуляция — API не спросит confirm)
|
||||
f0 = sorted(glob.glob(os.path.join(valid, "*.docx")))[0]
|
||||
session.upload_file(f0)
|
||||
session.upload_file(f0) # дубликат — API перезапишет
|
||||
print(f" дубликат: {len(session.files)} файлов (должен быть 1)")
|
||||
|
||||
# Мусор
|
||||
trash = sorted(glob.glob(os.path.join(errors, "trash_*.docx")))[:3]
|
||||
session.upload_files(trash)
|
||||
|
||||
# Удалить всё (sync с пустым списком)
|
||||
import requests
|
||||
requests.post("https://contracts.kube5s.ru/api/sync", json={'keep_ids': []}, timeout=10, verify=False)
|
||||
session.files = []
|
||||
session.contract_id = None
|
||||
print(f" удалено всё: {len(session.files)} файлов")
|
||||
|
||||
# Загрузить заново
|
||||
session.upload_files(sorted(glob.glob(os.path.join(valid, "*XXX005*"))))
|
||||
session.classify()
|
||||
|
||||
def scenario_E_zips(session):
|
||||
"""ZIP: загрузить архивы."""
|
||||
print("\n=== E: ZIP-архивы ===")
|
||||
zips = os.path.join(OUT, "zips")
|
||||
all_z = sorted(glob.glob(os.path.join(zips, "*.zip")))
|
||||
session.upload_files(all_z)
|
||||
|
||||
def scenario_F_stress(session):
|
||||
"""Стресс: загрузить ошибки + мусор + валидные вперемешку."""
|
||||
print("\n=== F: Стресс-микс ===")
|
||||
valid = os.path.join(OUT, "valid")
|
||||
errors = os.path.join(OUT, "errors")
|
||||
|
||||
mixed = []
|
||||
mixed += sorted(glob.glob(os.path.join(valid, "*.docx")))[:5]
|
||||
mixed += sorted(glob.glob(os.path.join(errors, "trash_*.docx")))[:5]
|
||||
mixed += sorted(glob.glob(os.path.join(errors, "corrupt_xml.docx")))
|
||||
mixed += sorted(glob.glob(os.path.join(errors, "orphan_*.docx")))[:2]
|
||||
random.shuffle(mixed)
|
||||
session.upload_files(mixed, delay=0.05)
|
||||
session.classify()
|
||||
session.get_groups()
|
||||
|
||||
def run_all():
|
||||
"""Прогнать все сценарии."""
|
||||
print("=" * 60)
|
||||
print("СИМУЛЯТОР — сценарии A–F")
|
||||
print("=" * 60)
|
||||
|
||||
scenarios = [
|
||||
("A", scenario_A_happy),
|
||||
("B", scenario_B_zigzag),
|
||||
("C", scenario_C_bulk),
|
||||
("D", scenario_D_stupid),
|
||||
("E", scenario_E_zips),
|
||||
("F", scenario_F_stress),
|
||||
]
|
||||
|
||||
for name, fn in scenarios:
|
||||
s = Session()
|
||||
try:
|
||||
fn(s)
|
||||
print(f" ✅ сценарий {name} OK")
|
||||
except Exception as e:
|
||||
print(f" ❌ сценарий {name} FAIL: {e}")
|
||||
finally:
|
||||
s.cleanup()
|
||||
time.sleep(1)
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("СИМУЛЯЦИЯ ЗАВЕРШЕНА")
|
||||
print("=" * 60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_all()
|
||||
Reference in New Issue
Block a user