"""화면 취향이 **탭을 새로 열어도 남는지** — 저장소가 갈리지 않았는지. 왜 (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"(?