Files
vibe_data_ana/tests/test_plan_adjustment.py

160 lines
4.3 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.
"""Tests for dynamic plan adjustment."""
import pytest
from datetime import datetime
from src.engines.plan_adjustment import (
adjust_plan,
identify_anomalies,
_fallback_plan_adjustment
)
from src.models.analysis_plan import AnalysisPlan, AnalysisTask
from src.models.analysis_result import AnalysisResult
from src.models.requirement_spec import AnalysisObjective
# Feature: true-ai-agent, Property 8: 计划动态调整
def test_plan_adjustment_with_anomaly():
"""
Property 8: For any analysis plan and intermediate results, if results
contain anomaly findings, the plan adjustment function should be able to
generate new deep-dive tasks or adjust existing task priorities.
Validates: 场景4验收.2, 场景4验收.3, FR-3.3
"""
# Create plan
plan = AnalysisPlan(
objectives=[
AnalysisObjective(
name="数据分析",
description="分析数据",
metrics=[],
priority=3
)
],
tasks=[
AnalysisTask(
id="task_1",
name="Task 1",
description="First task",
priority=3,
status='completed'
),
AnalysisTask(
id="task_2",
name="Task 2",
description="Second task",
priority=3,
status='pending'
)
],
created_at=datetime.now(),
updated_at=datetime.now()
)
# Create results with anomaly
results = [
AnalysisResult(
task_id="task_1",
task_name="Task 1",
success=True,
insights=["发现异常某类别占比90%,远超正常范围"],
execution_time=1.0
)
]
# Adjust plan (using fallback)
adjusted_plan = _fallback_plan_adjustment(plan, results)
# Verify: Plan should be updated
assert adjusted_plan.updated_at >= plan.created_at
# Verify: Pending task priority should be increased
task_2 = next(t for t in adjusted_plan.tasks if t.id == "task_2")
assert task_2.priority >= 3
def test_identify_anomalies():
"""Test anomaly identification from results."""
results = [
AnalysisResult(
task_id="task_1",
task_name="Task 1",
success=True,
insights=["发现异常数据", "正常分布"],
execution_time=1.0
),
AnalysisResult(
task_id="task_2",
task_name="Task 2",
success=True,
insights=["一切正常"],
execution_time=1.0
)
]
anomalies = identify_anomalies(results)
# Should identify one anomaly
assert len(anomalies) >= 1
assert anomalies[0]['task_id'] == "task_1"
def test_plan_adjustment_no_anomaly():
"""Test plan adjustment when no anomalies found."""
plan = AnalysisPlan(
objectives=[],
tasks=[
AnalysisTask(
id="task_1",
name="Task 1",
description="First task",
priority=3,
status='completed'
)
],
created_at=datetime.now(),
updated_at=datetime.now()
)
results = [
AnalysisResult(
task_id="task_1",
task_name="Task 1",
success=True,
insights=["一切正常"],
execution_time=1.0
)
]
adjusted_plan = _fallback_plan_adjustment(plan, results)
# Should still update timestamp
assert adjusted_plan.updated_at >= plan.created_at
def test_identify_anomalies_empty_results():
"""Test anomaly identification with empty results."""
anomalies = identify_anomalies([])
assert anomalies == []
def test_identify_anomalies_failed_results():
"""Test that failed results are skipped."""
results = [
AnalysisResult(
task_id="task_1",
task_name="Task 1",
success=False,
error="Failed",
insights=["发现异常"],
execution_time=1.0
)
]
anomalies = identify_anomalies(results)
# Failed results should be skipped
assert len(anomalies) == 0