"""옛 일위대가 조합 → 열마다 일위대가 문서 옮기기(`M02_Labor_Migrate` · PLAN 39-1b). 시스템 층 = 견본 표(임시 폴더) · 조합은 M01 마스터(읽기만) · 개인 층 = 임시 storage. """ import json from pathlib import Path import pytest from config import config_system from M02_MasterTemplete import M02_Labor_Migrate as migrate from M02_MasterTemplete import M02_MasterTemplete_Combo_Store as combos from M02_MasterTemplete import M02_MasterTemplete_Items as items_store from M02_MasterTemplete import M02_MasterTemplete_Store as store from M02_MasterTemplete import M02_Template_Layers as layers from resources.tester.test_m02_structure import write_sample_table SHARED = "UP42-000001" def _point(folder: Path, keys: dict[str, str]) -> None: path = folder / "table" / f"{store.STRUCTURE_TABLE}.json" doc = json.loads(path.read_bytes()) for col in doc["열"]: if col["id"] in keys: col["일위대가"] = keys[col["id"]] path.write_text(json.dumps(doc, ensure_ascii=False), encoding="utf-8") @pytest.fixture() def world(tmp_path, monkeypatch): system = tmp_path / "system" system.mkdir() write_sample_table(system) monkeypatch.setattr(store, "FOLDER", system) monkeypatch.setattr(layers, "SYSTEM_ROOT", system) storage = tmp_path / "storage" storage.mkdir() monkeypatch.setattr(config_system, "STORAGE_BASE_DIR", str(storage)) _point(system, {"rv": "UA000008", "c1": "UA000008", "pv_b": "UA999999"}) personal = layers.personal_dir(7, 42) items_store.ensure(personal) with store.at(personal): got = store.read("table", store.STRUCTURE_TABLE) doc = got["문서"] doc["열"] = [ {"id": "a", "머리": ["돌", "가"], "꼴": "수", "일위대가": SHARED}, {"id": "b", "머리": ["돌", "나"], "꼴": "수", "일위대가": SHARED}, ] store.write("table", store.STRUCTURE_TABLE, got["판"], doc) combo = { "그룹": "일위대가조합", "다음": 2, "줄": [ { "키": SHARED, "이름": "개인 조합", "단위": "개소", "담은로직": [{"로직": "GF000219", "메모": "메쌓기"}], } ], } (personal / combos.FILE).write_text(json.dumps(combo, ensure_ascii=False), encoding="utf-8") return {"system": system, "personal": personal, "storage": storage} def _labor(folder: Path, cid: str) -> dict: return json.loads((folder / "labor" / f"{cid}.json").read_bytes()) def test_시스템_층_열마다_복사_같은_조합도_따로_없는_조합은_못함(world): system = world["system"] got = migrate.migrate(system) assert got["옮김"] == ["rv ← UA000008", "c1 ← UA000008"] assert got["못함"] == ["pv_b · 없는 일위대가 조합 「UA999999」"] rv, c1 = _labor(system, "rv"), _labor(system, "c1") assert rv["본뜬"] == {"층": "system", "주인": None, "키": "UA000008"} assert rv["담은로직"] == c1["담은로직"] and len(rv["담은로직"]) == 14 assert all(one["입력값"] == {} and one["수량"] is None for one in rv["담은로직"]) assert rv["일위대가번"] != c1["일위대가번"] # 열마다 자기 번호 with store.at(system): # 나중에 만든 도면도 같은 뒷자리 store.create_structure("rv") doc = json.loads((system / "structure" / "rv.json").read_bytes()) assert doc["도번"][2:] == rv["일위대가번"][2:] assert rv["계산값"]["줄"] # 서버가 계산값까지 assert _labor(system, "ms")["담은로직"] == [] # 키 없는 열 = 빈 일위대가 def test_개인_층_여러_열이_쓰던_조합은_열마다_본뜬은_그_층(world): personal = world["personal"] assert migrate.layer_folders(True) == [personal] got = migrate.migrate(personal) assert got["옮김"] == [f"a ← {SHARED}", f"b ← {SHARED}"] a, b = _labor(personal, "a"), _labor(personal, "b") assert a["본뜬"] == b["본뜬"] == {"층": "personal", "주인": "7/42", "키": SHARED} assert (a["단위"], a["담은로직"][0]["메모"]) == ("개소", "메쌓기") assert a["일위대가번"] != b["일위대가번"] def test_다시_돌려도_같음_사람이_고친_문서는_그대로(world): system = world["system"] migrate.migrate(system) before = {p.name: p.read_bytes() for p in (system / "labor").glob("*.json")} assert migrate.migrate(system)["옮김"] == [] after = {p.name: p.read_bytes() for p in (system / "labor").glob("*.json")} assert before == after with store.at(system): # 사람이 비운 문서도 다시 안 채움 got = store.read("labor", "rv") store.write("labor", "rv", got["판"], {**got["문서"], "담은로직": []}) assert "rv" in migrate.migrate(system)["그대로"] assert _labor(system, "rv")["담은로직"] == [] def test_미리_보기는_파일을_안_씀(world): system = world["system"] got = migrate.migrate(system, dry=True) assert "rv ← UA000008" in got["옮김"] assert not list((system / "labor").glob("*.json"))