11from copy import deepcopy
22from dataclasses import dataclass
33from inspect import isawaitable
4- from typing import Awaitable , Callable
4+ from typing import Any , Awaitable , Callable
55
66from aiohttp import web
77
88
9+ ResponseHandler = Callable [
10+ [web .Request ], web .Response | Awaitable [web .Response ]
11+ ]
12+
13+
914@dataclass
1015class MockData :
1116 method : str # the method we replace
1217 path : str # the API path we are replacing
13- response : (
14- web .Response
15- | Callable [[web .Request ], web .Response | Awaitable [web .Response ]]
16- )
18+ response : web .Response | ResponseHandler
1719
1820
1921class WebServiceMock :
@@ -24,9 +26,9 @@ class WebServiceMock:
2426 2. Add real APIs via add_mock_data
2527 """
2628
27- def __init__ (self ):
29+ def __init__ (self ) -> None :
2830 self ._mock_data : list [MockData ] = []
29- self ._call_info = {}
31+ self ._call_info : dict [ str , dict [ str , list [ dict [ str , Any ]]]] = {}
3032
3133 async def handle (self , request : web .Request ) -> web .Response :
3234 """
@@ -41,19 +43,18 @@ async def handle(self, request: web.Request) -> web.Response:
4143 await self ._save_request (mock .method , mock .path , request )
4244 if isinstance (mock .response , web .Response ):
4345 return deepcopy (mock .response )
44- else :
45- response = mock .response (request )
46- if isawaitable (response ):
47- return await response
48- else :
49- return response
50-
51- raise Exception (
46+
47+ response = mock .response (request )
48+ if isawaitable (response ):
49+ return await response
50+ return response
51+
52+ raise LookupError (
5253 f"Mock with method={ request .method } "
5354 f"and url={ request .path } not found"
5455 )
5556
56- def add_mock_data (self , mock_data : MockData ) -> list [dict [str , any ]]:
57+ def add_mock_data (self , mock_data : MockData ) -> list [dict [str , Any ]]:
5758 """Saves a new mock and returns a reference to the call history"""
5859 self ._mock_data .append (mock_data )
5960
@@ -66,11 +67,12 @@ def add_mock_data(self, mock_data: MockData) -> list[dict[str, any]]:
6667 async def _save_request (
6768 self , method : str , path : str , request : web .Request
6869 ) -> None :
69- data = {"headers" : request .headers }
70+ data : dict [str , Any ] = {"headers" : request .headers }
71+
7072 if request .can_read_body :
7173 if request .content_type == "application/json" :
7274 data ["json" ] = await request .json ()
73- if request .content_type == "text/plain" :
75+ elif request .content_type == "text/plain" :
7476 data ["text" ] = await request .text ()
7577
7678 self ._call_info [path ][method ].append (data )
0 commit comments