"""저장 뒤 식 · 값 유지 — M02 면적산출 · 재료산출 저장본을 서버 엔진으로 다시 풀면 저장된 `계산값` 과 같음. 읽기만 함(저장본을 고치지 않음). 저장 때 서버가 적은 값과 지금 엔진 풀이가 어긋나면 화면을 다시 열 때 값이 달라 보임. """ import json import shutil from pathlib import Path import pytest from common_util import common_util_spreadsheet as spreadsheet ROOT = Path(__file__).resolve().parents[3] FOLDER = ROOT / "resources" / "master_template" pytestmark = pytest.mark.skipif(shutil.which("node") is None, reason="node 가 없음") def _books() -> list[tuple[str, dict]]: out = [] for kind in ("area", "material"): for path in sorted((FOLDER / kind).glob("[!.]*.json")): book = json.loads(path.read_text(encoding="utf-8")) if isinstance(book, dict) and book.get("시트"): out.append((f"{kind}/{path.stem}", book)) return out def test_저장본_서버_재계산_같음(): books = _books() assert any("계산값" in b for _, b in books), "계산값 있는 저장본이 없음" fresh = spreadsheet.recalc_workbooks([b for _, b in books]) diffs = [] for (name, book), values in zip(books, fresh): if "계산값" not in book: continue # 옛 저장본 — 풀리기만 하면 됨 saved = book["계산값"] for sheet, cells in values.items(): for addr, v in cells.items(): if saved.get(sheet, {}).get(addr) != v: diffs.append( f"{name} {sheet}!{addr}: 저장 {saved.get(sheet, {}).get(addr)} · 지금 {v}" ) for sheet, cells in saved.items(): for addr in cells: if addr not in values.get(sheet, {}): diffs.append(f"{name} {sheet}!{addr}: 저장에만 있음") assert not diffs, "\n".join(diffs[:30])