|
|
from typing import Annotated, Any |
|
|
|
|
|
import pytest |
|
|
from fastapi import Depends |
|
|
from fastapi.testclient import TestClient |
|
|
from pytest_benchmark.fixture import BenchmarkFixture |
|
|
|
|
|
|
|
|
@pytest.fixture(scope="package") |
|
|
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()) |
|
|
|
|
|
|
|
|
@pytest.mark.xfail(reason="not implemented yet") |
|
|
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() |
|
|
|
|
|
@router.post("form") |
|
|
async def form( |
|
|
*, |
|
|
endpoint: Annotated[TestEndpoint, Depends(net_client)], |
|
|
data: dict[str, Any], |
|
|
): |
|
|
return await endpoint.form(data=data) |
|
|
|
|
|
@router.post("teapot") |
|
|
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 |
|
|
|