kanban-app/backend/tests/routes/test_comments.py
2026-02-25 21:51:27 +03:00

204 lines
6.6 KiB
Python

import pytest
from app import db
from app.models import Board, Card, Comment, List
@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"] == regular_user.id
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, regular_user
):
"""Test updating a comment (by author)"""
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="Original", card_id=card.id, user_id=regular_user.id)
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=regular_user.id)
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