# -*- coding: utf-8 -*- """PLAN 8-3 — 로직 재료 줄 키 → 기본 검색어 바꿔 넣기(`build_재료_검색어.py`).""" from __future__ import annotations import json import sys from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[2] sys.path.insert(0, str(ROOT / "resources/master_data/scripts")) import build_재료_검색어 as bw # noqa: E402 import check_master as cm # noqa: E402 import master_auto as mau # noqa: E402 import master_formula as mf # noqa: E402 import master_pick as mp # noqa: E402 @pytest.fixture(scope="module") def master() -> mf.Master: return mf.Master(cm.load()) def _material(master, key: str, name: str) -> dict: return next(h for h in master.logic(key)["호표"] if h.get("이름") == name) def test_결속선은_원문대로_고른_어닐링철선이_그대로_첫째(master) -> None: item = _material(master, "GC000037", "결속선 # 10") assert "대표" not in item["요소"] and item["요소"]["검색어"].startswith("어닐링철선") row = master.logic("GC000037") got = mp.search(master, item["요소"], mau.values(master, row), item["단위"]) assert got[0] == "MT000204" # 어닐링철선 #10 서울 — 옛 입력 「결속선」 목록 첫째 def test_재료_입력_키_목록은_걷히고_넘기던_인자도_없음(master) -> None: for name, data in cm.load().items(): if not name.startswith("로직_"): continue for row in data["줄"]: assert not bw.material_inputs(row), row["키"] call = next(h["요소"] for h in master.logic("GF000169")["호표"] if "GF000160" in h["요소"]) assert "횟수=" in call and "철선=철선" not in call and "합판=합판" not in call def test_남은_대표는_값_빈_자리표_품목만(master) -> None: """검색어로 못 가르는 줄(규격 빈 자리표 MT030…)만 대표가 남음 — 목록으로 알린 줄.""" reps = { str(h["요소"]["대표"]) for data in cm.load().values() for row in data.get("줄", []) if "호표" in row for h in row["호표"] if isinstance(h.get("요소"), dict) and h["요소"].get("대표") } assert reps and all(k.startswith("MT0306") for k in reps), reps def test_글_갈음은_바뀐_값_자리만(master) -> None: text = ( '{ "키": "GX1", "입력": [\n { "이름": "철선", "고르기": ["MT000199"] },\n' ' { "이름": "횟수", "고르기": ["1회"] }\n],\n "호표": [\n' ' { "종류": "재료", "요소": {"구분": "철근·강재", "대표": "{철선}"}, "수량": "1" },\n' ' { "종류": "로직", "요소": "로직(GF000160, 횟수=횟수, 철선=철선)", "수량": "1" }\n] }' ) row = json.loads(text) change = {"요소": {0: {"구분": "철근·강재", "검색어": "어닐링철선 #8 서울"}}, "걷음": ["철선"]} got = bw._patch_row(text, row, change) assert json.loads(got) == bw.apply(row, change) assert '"이름": "횟수"' in got and "철선=철선" not in got and "횟수=횟수" in got assert got.count("\n") == text.count("\n") - 1 # 걷은 입력 한 줄만 빠짐