Files
Aislo/resources/tester/test_298_3_page_dispose.py
T
eomsangdonandClaude Opus 5.5 2ba46341ee feat(공용): 프로젝트마다 따로 동작 공용 — 탭 프로젝트 · 떠남 비움 · 떠남 물음 한 벌 (PLAN 572-1 · 요구 400~403)
- b_project_switch: currentProjectId(탭 세션 먼저 · 새 탭 = 마지막 값) · setCurrentProject · forgetProject · leaveProject(그 프로젝트 세션 칸 · 준비 표식 · 3D 보관함 몫) · reloadIfOtherProject(다른 프로젝트 화면 = 새로 엶) · guardProjectLeave · askProjectLeave([취소 · 폐기 · 저장] 한 번) · linkRouter(라우터가 이어 줌) · 화면 모듈은 부를 때만 들임
- b_asset_cache purgeProject · b_page_state 등록표 D02 · E 일곱 칸(옛 키 한 번 옮김) · router isProjectRoute
- 가드 helper: design_leave = 공용 가드 위 껍질(B05 고침 지문에 D · E 칸 안 섞임) · group_workflow { dirty, save, discard } · b_workflow_nav · b_page_scaffold · overlay · design_store · design_page 직접 읽기 → currentProjectId
- 시험 test_401_project_isolation 새로(탭 둘 흉내 · 떠남 · 보관함 · 가드 · 직접 읽기 한 곳) · 290_1 시드에 D02 · E 옛 키
- 낡은 시험 고침: 298_3 · 346_4 · 384_s · 520_3 헬퍼 = 공용 가드 · 탭 프로젝트 흉내 더함 · 298_3 탭 닫기 듣개 자리 b_project_switch 로 · 302_1 라우터 판별 글 isProjectRoute 꼴로 · 343_3 헬퍼 가짜 IndexedDB 내보냄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 18:06:14 +09:00

85 lines
3.1 KiB
Python

"""298-3 노선 [저장] 뒤 옛 페이지 풀림 — 페이지를 다시 세워도 창 · 문서 듣개 수 그대로 · 코리도 캐시 한 칸.
./venv/Scripts/python.exe -m pytest resources/tester/test_298_3_page_dispose.py -q
"""
from __future__ import annotations
import json
import re
import subprocess
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[2]
HELPER = Path(__file__).resolve().parent / "helper_298_3_page_dispose.cjs"
def _read(rel: str) -> str:
return (ROOT / rel).read_text(encoding="utf-8")
@pytest.fixture(scope="module")
def out() -> dict:
run = subprocess.run( # noqa: S603 — 고정 실행 파일
["node", "--expose-gc", str(HELPER)], capture_output=True, text=True, encoding="utf-8"
)
assert run.returncode == 0, run.stderr
return json.loads(run.stdout)
def test_다시_세워도_창_듣개_수_그대로(out) -> None:
assert (
out["afterFirst"]["window"] == 5
) # beforeunload · pointermove · pointerup · pointercancel · resize
assert out["afterFive"] == out["afterFirst"]
def test_옛_페이지_풀림_지금_페이지는_들음(out) -> None:
assert out["oldAlive"] == 0
assert out["liveAlive"] is True
assert out["resizeSettles"] == 1 # 살아 있는 패널 하나만 다시 앉힘
assert out["unloadBlocked"] is False and out["guardSet"] is True
@pytest.mark.parametrize(
("rel", "types"),
[
("ui_template/ui_template_overlay_drag.ts", "pointermove|pointerup|pointercancel|resize"),
(
"ui_template/ui_template_side_panels.ts",
"scroll|resize",
), # 끌기 동안 pointer 듣기는 끝에 뗌
("B05_Profile/B05_Profile_UI_Panel_Settings.ts", "pointerup|keyup"),
("B05_Profile/B05_Profile_UI_RouteEdit_StructureMarks.ts", "keydown|keyup|blur"),
("B05_Profile/B05_Profile_UI_RouteEdit_Keys.ts", "keydown|keyup|blur"),
],
)
def test_전역_듣기는_노드_수명으로만(rel: str, types: str) -> None:
code = _read(rel)
assert not re.search(rf'\b(window|document)\.addEventListener\(\s*"({types})"', code)
assert "listenWhileAlive(" in code
def test_옆_패널_크기_감시는_노드를_안_붙듦() -> None:
side = _read("ui_template/ui_template_side_panels.ts")
assert "new ResizeObserver(() => ref.deref()?.())" in side
assert "const ref = new WeakRef(place);" in side
def test_코리도_캐시는_지금_노선_한_칸() -> None:
code = _read("B05_Profile/B05_Profile_UI_Corridor.ts")
assert (
"function remember(key: string, entry: CacheEntry): void {\n cache.clear();\n cache.set(key, entry);\n}"
in code
)
assert code.count("cache.set(") == 1
def test_떠남_가드는_탭_닫기_듣개_한_번만() -> None:
# 401 — 떠남 가드가 공용으로 옮김 · 듣개는 모듈에 한 번 · 페이지 노드는 가드 목록에서 빠지면 버림
code = _read("A00_Common/b_project_switch.ts")
assert "if (!unloadHooked) {" in code and code.count('addEventListener("beforeunload"') == 1
assert "liveGuards(); // 빠진 옛 페이지를 붙들지 않음" in code