""" 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()