202 lines
5.9 KiB
Python
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"])
|