generated from coulomb/repo-seed
102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from api.services.lifecycle import (
|
|
has_active_task_status,
|
|
should_activate_parent_for_active_tasks,
|
|
should_activate_parent_for_task_start,
|
|
status_value,
|
|
transition_task_status,
|
|
transition_workstream_status,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize("parent_status", ["proposed", "ready", "backlog"])
|
|
def test_task_start_activates_planning_parent(parent_status):
|
|
assert should_activate_parent_for_task_start(
|
|
previous_task_status="todo",
|
|
new_task_status="progress",
|
|
parent_workstream_status=parent_status,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize("parent_status", ["active", "blocked", "finished", "archived"])
|
|
def test_task_start_does_not_rewrite_non_planning_parent(parent_status):
|
|
assert not should_activate_parent_for_task_start(
|
|
previous_task_status="todo",
|
|
new_task_status="progress",
|
|
parent_workstream_status=parent_status,
|
|
)
|
|
|
|
|
|
def test_task_start_requires_todo_to_progress_transition():
|
|
assert not should_activate_parent_for_task_start(
|
|
previous_task_status="progress",
|
|
new_task_status="progress",
|
|
parent_workstream_status="ready",
|
|
)
|
|
assert not should_activate_parent_for_task_start(
|
|
previous_task_status="todo",
|
|
new_task_status="done",
|
|
parent_workstream_status="ready",
|
|
)
|
|
|
|
|
|
def test_has_active_task_status_ignores_terminal_and_todo_statuses():
|
|
assert has_active_task_status(["todo", "done", "cancel"]) is False
|
|
assert has_active_task_status(["todo", "wait"]) is True
|
|
assert has_active_task_status(["progress"]) is True
|
|
|
|
|
|
def test_active_task_state_activates_planning_parent_for_renormalization():
|
|
assert should_activate_parent_for_active_tasks(
|
|
parent_workstream_status="proposed",
|
|
task_statuses=["todo", "progress"],
|
|
)
|
|
|
|
|
|
def test_active_task_state_does_not_unblock_blocked_parent():
|
|
assert not should_activate_parent_for_active_tasks(
|
|
parent_workstream_status="blocked",
|
|
task_statuses=["progress"],
|
|
)
|
|
|
|
|
|
def test_status_value_unwraps_enum_like_values():
|
|
class Status:
|
|
value = "In_Progress"
|
|
|
|
assert status_value(Status()) == "progress"
|
|
|
|
|
|
def test_transition_workstream_status_normalizes_aliases():
|
|
class Workstream:
|
|
status = "todo"
|
|
|
|
ws = Workstream()
|
|
result = transition_workstream_status(ws, "done")
|
|
|
|
assert ws.status == "finished"
|
|
assert result.previous_status == "ready"
|
|
assert result.target_status == "finished"
|
|
assert result.changed is True
|
|
|
|
|
|
def test_transition_task_status_activates_parent_once():
|
|
class Task:
|
|
status = "todo"
|
|
|
|
class Workstream:
|
|
status = "ready"
|
|
|
|
task = Task()
|
|
ws = Workstream()
|
|
result = transition_task_status(task, "progress", parent_workstream=ws)
|
|
|
|
assert task.status == "progress"
|
|
assert ws.status == "active"
|
|
assert result.parent_activated is True
|
|
assert result.previous_status == "todo"
|
|
assert result.target_status == "progress"
|