from typing import Any, List, Optional import pytest from fastapi import FastAPI, Query from starlette import status from starlette.middleware import Middleware from starlette.testclient import TestClient from owslib.ext.starlette.middleware.query_string import QueryStringFlatteningMiddleware @pytest.fixture(scope="session") def app() -> FastAPI: app = FastAPI( middleware=[ Middleware(QueryStringFlatteningMiddleware), ] ) @app.get("/test") def endpoint(ids: Optional[List[int]] = Query(None)) -> Any: return {"ids": ids} return app @pytest.fixture(scope="session") def client(app: FastAPI) -> TestClient: return TestClient(app) @pytest.mark.parametrize( "params, expected", [ (None, None), ({}, None), ({"ids": None}, None), ({"ids": ""}, None), ({"ids": " "}, None), ({"ids": "1,2,3"}, [1, 2, 3]), ({"ids": "1 , 2, 3"}, [1, 2, 3]), ({"ids": ["1", "2"]}, [1, 2]), ({"ids": ["1 ", " 2"]}, [1, 2]), ], ) def test_query_string_flattening( params: Any, expected: Optional[List[int]], client: TestClient ) -> None: response = client.get("/test", params=params) assert response.status_code == status.HTTP_200_OK assert response.json() == {"ids": expected}