2026-06-14 11:24:36 -04:00
|
|
|
"""Tests for automaton.dashboard.core.stats."""
|
|
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
from automaton.dashboard.core.stats import TaskStats
|
|
|
|
|
from automaton.dashboard.core.task import determine_task_state
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _task(name: str, tmp_path: Path, artifacts: dict[str, str]) -> object:
|
|
|
|
|
from automaton.dashboard.core.task import Task
|
|
|
|
|
|
|
|
|
|
task_dir = tmp_path / name
|
|
|
|
|
task_dir.mkdir(parents=True)
|
|
|
|
|
for filename, content in artifacts.items():
|
|
|
|
|
(task_dir / filename).write_text(content)
|
2026-06-26 10:05:18 -04:00
|
|
|
state, _, artifact_map = determine_task_state(task_dir)
|
2026-06-14 11:24:36 -04:00
|
|
|
return Task(name=name, folder_path=task_dir, state=state, artifacts=artifact_map)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_empty_stats() -> None:
|
|
|
|
|
stats = TaskStats([])
|
|
|
|
|
assert stats.total_tasks == 0
|
|
|
|
|
assert stats.pass_rate == 0.0
|
|
|
|
|
assert stats.fail_rate == 0.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_counts(tmp_path: Path) -> None:
|
|
|
|
|
tasks = [
|
|
|
|
|
_task("done-1", tmp_path, {"VERDICT.md": "## Status: PASS"}),
|
|
|
|
|
_task("done-2", tmp_path, {"VERDICT.md": "## Status: PASS"}),
|
|
|
|
|
_task("blocked", tmp_path, {"VERDICT.md": "## Status: FAIL"}),
|
|
|
|
|
_task("research", tmp_path, {"SPEC.md": "# Spec"}),
|
|
|
|
|
]
|
|
|
|
|
stats = TaskStats(tasks)
|
|
|
|
|
assert stats.total_tasks == 4
|
|
|
|
|
assert stats.pass_count == 2
|
|
|
|
|
assert stats.fail_count == 1
|
|
|
|
|
assert stats.in_progress_count == 1
|
|
|
|
|
assert stats.backlog_count == 0
|
|
|
|
|
assert stats.pass_rate == 50.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_sub_task_stats(tmp_path: Path) -> None:
|
|
|
|
|
from automaton.dashboard.core.task import SubTask, TaskState
|
|
|
|
|
|
|
|
|
|
parent = _task("parent", tmp_path, {"SPEC.md": "# Spec"})
|
|
|
|
|
parent.sub_tasks = [
|
|
|
|
|
SubTask(name="a", state=TaskState.DONE, has_spec=True, has_verdict=True, verdict_status="PASS"),
|
|
|
|
|
SubTask(name="b", state=TaskState.BLOCKED, has_spec=True, has_verdict=True, verdict_status="FAIL"),
|
|
|
|
|
]
|
|
|
|
|
stats = TaskStats([parent])
|
|
|
|
|
assert stats.sub_task_stats == {
|
|
|
|
|
"parent": {"total": 2, "passed": 1, "failed": 1, "needs_review": 0, "incomplete": 0}
|
|
|
|
|
}
|