"""F — 서버 재계산 다리: 파이썬 → Node 번들(`build:spreadsheet`) → 화면과 같은 TS 엔진. 엔진(A · B)이 아직 빈 몸이면 `아직 없음` 까닭이 그대로 올라와 저장을 막는지 봄 · 엔진이 차면 저장 견본(`spreadsheet_sample.json`)의 `계산값` 과 서버 풀이가 같은지 봄. """ 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] SAMPLE = ROOT / "A00_Common" / "spreadsheet" / "spreadsheet_sample.json" pytestmark = pytest.mark.skipif(shutil.which("node") is None, reason="node 가 없음") def test_견본_계산값_같음(): sample = json.loads(SAMPLE.read_text(encoding="utf-8")) try: saved = spreadsheet.with_server_values({**sample, "계산값": {"s1": {"H4": {"수": "틀림"}}}}) except spreadsheet.RecalcError as error: assert "아직 없음" in str(error), error # 엔진이 빈 몸일 때만 봐줌 pytest.skip(f"엔진 아직 — {error}") assert saved["계산값"] == sample["계산값"] assert {k: v for k, v in saved.items() if k != "계산값"} == { k: v for k, v in sample.items() if k != "계산값" } def test_못_푸는_문서는_까닭과_함께_막음(): with pytest.raises(spreadsheet.RecalcError) as caught: spreadsheet.recalc_workbooks([{"종류": "통합문서", "시트": "깨짐"}]) assert "스프레드시트 계산 실패" in str(caught.value)