import json import pytest from fastapi.testclient import TestClient from app.api_response import error_response from app.database import get_db from app.main import create_app class EmptyDb: def scalar(self, _statement): return None def test_health_uses_the_standard_success_envelope(): response = TestClient(create_app()).get("/health") assert response.status_code == 200 assert response.json() == { "code": 200, "msg": "success", "data": {"ok": True, "service": "miniapp-api"}, } def test_public_not_found_uses_the_standard_error_envelope(): app = create_app() app.dependency_overrides[get_db] = lambda: EmptyDb() try: response = TestClient(app).get("/api/public/details/missing-detail") finally: app.dependency_overrides.clear() assert response.status_code == 404 assert response.json() == { "code": 404, "msg": "详情不存在", "data": None, } def test_request_validation_uses_the_standard_error_envelope(): response = TestClient(create_app()).post("/api/public/leads", json={}) assert response.status_code == 400 body = response.json() assert body["code"] == 400 assert body["data"] is None assert body["errorCode"] == "VALIDATION_ERROR" assert body["msg"] @pytest.mark.parametrize("status_code", [400, 401, 404, 409, 422, 500]) def test_supported_error_statuses_keep_the_same_envelope(status_code): response = error_response(status_code, "示例错误", error_code="EXAMPLE_ERROR") assert response.status_code == status_code assert json.loads(response.body) == { "code": status_code, "msg": "示例错误", "data": None, "errorCode": "EXAMPLE_ERROR", }