- SkPatch LINK 기계 = 로직 · _Plan.link: EQ 키 → 기계경비 기초(그 기계를 고르기에 둔 기초 먼저) + 입력 기계 = 원문번호 · EQ 키 바로 더한줄 셈 오류 없앰 - master_pick resolve · machine · master_formula _inputs: 셈에 넘어온 마스터로 기계 찾음 — 까닭 = mp.EQ ContextVar 는 마스터를 지은 문맥에만 있어 서버 둘째 요청(스레드 풀 · 새 문맥)부터 목록 밖 기계(굴착기(타이어) 0.6㎥ 등)가 「고르기 밖」으로 막힘 · ContextVar 는 대신 길로 남김 - 새 시험 test_778_2_hopyo_machine_link(잇기 뒤 SK 셈 · 서버 두 요청 · 문맥 밖 스레드) - 여덟 파일 기초 80 · SK 37 · 고름 대기 89 그대로 · SK 셈 오류 0 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
75 lines
4.2 KiB
Python
75 lines
4.2 KiB
Python
"""못옮김 기계 잇기 = 기계경비 기초 로직 줄(PLAN 778-2 · 분석 621-B 4-2).
|
||
|
||
EQ 키 바로 더한줄은 셈 오류 → 사용자 잇기 `{id, 기계: EQ…}` = SK 더한줄
|
||
`{종류: 로직, 로직: 기계경비 기초, 입력값: {기계: 기계 번호}}` · SK 셈 됨(그 기계 시간당 기계경비 ×
|
||
엑셀 시간 × 배) · 갈래 다른 키 · 없는 키 = LinkError. 고르기 목록 밖 기계 = 서버 둘째 요청 ·
|
||
지은 문맥 밖 스레드에도 셈 됨(마스터를 셈에 넘김). master 읽기만.
|
||
"""
|
||
|
||
import threading
|
||
|
||
import pytest
|
||
|
||
from M01_MasterData import M01_MasterData_Store as m01
|
||
from M02_MasterTemplete import M02_Hopyo_Combine as combine
|
||
from M02_MasterTemplete import M02_Hopyo_SkPatch as skpatch
|
||
from M02_MasterTemplete import M02_Sangeun_Calc as calc
|
||
from M02_MasterTemplete import M02_Sangeun_Router as sangeun_router
|
||
from resources.tester.test_m02_hopyo_excel import client # noqa: F401
|
||
|
||
BASE = "GC000267" # 바탕 아무 기초(시간 단위) — 셈만 봄
|
||
|
||
|
||
def _plan(whole) -> skpatch._Plan:
|
||
doc = {"키": "SK-000000", "이름": "견줌", "단위": "시간", "바탕": {"로직": BASE},
|
||
"입력값": {}, "덮개": {}, "뺀줄": [], "자재표시": {}, "더한줄": []} # fmt: skip
|
||
work = skpatch._Plan(doc, whole)
|
||
one = {"id": "기계:굴착기", "갈래": "기계", "이름": "굴착기", "규격": "0.6", "단위": "시간",
|
||
"수량": 0.25, "글": "엑셀만 장비 — 기계 못 찾음", "후보": []} # fmt: skip
|
||
work.lost = [one, {**one, "id": "기계:굴착기#1"}]
|
||
return work
|
||
|
||
|
||
def test_기계_잇기_뒤_SK_셈_됨():
|
||
whole = m01.loaded()[1]
|
||
work = _plan(whole)
|
||
work.link([{"id": "기계:굴착기", "기계": "EQ000026"}])
|
||
add = work.doc["더한줄"][-1]
|
||
assert add["종류"] == "로직" and add["로직"] in combine.MACHINE_SET - {
|
||
combine.MACHINE["굴착기"]
|
||
}
|
||
assert add["입력값"] == {skpatch.MACH_IN: "0211-0060"} and "요소" not in add
|
||
assert add["수량"] == pytest.approx(0.25 * work.tb) and add["단위"] == "시간"
|
||
ran = calc.run(work.doc, whole) # 전 = 「Decimal × dict」 셈 오류
|
||
line = next(x for x in ran["줄"] if x.get("cid") == "add:#0")
|
||
assert float(line["금액"]) > 0
|
||
one = {"종류": "로직", "로직": add["로직"], "입력값": add["입력값"], "수량": 1}
|
||
hour = calc.run({**work.doc, "바탕": None, "더한줄": [one]}, whole)["기준"]
|
||
assert float(hour["경비"]) == 27120 # 굴착기(타이어) 0.6㎥ 시간당 경비(엑셀 14-6 과 같음)
|
||
# 무한궤도 = 굴착기(무한궤도) 기계경비 · 갈래 다른 키 · 없는 키 = 틀림
|
||
work.link([{"id": "기계:굴착기#1", "기계": "EQ000019"}])
|
||
assert work.doc["더한줄"][-1]["로직"] == combine.MACHINE["굴착기"]
|
||
work.lost = _plan(whole).lost
|
||
with pytest.raises(skpatch.LinkError):
|
||
work.link([{"id": "기계:굴착기", "기계": "MT000010"}])
|
||
with pytest.raises(skpatch.LinkError):
|
||
work.link([{"id": "기계:굴착기", "기계": "EQ999999"}])
|
||
|
||
|
||
def test_목록_밖_기계_서버_둘째_요청에도_셈(client): # noqa: F811
|
||
m01.loaded() # 마스터 = 이 스레드에서 지음 · 요청 = 다른 스레드(문맥 안 따라감)
|
||
client.app.include_router(sangeun_router.router)
|
||
one = {"종류": "로직", "로직": "GC000268", "입력값": {skpatch.MACH_IN: "0211-0060"},
|
||
"이름": "굴착기(타이어) 0.6㎥", "단위": "시간", "수량": 1} # fmt: skip
|
||
doc = {"키": "SK-000000", "이름": "t", "단위": "시간", "바탕": None, "입력값": {}, "덮개": {},
|
||
"뺀줄": [], "자재표시": {}, "더한줄": [one]} # fmt: skip
|
||
for _ in range(2):
|
||
got = client.post("/api/m02/layers/personal/sangeun/calc", json={"문서": doc})
|
||
assert got.status_code == 200, got.text
|
||
assert got.json()["기준"]["경비"] == 27120, got.json().get("까닭")
|
||
whole, out = m01.loaded()[1], {} # 지은 문맥 밖 스레드(서버 요청 스레드 풀과 같음)
|
||
run = threading.Thread(target=lambda: out.update(calc.run(doc, whole)))
|
||
run.start()
|
||
run.join()
|
||
assert out["기준"] and float(out["기준"]["경비"]) == 27120, out.get("까닭")
|