mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
95 lines
2.2 KiB
Python
95 lines
2.2 KiB
Python
from uuid import uuid4
|
|
|
|
import pytest
|
|
|
|
from domain.tasks.subtasks import SubTask, SubTaskStatus
|
|
|
|
|
|
def test_create_subtask_starts_waiting() -> None:
|
|
# arrange
|
|
task_id = uuid4()
|
|
|
|
# act
|
|
st = SubTask.create(task_id=task_id, inputs={"foo": "bar"})
|
|
|
|
# assert
|
|
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:
|
|
# arrange
|
|
st = SubTask.create(task_id=uuid4())
|
|
|
|
# act
|
|
st.start(cloud_logs_url="https://example/log")
|
|
|
|
# assert
|
|
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:
|
|
# arrange
|
|
st = SubTask.create(task_id=uuid4())
|
|
st.start()
|
|
first_start = st.job_started
|
|
|
|
# act
|
|
st.start(cloud_logs_url="https://other")
|
|
|
|
# assert
|
|
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:
|
|
# arrange
|
|
st = SubTask.create(task_id=uuid4())
|
|
st.complete()
|
|
# act / assert
|
|
with pytest.raises(ValueError):
|
|
st.start()
|
|
|
|
|
|
def test_complete_marks_outputs_and_job_completed() -> None:
|
|
# arrange
|
|
st = SubTask.create(task_id=uuid4())
|
|
st.start()
|
|
|
|
# act
|
|
st.complete({"uprn": "123"})
|
|
|
|
# assert
|
|
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:
|
|
# arrange
|
|
st = SubTask.create(task_id=uuid4())
|
|
# act
|
|
st.complete()
|
|
# assert
|
|
assert st.outputs is None
|
|
|
|
|
|
def test_fail_records_error_in_outputs() -> None:
|
|
# arrange
|
|
st = SubTask.create(task_id=uuid4())
|
|
err = RuntimeError("boom")
|
|
|
|
# act
|
|
st.fail(err)
|
|
|
|
# assert
|
|
assert st.status is SubTaskStatus.FAILED
|
|
assert st.outputs == {"error": "boom"}
|
|
assert st.job_completed is not None
|