Files
Aislo/resources/tester/test_418_reset_cleanup.py
T
eomsangdonandClaude Opus 5.5 af5c91e277 fix(B05 초기화 정리): 노선 추천 칸 [초기화] 지움 · 아래 [초기화]는 B08 · B09 초안 남김 (418)
- 노선 추천 칸 [초기화] 단추 · 편집기 handler · /route/plan 의 initial_route(전처리 초기 노선) 걷음
- 아래 [초기화] = 마지막 추천 [적용] 노선(초기값 스냅샷 규칙 그대로) · B05 · B06 초안만 지움
- 시험 test_418_reset_cleanup · 옛 시험 단언 고침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
2026-10-18 12:20:21 +09:00

125 lines
4.4 KiB
Python

"""418 초기화 정리(요구 254-3 · 253-6).
- 「노선 추천」 칸 [초기화] 없음 · 그 단추만 쓰던 길(편집기 handler · `initial_route`) 없음
- 좌측 아래 [초기화] — 저장 안 한 B08 · B09 초안 남김 · B05 · B06 초안만 지움(진짜 TS)
- 추천 [적용] → 고쳐 저장 → 아래 [초기화] = [적용]한 노선(진짜 `refresh_initial_snapshot`)
"""
import asyncio
import json
import subprocess
from contextlib import asynccontextmanager
from pathlib import Path
from uuid import uuid4
import pytest
from common_util.common_util_initial_snapshot import (
restore_snapshot_files,
save_initial_snapshot,
)
ROOT = Path(__file__).resolve().parents[2]
HELPER = Path(__file__).with_name("helper_418_reset_drafts.cjs")
def _read(rel: str) -> str:
return (ROOT / rel).read_text(encoding="utf-8")
def test_노선_추천_칸에_초기화_단추_없음():
part = _read("B05_Profile/B05_Profile_UI_Panel_Recommend.ts")
assert 'data-act="reset"' not in part and "resetButton" not in part
assert part.count('data-act="recommend" disabled') == 1
initial = _read("B05_Profile/B05_Profile_UI_RouteEdit_Initial.ts")
assert "resetButton" not in initial and "initialRouteSnapshot" not in initial
assert "initial_route" not in _read("B05_Profile/B05_Profile_Api_Replan.ts")
replan = _read("B05_Profile/B05_Profile_Router_Replan.py")
assert '"initial_route"' not in replan and "_initial_shape" not in replan
def test_아래_초기화는_B08_B09_초안_남김():
out = json.loads(
subprocess.run(
["node", str(HELPER)], capture_output=True, text=True, encoding="utf-8", check=True
).stdout
)
seed, left = out["seed"], out["left"]
for name in ("b08-materials", "b08-hydro", "b08-options", "b08-milestone", "b09-estimation"):
assert left[name] == seed[name], name
# B05 · B06 초안(프로젝트 범위 · 노선 범위)은 지움
assert left["route-draft"] is None and left["std-cross"] is None
assert left["crossdesign"] is None
# 다른 프로젝트 초안은 안 건드림
assert out["other"] == seed
assert [c[0] for c in out["calls"]] == ["resetRouteDesign", "toast", "reload"]
class _Cursor:
def __init__(self):
self.lastrowid = 0
self._rows = []
async def __aenter__(self):
return self
async def __aexit__(self, *_):
return False
async def execute(self, sql, params=None):
self._rows = [{"id": 7, "project_id": "p1"}] if "FROM routes" in sql else []
async def fetchone(self):
return self._rows[0] if self._rows else None
async def fetchall(self):
return self._rows
class _Connection:
def cursor(self, *_args, **_kwargs):
return _Cursor()
class _Pool:
@asynccontextmanager
async def acquire(self):
yield _Connection()
@pytest.fixture
def project(tmp_path: Path) -> Path:
(tmp_path / "B05_Profile/route").mkdir(parents=True)
return tmp_path
def _write_route(root: Path, tag: str) -> None:
(root / "B05_Profile/route/planned_route.csv").write_text(f"x,y\n{tag}\n", encoding="utf-8")
def _route(root: Path) -> str:
return (root / "B05_Profile/route/planned_route.csv").read_text(encoding="utf-8")
def test_추천_적용_뒤_고쳐도_아래_초기화는_적용_노선(project, monkeypatch):
from B05_Profile import B05_Profile_Router_RouteInitial as initial_router
monkeypatch.setattr(initial_router, "get_db_pool", lambda: _Pool())
# ① 자동설계 체인 직후 초기값
_write_route(project, "auto")
asyncio.run(save_initial_snapshot(_Connection(), project, 7))
# ② 추천 [적용](as_initial) — 그 노선으로 초기값 다시 뜸
_write_route(project, "applied")
asyncio.run(initial_router.refresh_initial_snapshot(uuid4(), project, 7))
# ③ 손으로 고쳐 [저장] — 초기값 그대로(as_initial 아님 · 스냅샷 안 부름)
_write_route(project, "edited")
# ④ 아래 [초기화] = 초기값 파일 복원
restore_snapshot_files(project)
assert _route(project) == "x,y\napplied\n"
# ⑤ 다른 추천으로 바꿔 [적용] → 그것이 새 초기화 자리
_write_route(project, "applied2")
asyncio.run(initial_router.refresh_initial_snapshot(uuid4(), project, 7))
_write_route(project, "edited2")
restore_snapshot_files(project)
assert _route(project) == "x,y\napplied2\n"