import pytest from app import db from app.models import Board, Card, CheckItem, Checklist, List @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