195 lines
6.5 KiB
Python
195 lines
6.5 KiB
Python
|
|
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
|