test_api.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import asyncio
  2. import json
  3. import httpx
  4. from standards_service.app import create_app
  5. def post_json(app, path, payload):
  6. async def send_request():
  7. transport = httpx.ASGITransport(app=app)
  8. async with httpx.AsyncClient(transport=transport, base_url="http://test") as client:
  9. return await client.post(path, json=payload)
  10. return asyncio.run(send_request())
  11. def test_batch_api_preserves_order_and_writes_one_log_per_query(standards_csv, tmp_path):
  12. log_path = tmp_path / "query.jsonl"
  13. app = create_app(csv_path=standards_csv, log_path=log_path)
  14. response = post_json(
  15. app,
  16. "/v1/search",
  17. {"keywords": ["GB 50330-2013", "本地规范库中不存在的规范"]},
  18. )
  19. assert response.status_code == 200
  20. payload = response.json()
  21. assert [item["query"] for item in payload["results"]] == [
  22. "GB 50330-2013",
  23. "本地规范库中不存在的规范",
  24. ]
  25. assert payload["results"][0]["candidates"][0]["code"] == "GB 50330-2013"
  26. assert payload["results"][1]["candidates"] == []
  27. entries = [json.loads(line) for line in log_path.read_text(encoding="utf-8").splitlines()]
  28. assert len(entries) == 2
  29. assert entries[0]["query"] == "GB 50330-2013"
  30. assert entries[0]["candidates"][0]["code"] == "GB 50330-2013"
  31. assert entries[1]["candidates"] == []
  32. assert "+" in entries[0]["time"] or entries[0]["time"].endswith("Z")
  33. assert entries[0]["elapsed_ms"] >= 0
  34. def test_service_exposes_only_one_route(standards_csv, tmp_path):
  35. app = create_app(csv_path=standards_csv, log_path=tmp_path / "query.jsonl")
  36. assert [route.path for route in app.routes] == ["/v1/search"]
  37. def test_api_rejects_more_than_one_hundred_keywords(standards_csv, tmp_path):
  38. app = create_app(csv_path=standards_csv, log_path=tmp_path / "query.jsonl")
  39. response = post_json(app, "/v1/search", {"keywords": ["GB 1"] * 101})
  40. assert response.status_code == 422