276 lines
9.4 KiB
Python
276 lines
9.4 KiB
Python
|
|
import pytest
|
||
|
|
|
||
|
|
from app import db
|
||
|
|
from app.models import Board, List, Card, Checklist, CheckItem
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.mark.integration
|
||
|
|
class TestChecklistRoutes:
|
||
|
|
"""Test Checklist API routes"""
|
||
|
|
|
||
|
|
def test_create_checklist_success(self, client, db_session, regular_user, auth_headers):
|
||
|
|
"""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
|
||
|
|
|
||
|
|
def test_create_checklist_missing_name(self, client, db_session, regular_user, auth_headers):
|
||
|
|
"""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
|
||
|
|
|
||
|
|
def test_create_check_item_success(self, client, db_session, regular_user, auth_headers):
|
||
|
|
"""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"
|
||
|
|
|
||
|
|
def test_create_check_item_missing_name(self, client, db_session, regular_user, auth_headers):
|
||
|
|
"""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
|
||
|
|
|
||
|
|
def test_update_check_item_success(self, client, db_session, regular_user, auth_headers):
|
||
|
|
"""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
|
||
|
|
|
||
|
|
def test_delete_checklist_success(self, client, db_session, regular_user, auth_headers):
|
||
|
|
"""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()
|
||
|
|
|
||
|
|
checklist = Checklist(name="To Delete", board_id=board.id, card_id=card.id, pos=0)
|
||
|
|
db_session.add(checklist)
|
||
|
|
db_session.commit()
|
||
|
|
|
||
|
|
response = client.delete(f"/api/checklists/{checklist.id}", headers=auth_headers)
|
||
|
|
|
||
|
|
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
|
||
|
|
|
||
|
|
def test_delete_check_item_success(self, client, db_session, regular_user, auth_headers):
|
||
|
|
"""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()
|
||
|
|
|
||
|
|
item = CheckItem(name="Task", checklist_id=checklist.id, pos=0, state="incomplete")
|
||
|
|
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)
|
||
|
|
|
||
|
|
assert response.status_code == 404
|