8f11340b38
Per post_module_taxonomy_de_cruft_20260627 Phase 2 (FR7). Each
'from src.models import X' for a moved class is rewritten to
'from src.<destination> import X':
Ticket, Track, WorkerContext, TrackState, TrackMetadata,
ThinkingSegment, EMPTY_TRACK_STATE -> src.mma
ProjectContext, ProjectMeta, ProjectOutput, ProjectFiles,
ProjectScreenshots, ProjectDiscussion, EMPTY_PROJECT_CONTEXT -> src.project
FileItem, Preset, ContextPreset, ContextFileEntry,
NamedViewPreset -> src.project_files
Tool, ToolPreset -> src.tool_presets
BiasProfile -> src.tool_bias
TextEditorConfig, ExternalEditorConfig,
EMPTY_TEXT_EDITOR_CONFIG -> src.external_editor
Persona -> src.personas
WorkspaceProfile -> src.workspace_manager
MCPServerConfig, MCPConfiguration, VectorStoreConfig,
RAGConfig, load_mcp_config -> src.mcp_client
NOT touched (kept on src.models; Phase 3 or Phase 4 will move them):
GenerateRequest, ConfirmRequest, DEFAULT_TOOL_CATEGORIES, Metadata, PROVIDERS
Migration was performed by the one-time script
scripts/tier2/artifacts/post_module_taxonomy_de_cruft_20260627/migrate_imports.py
which uses a class-to-module map and re.sub() to rewrite each
'from src.models import X' line.
Total: 85 import lines rewritten across 71 files.
Note: this commit depends on the v2 SHIPPED work
(origin/tier2/module_taxonomy_refactor_20260627) being merged into
this branch NEXT. On master (without the v2 SHIPPED commits), the
destination modules do not exist and these imports would fail.
64 lines
3.0 KiB
Python
64 lines
3.0 KiB
Python
import os
|
|
import sys
|
|
import unittest
|
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
|
class TestArchBoundaryPhase3(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
pass
|
|
def test_cascade_blocks_simple(self) -> None:
|
|
"""Test that a blocked dependency blocks its immediate dependent."""
|
|
from src.mma import Ticket, Track
|
|
t1 = Ticket(id="T1", description="d1", status="blocked", assigned_to="worker1")
|
|
t2 = Ticket(id="T2", description="d2", status="todo", assigned_to="worker1", depends_on=["T1"])
|
|
track = Track(id="TR1", description="track", tickets=[t1, t2])
|
|
from src.dag_engine import TrackDAG, ExecutionEngine
|
|
dag = TrackDAG([t1, t2])
|
|
engine = ExecutionEngine(dag)
|
|
engine.tick()
|
|
self.assertEqual(t2.status, "blocked")
|
|
if t2.blocked_reason:
|
|
self.assertIn("T1", t2.blocked_reason)
|
|
def test_cascade_blocks_multi_hop(self) -> None:
|
|
"""Test that blocking cascades through multiple dependencies."""
|
|
from src.mma import Ticket
|
|
from src.dag_engine import TrackDAG, ExecutionEngine
|
|
t1 = Ticket(id="T1", description="d1", status="blocked", assigned_to="worker1")
|
|
t2 = Ticket(id="T2", description="d2", status="todo", assigned_to="worker1", depends_on=["T1"])
|
|
t3 = Ticket(id="T3", description="d3", status="todo", assigned_to="worker1", depends_on=["T2"])
|
|
dag = TrackDAG([t1, t2, t3])
|
|
engine = ExecutionEngine(dag)
|
|
engine.tick()
|
|
self.assertEqual(t2.status, "blocked")
|
|
self.assertEqual(t3.status, "blocked")
|
|
def test_manual_unblock_restores_todo(self) -> None:
|
|
"""Test that unblocking a task manually works if dependencies are met."""
|
|
from src.mma import Ticket
|
|
from src.dag_engine import TrackDAG, ExecutionEngine
|
|
t1 = Ticket(id="T1", description="d1", status="completed", assigned_to="worker1")
|
|
t2 = Ticket(id="T2", description="d2", status="blocked", assigned_to="worker1", blocked_reason="manual")
|
|
dag = TrackDAG([t1, t2])
|
|
engine = ExecutionEngine(dag)
|
|
engine.update_task_status("T2", "todo")
|
|
self.assertEqual(t2.status, "todo")
|
|
ready = engine.tick()
|
|
self.assertIn(t2, ready)
|
|
def test_in_progress_not_blocked(self) -> None:
|
|
"""Test that in_progress tasks are not blocked automatically (only todo)."""
|
|
from src.mma import Ticket
|
|
from src.dag_engine import TrackDAG, ExecutionEngine
|
|
t1 = Ticket(id="T1", description="d1", status="blocked", assigned_to="worker1")
|
|
t2 = Ticket(id="T2", description="d2", status="in_progress", assigned_to="worker1", depends_on=["T1"])
|
|
dag = TrackDAG([t1, t2])
|
|
engine = ExecutionEngine(dag)
|
|
engine.tick()
|
|
self.assertEqual(t2.status, "in_progress")
|
|
def test_execution_engine_tick_cascades_blocks(self) -> None:
|
|
"""Test that ExecutionEngine.tick() triggers the cascading blocks."""
|
|
from src.mma import Ticket
|
|
from src.dag_engine import TrackDAG, ExecutionEngine
|
|
t1 = Ticket(id="T1", description="d1", status="blocked", assigned_to="worker1")
|
|
t2 = Ticket(id="T2", description="d2", status="todo", assigned_to="worker1", depends_on=["T1"])
|
|
dag = TrackDAG([t1, t2])
|
|
engine = ExecutionEngine(dag)
|
|
engine.tick()
|
|
self.assertEqual(t2.status, "blocked") |