Files
Aislo/resources/tester/test_793_3b_import_screen.py
T
eomsangdonandClaude Opus 5.5 c5067aa2b6 feat(809-1a): 일위대가 불러오기 = 경쟁사 로직 인정 · 요소만 연결 · [수정] 모달 = 일위대가 컨테이너 부품 · 기초 판정 걷음
- [수정] 모달 = Labor_Table(읽기 · 덧칸 표지 · 엑셀 금액) · 줄 = 로직(단가산출 · 일위대가) / 요소(연결됨 · 후보 · 못 이음) · 단가산출 줄 = 가져온 식 SK 수식 탭 모달(Labor_SkEdit) · 서버 hopyo-view(M02_Hopyo_View)
- 엑셀 보기 목록 · 칠 = 줄 표지(View.listing) · 단가산출 탭 = 블록 목록 + [가져온 식으로 열기] · [내 단가산출로]
- 걷음(요구 703): 판정 체계 785(Judge · Solve · Bind · San_Basis 다섯 · Make.Move · Row 1차 판정 · 화면 Check · CheckRows · Rows · Block · JudgeApi · Picks · Judge.css) · [우리 기초로 바꾸기](to-base) · 근거 기초 제안 · Clause 기초 판정
- 시험 지움: 642_2(Bind · Solve) · 642_3(Row 1차 판정) · 642_5(옮기기 Move) · 642_6(판정 화면) · 786_2(옛 [수정] 모달) · 793_3a(근거 → 기초 제안) — 모두 걷은 기초 판정 길 몫
- 시험 고침: 642_1 · 794_2a2 · 794_2b(근거 제안 부분만 뺌) · 793_2 · 793_3b(기초 바꾸기 기대 → 없음) · 627 · 779_2 · 785_4 · 807_1 · m02_hopyo_excel · grid · stmate(judge 길 → view 길)
- 새 시험 test_809_1_import_labor(기초 길 0 · 표지 1,350 줄 · 가져온 식 SK · 모달 = Labor_Table · 금액 = 엑셀)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 19:17:58 +09:00

155 lines
7.6 KiB
Python

# -*- coding: utf-8 -*-
"""793-3b 지킴 — 불러오기 단산 줄 = 가져온 식 단가산출 모달(요구 646 · 647 · 652 갈래 C).
- 서버 길 `…/sangeun/from-hopyo` — 올림 때 산근 시트 둠(`실무자료/산근/<HP>.json`) →
블록 → 793-2a 내보내기 → 793-2 가져온 식 SK(만들 층 · 엑셀 단가 그대로 · 검산 = 엑셀) ·
같은 내용 = 그 SK 다시 씀 · 산근 없는 옛 HP = 409 · HP 지우면 산근도 지움 ·
STmate 블록 끝전 = 엑셀 계와 맞는 쪽
- 화면 소스 — 단가산출 탭 목록 [가져온 식으로 열기](`Hopyo_SheetSk`) · 시트 모달
(`Sangeun_Detail`) · 머리 판(검산 · [우리 단가로] / [엑셀 단가로] · [원본 글 보기] ·
[이음 고르기] · 소요량 이음) · 부품 상자만 · 700 줄
- 809-1 걷음(요구 703) — [우리 기초로 바꾸기] · 근거 세 단 · 입력 필요 · [이 줄에 잇기] · 옮기기 판정 길 없음
임시 storage(`client` 마당) · M01 원본 그대로.
"""
import re
from pathlib import Path
import helper_m02_hopyo_golden as golden
import pytest
from M02_MasterTemplete import M02_MasterTemplete_Store as store
from M02_MasterTemplete import M02_Sangeun_FromHopyo as fh
from M02_MasterTemplete import M02_Sangeun_Router as sangeun_router
from M02_MasterTemplete import M02_Template_Layers as layers
# ruff: noqa: F811
from resources.tester.test_m02_hopyo_excel import _post, client, master_hash # noqa: F401
ROOT = Path(__file__).resolve().parents[2]
M02 = ROOT / "M02_MasterTemplete"
API = "/api/m02/layers/personal"
KEY = "HP-000001"
MINE = ("Hopyo_Imported", "Hopyo_ImportedPanel", "Hopyo_SheetSk", "Hopyo_View")
def _src(name: str) -> str:
return (M02 / f"M02_MasterTemplete_{name}.ts").read_text(encoding="utf-8")
def _skcount() -> int:
folder = layers.personal_dir(7, 42) / "sangeun"
return len(list(folder.glob("*.json"))) if folder.exists() else 0
def _open(client, no=18):
body = {"층": "personal", "키": KEY, "번": no}
return client.post(f"{API}/sangeun/from-hopyo", json=body)
# ── 서버 길 ───────────────────────────────────────────────────────────
def test_단산_블록_가져온_식_만들기_다시씀_지움(client):
client.app.include_router(sangeun_router.router)
before = master_hash()
assert _post(client).status_code == 200
folder = layers.personal_dir(7, 42)
assert fh.has(folder, KEY)
made = _open(client)
assert made.status_code == 200, made.text
got = made.json()
assert got["이름"].startswith("SK-") and got["다시씀"] is False
assert got["단가기준"] == "엑셀" and got["검산"]["같음"] is True
assert round(got["검산"]["셈"]["계"]) == 30369 # 북부청임도 단산18 문양거푸집 = 엑셀
n = _skcount()
again = _open(client).json()
assert again["이름"] == got["이름"] and again["다시씀"] is True and _skcount() == n
with store.at(folder):
doc = store.read("sangeun", got["이름"])["문서"]
assert doc["바탕"] is None and doc["가져온"]["원본"]["엑셀금액"]["계"] == 30369
ten = _open(client, 10).json() # 야면석소운반 — 근거 기초 제안 없음(809-1 · 요구 703)
with store.at(folder):
meta = store.read("sangeun", ten["이름"])["문서"]["가져온"]
assert meta["로직"] and "근거후보" not in meta
assert _open(client, 99999).status_code == 404
fh._path(folder, KEY).unlink() # 산근 없는 옛 HP = 다시 올림
old = _open(client)
assert old.status_code == 409 and old.json()["detail"] == fh.RELOAD
assert _post(client).status_code == 200 and fh.has(
folder, KEY
) # 같은 엑셀 다시 올림 = 산근 채움
assert client.delete(f"{API}/hopyo/{KEY}").status_code == 200
assert not fh.has(folder, KEY) # HP 지우면 산근도
assert master_hash() == before
RULES = [("봉화", "D00102", "비목버림"), ("동부청영월", "D00003", "합버림_큰나머지")]
@pytest.mark.parametrize(("tag", "code", "rule"), RULES)
def test_STmate_끝전_엑셀_계와_맞는_쪽(tag, code, rule):
from M02_MasterTemplete import M02_San_Book as book
from M02_MasterTemplete import M02_San_Stmate as stm
if not golden.FILES[tag].exists():
pytest.skip(f"실무 엑셀 없음 {tag}")
data = book.load(golden.FILES[tag])
blk = next(b for b in data["블록"] if b["코드"] == code)
assert fh._rule(blk, stm.parse_block(blk["몸"]), data["단가"]) == rule
# ── 화면 소스 ─────────────────────────────────────────────────────────
def test_단산_줄_길_잇기():
sk, view = _src("Hopyo_SheetSk"), _src("Hopyo_View")
assert "openImported({" in sk and "dataset.skOpen" in sk # 단가산출 탭 목록 = 가져온 식 모달
assert (
'"/sangeun/from-hopyo"' in view and "openSkEdit(" in view
) # [수정] 단산 줄 = 수식 탭 모달
imp = _src("Hopyo_Imported")
assert '"/sangeun/from-hopyo"' in imp and "/sangeun/imported/${how}" in imp
assert "mountSangeunDetail(" in imp and "saveTemplate(" in imp and "openModal({" in imp
for how in ('run("price"', 'run("link"'):
assert how in imp, how
for gone in ("to-base", "toBase", "onLink", "skPick", "checkJudge", "readJudgeBlock"):
assert gone not in imp, gone # 809-1 · 요구 703
# 옛 M02 수식 나무 화면(「엑셀 원래」 위 줄) 걷음 — 수식 탭 = 공용 수식 문서 화면(802-4b-2)
assert not (M02 / "M02_MasterTemplete_Sangeun_Equation.ts").exists()
def test_머리_판_기초_없음():
panel = _src("Hopyo_ImportedPanel")
for word in ("ToOurs", "ToExcel", "Source", "Link", "Same", "Diff"):
assert f'tx("{word}")' in panel, word
for gone in ("ToBase", "PickBase", "data-basis-tiers", "우리 기초로 바꾸기", "근거 제안"):
assert gone not in panel, gone
model = (M02 / "logic/M02_Hopyo_Imported_Model.ts").read_text(encoding="utf-8")
assert "BasisCand" not in model and "skPick" not in model and "근거후보" not in model
assert not re.search(r"from \"@ui|document\.|fetch\(|sessionStorage\.", model) # 순수
def test_부품상자만_700줄_공용_안_고침():
for name in MINE:
text = _src(name)
assert len(text.splitlines()) <= 700, name
assert not re.search(r"""\bel\(\s*["'](button|input|select)["']""", text), name
assert not re.search(r"""createElement\(\s*["'](button|input|select)["']""", text), name
assert "#" not in "".join(re.findall(r"color:\s*[^;]+", text)), name
for name in ("Labor_Rows", "Labor_SkEdit", "Sangeun_Detail", "Sangeun_Tabs"):
assert "Hopyo_Imported" not in _src(name), name # 공용 쪽은 새 모달을 모름
def test_가져온_식_시트_M01바뀜_없음(client):
"""가져온 식 SK 는 M01 짝이 없음 — 저장 M01판이 있어도 시트 「M01 바뀜」 · 짝잃음 안 띄움."""
from M02_MasterTemplete import M02_Sangeun_Calc as calc
client.app.include_router(sangeun_router.router)
assert _post(client).status_code == 200
name = _open(client).json()["이름"]
folder = layers.personal_dir(7, 42)
with store.at(folder):
doc = store.read("sangeun", name)["문서"]
spots = list(calc.calc_doc(doc)["시트"]["자리"])
ans = calc.calc_doc({**doc, "M01판": {k: "다름" for k in [*spots, "x"]}})
sheet = ans["시트"]
assert sheet["자리"] and not any(x["M01바뀜"] for x in sheet["자리"].values())
assert sheet["짝잃음"] == []