Files
Aislo/resources/tester/test_prefs_persist_across_tabs.py
eomsangdonandClaude Opus 5 0ef32b5279 chore(tester): 시험을 resources/tester/ 로 옮김 — 창끼리 건너가게
⚠ **뿌리** — `tmp/` 는 창 사이에 안 건너감(실측 확인: 상대 창이 놓은 `tmp/_sync_probe.txt`
가 시간을 두고 두 번 봐도 안 보임). 그래서 **정본(등록부 스키마)만 건너가고 그것을 읽는
시험은 안 건너가** 오늘 두 번, 같은 시험이 **연 창은 통과·받은 창은 실패**가 됐음.

- `tmp/tests/*` 를 `resources/tester/` 로 **복사**(127 파일). 내용은 **한 줄도 안 고침**
- `tmp/tests` 는 **남겨 둠** — 되돌릴 자리(사용자 지시)
- 실행: `./venv/Scripts/python.exe -m pytest resources/tester/ -q`
  옮기기 전과 **같은 수**: 617 통과 / 22 건너뜀 / 실패 0

⇒ 이제 시험·예외·까닭이 **정본과 함께** 움직임. 오늘 세운 「예외는 정본 스키마에」와 짝임.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 17:12:30 +09:00

58 lines
2.9 KiB
Python

"""화면 취향이 **탭을 새로 열어도 남는지** — 저장소가 갈리지 않았는지.
왜 (2026-09-07 실측) — 취향(패널 높이·접힘·유토곡선 열림)까지 세션에 있어 **탭을 새로 열거나
브라우저를 껐다 켤 때마다 초기화**됐다. 계획서에는 「PC 를 바꾸면」으로 적혀 있었으나 실제
불편은 훨씬 잦았다. 취향은 설계 데이터가 아니므로 브라우저 저장소에 둔다 —
**설계값·초안·계산 결과는 세션 그대로**이고 그 경계가 이 시험의 요지다.
실측 — 옮긴 뒤 새 탭에서 취향 8개가 그대로 섰고 높이도 보존됐다(종단 438px · 표 204px).
"""
import re
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
_STATE = ROOT / "A00_Common" / "b_page_state.ts"
#: 키만 들고 저장소를 직접 만지는 화면 공용 부품 — 여기를 안 거치면 취향만 세션에 남는다.
_HELPERS = (
ROOT / "ui_template" / "ui_template_resizer.ts",
ROOT / "ui_template" / "ui_template_overlay.ts",
ROOT / "ui_template" / "ui_template_overlay_drag.ts",
)
def test_취향만_브라우저_저장소로_간다():
source = _STATE.read_text(encoding="utf-8")
chooser = re.search(r"function storageFor\(key: string\): Storage \{(.*?)\}", source, re.S)
assert chooser, "저장소를 고르는 자리가 없음"
body = chooser.group(1)
assert 'key.startsWith("aislo:pref:")' in body, "취향 말고 다른 통까지 가릴 수 있음"
assert "localStorage" in body and "sessionStorage" in body, "두 저장소를 다 안 씀"
def test_설계값은_세션_그대로다():
"""초안·결과가 브라우저 저장소로 새면 프로젝트를 옮겨도 남는다 — 그 경계를 지킨다."""
source = _STATE.read_text(encoding="utf-8")
for bucket in ("aislo:draft:", "aislo:result:"):
assert f'startsWith("{bucket}")' not in source, f"{bucket} 까지 저장소를 갈랐음"
def test_화면_공용_부품도_같은_판단을_쓴다():
for path in _HELPERS:
source = path.read_text(encoding="utf-8")
assert "ByKey(" in source, f"{path.name} 이 저장소를 직접 고르고 있음"
# 남은 날 `sessionStorage.` 직접 호출이 있으면 그 값만 세션에 남아 갈린다.
leftovers = [
line
for line in source.splitlines()
if re.search(r"(?<![.\w])sessionStorage\.(get|set|remove)Item\(", line)
]
assert not leftovers, f"{path.name} 에 세션 직접 호출이 남음: {leftovers[:2]}"
def test_옛_세션_취향을_한_번_옮긴다():
"""이 변경 때문에 쓰던 패널 크기가 초기화되지 않게 — 첫 로드 때 쓸어 옮긴다."""
source = _STATE.read_text(encoding="utf-8")
assert "function liftPrefsToLocalStorage()" in source, "옮기는 자리가 없음"
assert re.search(r"^liftPrefsToLocalStorage\(\);", source, re.M), "부르는 자리가 없음"