3
3
from typing import Any
4
4
from unittest .mock import sentinel
5
5
6
- from jsonrpcserver import status
7
6
from jsonrpcserver .dispatcher import (
8
7
create_requests ,
9
8
default_deserializer ,
13
12
dispatch_to_response_pure ,
14
13
)
15
14
from jsonrpcserver .methods import Methods , global_methods
16
- from jsonrpcserver .result import Result , Success
17
15
from jsonrpcserver .request import Request , NOID
18
16
from jsonrpcserver .response import ErrorResponse , SuccessResponse
17
+ from jsonrpcserver .result import Result , Success , InvalidParams
18
+ from jsonrpcserver .status import (
19
+ ERROR_INTERNAL_ERROR ,
20
+ ERROR_INVALID_PARAMS ,
21
+ ERROR_INVALID_REQUEST ,
22
+ ERROR_PARSE_ERROR ,
23
+ )
19
24
20
25
21
26
# def test_dispatch_to_response_pure_invalid_params_notification():
@@ -139,27 +144,29 @@ def test_dispatch_to_response_pure_notification():
139
144
assert response is None
140
145
141
146
142
- def test_dispatch_to_response_pure_notification_invalid_jsonrpc ():
147
+ def test_dispatch_to_response_pure_invalid_json ():
148
+ """Unable to parse, must return an error"""
143
149
response = dispatch_to_response_pure (
144
150
methods = Methods (ping ),
145
151
context = None ,
146
152
schema_validator = default_schema_validator ,
147
153
deserializer = default_deserializer ,
148
- request = '{"jsonrpc": "0", "method": "notify"}' ,
154
+ request = "{" ,
149
155
)
150
156
assert isinstance (response , ErrorResponse )
157
+ assert response .code == ERROR_PARSE_ERROR
151
158
152
159
153
- def test_dispatch_to_response_pure_invalid_json ():
154
- """Unable to parse, must return an error"""
160
+ def test_dispatch_to_response_pure_notification_invalid_jsonrpc ():
155
161
response = dispatch_to_response_pure (
156
162
methods = Methods (ping ),
157
163
context = None ,
158
164
schema_validator = default_schema_validator ,
159
165
deserializer = default_deserializer ,
160
- request = "{" ,
166
+ request = '{"jsonrpc": "0", "method": "notify"}' ,
161
167
)
162
168
assert isinstance (response , ErrorResponse )
169
+ assert response .code == ERROR_INVALID_REQUEST
163
170
164
171
165
172
def test_dispatch_to_response_pure_invalid_jsonrpc ():
@@ -172,6 +179,7 @@ def test_dispatch_to_response_pure_invalid_jsonrpc():
172
179
request = "{}" ,
173
180
)
174
181
assert isinstance (response , ErrorResponse )
182
+ assert response .code == ERROR_INVALID_REQUEST
175
183
176
184
177
185
def test_dispatch_to_response_pure_invalid_params ():
@@ -187,6 +195,7 @@ def foo(colour: str) -> Result:
187
195
request = '{"jsonrpc": "2.0", "method": "foo", "params": ["blue"], "id": 1}' ,
188
196
)
189
197
assert isinstance (response , ErrorResponse )
198
+ assert response .code == ERROR_INVALID_PARAMS
190
199
191
200
192
201
def test_dispatch_to_response_pure_invalid_params_count ():
@@ -201,7 +210,25 @@ def foo(colour: str, size: str):
201
210
request = '{"jsonrpc": "2.0", "method": "foo", "params": {"colour":"blue"}, "id": 1}' ,
202
211
)
203
212
assert isinstance (response , ErrorResponse )
204
- assert response .data == "missing a required argument: 'size'"
213
+ assert response .code == ERROR_INVALID_PARAMS
214
+
215
+
216
+ def test_dispatch_to_response_pure_enforcing_result ():
217
+ """Methods should return a Result, otherwise we get an Internal Error response."""
218
+
219
+ def not_a_result ():
220
+ return None
221
+
222
+ response = dispatch_to_response_pure (
223
+ methods = Methods (not_a_result ),
224
+ context = None ,
225
+ schema_validator = default_schema_validator ,
226
+ deserializer = default_deserializer ,
227
+ request = '{"jsonrpc": "2.0", "method": "not_a_result", "id": 1}' ,
228
+ )
229
+ assert isinstance (response , ErrorResponse )
230
+ assert response .code == ERROR_INTERNAL_ERROR
231
+ assert response .data == "The method did not return a Result"
205
232
206
233
207
234
# dispatch_to_response
@@ -306,7 +333,7 @@ def test_examples_invalid_json():
306
333
request = '[{"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, {"jsonrpc": "2.0", "method"]' ,
307
334
)
308
335
assert isinstance (response , ErrorResponse )
309
- assert response .code == status . JSONRPC_PARSE_ERROR_CODE
336
+ assert response .code == ERROR_PARSE_ERROR
310
337
311
338
312
339
def test_examples_empty_array ():
@@ -319,7 +346,7 @@ def test_examples_empty_array():
319
346
deserializer = default_deserializer ,
320
347
)
321
348
assert isinstance (response , ErrorResponse )
322
- assert response .code == status . JSONRPC_INVALID_REQUEST_CODE
349
+ assert response .code == ERROR_INVALID_REQUEST
323
350
324
351
325
352
def test_examples_invalid_jsonrpc_batch ():
@@ -335,7 +362,7 @@ def test_examples_invalid_jsonrpc_batch():
335
362
request = "[1]" ,
336
363
)
337
364
assert isinstance (response , ErrorResponse )
338
- assert response .code == status . JSONRPC_INVALID_REQUEST_CODE
365
+ assert response .code == ERROR_INVALID_REQUEST
339
366
340
367
341
368
def test_examples_multiple_invalid_jsonrpc ():
@@ -351,7 +378,7 @@ def test_examples_multiple_invalid_jsonrpc():
351
378
request = "[1, 2, 3]" ,
352
379
)
353
380
assert isinstance (response , ErrorResponse )
354
- assert response .code == status . JSONRPC_INVALID_REQUEST_CODE
381
+ assert response .code == ERROR_INVALID_REQUEST
355
382
356
383
357
384
def test_examples_mixed_requests_and_notifications ():
0 commit comments