forked from zhouruizhe/gmTouringMiniApp
100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
from fastapi.testclient import TestClient
|
|
|
|
from app.main import app
|
|
|
|
|
|
client = TestClient(app)
|
|
|
|
|
|
def preferences(**overrides):
|
|
payload = {
|
|
"destination": "深圳市光明区",
|
|
"themes": ["亲子"],
|
|
"duration": "half_day",
|
|
"pace": "relaxed",
|
|
"interests": ["自然风光", "生态科普"],
|
|
"adults": 2,
|
|
"children": 1,
|
|
"childAges": [6],
|
|
"transport": "public_transport",
|
|
"budgetLevel": "standard",
|
|
"extraRequirements": "",
|
|
}
|
|
payload.update(overrides)
|
|
return payload
|
|
|
|
|
|
def test_health_reports_knowledge_and_mock_model():
|
|
response = client.get("/api/v1/health")
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["status"] == "ok"
|
|
assert data["knowledgeCount"] >= 15
|
|
assert data["modelConfigured"] is True
|
|
|
|
|
|
def test_create_plan_only_returns_known_guangming_places():
|
|
response = client.post("/api/v1/plans", json=preferences())
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["conversationId"]
|
|
assert data["itinerary"]["items"]
|
|
assert len(data["itinerary"]["items"]) >= 2
|
|
assert len(data["itinerary"]["items"]) <= 3
|
|
assert all(
|
|
item["placeId"].startswith("guangming-")
|
|
for item in data["itinerary"]["items"]
|
|
)
|
|
assert len(data["itinerary"]["sources"]) == len(
|
|
{item["placeId"] for item in data["itinerary"]["items"]}
|
|
)
|
|
|
|
|
|
def test_indoor_requirement_filters_out_outdoor_places():
|
|
response = client.post(
|
|
"/api/v1/plans",
|
|
json=preferences(
|
|
themes=["研学"],
|
|
interests=["文化场馆"],
|
|
extraRequirements="下午下雨,只安排室内项目",
|
|
),
|
|
)
|
|
assert response.status_code == 200
|
|
outdoor_ids = {
|
|
"guangming-science-park",
|
|
"guangming-happy-farm",
|
|
"guangming-hongqiao-park",
|
|
"guangming-dadingling-greenway",
|
|
}
|
|
ids = {item["placeId"] for item in response.json()["itinerary"]["items"]}
|
|
assert ids.isdisjoint(outdoor_ids)
|
|
|
|
|
|
def test_adjust_existing_plan():
|
|
created = client.post("/api/v1/plans", json=preferences()).json()
|
|
response = client.post(
|
|
f"/api/v1/conversations/{created['conversationId']}/messages",
|
|
json={"message": "改成室内研学路线"},
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["conversationId"] == created["conversationId"]
|
|
assert data["changeSummary"]
|
|
assert data["itinerary"]["items"]
|
|
|
|
|
|
def test_missing_preferences_are_rejected():
|
|
response = client.post(
|
|
"/api/v1/plans",
|
|
json=preferences(themes=[], interests=[]),
|
|
)
|
|
assert response.status_code == 422
|
|
|
|
|
|
def test_expired_or_unknown_session_is_404():
|
|
response = client.post(
|
|
"/api/v1/conversations/not-found/messages",
|
|
json={"message": "慢一点"},
|
|
)
|
|
assert response.status_code == 404
|