Source code for ewoksserver.tests.api_versions

from functools import wraps
from typing import Optional
from typing import Tuple

import pytest

from ..app import routes

_API_VERSIONS = {
    (): (2, 0, 0),
    (2,): (2, 0, 0),
    (2, 0, 0): (2, 0, 0),
    (1,): (1, 1, 0),
    (1, 1, 0): (1, 1, 0),
    (1, 0, 0): (1, 0, 0),
}
# Maps route version to the effective route version used


[docs] @pytest.fixture def min_api_version(request) -> Optional[str]: try: return request.param except AttributeError: return None
[docs] @pytest.fixture def max_api_version(request) -> Optional[str]: try: return request.param except AttributeError: return None
def _get_api_root(route_version: Tuple[int]) -> str: if not route_version: return routes.BACKEND_PREFIX version_suffix = "_".join(list(map(str, route_version))) return f"{routes.BACKEND_PREFIX}/v{version_suffix}"
[docs] @pytest.fixture( params=list(_API_VERSIONS.items()), ids=[_get_api_root(route_version) for route_version in _API_VERSIONS], ) def api_root( request, min_api_version: Optional[str], max_api_version: Optional[str] ) -> str: route_version, version_tuple = request.param api_root = _get_api_root(route_version) if min_api_version: min_api_version_tuple = tuple(map(int, min_api_version.split("."))) assert ( len(min_api_version_tuple) == 3 ), "min_api_version must be of the form 'x.y.z'" if max_api_version: max_api_version_tuple = tuple(map(int, max_api_version.split("."))) assert ( len(max_api_version_tuple) == 3 ), "max_api_version must be of the form 'x.y.z'" if min_api_version and version_tuple < min_api_version_tuple: pytest.skip(f"requires API >= {min_api_version}") if max_api_version and version_tuple > max_api_version_tuple: pytest.skip(f"requires API <= {max_api_version}") return api_root
[docs] def api_version_bounds( min_version: Optional[str] = None, max_version: Optional[str] = None ): def decorator(func): parametrize_decorators = [] if min_version: parametrize_decorators.append( pytest.mark.parametrize( "min_api_version", [min_version], indirect=True, ids=[""] ) ) if max_version: parametrize_decorators.append( pytest.mark.parametrize( "max_api_version", [max_version], indirect=True, ids=[""] ) ) for decorator in reversed(parametrize_decorators): func = decorator(func) @wraps(func) def wrapper(*args, **kwargs): return func(*args, **kwargs) return wrapper return decorator