import uuid from datetime import datetime, timezone import pytest from fastapi import status from sqlalchemy.orm import Session from app.models.db import ChannelURL, Priority from app.routers.priorities import router as priorities_router # Import fixtures and mocks from tests.utils.auth_test_fixtures import ( admin_user_client, db_session, non_admin_user_client, ) from tests.utils.db_mocks import MockChannelDB, MockChannelURL, MockGroup, MockPriority # --- Test Cases For Priority Creation --- def test_create_priority_success(db_session: Session, admin_user_client): priority_data = {"id": 100, "description": "Test Priority"} response = admin_user_client.post("/priorities/", json=priority_data) assert response.status_code == status.HTTP_201_CREATED data = response.json() assert data["id"] == 100 assert data["description"] == "Test Priority" # Verify in DB db_priority = db_session.get(MockPriority, 100) assert db_priority is not None assert db_priority.description == "Test Priority" def test_create_priority_duplicate(db_session: Session, admin_user_client): # Create initial priority priority_data = {"id": 100, "description": "Original Priority"} response1 = admin_user_client.post("/priorities/", json=priority_data) assert response1.status_code == status.HTTP_201_CREATED # Attempt to create with same ID response2 = admin_user_client.post("/priorities/", json=priority_data) assert response2.status_code == status.HTTP_409_CONFLICT assert "already exists" in response2.json()["detail"] def test_create_priority_forbidden_for_non_admin( db_session: Session, non_admin_user_client ): priority_data = {"id": 100, "description": "Test Priority"} response = non_admin_user_client.post("/priorities/", json=priority_data) assert response.status_code == status.HTTP_403_FORBIDDEN assert "required roles" in response.json()["detail"] # --- Test Cases For List Priorities --- def test_list_priorities_empty(db_session: Session, admin_user_client): response = admin_user_client.get("/priorities/") assert response.status_code == status.HTTP_200_OK assert response.json() == [] def test_list_priorities_with_data(db_session: Session, admin_user_client): # Create some test priorities priorities = [ MockPriority(id=100, description="High"), MockPriority(id=200, description="Medium"), MockPriority(id=300, description="Low"), ] for priority in priorities: db_session.add(priority) db_session.commit() response = admin_user_client.get("/priorities/") assert response.status_code == status.HTTP_200_OK data = response.json() assert len(data) == 3 assert data[0]["id"] == 100 assert data[0]["description"] == "High" assert data[1]["id"] == 200 assert data[1]["description"] == "Medium" assert data[2]["id"] == 300 assert data[2]["description"] == "Low" def test_list_priorities_forbidden_for_non_admin( db_session: Session, non_admin_user_client ): response = non_admin_user_client.get("/priorities/") assert response.status_code == status.HTTP_403_FORBIDDEN assert "required roles" in response.json()["detail"] # --- Test Cases For Get Priority --- def test_get_priority_success(db_session: Session, admin_user_client): # Create a test priority priority = MockPriority(id=100, description="Test Priority") db_session.add(priority) db_session.commit() response = admin_user_client.get("/priorities/100") assert response.status_code == status.HTTP_200_OK data = response.json() assert data["id"] == 100 assert data["description"] == "Test Priority" def test_get_priority_not_found(db_session: Session, admin_user_client): response = admin_user_client.get("/priorities/999") assert response.status_code == status.HTTP_404_NOT_FOUND assert "Priority not found" in response.json()["detail"] def test_get_priority_forbidden_for_non_admin( db_session: Session, non_admin_user_client ): response = non_admin_user_client.get("/priorities/100") assert response.status_code == status.HTTP_403_FORBIDDEN assert "required roles" in response.json()["detail"] # --- Test Cases For Delete Priority --- def test_delete_priority_success(db_session: Session, admin_user_client): # Create a test priority priority = MockPriority(id=100, description="To Delete") db_session.add(priority) db_session.commit() response = admin_user_client.delete("/priorities/100") assert response.status_code == status.HTTP_204_NO_CONTENT # Verify priority is gone from DB db_priority = db_session.get(MockPriority, 100) assert db_priority is None def test_delete_priority_not_found(db_session: Session, admin_user_client): response = admin_user_client.delete("/priorities/999") assert response.status_code == status.HTTP_404_NOT_FOUND assert "Priority not found" in response.json()["detail"] def test_delete_priority_in_use(db_session: Session, admin_user_client): # Create a priority and a channel URL using it priority = MockPriority(id=100, description="In Use") group_id = uuid.uuid4() test_group = MockGroup( id=group_id, name="Group With Channels", sort_order=1, created_at=datetime.now(timezone.utc), updated_at=datetime.now(timezone.utc), ) db_session.add_all([priority, test_group]) db_session.commit() # Create a channel first channel = MockChannelDB( name="Test Channel", tvg_id="test.tv", tvg_name="Test", tvg_logo="test.png", group_id=group_id, ) db_session.add(channel) db_session.commit() # Create URL associated with the channel and priority channel_url = MockChannelURL( url="http://test.com", priority_id=100, in_use=True, channel_id=channel.id, # Add the channel_id ) db_session.add(channel_url) db_session.commit() response = admin_user_client.delete("/priorities/100") assert response.status_code == status.HTTP_409_CONFLICT assert "in use by channel URLs" in response.json()["detail"] # Verify priority still exists db_priority = db_session.get(MockPriority, 100) assert db_priority is not None def test_delete_priority_forbidden_for_non_admin( db_session: Session, non_admin_user_client ): response = non_admin_user_client.delete("/priorities/100") assert response.status_code == status.HTTP_403_FORBIDDEN assert "required roles" in response.json()["detail"]