from datetime import datetime, timezone import pytest from httpx import ASGITransport, AsyncClient from unittest.mock import AsyncMock, patch from backend.app.models.dataset import Dataset from backend.app.schemas import dataset as schema_dataset @pytest.mark.asyncio async def test_create_dataset_success(client: AsyncClient) -> None: """Asserts that a valid dataset payload returns HTTP 201 and correct mock response.""" now = datetime.now(timezone.utc) mock_dataset_db = Dataset( id=1, name="Test QA Dataset", version="1.0.0", description="Verify prompt safety", category="safety", created_at=now, updated_at=now ) with patch("backend.app.api.v1.datasets.crud_dataset.dataset.create", new_callable=AsyncMock) as mock_create: mock_create.return_value = mock_dataset_db payload = { "name": "Test QA Dataset", "version": "1.0.0", "description": "Verify prompt safety", "category": "safety" } response = await client.post("/api/v1/datasets/", json=payload) assert response.status_code == 201 data = response.json() assert data["name"] == "Test QA Dataset" assert data["id"] == 1 assert data["category"] == "safety" @pytest.mark.asyncio async def test_list_datasets(client: AsyncClient) -> None: """Asserts listing datasets calls get_multi and returns dataset schemas.""" now = datetime.now(timezone.utc) mock_list = [ Dataset(id=1, name="DS1", version="1.0", description="Desc1", category="factual", created_at=now, updated_at=now), Dataset(id=2, name="DS2", version="2.0", description="Desc2", category="reasoning", created_at=now, updated_at=now) ] with patch("backend.app.api.v1.datasets.crud_dataset.dataset.get_multi", new_callable=AsyncMock) as mock_multi: mock_multi.return_value = mock_list response = await client.get("/api/v1/datasets/") assert response.status_code == 200 data = response.json() assert len(data) == 2 assert data[0]["name"] == "DS1" assert data[1]["name"] == "DS2" @pytest.mark.asyncio async def test_unauthorized_access() -> None: """Asserts that requests missing X-API-Key are blocked with HTTP 403.""" from backend.app.main import app async with AsyncClient(transport=ASGITransport(app=app), base_url="http://test") as autoless_client: response = await autoless_client.get("/api/v1/datasets/") assert response.status_code == 403 assert "credentials missing" in response.json()["detail"].lower()