Files
2026Technology-Competition/tests/test_data_models.py
T
lhl 2e11720a2d feat(impact): Impact Agent MVP —— 变更点定位 + 影响调查书(追加改修场景)
- 门控:用户提供 existing_system 路径 → 进入影响调查;未提供 → 原流程不变
- CodeParser 解析 Java(@RestController/@Service/@Entity/@TableName)+ ExistingSystemExplorer 组装
- ImpactAgent 变更点定位(变更区分×既存対応 确定性比对,无 LLM)→ ImpactReport(JSON 可下载)
- 影响调查结果作为 Writer 生成概要设计书的主上下文({{impact}},无专用影响章)
- source_aggregator 解除 existing_system=None 硬编码
- 既有系统样本 sunOnly/stock-trade-system(无 LICENSE,仅测试输入,保留来源标注)
- 新造股票交易域追加改修样本 要件定義_追加改修_股票.xlsx(对齐 sunOnly 真实类名)
- 全量 351 passed / 99.27% 覆盖;门禁 PASS(16 要素:新规5/変更8/削除3/未受影响50)
2026-08-23 17:59:08 +08:00

132 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from dataclasses import asdict
from genesis.data_models import (
CellComment, CellFormatting, CellValue, ChangeAnalysis, ChangeElement,
ChangeType, Confidence, ElementType, ExcelTable, ExtractionMethod,
ImageAnalysis, ImpactReport, ImpactWarning, ParsedTemplate, Provenance,
RelationType, RuleDocument, SheetType, StructuredSource,
)
def test_sheettype_has_8_members():
assert len(SheetType) == 8
assert SheetType.FUNCTION.value == "FUNCTION"
assert SheetType.GENERIC.value == "GENERIC"
def test_value_enum_members():
assert ElementType.FUNCTION.value == "機能"
assert RelationType.USE.value == "利用"
assert Confidence.HIGH.value == "high"
assert ExtractionMethod.OPENPYXL.value == "openpyxl"
def test_cellformatting_defaults():
fmt = CellFormatting()
assert fmt.strikethrough is False
assert fmt.font_color is None
assert fmt.bg_color is None
def test_cellvalue_forward_reference_works():
"""CellValue 引用后置定义的 CellFormatting/CellCommentfuture.annotations 落地)"""
prov = Provenance(file_name="f.xlsx", sheet_name="S", row=1, column="A", column_header="h")
cv = CellValue(
value="x",
provenance=prov,
formatting=CellFormatting(strikethrough=True),
comment=CellComment(author="reviewer", text="check", source_uri="f.xlsx#S!A1"),
)
assert cv.formatting.strikethrough is True
assert cv.comment.author == "reviewer"
def test_excel_table_references_sheettype():
table = ExcelTable(
name="機能一覧",
detected_type=SheetType.FUNCTION,
extraction_method=ExtractionMethod.OPENPYXL.value,
headers=["機能ID", "機能名"],
rows=[],
)
assert table.detected_type is SheetType.FUNCTION
assert table.extraction_method == "openpyxl"
def test_structured_source_assembles_all():
source = StructuredSource(
tables=[],
template=ParsedTemplate(file_name="t.docx", sections=[], placeholders={}, styles={}),
rule_docs=[RuleDocument(
file_name="記入規則.docx", category="write", markdown_content="# 規則",
source_path="samples/記入規則.docx", file_type="word", hash="abc",
)],
image_analyses=[ImageAnalysis(
image_ref="img1", description="画面遷移図", confidence=0.9,
source_uri="f.xlsx#S!A1", sheet_name="S", anchor_cell="A1", status="recognized",
)],
existing_system=None,
comments=[],
)
assert source.rule_docs[0].category == "write"
assert source.image_analyses[0].nearby_text == ""
def test_asdict_serializable():
prov = Provenance(file_name="f.xlsx", sheet_name="S", row=1, column="A", column_header="h")
d = asdict(CellValue(value=1, provenance=prov))
assert d["provenance"]["row"] == 1
# ---------- Impact Agent MVP 数据模型(2026-08-23 ----------
def test_changetype_members():
assert ChangeType.NEW.value == "新規"
assert ChangeType.MODIFIED.value == "変更"
assert ChangeType.DELETED.value == "削除"
assert ChangeType.UNCHANGED.value == "不变"
def test_change_element_defaults():
el = ChangeElement(element_id="F001", element_type="機能", name="止损风控", change_type=ChangeType.NEW)
assert el.existing_mapping == []
assert el.impacted_existing == []
assert el.evidence == ""
assert el.status == "ok"
def test_change_analysis_holds_lists():
ca = ChangeAnalysis(
project_type="enhancement",
new_elements=[ChangeElement("F001", "機能", "止损风控", ChangeType.NEW)],
modified_elements=[],
deleted_elements=[],
unchanged_elements=[],
warnings=[ImpactWarning(element_id="F002", issue="无法定位修改对象")],
)
assert ca.project_type == "enhancement"
assert ca.new_elements[0].element_id == "F001"
assert ca.warnings[0].issue == "无法定位修改对象"
def test_impact_report_defaults():
report = ImpactReport(metadata={"version": "v1"})
assert report.change_analysis is None
assert report.summary == {}
def test_impact_report_holds_analysis():
ca = ChangeAnalysis(project_type="enhancement", new_elements=[], modified_elements=[],
deleted_elements=[], unchanged_elements=[], warnings=[])
report = ImpactReport(metadata={"version": "v1"}, change_analysis=ca, summary={"new": 0})
assert report.change_analysis.project_type == "enhancement"
assert report.summary["new"] == 0
def test_structured_source_impact_report_default_none():
"""StructuredSource 新增 impact_report 字段,缺省 None(门控未提供时保持 None)。"""
source = StructuredSource(
tables=[], template=None, rule_docs=[], image_analyses=[], existing_system=None, comments=[],
)
assert source.impact_report is None