LinkDesk/backend/test_custom_task_status_sch...

202 lines
5.9 KiB
Python

"""
Test custom task status schemas
"""
import pytest
from pydantic import ValidationError
from schemas.custom_task_status import (
CustomTaskStatus,
CustomTaskStatusCreate,
CustomTaskStatusUpdate,
CustomTaskStatusReorder,
CustomTaskStatusDelete,
SystemTaskStatus,
AllTaskStatusesResponse,
TaskStatusInUseError,
CustomTaskStatusResponse
)
def test_custom_task_status_create_valid():
"""Test creating a valid custom task status"""
status = CustomTaskStatusCreate(
name="In Review",
color="#FF5733"
)
assert status.name == "In Review"
assert status.color == "#FF5733"
def test_custom_task_status_create_without_color():
"""Test creating a status without color (should be optional)"""
status = CustomTaskStatusCreate(name="Pending Approval")
assert status.name == "Pending Approval"
assert status.color is None
def test_custom_task_status_create_name_validation():
"""Test name validation - empty name should fail"""
with pytest.raises(ValidationError) as exc_info:
CustomTaskStatusCreate(name=" ")
assert "Status name cannot be empty" in str(exc_info.value)
def test_custom_task_status_create_name_too_long():
"""Test name validation - name too long should fail"""
long_name = "A" * 51
with pytest.raises(ValidationError) as exc_info:
CustomTaskStatusCreate(name=long_name)
# Pydantic's built-in validation message
assert "at most 50 characters" in str(exc_info.value)
def test_custom_task_status_create_invalid_color():
"""Test color validation - invalid hex code should fail"""
with pytest.raises(ValidationError) as exc_info:
CustomTaskStatusCreate(name="Test", color="invalid")
assert "Color must be a valid hex code" in str(exc_info.value)
def test_custom_task_status_create_color_normalization():
"""Test color normalization to uppercase"""
status = CustomTaskStatusCreate(name="Test", color="#ff5733")
assert status.color == "#FF5733"
def test_custom_task_status_update_valid():
"""Test updating a custom task status"""
update = CustomTaskStatusUpdate(
name="Updated Name",
color="#00FF00",
is_default=True
)
assert update.name == "Updated Name"
assert update.color == "#00FF00"
assert update.is_default is True
def test_custom_task_status_update_partial():
"""Test partial update (only some fields)"""
update = CustomTaskStatusUpdate(name="New Name")
assert update.name == "New Name"
assert update.color is None
assert update.is_default is None
def test_custom_task_status_reorder_valid():
"""Test reordering statuses"""
reorder = CustomTaskStatusReorder(
status_ids=["status_1", "status_2", "status_3"]
)
assert len(reorder.status_ids) == 3
def test_custom_task_status_reorder_empty():
"""Test reordering with empty list should fail"""
with pytest.raises(ValidationError):
CustomTaskStatusReorder(status_ids=[])
def test_custom_task_status_reorder_duplicates():
"""Test reordering with duplicates should fail"""
with pytest.raises(ValidationError) as exc_info:
CustomTaskStatusReorder(status_ids=["status_1", "status_1", "status_2"])
assert "duplicates" in str(exc_info.value).lower()
def test_custom_task_status_delete():
"""Test delete schema"""
delete = CustomTaskStatusDelete(reassign_to_status_id="status_2")
assert delete.reassign_to_status_id == "status_2"
def test_custom_task_status_delete_without_reassignment():
"""Test delete without reassignment"""
delete = CustomTaskStatusDelete()
assert delete.reassign_to_status_id is None
def test_custom_task_status_full():
"""Test full custom task status schema"""
status = CustomTaskStatus(
id="custom_status_1",
name="In Review",
color="#FF5733",
order=0,
is_default=False
)
assert status.id == "custom_status_1"
assert status.name == "In Review"
assert status.color == "#FF5733"
assert status.order == 0
assert status.is_default is False
def test_system_task_status():
"""Test system task status schema"""
status = SystemTaskStatus(
id="not_started",
name="Not Started",
color="#6B7280"
)
assert status.id == "not_started"
assert status.is_system is True
def test_all_task_statuses_response():
"""Test all task statuses response schema"""
response = AllTaskStatusesResponse(
statuses=[
CustomTaskStatus(
id="custom_1",
name="Custom Status",
color="#FF5733",
order=0,
is_default=False
)
],
system_statuses=[
SystemTaskStatus(
id="not_started",
name="Not Started",
color="#6B7280"
)
],
default_status_id="not_started"
)
assert len(response.statuses) == 1
assert len(response.system_statuses) == 1
assert response.default_status_id == "not_started"
def test_task_status_in_use_error():
"""Test task status in use error schema"""
error = TaskStatusInUseError(
error="Cannot delete status in use",
status_id="custom_1",
status_name="In Review",
task_count=5,
task_ids=[1, 2, 3, 4, 5]
)
assert error.task_count == 5
assert len(error.task_ids) == 5
def test_custom_task_status_response():
"""Test custom task status response schema"""
response = CustomTaskStatusResponse(
message="Status created successfully",
status=CustomTaskStatus(
id="custom_1",
name="New Status",
color="#FF5733",
order=0,
is_default=False
)
)
assert response.message == "Status created successfully"
assert response.status.name == "New Status"
if __name__ == "__main__":
pytest.main([__file__, "-v"])