Spaces:
Running
Running
from typing import Annotated, Any | |
import pytest | |
from fastapi import Depends | |
from fastapi.testclient import TestClient | |
from pytest_benchmark.fixture import BenchmarkFixture | |
def client(): | |
from hibiapi.app import app | |
with TestClient(app, base_url="http://testserver/") as client: | |
yield client | |
def test_openapi(client: TestClient, in_stress: bool = False): | |
response = client.get("/openapi.json") | |
assert response.status_code == 200 | |
assert response.json() | |
if in_stress: | |
return True | |
def test_doc_page(client: TestClient, in_stress: bool = False): | |
response = client.get("/docs") | |
assert response.status_code == 200 | |
assert response.text | |
response = client.get("/docs/test") | |
assert response.status_code == 200 | |
assert response.text | |
if in_stress: | |
return True | |
def test_openapi_stress(client: TestClient, benchmark: BenchmarkFixture): | |
assert benchmark.pedantic( | |
test_openapi, | |
args=(client, True), | |
rounds=200, | |
warmup_rounds=10, | |
iterations=3, | |
) | |
def test_doc_page_stress(client: TestClient, benchmark: BenchmarkFixture): | |
assert benchmark.pedantic( | |
test_doc_page, args=(client, True), rounds=200, iterations=3 | |
) | |
def test_notfound(client: TestClient): | |
from hibiapi.utils.exceptions import ExceptionReturn | |
response = client.get("/notexistpath") | |
assert response.status_code == 404 | |
assert ExceptionReturn.parse_obj(response.json()) | |
def test_net_request(): | |
from hibiapi.utils.net import BaseNetClient | |
from hibiapi.utils.routing import BaseEndpoint, SlashRouter | |
test_headers = {"x-test-header": "random-string"} | |
test_data = {"test": "test"} | |
class TestEndpoint(BaseEndpoint): | |
base = "https://httpbin.org" | |
async def request(self, path: str, params: dict[str, Any]): | |
url = self._join(self.base, path, params) | |
response = await self.client.post(url, data=params) | |
response.raise_for_status() | |
return response.json() | |
async def form(self, *, data: dict[str, Any]): | |
return await self.request("/post", data) | |
async def teapot(self): | |
return await self.request("/status/{codes}", {"codes": 418}) | |
class TestNetClient(BaseNetClient): | |
pass | |
async def net_client(): | |
async with TestNetClient(headers=test_headers) as client: | |
yield TestEndpoint(client) | |
router = SlashRouter() | |
async def form( | |
*, | |
endpoint: Annotated[TestEndpoint, Depends(net_client)], | |
data: dict[str, Any], | |
): | |
return await endpoint.form(data=data) | |
async def teapot(endpoint: Annotated[TestEndpoint, Depends(net_client)]): | |
return await endpoint.teapot() | |
from hibiapi.app.routes import router as api_router | |
api_router.include_router(router, prefix="/test") | |
from hibiapi.app import app | |
from hibiapi.utils.exceptions import ExceptionReturn | |
with TestClient(app, base_url="http://testserver/api/test/") as client: | |
response = client.post("form", json=test_data) | |
assert response.status_code == 200 | |
response_data = response.json() | |
assert response_data["form"] == test_data | |
request_headers = {k.lower(): v for k, v in response_data["headers"].items()} | |
assert test_headers.items() <= request_headers.items() | |
response = client.post("teapot", json=test_data) | |
exception_return = ExceptionReturn.parse_obj(response.json()) | |
assert exception_return.code == response.status_code | |