test_e2e_network.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import pytest
  2. from fastapi.testclient import TestClient
  3. from app.main import app
  4. def test_cors_headers(client):
  5. # Test that CORS headers are present
  6. origin = "http://localhost:5173"
  7. response = client.options(
  8. "/api/v1/auth/login",
  9. headers={
  10. "Origin": origin,
  11. "Access-Control-Request-Method": "POST",
  12. "Access-Control-Request-Headers": "Content-Type",
  13. },
  14. )
  15. assert response.status_code == 200
  16. # When allow_credentials=True, Starlette reflects the Origin header instead of returning '*'
  17. assert response.headers["access-control-allow-origin"] == origin
  18. assert "POST" in response.headers["access-control-allow-methods"]
  19. def test_root_endpoint(client):
  20. response = client.get("/")
  21. assert response.status_code == 200
  22. if response.headers.get("content-type", "").startswith("text/html"):
  23. assert '<div id="app"></div>' in response.text
  24. else:
  25. assert response.json()["message"].startswith("Welcome to MADF API")
  26. def test_global_exception_handler(client):
  27. # Mocking a call that triggers an exception
  28. from app.api.v1.endpoints import auth
  29. # We need to mock the function inside the module where it's used
  30. import app.api.v1.endpoints.auth as auth_mod
  31. original_get_user = auth_mod.get_user_by_username
  32. def mock_get_user(*args, **kwargs):
  33. raise ValueError("Unexpected error for testing")
  34. auth_mod.get_user_by_username = mock_get_user
  35. try:
  36. # Use a real endpoint that calls get_user_by_username
  37. response = client.post(
  38. "/api/v1/auth/login",
  39. data={"username": "test", "password": "test"}
  40. )
  41. # Global exception handler should catch this and return 500
  42. assert response.status_code == 500
  43. data = response.json()
  44. assert data["code"] == 500
  45. assert "服务器内部错误" in data["message"]
  46. finally:
  47. auth_mod.get_user_by_username = original_get_user
  48. def test_validation_error_handler(client):
  49. # Missing required fields
  50. response = client.post(
  51. "/api/v1/auth/login",
  52. data={} # Missing username and password
  53. )
  54. assert response.status_code == 400
  55. assert response.json()["message"] == "请求参数验证失败"
  56. def test_404_handler(client):
  57. response = client.get("/api/v1/not-exists")
  58. assert response.status_code == 404
  59. assert response.json()["detail"] in {"Not Found", "API endpoint not found"}