todo-fastapi / tests /test_task_workflow.py
MuhammedSuhaib's picture
Deployment via uv
4c94294 verified
Raw
History Blame Contribute Delete
8.6 kB
import pytest
from fastapi.testclient import TestClient
from main import app
from unittest.mock import patch, MagicMock
import json
client = TestClient(app)
def test_complete_task_management_workflow():
"""Test the complete task management workflow: create, read, update, complete, delete"""
user_id = "workflow_test_user"
with patch("auth.jwt.get_current_user_id") as mock_get_user:
mock_get_user.return_value = user_id
# 1. Test creating a task
response = client.post(
"/api/tasks",
headers={"Authorization": "Bearer valid_token"},
json={
"title": "Workflow Test Task",
"description": "Testing the complete workflow",
"priority": "medium",
"category": "test",
"tags": ["workflow", "test"]
}
)
assert response.status_code == 200
created_task = response.json()["data"]
assert created_task["title"] == "Workflow Test Task"
assert created_task["description"] == "Testing the complete workflow"
assert created_task["user_id"] == user_id
assert created_task["priority"] == "medium"
assert created_task["category"] == "test"
assert "workflow" in created_task["tags"]
assert "test" in created_task["tags"]
assert created_task["completed"] is False
task_id = created_task["id"]
assert task_id is not None
# 2. Test retrieving the created task
response = client.get(
f"/api/tasks/{task_id}",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
retrieved_task = response.json()["data"]
assert retrieved_task["id"] == task_id
assert retrieved_task["title"] == "Workflow Test Task"
# 3. Test retrieving all tasks for user
response = client.get(
"/api/tasks",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
tasks_list = response.json()["data"]
task_ids = [task["id"] for task in tasks_list]
assert task_id in task_ids
# 4. Test updating the task
response = client.put(
f"/api/tasks/{task_id}",
headers={"Authorization": "Bearer valid_token"},
json={
"title": "Updated Workflow Test Task",
"description": "Updated description for workflow test",
"priority": "high",
"category": "updated-test",
"tags": ["updated", "workflow", "final-test"]
}
)
assert response.status_code == 200
updated_task = response.json()["data"]
assert updated_task["id"] == task_id
assert updated_task["title"] == "Updated Workflow Test Task"
assert updated_task["description"] == "Updated description for workflow test"
assert updated_task["priority"] == "high"
assert updated_task["category"] == "updated-test"
assert "updated" in updated_task["tags"]
assert "workflow" in updated_task["tags"]
assert "final-test" in updated_task["tags"]
# 5. Test toggling completion status
response = client.patch(
f"/api/tasks/{task_id}/complete",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
completed_task = response.json()["data"]
assert completed_task["id"] == task_id
assert completed_task["completed"] is True # Should now be completed
# 6. Test toggling completion status back
response = client.patch(
f"/api/tasks/{task_id}/complete",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
uncompleted_task = response.json()["data"]
assert uncompleted_task["id"] == task_id
assert uncompleted_task["completed"] is False # Should now be uncompleted again
# 7. Test deleting the task
response = client.delete(
f"/api/tasks/{task_id}",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
delete_result = response.json()["data"]
assert delete_result["ok"] is True
# 8. Verify the task is gone
response = client.get(
f"/api/tasks/{task_id}",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code in [404, 422] # Should not be found after deletion
def test_multiple_tasks_workflow():
"""Test workflow with multiple tasks to ensure isolation and correctness"""
user_id = "multi_task_user"
with patch("auth.jwt.get_current_user_id") as mock_get_user:
mock_get_user.return_value = user_id
# Create multiple tasks
task_titles = ["Task 1", "Task 2", "Task 3"]
created_tasks = []
for i, title in enumerate(task_titles):
response = client.post(
"/api/tasks",
headers={"Authorization": "Bearer valid_token"},
json={
"title": title,
"description": f"Description for {title}",
"priority": "medium" if i % 2 == 0 else "high"
}
)
assert response.status_code == 200
task = response.json()["data"]
assert task["user_id"] == user_id
assert task["title"] == title
created_tasks.append(task)
# Verify all tasks were created with correct properties
assert len(created_tasks) == 3
for i, task in enumerate(created_tasks):
assert task["title"] == task_titles[i]
assert task["user_id"] == user_id
expected_priority = "medium" if i % 2 == 0 else "high"
assert task["priority"] == expected_priority
# Get all tasks and verify they all belong to the same user
response = client.get(
"/api/tasks",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
all_tasks = response.json()["data"]
assert len(all_tasks) >= 3 # At least the 3 we created
# Verify all returned tasks belong to the correct user
for task in all_tasks:
if task["id"] in [t["id"] for t in created_tasks]:
# These are our created tasks - verify they have the right user_id
assert task["user_id"] == user_id
# Update one of the tasks
task_id_to_update = created_tasks[0]["id"]
response = client.put(
f"/api/tasks/{task_id_to_update}",
headers={"Authorization": "Bearer valid_token"},
json={
"title": "Updated Task 1",
"completed": True
}
)
assert response.status_code == 200
updated_task = response.json()["data"]
assert updated_task["id"] == task_id_to_update
assert updated_task["title"] == "Updated Task 1"
assert updated_task["completed"] is True
# Toggle completion on another task
task_id_to_toggle = created_tasks[1]["id"]
response = client.patch(
f"/api/tasks/{task_id_to_toggle}/complete",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
toggled_task = response.json()["data"]
assert toggled_task["id"] == task_id_to_toggle
assert toggled_task["completed"] is True
# Delete one task
task_id_to_delete = created_tasks[2]["id"]
response = client.delete(
f"/api/tasks/{task_id_to_delete}",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
# Verify only the deleted task is affected
response = client.get(
"/api/tasks",
headers={"Authorization": "Bearer valid_token"}
)
assert response.status_code == 200
remaining_tasks = response.json()["data"]
# The deleted task should not appear in the list
remaining_task_ids = [task["id"] for task in remaining_tasks]
assert task_id_to_delete not in remaining_task_ids