Files
Aislo/resources/tester/test_m01_search_words.py
T
eomsangdonandClaude Opus 5.5 3f581ca41b feat(m01): 로직 재료 줄 키 → 기본 검색어 바꿔 넣기 (PLAN 8-3)
- 재료 줄 591 → {구분, 상세구분, 검색어} · 재료 입력 키 목록 76 걷음 · 넘기던 인자 뗌
- 결속선 등 원문대로 고른 품목(어닐링철선)이 검색 첫째 그대로
- 1,354 자동값 금액 변화 0 · 계산전부 멈춤 0 · check_master 로직 0 · 단위 16 그대로
- 못 맞춘 26줄은 옛 대표 · 조건 그대로: 값 빈 자리표 MT0306… 14 · 같은 단위 후보 0 빈 줄 12
- 도구: 빈 줄은 안 바꿈 · 판정은 서버 찾기(master_pick.search) · 시험 test_m01_search_words

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V1MKKZKpUHTPKb513FneU8
2026-09-24 21:05:58 +09:00

75 lines
3.1 KiB
Python

# -*- 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 # 걷은 입력 한 줄만 빠짐