Files
Aislo/resources/tester/test_548_project_overview.py
T
eomsangdonandClaude Opus 5.5 29512c001b feat(D 예정노선): D02 기준 지정 걷음 · 지점 마킹 = D03 노선분석 · 기준점 둘레 1 km 처음 받기 · 조용히 이어 받기 (PLAN 591-2 · 요구 452 · 453)
- D02 걷음 — 길 · 단계(PLAN 단계 둘 = 노선 분석 · 확정) · [>] · 대시보드 단계 점 · 서버 길 · 폴더 만들기 · 캐시 등록 · 글 · 가이드 폴더
- 등록 [등록] · 받은 예정노선 [보기] = D03 으로 곧바로
- D03 지점 = 긋기에 붙는 점 · 목록 칸(여섯 색 · 「지점 N」 · 🗑) · 핀 끌기 = 그 자리 노선 노드 같이 · [저장] 몸에 실음 · [초기화] = 선만 지우고 지점 남김
- 지도 우클릭 메뉴(부품 상자) — 여기서 긋기 시작(빈 땅 = 새 본선) · 갈래 시작 · 이어 긋기 · 지점 놓기 · 지점 지우기 · 긋기 끝
- 받기 — 처음 = 등록 기준점 둘레 ± 1 km(지점 · 선 없을 때) · 지점 · 선 · 지도 보기 가운데가 받은 범위 밖이면 조용히 이어 받음(단추 · 막는 창 걷음 · 실패만 [다시 받기])
- 좌표계 = 파일 머리 · 없으면 기준점 경도 TM 띠
- 시험: 529_3(D02 지점 API) 지움 → 591_2 로 갈음 · 280_2 · 528 · 530_2 · 547_1 · 548 · 553_4 · 556_2 · 560_4 · 401 · 54_2 = D02 단계 · 페이지 걷음에 맞춤 · 590_1 · 530_2_analyze = 사업연도 · 기준점 한 번에 읽음 · 591_1 D04 씨앗 시험 = 590-1 이 씨앗 줄 걷음에 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 10:19:34 +09:00

77 lines
3.4 KiB
Python

"""548 프로젝트 목록 · 상세 — 칸반 나눔 규칙 · 산출물 · 내 것 · 단계 수 짝(서버 · 화면 · 요약)."""
import re
from datetime import datetime, timedelta
from pathlib import Path
from B01_Dashboard.B01_Dashboard_Router_Overview import (
STAGE_TOTAL,
board_column,
idle_days,
is_mine,
project_outputs,
)
from B01_Dashboard.B01_Dashboard_Summary import STAGE_NAMES
ROOT = Path(__file__).resolve().parents[2]
def stages(*states: str) -> list[dict]:
return [{"stage_no": i, "state": s} for i, s in enumerate(states)]
N, P, C, S, F = "NOT_STARTED", "IN_PROGRESS", "COMPLETE", "STALE", "FAILED"
def test_board_column_road():
assert board_column("ROAD", stages(N, N, N, N, N, N, N)) == "start"
assert board_column("ROAD", []) == "start"
assert board_column("ROAD", stages(P, N, N, N, N, N, N)) == "design"
assert board_column("ROAD", stages(C, C, C, P, N, N, N)) == "design"
assert board_column("ROAD", stages(C, C, P, S, N, N, N)) == "review"
assert board_column("ROAD", stages(C, F, N, N, N, N, N)) == "review"
assert board_column("ROAD", stages(C, C, C, C, C, C, P)) == "confirm"
assert board_column("ROAD", stages(C, C, C, C, C, C, N)) == "confirm"
assert board_column("ROAD", stages(C, C, C, C, C, C, C)) == "done"
# 마지막만 마침이어도 완료(앞이 STALE 이어도)
assert board_column("ROAD", stages(C, S, C, C, C, C, C)) == "done"
def test_board_column_other_kinds():
assert board_column("PLAN", stages(C, P)) == "confirm"
assert board_column("PLAN", stages(C, C)) == "done"
assert board_column("STABILITY", stages(C, P, N, N, N, N)) == "design"
assert board_column("STABILITY", stages(N, N, N, N, N)) == "start"
# 모르는 종류(사방) = 단계 없음 → 시작 전 · 설계 중
assert board_column("EROSION", []) == "start"
def test_outputs_only_when_ready():
assert project_outputs("PLAN", stages(C, C)) == []
assert project_outputs("ROAD", stages(C, C, C, P, N, N, N)) == []
keys = lambda st: [o["key"] for o in project_outputs("ROAD", st)] # noqa: E731
assert keys(stages(C, C, C, C, P, N, N)) == ["drawings"]
assert keys(stages(C, C, C, C, C, C, P)) == ["drawings", "quantity", "cost"]
assert keys(stages(C, C, C, C, C, S, S)) == ["drawings", "cost"]
def test_is_mine_and_idle():
row = {"user_id": 1, "pm_user_id": 2, "field_lead_user_id": None, "designer_user_id": 3}
assert all(is_mine({**row, "member_user_ids": []}, uid) for uid in (1, 2, 3))
assert is_mine({**row, "member_user_ids": [9]}, 9)
assert not is_mine({**row, "member_user_ids": [9]}, 8)
now = datetime(2026, 10, 26, 12)
assert idle_days(now - timedelta(days=15, hours=1), now) == 15
assert idle_days(None, now) is None
def test_stage_total_pairs():
"""단계 수 = 화면 단계 막대(group_workflow · workflowSteps) = 카드 요약(547-1)."""
group = (ROOT / "A00_Common/group_workflow.ts").read_text(encoding="utf-8")
labels = re.findall(r"labels:\s*\[(.*?)\]", group, re.S)
plan, stab = (len(re.findall(r'"DE_Step_\w+"', block)) for block in labels)
scaffold = (ROOT / "A00_Common/b_page_scaffold.ts").read_text(encoding="utf-8")
road = re.search(r"function workflowSteps\(\)[^{]*\{\s*return \[(.*?)\]", scaffold, re.S).group(1)
assert STAGE_TOTAL == {"ROAD": road.count("L("), "PLAN": plan, "STABILITY": stab}
assert {k: len(v) for k, v in STAGE_NAMES.items()} == STAGE_TOTAL