Files
Aislo/resources/tester/test_323_9_save_redraw.py
T
eomsangdonandClaude Opus 5.5 7cb82c6112 fix(구조물표): 323-9 ① B06 [저장] 뒤 카드 = 서버 새 상세 — 저장 도중 바뀜 신호로 낡은 상세 캐시 · 빈 초안을 그리지 않음(savingDesign) · 뒤처리가 비운 캐시로 새 상세를 받아 한 번 다시 그림(보일 때만) · B05 보기 저장 · [확정] 길 그대로
- design_save: 저장 도중 표시(savingDesign) · 다 나간 뒤 · 실패 때 풂
- design_view_cross: refreshDetailForStructures 가 저장 도중이면 차례만 올리고 안 그림(최신만) · persistContext.redraw
- B06 Persist done: invalidateSectionDetail 뒤 redraw
- 시험: test_323_9_save_redraw(저장 전 옛 자리 · 저장 뒤 새 자리 · 도중 건너뜀)

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

61 lines
2.1 KiB
Python

"""PLAN 323-9 ① — B06 [저장] 뒤 카드가 저장 전 서버 상태로 돌아가던 흠.
저장 도중 바뀜 신호(초안이 정본으로 나가며 비워짐)가 낡은 상세 캐시 · 빈 초안으로 다시 그렸고, 뒤처리는
캐시만 비우고 다시 안 그렸음 → 저장 도중엔 안 그림 · 뒤처리가 서버 새 상세로 한 번 그림.
Node 헬퍼 = `helper_323_9_save_redraw.cjs`(진짜 저장 차례 · 횡단 뒤처리 · 상세 캐시).
"""
from __future__ import annotations
import json
import subprocess
from pathlib import Path
import pytest
HERE = Path(__file__).parent
ROOT = HERE.parent.parent
pytestmark = pytest.mark.skipif(
not (ROOT / "config" / "node_modules").is_dir(), reason="프론트엔드 의존성 미설치"
)
@pytest.fixture(scope="module")
def out() -> dict:
run = subprocess.run(
["node", str(HERE / "helper_323_9_save_redraw.cjs")],
capture_output=True,
text=True,
encoding="utf-8",
timeout=120,
check=True,
)
return json.loads(run.stdout)
def test_after_save_cards_show_server_new_detail(out: dict) -> None:
assert out["ok"] is True
assert out["before"] == "옛 자리 4+5"
assert out["after"] == "새 자리 4+8 · 47+0"
def test_no_redraw_from_stale_cache_while_saving(out: dict) -> None:
assert out["savingSeen"] == [True, False] and out["savingIdle"] is False
# 저장 도중 신호는 건너뜀 · 뒤처리가 새로 한 번 받음(오버레이 안)
assert out["calls"] == [
"overlay:on",
"refresh:skip",
"cross:save",
"fetch:새 자리 4+8 · 47+0",
"overlay:off",
]
def test_cross_view_wires_guard_and_redraw() -> None:
view = (ROOT / "A00_Common" / "design" / "design_view_cross.ts").read_text("utf-8")
body = view[view.index("async function refreshDetailForStructures") :]
body = body[: body.index("loadSectionDetail")]
assert "++structuresRefreshSeq" in body and "savingDesign(projectId)" in body
assert "redraw: () => (host.visible() ? refreshDetailForStructures()" in view