Skip to content

Commit 5a44800

Browse files
committed
Added test for use global interceptor
1 parent ea2ecbc commit 5a44800

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

ellar/core/guard/consumer.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ async def run_route_guards(self, context: IExecutionContext) -> None:
2424

2525
for guard in self._get_guards(context):
2626
await self.run_guard(context, guard)
27-
else:
28-
for guard in map(self.get_guard_instance, context.get_app().get_guards()):
29-
await self.run_guard(context, guard)
3027

3128
async def run_guard(
3229
self, context: IExecutionContext, guard_instance: "GuardCanActivate"
@@ -43,7 +40,8 @@ def _get_guards(self, context: IExecutionContext) -> t.Iterable["GuardCanActivat
4340

4441
return map(
4542
self.get_guard_instance,
46-
reflector.get_all_and_override(GUARDS_KEY, *targets) or [],
43+
reflector.get_all_and_override(GUARDS_KEY, *targets)
44+
or context.get_app().get_guards(),
4745
)
4846

4947
def get_guard_instance(

ellar/core/interceptors/consumer.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,13 @@ def get_interceptor(
2828
async def execute(
2929
self, context: IExecutionContext, route_operation: "RouteOperationBase"
3030
) -> t.Any:
31-
interceptor_idx = 0
3231
route_interceptors: t.List[EllarInterceptor] = list(
3332
map(
3433
self.get_interceptor,
3534
self.reflector.get_all_and_override(
3635
ROUTE_INTERCEPTORS, *[context.get_handler(), context.get_class()]
3736
)
38-
or [],
37+
or context.get_app().get_interceptors(),
3938
)
4039
)
4140
route_interceptors_length = len(route_interceptors or [])
@@ -46,7 +45,7 @@ async def handler(idx: int) -> t.Any:
4645
if idx >= route_interceptors_length:
4746
return await route_operation.handle_request(context=context)
4847
return await route_interceptors[idx].intercept(
49-
context, functools.partial(handler, interceptor_idx + 1)
48+
context, functools.partial(handler, idx + 1)
5049
)
5150

5251
res = await handler(0)

ellar/core/main.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ellar.common.datastructures import State, URLPath
99
from ellar.common.interfaces import IExceptionHandler, IExceptionMiddlewareService
1010
from ellar.common.logger import logger
11-
from ellar.common.models import GuardCanActivate
11+
from ellar.common.models import EllarInterceptor, GuardCanActivate
1212
from ellar.common.templating import Environment
1313
from ellar.common.types import ASGIApp, T, TReceive, TScope, TSend
1414
from ellar.core.middleware import (
@@ -54,6 +54,9 @@ def __init__(
5454
self._injector: EllarInjector = injector
5555

5656
self._global_guards = [] if global_guards is None else list(global_guards)
57+
self._global_interceptors: t.List[
58+
t.Union[EllarInterceptor, t.Type[EllarInterceptor]]
59+
] = []
5760
self._exception_handlers = list(self.config.EXCEPTION_HANDLERS)
5861

5962
self._user_middleware = list(t.cast(list, self.config.MIDDLEWARE))
@@ -143,11 +146,21 @@ def install_module(
143146
def get_guards(self) -> t.List[t.Union[t.Type[GuardCanActivate], GuardCanActivate]]:
144147
return self._global_guards
145148

149+
def get_interceptors(
150+
self,
151+
) -> t.List[t.Union[EllarInterceptor, t.Type[EllarInterceptor]]]:
152+
return self._global_interceptors
153+
146154
def use_global_guards(
147155
self, *guards: t.Union["GuardCanActivate", t.Type["GuardCanActivate"]]
148156
) -> None:
149157
self._global_guards.extend(guards)
150158

159+
def use_global_interceptors(
160+
self, *interceptors: t.Union[EllarInterceptor, t.Type[EllarInterceptor]]
161+
) -> None:
162+
self._global_interceptors.extend(interceptors)
163+
151164
@property
152165
def injector(self) -> EllarInjector:
153166
return self._injector

tests/test_interceptors/test_interceptor.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,25 @@ def test_interceptor_works_ws():
8585
with client.websocket_connect("/interceptor-ws") as ws:
8686
data = ws.receive_text()
8787
assert data == "intercepted okay"
88+
89+
90+
def test_global_guard_works():
91+
tm = Test.create_test_module()
92+
app = tm.create_application()
93+
94+
@get("/global")
95+
def _interceptor_demo_endpoint():
96+
return {"message": "intercepted okay"}
97+
98+
app.router.append(_interceptor_demo_endpoint)
99+
app.use_global_interceptors(Interceptor1(), InterceptCustomException)
100+
101+
_client = tm.get_test_client()
102+
103+
res = _client.get("/global")
104+
105+
assert res.status_code == 200
106+
assert res.json() == {
107+
"Interceptor1": "Interceptor1 modified returned resulted",
108+
"message": "intercepted okay",
109+
}

0 commit comments

Comments
 (0)