Init Repo
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
"""
|
||||
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"])
|
||||
Reference in New Issue
Block a user