import pytest from httpx import ASGITransport, AsyncClient from uuid import uuid4 from app.core.database import init_db from app.main import app @pytest.mark.asyncio async def test_bazi_reading_lifecycle(monkeypatch): monkeypatch.setattr("app.services.analyzer_common.settings.openai_api_key", None) await init_db() transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as client: auth = await client.post("/api/v1/auth/anonymous-login", json={"client_id": f"readings-bazi-{uuid4()}"}) token = auth.json()["access_token"] headers = {"authorization": f"Bearer {token}"} created = await client.post( "/api/v1/readings", headers=headers, json={ "reading_type": "bazi", "input_data": { "calendar_type": "solar", "birth_date": "1992-08-18", "birth_time": "09:30", "time_unknown": False, "birth_place": "广东深圳", }, }, ) assert created.status_code == 201 reading_id = created.json()["id"] detail = await client.get(f"/api/v1/readings/{reading_id}", headers=headers) assert detail.status_code == 200 assert detail.json()["reading_type"] == "bazi" assert detail.json()["status"] in {"pending", "processing", "completed"} listing = await client.get("/api/v1/readings", headers=headers) assert listing.status_code == 200 assert any(item["id"] == reading_id for item in listing.json()) deleted = await client.delete(f"/api/v1/readings/{reading_id}", headers=headers) assert deleted.status_code == 200 @pytest.mark.asyncio async def test_daily_reading_quota_blocks_sixth_request(monkeypatch): monkeypatch.setattr("app.services.analyzer_common.settings.openai_api_key", None) await init_db() transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as client: auth = await client.post("/api/v1/auth/anonymous-login", json={"client_id": f"readings-quota-{uuid4()}"}) token = auth.json()["access_token"] headers = {"authorization": f"Bearer {token}"} payload = { "reading_type": "bazi", "input_data": { "calendar_type": "solar", "birth_date": "1992-08-18", "birth_time": "09:30", "time_unknown": False, "birth_place": "广东深圳", }, } quota_before = await client.get("/api/v1/readings/quota", headers=headers) assert quota_before.status_code == 200 for _ in range(5): response = await client.post("/api/v1/readings", headers=headers, json=payload) assert response.status_code == 201 blocked = await client.post("/api/v1/readings", headers=headers, json=payload) assert blocked.status_code == 429 quota_after = await client.get("/api/v1/readings/quota", headers=headers) assert quota_after.json()["remaining"] == 0