import pytest from app import db from app.models import Board, Card, CardLabel, Label, List @pytest.mark.integration class TestLabelRoutes: """Test Label API routes""" def test_get_board_labels_success( self, client, db_session, regular_user, auth_headers ): """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 def test_create_label_missing_name( self, client, db_session, regular_user, auth_headers ): """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 def test_add_label_to_card_success( self, client, db_session, regular_user, auth_headers ): """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 def test_remove_label_from_card_success( self, client, db_session, regular_user, auth_headers ): """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() ) assert deleted_card_label is None