2026-02-25 16:48:18 +00:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
from app import db
|
2026-02-25 18:32:57 +00:00
|
|
|
from app.models import Board, Card, CardLabel, Label, List
|
2026-02-25 16:48:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.integration
|
|
|
|
|
class TestLabelRoutes:
|
|
|
|
|
"""Test Label API routes"""
|
|
|
|
|
|
2026-02-25 18:32:57 +00:00
|
|
|
def test_get_board_labels_success(
|
|
|
|
|
self, client, db_session, regular_user, auth_headers
|
|
|
|
|
):
|
2026-02-25 16:48:18 +00:00
|
|
|
"""Test getting all labels for a board"""
|
|
|
|
|
board = Board(name="Test Board", user_id=regular_user.id)
|
|
|
|
|
db_session.add(board)
|
|
|
|
|
db_session.flush()
|
|
|
|
|
|
|
|
|
|
label1 = Label(name="Urgent", color="red", board_id=board.id)
|
|
|
|
|
label2 = Label(name="Low Priority", color="green", board_id=board.id)
|
|
|
|
|
db_session.add_all([label1, label2])
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.get(f"/api/boards/{board.id}/labels", headers=auth_headers)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
data = response.get_json()
|
|
|
|
|
assert len(data) == 2
|
|
|
|
|
assert data[0]["name"] == "Urgent"
|
|
|
|
|
assert data[1]["name"] == "Low Priority"
|
|
|
|
|
|
|
|
|
|
def test_get_board_labels_unauthorized(self, client, db_session, regular_user):
|
|
|
|
|
"""Test getting labels without authentication"""
|
|
|
|
|
board = Board(name="Test Board", user_id=regular_user.id)
|
|
|
|
|
db_session.add(board)
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.get(f"/api/boards/{board.id}/labels")
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 401
|
|
|
|
|
|
|
|
|
|
def test_create_label_success(self, client, db_session, regular_user, auth_headers):
|
|
|
|
|
"""Test creating a new label in a board"""
|
|
|
|
|
board = Board(name="Test Board", user_id=regular_user.id)
|
|
|
|
|
db_session.add(board)
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.post(
|
|
|
|
|
f"/api/boards/{board.id}/labels",
|
|
|
|
|
headers=auth_headers,
|
|
|
|
|
json={"name": "Urgent", "color": "red"},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 201
|
|
|
|
|
data = response.get_json()
|
|
|
|
|
assert data["name"] == "Urgent"
|
|
|
|
|
assert data["color"] == "red"
|
|
|
|
|
assert data["board_id"] == board.id
|
|
|
|
|
|
2026-02-25 18:32:57 +00:00
|
|
|
def test_create_label_missing_name(
|
|
|
|
|
self, client, db_session, regular_user, auth_headers
|
|
|
|
|
):
|
2026-02-25 16:48:18 +00:00
|
|
|
"""Test creating a label without name"""
|
|
|
|
|
board = Board(name="Test Board", user_id=regular_user.id)
|
|
|
|
|
db_session.add(board)
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.post(
|
|
|
|
|
f"/api/boards/{board.id}/labels",
|
|
|
|
|
headers=auth_headers,
|
|
|
|
|
json={"color": "red"},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 400
|
|
|
|
|
|
|
|
|
|
def test_create_label_unauthorized(self, client, db_session, regular_user):
|
|
|
|
|
"""Test creating a label without authentication"""
|
|
|
|
|
board = Board(name="Test Board", user_id=regular_user.id)
|
|
|
|
|
db_session.add(board)
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.post(
|
|
|
|
|
f"/api/boards/{board.id}/labels",
|
|
|
|
|
json={"name": "Urgent", "color": "red"},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 401
|
|
|
|
|
|
2026-02-25 18:32:57 +00:00
|
|
|
def test_add_label_to_card_success(
|
|
|
|
|
self, client, db_session, regular_user, auth_headers
|
|
|
|
|
):
|
2026-02-25 16:48:18 +00:00
|
|
|
"""Test adding a label to 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()
|
|
|
|
|
|
|
|
|
|
label = Label(name="Urgent", color="red", board_id=board.id)
|
|
|
|
|
db_session.add(label)
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.post(
|
|
|
|
|
f"/api/cards/{card.id}/labels",
|
|
|
|
|
headers=auth_headers,
|
|
|
|
|
json={"label_id": label.id},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 201
|
|
|
|
|
data = response.get_json()
|
|
|
|
|
assert data["card_id"] == card.id
|
|
|
|
|
assert data["label_id"] == label.id
|
|
|
|
|
|
|
|
|
|
def test_add_label_to_card_unauthorized(self, client, db_session, regular_user):
|
|
|
|
|
"""Test adding a label to card 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()
|
|
|
|
|
|
|
|
|
|
label = Label(name="Urgent", color="red", board_id=board.id)
|
|
|
|
|
db_session.add(label)
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.post(
|
|
|
|
|
f"/api/cards/{card.id}/labels",
|
|
|
|
|
json={"label_id": label.id},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 401
|
|
|
|
|
|
2026-02-25 18:32:57 +00:00
|
|
|
def test_remove_label_from_card_success(
|
|
|
|
|
self, client, db_session, regular_user, auth_headers
|
|
|
|
|
):
|
2026-02-25 16:48:18 +00:00
|
|
|
"""Test removing a label from 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()
|
|
|
|
|
|
|
|
|
|
label = Label(name="Urgent", color="red", board_id=board.id)
|
|
|
|
|
db_session.add(label)
|
|
|
|
|
db_session.flush()
|
|
|
|
|
|
|
|
|
|
card_label = CardLabel(card_id=card.id, label_id=label.id)
|
|
|
|
|
db_session.add(card_label)
|
|
|
|
|
db_session.commit()
|
|
|
|
|
|
|
|
|
|
response = client.delete(
|
|
|
|
|
f"/api/cards/{card.id}/labels/{label.id}",
|
|
|
|
|
headers=auth_headers,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
data = response.get_json()
|
|
|
|
|
assert "message" in data
|
|
|
|
|
|
|
|
|
|
# Verify card-label association is deleted
|
|
|
|
|
deleted_card_label = (
|
|
|
|
|
db.session.query(CardLabel)
|
|
|
|
|
.filter_by(card_id=card.id, label_id=label.id)
|
|
|
|
|
.first()
|
|
|
|
|
)
|
2026-02-25 18:32:57 +00:00
|
|
|
assert deleted_card_label is None
|