kanban-app/backend/tests/routes/test_checklists.py

297 lines
9.5 KiB
Python
Raw Normal View History

2026-02-25 16:48:18 +00:00
import pytest
from app import db
2026-02-25 18:32:57 +00:00
from app.models import Board, Card, CheckItem, Checklist, List
2026-02-25 16:48:18 +00:00
@pytest.mark.integration
class TestChecklistRoutes:
"""Test Checklist API routes"""
2026-02-25 18:32:57 +00:00
def test_create_checklist_success(
self, client, db_session, regular_user, auth_headers
):
2026-02-25 16:48:18 +00:00
"""Test creating a new checklist in a card"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.commit()
response = client.post(
f"/api/cards/{card.id}/checklists",
headers=auth_headers,
json={"name": "Tasks", "pos": 0},
)
assert response.status_code == 201
data = response.get_json()
assert data["name"] == "Tasks"
assert data["card_id"] == card.id
assert data["board_id"] == board.id
2026-02-25 18:32:57 +00:00
def test_create_checklist_missing_name(
self, client, db_session, regular_user, auth_headers
):
2026-02-25 16:48:18 +00:00
"""Test creating a checklist without name"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.commit()
response = client.post(
f"/api/cards/{card.id}/checklists",
headers=auth_headers,
json={"pos": 0},
)
assert response.status_code == 400
def test_create_checklist_unauthorized(self, client, db_session, regular_user):
"""Test creating a checklist without authentication"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.commit()
response = client.post(
f"/api/cards/{card.id}/checklists",
json={"name": "Tasks"},
)
assert response.status_code == 401
2026-02-25 18:32:57 +00:00
def test_create_check_item_success(
self, client, db_session, regular_user, auth_headers
):
2026-02-25 16:48:18 +00:00
"""Test creating a new check item in a checklist"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.flush()
checklist = Checklist(name="Tasks", board_id=board.id, card_id=card.id, pos=0)
db_session.add(checklist)
db_session.commit()
response = client.post(
f"/api/checklists/{checklist.id}/items",
headers=auth_headers,
json={"name": "Complete task", "pos": 0, "state": "incomplete"},
)
assert response.status_code == 201
data = response.get_json()
assert data["name"] == "Complete task"
assert data["checklist_id"] == checklist.id
assert data["state"] == "incomplete"
2026-02-25 18:32:57 +00:00
def test_create_check_item_missing_name(
self, client, db_session, regular_user, auth_headers
):
2026-02-25 16:48:18 +00:00
"""Test creating a check item without name"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.flush()
checklist = Checklist(name="Tasks", board_id=board.id, card_id=card.id, pos=0)
db_session.add(checklist)
db_session.commit()
response = client.post(
f"/api/checklists/{checklist.id}/items",
headers=auth_headers,
json={"state": "incomplete"},
)
assert response.status_code == 400
def test_create_check_item_unauthorized(self, client, db_session, regular_user):
"""Test creating a check item without authentication"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.flush()
checklist = Checklist(name="Tasks", board_id=board.id, card_id=card.id, pos=0)
db_session.add(checklist)
db_session.commit()
response = client.post(
f"/api/checklists/{checklist.id}/items",
json={"name": "Complete task"},
)
assert response.status_code == 401
2026-02-25 18:32:57 +00:00
def test_update_check_item_success(
self, client, db_session, regular_user, auth_headers
):
2026-02-25 16:48:18 +00:00
"""Test updating a check item (toggle state)"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.flush()
checklist = Checklist(name="Tasks", board_id=board.id, card_id=card.id, pos=0)
db_session.add(checklist)
db_session.flush()
item = CheckItem(
name="Task", checklist_id=checklist.id, pos=0, state="incomplete"
)
db_session.add(item)
db_session.commit()
response = client.put(
f"/api/check-items/{item.id}",
headers=auth_headers,
json={"state": "complete", "name": "Updated Task"},
)
assert response.status_code == 200
data = response.get_json()
assert data["state"] == "complete"
assert data["name"] == "Updated Task"
def test_update_check_item_not_found(self, client, db_session, auth_headers):
"""Test updating a non-existent check item"""
response = client.put(
"/api/check-items/99999",
headers=auth_headers,
json={"state": "complete"},
)
assert response.status_code == 404
2026-02-25 18:32:57 +00:00
def test_delete_checklist_success(
self, client, db_session, regular_user, auth_headers
):
2026-02-25 16:48:18 +00:00
"""Test deleting a checklist"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.flush()
2026-02-25 18:32:57 +00:00
checklist = Checklist(
name="To Delete", board_id=board.id, card_id=card.id, pos=0
)
2026-02-25 16:48:18 +00:00
db_session.add(checklist)
db_session.commit()
2026-02-25 18:32:57 +00:00
response = client.delete(
f"/api/checklists/{checklist.id}", headers=auth_headers
)
2026-02-25 16:48:18 +00:00
assert response.status_code == 200
data = response.get_json()
assert "message" in data
# Verify checklist is deleted
deleted_checklist = db.session.get(Checklist, checklist.id)
assert deleted_checklist is None
def test_delete_checklist_not_found(self, client, db_session, auth_headers):
"""Test deleting a non-existent checklist"""
response = client.delete("/api/checklists/99999", headers=auth_headers)
assert response.status_code == 404
2026-02-25 18:32:57 +00:00
def test_delete_check_item_success(
self, client, db_session, regular_user, auth_headers
):
2026-02-25 16:48:18 +00:00
"""Test deleting a check item"""
board = Board(name="Test Board", user_id=regular_user.id)
db_session.add(board)
db_session.flush()
lst = List(name="To Do", board_id=board.id, pos=0)
db_session.add(lst)
db_session.flush()
card = Card(name="Test Card", board_id=board.id, list_id=lst.id, pos=0)
db_session.add(card)
db_session.flush()
checklist = Checklist(name="Tasks", board_id=board.id, card_id=card.id, pos=0)
db_session.add(checklist)
db_session.flush()
2026-02-25 18:32:57 +00:00
item = CheckItem(
name="Task", checklist_id=checklist.id, pos=0, state="incomplete"
)
2026-02-25 16:48:18 +00:00
db_session.add(item)
db_session.commit()
response = client.delete(f"/api/check-items/{item.id}", headers=auth_headers)
assert response.status_code == 200
data = response.get_json()
assert "message" in data
# Verify check item is deleted
deleted_item = db.session.get(CheckItem, item.id)
assert deleted_item is None
def test_delete_check_item_not_found(self, client, db_session, auth_headers):
"""Test deleting a non-existent check item"""
response = client.delete("/api/check-items/99999", headers=auth_headers)
2026-02-25 18:32:57 +00:00
assert response.status_code == 404