Model/tests/domain/tasks/test_subtasks.py
2026-05-19 16:35:09 +00:00

75 lines
2 KiB
Python

from uuid import uuid4
import pytest
from domain.tasks.subtasks import SubTask, SubTaskStatus
def test_create_subtask_starts_waiting() -> None:
task_id = uuid4()
st = SubTask.create(task_id=task_id, inputs={"foo": "bar"})
assert st.task_id == task_id
assert st.status is SubTaskStatus.WAITING
assert st.inputs == {"foo": "bar"}
assert st.outputs is None
assert st.job_started is None
assert st.job_completed is None
def test_start_transitions_to_in_progress_and_sets_cloud_logs_url() -> None:
st = SubTask.create(task_id=uuid4())
st.start(cloud_logs_url="https://example/log")
assert st.status is SubTaskStatus.IN_PROGRESS
assert st.cloud_logs_url == "https://example/log"
assert st.job_started is not None
def test_start_is_idempotent_from_in_progress() -> None:
st = SubTask.create(task_id=uuid4())
st.start()
first_start = st.job_started
st.start(cloud_logs_url="https://other")
assert st.status is SubTaskStatus.IN_PROGRESS
assert st.job_started == first_start # not overwritten
assert st.cloud_logs_url == "https://other"
def test_start_rejects_from_terminal_status() -> None:
st = SubTask.create(task_id=uuid4())
st.complete()
with pytest.raises(ValueError):
st.start()
def test_complete_marks_outputs_and_job_completed() -> None:
st = SubTask.create(task_id=uuid4())
st.start()
st.complete({"uprn": "123"})
assert st.status is SubTaskStatus.COMPLETE
assert st.outputs == {"result": {"uprn": "123"}}
assert st.job_completed is not None
def test_complete_without_result_leaves_outputs_unset() -> None:
st = SubTask.create(task_id=uuid4())
st.complete()
assert st.outputs is None
def test_fail_records_error_in_outputs() -> None:
st = SubTask.create(task_id=uuid4())
err = RuntimeError("boom")
st.fail(err)
assert st.status is SubTaskStatus.FAILED
assert st.outputs == {"error": "boom"}
assert st.job_completed is not None