import json import pytest from fastapi.testclient import TestClient from app import db as db_module @pytest.fixture(autouse=True) def fresh_db(monkeypatch, tmp_path): db_file = tmp_path / "test_routes.db" monkeypatch.setattr(db_module, "DB_PATH", str(db_file)) db_module.init_db() from app.main import app yield app def test_interpret_calls_pipeline(monkeypatch, fresh_db): async def fake_interpret(req): return { "interpretation_json": {"summary": "S", "cards": [], "interactions": [], "advice": "A", "warning": None, "confidence": "high"}, "model": "claude-sonnet-4-6", "tokens_in": 100, "tokens_out": 200, "cost_usd": 0.005, "latency_ms": 1234, "reroll_count": 0, } from app.tarot import pipeline monkeypatch.setattr(pipeline, "interpret", fake_interpret) client = TestClient(fresh_db) r = client.post("/api/agent-office/tarot/interpret", json={ "spread_type": "one_card", "category": "일반", "question": "Q", "cards": [{"position": "오늘", "card_id": "the-fool", "reversed": False}], "cards_reference": "REF", "context_meta": {}, }) assert r.status_code == 200, r.text assert r.json()["interpretation_json"]["confidence"] == "high" def test_save_and_list(fresh_db): client = TestClient(fresh_db) save = client.post("/api/agent-office/tarot/readings", json={ "spread_type": "three_card", "category": "연애", "question": "Q", "cards": [{"position": "과거", "card_id": "the-fool", "reversed": False}], "interpretation_json": {"summary": "S", "cards": [], "interactions": [], "advice": "A", "warning": None, "confidence": "medium"}, "model": "claude-sonnet-4-6", "tokens_in": 1, "tokens_out": 2, "cost_usd": 0.01, "confidence": "medium", }) assert save.status_code == 200, save.text rid = save.json()["id"] lst = client.get("/api/agent-office/tarot/readings?page=1&size=10") assert lst.json()["total"] == 1 assert lst.json()["items"][0]["id"] == rid def test_patch_favorite(fresh_db): client = TestClient(fresh_db) save = client.post("/api/agent-office/tarot/readings", json={ "spread_type": "one_card", "cards": [], "interpretation_json": {"summary": "S", "cards": [], "interactions": [], "advice": "A", "warning": None, "confidence": "low"}, "model": "x", "tokens_in": 0, "tokens_out": 0, "cost_usd": 0.0, "confidence": "low", }) rid = save.json()["id"] p = client.patch(f"/api/agent-office/tarot/readings/{rid}", json={"favorite": True}) assert p.status_code == 200 g = client.get(f"/api/agent-office/tarot/readings/{rid}") assert g.json()["favorite"] == 1 def test_delete(fresh_db): client = TestClient(fresh_db) save = client.post("/api/agent-office/tarot/readings", json={ "spread_type": "one_card", "cards": [], "interpretation_json": {"summary": "S", "cards": [], "interactions": [], "advice": "A", "warning": None, "confidence": "low"}, "model": "x", "tokens_in": 0, "tokens_out": 0, "cost_usd": 0.0, "confidence": "low", }) rid = save.json()["id"] d = client.delete(f"/api/agent-office/tarot/readings/{rid}") assert d.status_code == 200 g = client.get(f"/api/agent-office/tarot/readings/{rid}") assert g.status_code == 404 def test_get_missing_reading_404(fresh_db): client = TestClient(fresh_db) r = client.get("/api/agent-office/tarot/readings/99999") assert r.status_code == 404