import pytest from app import db from app.models import Board, List, Card, Comment @pytest.mark.integration class TestCommentRoutes: """Test Comment API routes""" def test_get_card_comments_success(self, client, db_session, regular_user, auth_headers): """Test getting all comments for 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.flush() comment1 = Comment(text="First comment", card_id=card.id, user_id=1) comment2 = Comment(text="Second comment", card_id=card.id, user_id=1) db_session.add_all([comment1, comment2]) db_session.commit() response = client.get(f"/api/cards/{card.id}/comments", headers=auth_headers) assert response.status_code == 200 data = response.get_json() assert len(data) == 2 assert data[0]["text"] == "Second comment" # Newest first assert data[1]["text"] == "First comment" def test_get_card_comments_unauthorized(self, client, db_session, regular_user): """Test getting comments 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.get(f"/api/cards/{card.id}/comments") assert response.status_code == 401 def test_create_comment_success(self, client, db_session, regular_user, auth_headers): """Test creating a new comment on 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}/comments", headers=auth_headers, json={"text": "This is a comment"}, ) assert response.status_code == 201 data = response.get_json() assert data["text"] == "This is a comment" assert data["card_id"] == card.id assert data["user_id"] == 1 def test_create_comment_missing_text(self, client, db_session, regular_user, auth_headers): """Test creating a comment without text""" 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}/comments", headers=auth_headers, json={}, ) assert response.status_code == 400 def test_create_comment_unauthorized(self, client, db_session, regular_user): """Test creating a comment 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}/comments", json={"text": "This is a comment"}, ) assert response.status_code == 401 def test_update_comment_success(self, client, db_session, auth_headers): """Test updating a comment (by author)""" board = Board(name="Test Board", user_id=1) 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() comment = Comment(text="Original", card_id=card.id, user_id=1) db_session.add(comment) db_session.commit() response = client.put( f"/api/comments/{comment.id}", headers=auth_headers, json={"text": "Updated comment"}, ) assert response.status_code == 200 data = response.get_json() assert data["text"] == "Updated comment" def test_update_comment_not_found(self, client, db_session, auth_headers): """Test updating a non-existent comment""" response = client.put( "/api/comments/99999", headers=auth_headers, json={"text": "Updated"}, ) assert response.status_code == 404 def test_delete_comment_success(self, client, db_session, regular_user, auth_headers): """Test deleting a comment""" 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() comment = Comment(text="To Delete", card_id=card.id, user_id=1) db_session.add(comment) db_session.commit() response = client.delete(f"/api/comments/{comment.id}", headers=auth_headers) assert response.status_code == 200 data = response.get_json() assert "message" in data # Verify comment is deleted deleted_comment = db.session.get(Comment, comment.id) assert deleted_comment is None def test_delete_comment_not_found(self, client, db_session, auth_headers): """Test deleting a non-existent comment""" response = client.delete("/api/comments/99999", headers=auth_headers) assert response.status_code == 404