|
1 | | -from typing import Any, Callable, Dict, Sequence, Type, Union |
| 1 | +from json import dumps as json_dumps |
| 2 | +from typing import Any, Callable, Dict, List, Sequence, Type, Union, cast |
2 | 3 | from unittest.mock import Mock |
| 4 | +from urllib.parse import urlencode |
3 | 5 |
|
| 6 | +from ninja import NinjaAPI, Router |
4 | 7 | from ninja.constants import NOT_SET, NOT_SET_TYPE |
5 | | -from ninja.testing.client import NinjaResponse |
| 8 | +from ninja.testing.client import NinjaClientBase, NinjaResponse |
6 | 9 | from ninja_extra import ControllerBase |
7 | | -from ninja_extra.testing.client import NinjaExtraClientBase |
8 | 10 |
|
9 | 11 | from easy.main import EasyAPI |
10 | 12 |
|
11 | 13 |
|
12 | | -class EasyAPIClientBase(NinjaExtraClientBase): |
| 14 | +class EasyAPIClientBase(NinjaClientBase): |
13 | 15 | def __init__( |
14 | 16 | self, |
15 | | - controller_class: Union[Type[ControllerBase], Type], |
| 17 | + router_or_app: Union[EasyAPI, Router, Type[ControllerBase]], |
16 | 18 | auth: Union[ |
17 | 19 | Sequence[Callable[..., Any]], Callable[..., Any], NOT_SET_TYPE, None |
18 | 20 | ] = NOT_SET, |
19 | 21 | api_cls: Union[Type[EasyAPI], Type] = EasyAPI, |
20 | 22 | ) -> None: |
21 | | - api = api_cls(auth=auth) |
22 | | - assert hasattr(controller_class, "get_api_controller"), "Not a valid object" |
23 | | - controller_ninja_api_controller = controller_class.get_api_controller() |
24 | | - assert controller_ninja_api_controller |
25 | | - controller_ninja_api_controller.set_api_instance(api) |
26 | | - self._urls_cache = list(controller_ninja_api_controller.urls_paths("")) |
27 | | - super(NinjaExtraClientBase, self).__init__(api) |
| 23 | + if hasattr(router_or_app, "get_api_controller"): |
| 24 | + api = api_cls(auth=auth) |
| 25 | + controller_ninja_api_controller = router_or_app.get_api_controller() # type: ignore |
| 26 | + assert controller_ninja_api_controller |
| 27 | + controller_ninja_api_controller.set_api_instance(api) |
| 28 | + self._urls_cache = list(controller_ninja_api_controller.urls_paths("")) |
| 29 | + router_or_app = api |
| 30 | + super().__init__(cast(Union[NinjaAPI, Router], router_or_app)) |
| 31 | + |
| 32 | + def request( |
| 33 | + self, |
| 34 | + method: str, |
| 35 | + path: str, |
| 36 | + data: Dict = {}, |
| 37 | + json: Any = None, |
| 38 | + **request_params: Any, |
| 39 | + ) -> "NinjaResponse": |
| 40 | + if json is not None: |
| 41 | + request_params["body"] = json_dumps(json) |
| 42 | + if "query" in request_params and isinstance(request_params["query"], dict): |
| 43 | + query = request_params.pop("query") |
| 44 | + url_encode = urlencode(query) |
| 45 | + path = f"{path}?{url_encode}" |
| 46 | + func, request, kwargs = self._resolve(method, path, data, request_params) |
| 47 | + return self._call(func, request, kwargs) # type: ignore |
| 48 | + |
| 49 | + @property |
| 50 | + def urls(self) -> List: |
| 51 | + if not hasattr(self, "_urls_cache"): |
| 52 | + self._urls_cache: List |
| 53 | + if isinstance(self.router_or_app, EasyAPI): |
| 54 | + self._urls_cache = self.router_or_app.urls[0] # pragma: no cover |
| 55 | + else: |
| 56 | + api = EasyAPI() |
| 57 | + self.router_or_app.set_api_instance(api) # type: ignore |
| 58 | + self._urls_cache = list(self.router_or_app.urls_paths("")) # type: ignore |
| 59 | + return self._urls_cache |
28 | 60 |
|
29 | 61 |
|
30 | 62 | class EasyTestClient(EasyAPIClientBase): |
|
0 commit comments