From 35aed7dd5a852c907d46d1565c05ba9493f99ada Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Thu, 16 Oct 2025 10:18:09 -0400 Subject: [PATCH] Define JSON-RPC v2.0 Signed-off-by: Juan Cruz Viotti --- schemas/jsonrpc/v2.0/batch-request.json | 61 ++++ schemas/jsonrpc/v2.0/batch-response.json | 53 +++ schemas/jsonrpc/v2.0/code-predefined.json | 42 +++ schemas/jsonrpc/v2.0/code.json | 16 + schemas/jsonrpc/v2.0/error.json | 39 ++ schemas/jsonrpc/v2.0/identifier.json | 9 + schemas/jsonrpc/v2.0/method-internal.json | 10 + schemas/jsonrpc/v2.0/method.json | 16 + schemas/jsonrpc/v2.0/notification.json | 46 +++ schemas/jsonrpc/v2.0/parameters.json | 16 + schemas/jsonrpc/v2.0/request.json | 50 +++ schemas/jsonrpc/v2.0/response.json | 71 ++++ tests/jsonrpc/v2.0/batch-request.test.json | 290 +++++++++++++++ tests/jsonrpc/v2.0/batch-response.test.json | 353 ++++++++++++++++++ tests/jsonrpc/v2.0/code-predefined.test.json | 126 +++++++ tests/jsonrpc/v2.0/code.test.json | 130 +++++++ tests/jsonrpc/v2.0/error.test.json | 263 ++++++++++++++ tests/jsonrpc/v2.0/identifier.test.json | 136 +++++++ tests/jsonrpc/v2.0/method-internal.test.json | 114 ++++++ tests/jsonrpc/v2.0/method.test.json | 132 +++++++ tests/jsonrpc/v2.0/notification.test.json | 264 ++++++++++++++ tests/jsonrpc/v2.0/parameters.test.json | 145 ++++++++ tests/jsonrpc/v2.0/request.test.json | 330 +++++++++++++++++ tests/jsonrpc/v2.0/response.test.json | 357 +++++++++++++++++++ 24 files changed, 3069 insertions(+) create mode 100644 schemas/jsonrpc/v2.0/batch-request.json create mode 100644 schemas/jsonrpc/v2.0/batch-response.json create mode 100644 schemas/jsonrpc/v2.0/code-predefined.json create mode 100644 schemas/jsonrpc/v2.0/code.json create mode 100644 schemas/jsonrpc/v2.0/error.json create mode 100644 schemas/jsonrpc/v2.0/identifier.json create mode 100644 schemas/jsonrpc/v2.0/method-internal.json create mode 100644 schemas/jsonrpc/v2.0/method.json create mode 100644 schemas/jsonrpc/v2.0/notification.json create mode 100644 schemas/jsonrpc/v2.0/parameters.json create mode 100644 schemas/jsonrpc/v2.0/request.json create mode 100644 schemas/jsonrpc/v2.0/response.json create mode 100644 tests/jsonrpc/v2.0/batch-request.test.json create mode 100644 tests/jsonrpc/v2.0/batch-response.test.json create mode 100644 tests/jsonrpc/v2.0/code-predefined.test.json create mode 100644 tests/jsonrpc/v2.0/code.test.json create mode 100644 tests/jsonrpc/v2.0/error.test.json create mode 100644 tests/jsonrpc/v2.0/identifier.test.json create mode 100644 tests/jsonrpc/v2.0/method-internal.test.json create mode 100644 tests/jsonrpc/v2.0/method.test.json create mode 100644 tests/jsonrpc/v2.0/notification.test.json create mode 100644 tests/jsonrpc/v2.0/parameters.test.json create mode 100644 tests/jsonrpc/v2.0/request.test.json create mode 100644 tests/jsonrpc/v2.0/response.test.json diff --git a/schemas/jsonrpc/v2.0/batch-request.json b/schemas/jsonrpc/v2.0/batch-request.json new file mode 100644 index 00000000..002e581d --- /dev/null +++ b/schemas/jsonrpc/v2.0/batch-request.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Batch Request", + "description": "An array of request objects sent to the server in a single batch", + "$comment": "https://www.jsonrpc.org/specification#batch", + "examples": [ + [ + { + "id": "1", + "jsonrpc": "2.0", + "method": "sum", + "params": [ 1, 2, 4 ] + }, + { + "jsonrpc": "2.0", + "method": "notify_hello", + "params": [ 7 ] + }, + { + "id": "2", + "jsonrpc": "2.0", + "method": "subtract", + "params": [ 42, 23 ] + } + ], + [ + { + "id": 1, + "jsonrpc": "2.0", + "method": "get_data" + } + ], + [ + { + "jsonrpc": "2.0", + "method": "notify_update" + }, + { + "id": "req-1", + "jsonrpc": "2.0", + "method": "fetch", + "params": { + "key": "value" + } + } + ] + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "array", + "minItems": 1, + "items": { + "anyOf": [ + { + "$ref": "./request.json" + }, + { + "$ref": "./notification.json" + } + ] + } +} diff --git a/schemas/jsonrpc/v2.0/batch-response.json b/schemas/jsonrpc/v2.0/batch-response.json new file mode 100644 index 00000000..87e81815 --- /dev/null +++ b/schemas/jsonrpc/v2.0/batch-response.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Batch Response", + "description": "An array of response objects returned by the server in response to a batch request", + "$comment": "https://www.jsonrpc.org/specification#batch", + "examples": [ + [ + { + "id": "1", + "jsonrpc": "2.0", + "result": 7 + }, + { + "id": "2", + "jsonrpc": "2.0", + "result": 19 + }, + { + "id": null, + "error": { + "code": -32600, + "message": "Invalid Request" + }, + "jsonrpc": "2.0" + } + ], + [ + { + "id": 1, + "jsonrpc": "2.0", + "result": { + "status": "ok" + } + } + ], + [ + { + "id": "req-1", + "error": { + "code": -32601, + "message": "Method not found" + }, + "jsonrpc": "2.0" + } + ] + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "array", + "minItems": 1, + "items": { + "$ref": "./response.json" + } +} diff --git a/schemas/jsonrpc/v2.0/code-predefined.json b/schemas/jsonrpc/v2.0/code-predefined.json new file mode 100644 index 00000000..f67ba338 --- /dev/null +++ b/schemas/jsonrpc/v2.0/code-predefined.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Predefined Error Code", + "description": "An error code from the predefined range reserved by the JSON-RPC 2.0 specification", + "$comment": "https://www.jsonrpc.org/specification#error_object", + "examples": [ -32700, -32600, -32601, -32602, -32603, -32000 ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "integer", + "anyOf": [ + { + "title": "Parse error", + "description": "Invalid JSON was received by the server", + "const": -32700 + }, + { + "title": "Invalid request", + "description": "The JSON sent is not a valid Request object", + "const": -32600 + }, + { + "title": "Method not found", + "description": "The method does not exist / is not available", + "const": -32601 + }, + { + "title": "Invalid params", + "description": "Invalid method parameter(s)", + "const": -32602 + }, + { + "title": "Internal error", + "description": "Internal JSON-RPC error", + "const": -32603 + }, + { + "title": "Server error", + "description": "Implementation-defined server error", + "maximum": -32000, + "minimum": -32099 + } + ] +} diff --git a/schemas/jsonrpc/v2.0/code.json b/schemas/jsonrpc/v2.0/code.json new file mode 100644 index 00000000..d0cc1ad7 --- /dev/null +++ b/schemas/jsonrpc/v2.0/code.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Error Code", + "description": "A number that indicates the error type that occurred", + "$comment": "https://www.jsonrpc.org/specification#error_object", + "examples": [ -32700, -32600, -32601, -32000, 100, -1 ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "anyOf": [ + { + "$ref": "./code-predefined.json" + }, + { + "type": "integer" + } + ] +} diff --git a/schemas/jsonrpc/v2.0/error.json b/schemas/jsonrpc/v2.0/error.json new file mode 100644 index 00000000..f8be2e91 --- /dev/null +++ b/schemas/jsonrpc/v2.0/error.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Error Object", + "description": "An object that describes an error that occurred during the request", + "$comment": "https://www.jsonrpc.org/specification#error_object", + "examples": [ + { + "code": -32600, + "message": "Invalid Request" + }, + { + "code": -32601, + "message": "Method not found" + }, + { + "code": -32000, + "data": { + "details": "Database connection failed" + }, + "message": "Server error" + } + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "object", + "required": [ "code", "message" ], + "properties": { + "code": { + "description": "The error type", + "$ref": "./code.json" + }, + "data": { + "description": "Additional error information" + }, + "message": { + "description": "The error description", + "type": "string" + } + } +} diff --git a/schemas/jsonrpc/v2.0/identifier.json b/schemas/jsonrpc/v2.0/identifier.json new file mode 100644 index 00000000..e8a3978e --- /dev/null +++ b/schemas/jsonrpc/v2.0/identifier.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Identifier", + "description": "An identifier established by the client that must be matched in the response if included in a request", + "$comment": "https://www.jsonrpc.org/specification#request_object", + "examples": [ "abc123", 42, null, "request-1" ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": [ "string", "integer", "null" ] +} diff --git a/schemas/jsonrpc/v2.0/method-internal.json b/schemas/jsonrpc/v2.0/method-internal.json new file mode 100644 index 00000000..ba86dfa6 --- /dev/null +++ b/schemas/jsonrpc/v2.0/method-internal.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Internal Method Name", + "description": "A method name reserved for system extensions that begins with the prefix 'rpc.'", + "$comment": "https://www.jsonrpc.org/specification#request_object", + "examples": [ "rpc.discover", "rpc.introspect", "rpc.system.info" ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "string", + "pattern": "^rpc\\." +} diff --git a/schemas/jsonrpc/v2.0/method.json b/schemas/jsonrpc/v2.0/method.json new file mode 100644 index 00000000..a65326bb --- /dev/null +++ b/schemas/jsonrpc/v2.0/method.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Method Name", + "description": "A string containing the name of the method to be invoked", + "$comment": "https://www.jsonrpc.org/specification#request_object", + "examples": [ "subtract", "update", "notify_hello", "rpc.discover", "sum" ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "anyOf": [ + { + "$ref": "./method-internal.json" + }, + { + "type": "string" + } + ] +} diff --git a/schemas/jsonrpc/v2.0/notification.json b/schemas/jsonrpc/v2.0/notification.json new file mode 100644 index 00000000..42c83866 --- /dev/null +++ b/schemas/jsonrpc/v2.0/notification.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Notification", + "description": "A request object without an identifier that must not be responded to by the server", + "$comment": "https://www.jsonrpc.org/specification#notification", + "examples": [ + { + "jsonrpc": "2.0", + "method": "update" + }, + { + "jsonrpc": "2.0", + "method": "notify_hello", + "params": [ 7 ] + }, + { + "jsonrpc": "2.0", + "method": "notify_sum", + "params": { + "a": 1, + "b": 2 + } + } + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "object", + "required": [ "jsonrpc", "method" ], + "properties": { + "id": { + "description": "Must not be included", + "not": true + }, + "jsonrpc": { + "description": "The protocol version", + "const": "2.0" + }, + "method": { + "description": "The method name", + "$ref": "./method.json" + }, + "params": { + "description": "The method parameters", + "$ref": "./parameters.json" + } + } +} diff --git a/schemas/jsonrpc/v2.0/parameters.json b/schemas/jsonrpc/v2.0/parameters.json new file mode 100644 index 00000000..6c11d7c0 --- /dev/null +++ b/schemas/jsonrpc/v2.0/parameters.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Parameter Structures", + "description": "A structured value that holds the parameter values to be used during the invocation of the method", + "$comment": "https://www.jsonrpc.org/specification#parameter_structures", + "examples": [ + [ 42, "foo" ], + { + "age": 30, + "name": "John" + }, + [] + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": [ "array", "object" ] +} diff --git a/schemas/jsonrpc/v2.0/request.json b/schemas/jsonrpc/v2.0/request.json new file mode 100644 index 00000000..aa4ccab5 --- /dev/null +++ b/schemas/jsonrpc/v2.0/request.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Request Object", + "description": "An object that represents a call to a method on the server", + "$comment": "https://www.jsonrpc.org/specification#request_object", + "examples": [ + { + "id": 1, + "jsonrpc": "2.0", + "method": "subtract", + "params": [ 42, 23 ] + }, + { + "id": 3, + "jsonrpc": "2.0", + "method": "subtract", + "params": { + "minuend": 42, + "subtrahend": 23 + } + }, + { + "id": "req-001", + "jsonrpc": "2.0", + "method": "update", + "params": [ 1, 2, 3, 4, 5 ] + } + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "object", + "required": [ "jsonrpc", "method", "id" ], + "properties": { + "id": { + "description": "The request identifier", + "$ref": "./identifier.json" + }, + "jsonrpc": { + "description": "The protocol version", + "const": "2.0" + }, + "method": { + "description": "The method name", + "$ref": "./method.json" + }, + "params": { + "description": "The method parameters", + "$ref": "./parameters.json" + } + } +} diff --git a/schemas/jsonrpc/v2.0/response.json b/schemas/jsonrpc/v2.0/response.json new file mode 100644 index 00000000..d2e51083 --- /dev/null +++ b/schemas/jsonrpc/v2.0/response.json @@ -0,0 +1,71 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "JSON-RPC 2.0 Response Object", + "description": "An object that represents the result of a method invocation on the server", + "$comment": "https://www.jsonrpc.org/specification#response_object", + "examples": [ + { + "id": 1, + "jsonrpc": "2.0", + "result": 19 + }, + { + "id": "req-002", + "jsonrpc": "2.0", + "result": [ 7, 8, 9 ] + }, + { + "id": 3, + "error": { + "code": -32601, + "message": "Method not found" + }, + "jsonrpc": "2.0" + } + ], + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "type": "object", + "anyOf": [ + { + "required": [ "jsonrpc", "id", "error" ], + "properties": { + "id": { + "description": "The response identifier", + "$ref": "./identifier.json" + }, + "error": { + "description": "The error object", + "$ref": "./error.json" + }, + "jsonrpc": { + "description": "The protocol version", + "const": "2.0" + }, + "result": { + "description": "Must not be included", + "not": true + } + } + }, + { + "required": [ "jsonrpc", "id", "result" ], + "properties": { + "id": { + "description": "The response identifier", + "$ref": "./identifier.json" + }, + "error": { + "description": "Must not be included", + "not": true + }, + "jsonrpc": { + "description": "The protocol version", + "const": "2.0" + }, + "result": { + "description": "The method result" + } + } + } + ] +} diff --git a/tests/jsonrpc/v2.0/batch-request.test.json b/tests/jsonrpc/v2.0/batch-request.test.json new file mode 100644 index 00000000..e9705ae4 --- /dev/null +++ b/tests/jsonrpc/v2.0/batch-request.test.json @@ -0,0 +1,290 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/batch-request.json", + "tests": [ + { + "data": [ + { + "id": "1", + "jsonrpc": "2.0", + "method": "sum", + "params": [ 1, 2, 4 ] + } + ], + "valid": true + }, + { + "data": [ + { + "id": "1", + "jsonrpc": "2.0", + "method": "sum", + "params": [ 1, 2, 4 ] + }, + { + "jsonrpc": "2.0", + "method": "notify_hello", + "params": [ 7 ] + } + ], + "valid": true + }, + { + "data": [ + { + "id": "1", + "jsonrpc": "2.0", + "method": "sum", + "params": [ 1, 2, 4 ] + }, + { + "jsonrpc": "2.0", + "method": "notify_hello", + "params": [ 7 ] + }, + { + "id": "2", + "jsonrpc": "2.0", + "method": "subtract", + "params": [ 42, 23 ] + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "method": "get_data" + } + ], + "valid": true + }, + { + "data": [ + { + "jsonrpc": "2.0", + "method": "notify_update" + } + ], + "valid": true + }, + { + "data": [ + { + "jsonrpc": "2.0", + "method": "notify_update" + }, + { + "id": "req-1", + "jsonrpc": "2.0", + "method": "fetch", + "params": { + "key": "value" + } + } + ], + "valid": true + }, + { + "data": [ + { + "jsonrpc": "2.0", + "method": "notify1" + }, + { + "jsonrpc": "2.0", + "method": "notify2" + }, + { + "jsonrpc": "2.0", + "method": "notify3" + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "method": "request1" + }, + { + "id": 2, + "jsonrpc": "2.0", + "method": "request2" + }, + { + "id": 3, + "jsonrpc": "2.0", + "method": "request3" + } + ], + "valid": true + }, + { + "data": [ + { + "id": "calc-1", + "jsonrpc": "2.0", + "method": "calculate", + "params": { + "x": 10, + "y": 20 + } + }, + { + "jsonrpc": "2.0", + "method": "log", + "params": [ "info", "test" ] + }, + { + "id": 100, + "jsonrpc": "2.0", + "method": "process", + "params": [] + }, + { + "jsonrpc": "2.0", + "method": "notify" + }, + { + "id": "q-1", + "jsonrpc": "2.0", + "method": "query" + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "method": "test1" + }, + { + "id": 2, + "jsonrpc": "2.0", + "method": "test2" + }, + { + "id": 3, + "jsonrpc": "2.0", + "method": "test3" + }, + { + "id": 4, + "jsonrpc": "2.0", + "method": "test4" + }, + { + "id": 5, + "jsonrpc": "2.0", + "method": "test5" + }, + { + "id": 6, + "jsonrpc": "2.0", + "method": "test6" + }, + { + "id": 7, + "jsonrpc": "2.0", + "method": "test7" + }, + { + "id": 8, + "jsonrpc": "2.0", + "method": "test8" + }, + { + "id": 9, + "jsonrpc": "2.0", + "method": "test9" + }, + { + "id": 10, + "jsonrpc": "2.0", + "method": "test10" + } + ], + "valid": true + }, + { + "data": [], + "valid": false + }, + { + "data": [ + { + "jsonrpc": "2.0", + "method": "test" + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0" + } + ], + "valid": false + }, + { + "data": [ + { + "id": 1, + "method": "test" + } + ], + "valid": false + }, + { + "data": [ "not an object" ], + "valid": false + }, + { + "data": [ 42 ], + "valid": false + }, + { + "data": [ null ], + "valid": false + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "method": "valid" + }, + { + "jsonrpc": "2.0", + "method": "notify" + } + ], + "valid": true + }, + { + "data": {}, + "valid": false + }, + { + "data": "batch", + "valid": false + }, + { + "data": 42, + "valid": false + }, + { + "data": null, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/batch-response.test.json b/tests/jsonrpc/v2.0/batch-response.test.json new file mode 100644 index 00000000..a4406726 --- /dev/null +++ b/tests/jsonrpc/v2.0/batch-response.test.json @@ -0,0 +1,353 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/batch-response.json", + "tests": [ + { + "data": [ + { + "id": "1", + "jsonrpc": "2.0", + "result": 7 + } + ], + "valid": true + }, + { + "data": [ + { + "id": "1", + "jsonrpc": "2.0", + "result": 7 + }, + { + "id": "2", + "jsonrpc": "2.0", + "result": 19 + } + ], + "valid": true + }, + { + "data": [ + { + "id": "1", + "jsonrpc": "2.0", + "result": 7 + }, + { + "id": "2", + "jsonrpc": "2.0", + "result": 19 + }, + { + "id": null, + "error": { + "code": -32600, + "message": "Invalid Request" + }, + "jsonrpc": "2.0" + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "result": { + "status": "ok" + } + } + ], + "valid": true + }, + { + "data": [ + { + "id": "req-1", + "error": { + "code": -32601, + "message": "Method not found" + }, + "jsonrpc": "2.0" + } + ], + "valid": true + }, + { + "data": [ + { + "id": null, + "error": { + "code": -32700, + "message": "Parse error" + }, + "jsonrpc": "2.0" + }, + { + "id": null, + "error": { + "code": -32600, + "message": "Invalid Request" + }, + "jsonrpc": "2.0" + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "result": null + }, + { + "id": 2, + "jsonrpc": "2.0", + "result": true + }, + { + "id": 3, + "jsonrpc": "2.0", + "result": false + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "result": 100 + }, + { + "id": 2, + "jsonrpc": "2.0", + "result": 200 + }, + { + "id": 3, + "jsonrpc": "2.0", + "result": 300 + }, + { + "id": 4, + "error": { + "code": -32600, + "message": "Invalid Request" + }, + "jsonrpc": "2.0" + } + ], + "valid": true + }, + { + "data": [ + { + "id": "arr-1", + "jsonrpc": "2.0", + "result": [ 1, 2, 3 ] + }, + { + "id": "obj-1", + "jsonrpc": "2.0", + "result": { + "key": "value" + } + }, + { + "id": "str-1", + "jsonrpc": "2.0", + "result": "string result" + } + ], + "valid": true + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "result": 1 + }, + { + "id": 2, + "jsonrpc": "2.0", + "result": 2 + }, + { + "id": 3, + "jsonrpc": "2.0", + "result": 3 + }, + { + "id": 4, + "jsonrpc": "2.0", + "result": 4 + }, + { + "id": 5, + "jsonrpc": "2.0", + "result": 5 + }, + { + "id": 6, + "jsonrpc": "2.0", + "result": 6 + }, + { + "id": 7, + "jsonrpc": "2.0", + "result": 7 + }, + { + "id": 8, + "jsonrpc": "2.0", + "result": 8 + }, + { + "id": 9, + "jsonrpc": "2.0", + "result": 9 + }, + { + "id": 10, + "jsonrpc": "2.0", + "result": 10 + } + ], + "valid": true + }, + { + "data": [ + { + "id": "err-1", + "error": { + "code": -32000, + "data": { + "details": "Internal failure" + }, + "message": "Server error" + }, + "jsonrpc": "2.0" + } + ], + "valid": true + }, + { + "data": [ + { + "id": 0, + "jsonrpc": "2.0", + "result": 0 + }, + { + "id": "empty", + "jsonrpc": "2.0", + "result": "" + }, + { + "id": "arr", + "jsonrpc": "2.0", + "result": [] + }, + { + "id": "obj", + "jsonrpc": "2.0", + "result": {} + } + ], + "valid": true + }, + { + "data": [], + "valid": false + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0" + } + ], + "valid": false + }, + { + "data": [ + { + "id": 1, + "error": { + "code": -32600, + "message": "Error" + }, + "jsonrpc": "2.0", + "result": 1 + } + ], + "valid": false + }, + { + "data": [ + { + "id": 1, + "result": 1 + } + ], + "valid": false + }, + { + "data": [ + { + "jsonrpc": "2.0", + "result": 1 + } + ], + "valid": false + }, + { + "data": [ "not an object" ], + "valid": false + }, + { + "data": [ 42 ], + "valid": false + }, + { + "data": [ null ], + "valid": false + }, + { + "data": [ + { + "id": 1, + "jsonrpc": "2.0", + "result": 1 + }, + { + "id": 2, + "jsonrpc": "2.0" + } + ], + "valid": false + }, + { + "data": {}, + "valid": false + }, + { + "data": "batch", + "valid": false + }, + { + "data": 42, + "valid": false + }, + { + "data": null, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/code-predefined.test.json b/tests/jsonrpc/v2.0/code-predefined.test.json new file mode 100644 index 00000000..251473b7 --- /dev/null +++ b/tests/jsonrpc/v2.0/code-predefined.test.json @@ -0,0 +1,126 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/code-predefined.json", + "tests": [ + { + "data": -32700, + "valid": true + }, + { + "data": -32600, + "valid": true + }, + { + "data": -32601, + "valid": true + }, + { + "data": -32602, + "valid": true + }, + { + "data": -32603, + "valid": true + }, + { + "data": -32000, + "valid": true + }, + { + "data": -32001, + "valid": true + }, + { + "data": -32050, + "valid": true + }, + { + "data": -32098, + "valid": true + }, + { + "data": -32099, + "valid": true + }, + { + "data": -32701, + "valid": false + }, + { + "data": -32699, + "valid": false + }, + { + "data": -32604, + "valid": false + }, + { + "data": -32599, + "valid": false + }, + { + "data": -31999, + "valid": false + }, + { + "data": -32100, + "valid": false + }, + { + "data": 0, + "valid": false + }, + { + "data": 1, + "valid": false + }, + { + "data": 100, + "valid": false + }, + { + "data": -1, + "valid": false + }, + { + "data": -100, + "valid": false + }, + { + "data": 32000, + "valid": false + }, + { + "data": 32700, + "valid": false + }, + { + "data": -32700.5, + "valid": false + }, + { + "data": "error", + "valid": false + }, + { + "data": "-32600", + "valid": false + }, + { + "data": null, + "valid": false + }, + { + "data": true, + "valid": false + }, + { + "data": [], + "valid": false + }, + { + "data": {}, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/code.test.json b/tests/jsonrpc/v2.0/code.test.json new file mode 100644 index 00000000..c3a73068 --- /dev/null +++ b/tests/jsonrpc/v2.0/code.test.json @@ -0,0 +1,130 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/code.json", + "tests": [ + { + "data": -32700, + "valid": true + }, + { + "data": -32600, + "valid": true + }, + { + "data": -32601, + "valid": true + }, + { + "data": -32602, + "valid": true + }, + { + "data": -32603, + "valid": true + }, + { + "data": -32000, + "valid": true + }, + { + "data": -32099, + "valid": true + }, + { + "data": 0, + "valid": true + }, + { + "data": 1, + "valid": true + }, + { + "data": -1, + "valid": true + }, + { + "data": 100, + "valid": true + }, + { + "data": -100, + "valid": true + }, + { + "data": 999, + "valid": true + }, + { + "data": -999, + "valid": true + }, + { + "data": 40000, + "valid": true + }, + { + "data": -40000, + "valid": true + }, + { + "data": 2147483647, + "valid": true + }, + { + "data": -2147483648, + "valid": true + }, + { + "data": -31999, + "valid": true + }, + { + "data": -32100, + "valid": true + }, + { + "data": -32701, + "valid": true + }, + { + "data": 1.5, + "valid": false + }, + { + "data": -32700.5, + "valid": false + }, + { + "data": 0.1, + "valid": false + }, + { + "data": "error", + "valid": false + }, + { + "data": "-32600", + "valid": false + }, + { + "data": null, + "valid": false + }, + { + "data": true, + "valid": false + }, + { + "data": false, + "valid": false + }, + { + "data": [], + "valid": false + }, + { + "data": {}, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/error.test.json b/tests/jsonrpc/v2.0/error.test.json new file mode 100644 index 00000000..fdb38cd4 --- /dev/null +++ b/tests/jsonrpc/v2.0/error.test.json @@ -0,0 +1,263 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/error.json", + "tests": [ + { + "data": { + "code": -32600, + "message": "Invalid Request" + }, + "valid": true + }, + { + "data": { + "code": -32601, + "message": "Method not found" + }, + "valid": true + }, + { + "data": { + "code": -32700, + "message": "Parse error" + }, + "valid": true + }, + { + "data": { + "code": -32602, + "message": "Invalid params" + }, + "valid": true + }, + { + "data": { + "code": -32603, + "message": "Internal error" + }, + "valid": true + }, + { + "data": { + "code": -32000, + "message": "Server error" + }, + "valid": true + }, + { + "data": { + "code": 100, + "message": "Application error" + }, + "valid": true + }, + { + "data": { + "code": -1, + "message": "Custom error" + }, + "valid": true + }, + { + "data": { + "code": 0, + "message": "" + }, + "valid": true + }, + { + "data": { + "code": -32600, + "data": "Additional info", + "message": "Invalid Request" + }, + "valid": true + }, + { + "data": { + "code": -32601, + "data": { + "method": "foo" + }, + "message": "Method not found" + }, + "valid": true + }, + { + "data": { + "code": -32000, + "data": { + "details": "Database connection failed" + }, + "message": "Server error" + }, + "valid": true + }, + { + "data": { + "code": 100, + "data": [ 1, 2, 3 ], + "message": "Error" + }, + "valid": true + }, + { + "data": { + "code": -32700, + "data": null, + "message": "Parse error" + }, + "valid": true + }, + { + "data": { + "code": 42, + "data": true, + "message": "Error" + }, + "valid": true + }, + { + "data": { + "code": -32602, + "data": 123, + "message": "Invalid params" + }, + "valid": true + }, + { + "data": { + "code": 1, + "message": "A very long error message with many characters describing the issue in detail" + }, + "valid": true + }, + { + "data": { + "code": -32600, + "message": "Error with unicode café" + }, + "valid": true + }, + { + "data": { + "code": 100, + "message": "Error with\nnewline" + }, + "valid": true + }, + { + "data": { + "code": -32600, + "data": { + "nested": { + "deep": { + "value": 42 + } + } + }, + "message": "Error" + }, + "valid": true + }, + { + "data": { + "message": "Missing code" + }, + "valid": false + }, + { + "data": { + "code": -32600 + }, + "valid": false + }, + { + "data": {}, + "valid": false + }, + { + "data": { + "code": "not-a-number", + "message": "Invalid code type" + }, + "valid": false + }, + { + "data": { + "code": -32600, + "message": 123 + }, + "valid": false + }, + { + "data": { + "code": null, + "message": "Null code" + }, + "valid": false + }, + { + "data": { + "code": -32600, + "message": null + }, + "valid": false + }, + { + "data": { + "code": -32600.5, + "message": "Fractional code" + }, + "valid": false + }, + { + "data": { + "code": -32000, + "custom": "extension", + "message": "Server error" + }, + "valid": true + }, + { + "data": { + "code": -32601, + "message": "Method not found", + "request_id": "req-123", + "timestamp": 1234567890 + }, + "valid": true + }, + { + "data": { + "x-trace": { + "column": 10, + "line": 42 + }, + "code": -32700, + "message": "Parse error" + }, + "valid": true + }, + { + "data": [], + "valid": false + }, + { + "data": "error", + "valid": false + }, + { + "data": 42, + "valid": false + }, + { + "data": null, + "valid": false + }, + { + "data": true, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/identifier.test.json b/tests/jsonrpc/v2.0/identifier.test.json new file mode 100644 index 00000000..34766885 --- /dev/null +++ b/tests/jsonrpc/v2.0/identifier.test.json @@ -0,0 +1,136 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/identifier.json", + "tests": [ + { + "data": "abc123", + "valid": true + }, + { + "data": "request-1", + "valid": true + }, + { + "data": "req_001", + "valid": true + }, + { + "data": "", + "valid": true + }, + { + "data": "a", + "valid": true + }, + { + "data": "very-long-identifier-with-many-characters-0123456789", + "valid": true + }, + { + "data": "UUID-like-f47ac10b-58cc-4372-a567-0e02b2c3d479", + "valid": true + }, + { + "data": "with spaces", + "valid": true + }, + { + "data": "with\nnewline", + "valid": true + }, + { + "data": "with\ttab", + "valid": true + }, + { + "data": "unicode-café", + "valid": true + }, + { + "data": "emoji-🎉", + "valid": true + }, + { + "data": 0, + "valid": true + }, + { + "data": 1, + "valid": true + }, + { + "data": -1, + "valid": true + }, + { + "data": 42, + "valid": true + }, + { + "data": -42, + "valid": true + }, + { + "data": 999999, + "valid": true + }, + { + "data": -999999, + "valid": true + }, + { + "data": 2147483647, + "valid": true + }, + { + "data": -2147483648, + "valid": true + }, + { + "data": null, + "valid": true + }, + { + "data": 1.5, + "valid": false + }, + { + "data": 3.14, + "valid": false + }, + { + "data": 0.1, + "valid": false + }, + { + "data": -0.5, + "valid": false + }, + { + "data": true, + "valid": false + }, + { + "data": false, + "valid": false + }, + { + "data": [], + "valid": false + }, + { + "data": [ 1 ], + "valid": false + }, + { + "data": {}, + "valid": false + }, + { + "data": { + "id": 1 + }, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/method-internal.test.json b/tests/jsonrpc/v2.0/method-internal.test.json new file mode 100644 index 00000000..47a26574 --- /dev/null +++ b/tests/jsonrpc/v2.0/method-internal.test.json @@ -0,0 +1,114 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/method-internal.json", + "tests": [ + { + "data": "rpc.", + "valid": true + }, + { + "data": "rpc.discover", + "valid": true + }, + { + "data": "rpc.introspect", + "valid": true + }, + { + "data": "rpc.system", + "valid": true + }, + { + "data": "rpc.system.info", + "valid": true + }, + { + "data": "rpc.system.listMethods", + "valid": true + }, + { + "data": "rpc.server.version", + "valid": true + }, + { + "data": "rpc.a", + "valid": true + }, + { + "data": "rpc.with-dash", + "valid": true + }, + { + "data": "rpc.with_underscore", + "valid": true + }, + { + "data": "rpc.123", + "valid": true + }, + { + "data": "rpc.deeply.nested.method.name", + "valid": true + }, + { + "data": "rpc", + "valid": false + }, + { + "data": "Rpc.", + "valid": false + }, + { + "data": "RPC.", + "valid": false + }, + { + "data": "rPc.", + "valid": false + }, + { + "data": "method", + "valid": false + }, + { + "data": "subtract", + "valid": false + }, + { + "data": "update", + "valid": false + }, + { + "data": ".rpc", + "valid": false + }, + { + "data": "prefix.rpc.", + "valid": false + }, + { + "data": "", + "valid": false + }, + { + "data": 42, + "valid": false + }, + { + "data": null, + "valid": false + }, + { + "data": true, + "valid": false + }, + { + "data": [], + "valid": false + }, + { + "data": {}, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/method.test.json b/tests/jsonrpc/v2.0/method.test.json new file mode 100644 index 00000000..7491289b --- /dev/null +++ b/tests/jsonrpc/v2.0/method.test.json @@ -0,0 +1,132 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/method.json", + "tests": [ + { + "data": "subtract", + "valid": true + }, + { + "data": "update", + "valid": true + }, + { + "data": "notify_hello", + "valid": true + }, + { + "data": "sum", + "valid": true + }, + { + "data": "get_data", + "valid": true + }, + { + "data": "foobar", + "valid": true + }, + { + "data": "method-with-dashes", + "valid": true + }, + { + "data": "method.with.dots", + "valid": true + }, + { + "data": "MethodWithCamelCase", + "valid": true + }, + { + "data": "method123", + "valid": true + }, + { + "data": "123method", + "valid": true + }, + { + "data": "a", + "valid": true + }, + { + "data": "", + "valid": true + }, + { + "data": "rpc.discover", + "valid": true + }, + { + "data": "rpc.introspect", + "valid": true + }, + { + "data": "rpc.system.info", + "valid": true + }, + { + "data": "rpc.", + "valid": true + }, + { + "data": "unicode-café", + "valid": true + }, + { + "data": "emoji-🎉", + "valid": true + }, + { + "data": "with spaces", + "valid": true + }, + { + "data": "with\ttab", + "valid": true + }, + { + "data": "with\nnewline", + "valid": true + }, + { + "data": 42, + "valid": false + }, + { + "data": 0, + "valid": false + }, + { + "data": null, + "valid": false + }, + { + "data": true, + "valid": false + }, + { + "data": false, + "valid": false + }, + { + "data": [], + "valid": false + }, + { + "data": [ "method" ], + "valid": false + }, + { + "data": {}, + "valid": false + }, + { + "data": { + "method": "test" + }, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/notification.test.json b/tests/jsonrpc/v2.0/notification.test.json new file mode 100644 index 00000000..8f75ca75 --- /dev/null +++ b/tests/jsonrpc/v2.0/notification.test.json @@ -0,0 +1,264 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/notification.json", + "tests": [ + { + "data": { + "jsonrpc": "2.0", + "method": "update" + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify_hello" + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify" + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "log" + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify_hello", + "params": [ 7 ] + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify_sum", + "params": { + "a": 1, + "b": 2 + } + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "update", + "params": [] + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify", + "params": {} + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "event", + "params": [ 1, 2, 3, 4, 5 ] + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify", + "params": { + "x": 10, + "y": 20 + } + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "rpc.notify" + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "rpc.system.event", + "params": { + "type": "shutdown" + } + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify_with_complex_params", + "params": { + "nested": { + "data": [ 1, 2, 3 ] + } + } + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": "update" + }, + "valid": false + }, + { + "data": { + "id": "req-1", + "jsonrpc": "2.0", + "method": "notify" + }, + "valid": false + }, + { + "data": { + "id": null, + "jsonrpc": "2.0", + "method": "event" + }, + "valid": false + }, + { + "data": { + "id": 0, + "jsonrpc": "2.0", + "method": "notify" + }, + "valid": false + }, + { + "data": { + "method": "update" + }, + "valid": false + }, + { + "data": { + "jsonrpc": "2.0" + }, + "valid": false + }, + { + "data": {}, + "valid": false + }, + { + "data": { + "jsonrpc": "1.0", + "method": "update" + }, + "valid": false + }, + { + "data": { + "jsonrpc": "3.0", + "method": "update" + }, + "valid": false + }, + { + "data": { + "jsonrpc": 2.0, + "method": "update" + }, + "valid": false + }, + { + "data": { + "jsonrpc": "2.0", + "method": 123 + }, + "valid": false + }, + { + "data": { + "jsonrpc": "2.0", + "method": null + }, + "valid": false + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify", + "params": "invalid" + }, + "valid": false + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify", + "params": 42 + }, + "valid": false + }, + { + "data": { + "jsonrpc": "2.0", + "method": "notify", + "params": null + }, + "valid": false + }, + { + "data": { + "custom": "extension", + "jsonrpc": "2.0", + "method": "update" + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "log", + "params": [ "message" ], + "priority": "low", + "timestamp": 1234567890 + }, + "valid": true + }, + { + "data": { + "x-metadata": { + "source": "system" + }, + "jsonrpc": "2.0", + "method": "notify_event" + }, + "valid": true + }, + { + "data": [], + "valid": false + }, + { + "data": "notification", + "valid": false + }, + { + "data": null, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/parameters.test.json b/tests/jsonrpc/v2.0/parameters.test.json new file mode 100644 index 00000000..6dc497ea --- /dev/null +++ b/tests/jsonrpc/v2.0/parameters.test.json @@ -0,0 +1,145 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/parameters.json", + "tests": [ + { + "data": [], + "valid": true + }, + { + "data": [ 1 ], + "valid": true + }, + { + "data": [ 1, 2, 3 ], + "valid": true + }, + { + "data": [ "foo" ], + "valid": true + }, + { + "data": [ "foo", "bar" ], + "valid": true + }, + { + "data": [ null ], + "valid": true + }, + { + "data": [ true, false ], + "valid": true + }, + { + "data": [ 42, "test", null, true ], + "valid": true + }, + { + "data": [ + [ 1, 2 ], + [ 3, 4 ] + ], + "valid": true + }, + { + "data": [ + { + "nested": "object" + } + ], + "valid": true + }, + { + "data": {}, + "valid": true + }, + { + "data": { + "name": "John" + }, + "valid": true + }, + { + "data": { + "age": 30, + "name": "John" + }, + "valid": true + }, + { + "data": { + "a": 1, + "b": 2, + "c": 3 + }, + "valid": true + }, + { + "data": { + "value": null + }, + "valid": true + }, + { + "data": { + "flag": true + }, + "valid": true + }, + { + "data": { + "nested": { + "deep": { + "value": 42 + } + } + }, + "valid": true + }, + { + "data": { + "array": [ 1, 2, 3 ] + }, + "valid": true + }, + { + "data": { + "minuend": 42, + "subtrahend": 23 + }, + "valid": true + }, + { + "data": { + "x": 10, + "label": "point", + "y": 20 + }, + "valid": true + }, + { + "data": "string", + "valid": false + }, + { + "data": 42, + "valid": false + }, + { + "data": 0, + "valid": false + }, + { + "data": true, + "valid": false + }, + { + "data": false, + "valid": false + }, + { + "data": null, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/request.test.json b/tests/jsonrpc/v2.0/request.test.json new file mode 100644 index 00000000..5481e308 --- /dev/null +++ b/tests/jsonrpc/v2.0/request.test.json @@ -0,0 +1,330 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/request.json", + "tests": [ + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": "subtract" + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": "subtract", + "params": [ 42, 23 ] + }, + "valid": true + }, + { + "data": { + "id": 3, + "jsonrpc": "2.0", + "method": "subtract", + "params": { + "minuend": 42, + "subtrahend": 23 + } + }, + "valid": true + }, + { + "data": { + "id": "req-001", + "jsonrpc": "2.0", + "method": "update", + "params": [ 1, 2, 3, 4, 5 ] + }, + "valid": true + }, + { + "data": { + "id": "1", + "jsonrpc": "2.0", + "method": "sum", + "params": [ 1, 2, 4 ] + }, + "valid": true + }, + { + "data": { + "id": 0, + "jsonrpc": "2.0", + "method": "get_data" + }, + "valid": true + }, + { + "data": { + "id": -1, + "jsonrpc": "2.0", + "method": "fetch" + }, + "valid": true + }, + { + "data": { + "id": 999999, + "jsonrpc": "2.0", + "method": "query" + }, + "valid": true + }, + { + "data": { + "id": "", + "jsonrpc": "2.0", + "method": "test" + }, + "valid": true + }, + { + "data": { + "id": "uuid-f47ac10b-58cc-4372-a567-0e02b2c3d479", + "jsonrpc": "2.0", + "method": "execute" + }, + "valid": true + }, + { + "data": { + "id": null, + "jsonrpc": "2.0", + "method": "process" + }, + "valid": true + }, + { + "data": { + "id": 42, + "jsonrpc": "2.0", + "method": "run", + "params": [] + }, + "valid": true + }, + { + "data": { + "id": "test", + "jsonrpc": "2.0", + "method": "execute", + "params": {} + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": "rpc.discover" + }, + "valid": true + }, + { + "data": { + "id": "sys-1", + "jsonrpc": "2.0", + "method": "rpc.system.info", + "params": { + "verbose": true + } + }, + "valid": true + }, + { + "data": { + "id": 100, + "jsonrpc": "2.0", + "method": "calculate", + "params": { + "x": 10, + "op": "add", + "y": 20 + } + }, + "valid": true + }, + { + "data": { + "id": "batch-1", + "jsonrpc": "2.0", + "method": "batch_process", + "params": [ + [ 1, 2 ], + [ 3, 4 ] + ] + }, + "valid": true + }, + { + "data": { + "jsonrpc": "2.0", + "method": "subtract" + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0" + }, + "valid": false + }, + { + "data": { + "id": 1, + "method": "subtract" + }, + "valid": false + }, + { + "data": {}, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "1.0", + "method": "subtract" + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "3.0", + "method": "subtract" + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": 2.0, + "method": "subtract" + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": 123 + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": null + }, + "valid": false + }, + { + "data": { + "id": true, + "jsonrpc": "2.0", + "method": "test" + }, + "valid": false + }, + { + "data": { + "id": [], + "jsonrpc": "2.0", + "method": "test" + }, + "valid": false + }, + { + "data": { + "id": {}, + "jsonrpc": "2.0", + "method": "test" + }, + "valid": false + }, + { + "data": { + "id": 1.5, + "jsonrpc": "2.0", + "method": "test" + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": "test", + "params": "invalid" + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": "test", + "params": 42 + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "method": "test", + "params": null + }, + "valid": false + }, + { + "data": { + "id": 1, + "custom": "extension", + "jsonrpc": "2.0", + "method": "test" + }, + "valid": true + }, + { + "data": { + "id": "req-1", + "jsonrpc": "2.0", + "method": "process", + "params": [ 1, 2, 3 ], + "priority": "high", + "timeout": 5000 + }, + "valid": true + }, + { + "data": { + "id": 42, + "x-custom-header": { + "trace-id": "abc123" + }, + "jsonrpc": "2.0", + "method": "query" + }, + "valid": true + }, + { + "data": [], + "valid": false + }, + { + "data": "request", + "valid": false + }, + { + "data": null, + "valid": false + } + ] +} diff --git a/tests/jsonrpc/v2.0/response.test.json b/tests/jsonrpc/v2.0/response.test.json new file mode 100644 index 00000000..ae2bfe42 --- /dev/null +++ b/tests/jsonrpc/v2.0/response.test.json @@ -0,0 +1,357 @@ +{ + "x-license": "https://github.com/sourcemeta/std/blob/main/LICENSE", + "target": "../../../schemas/jsonrpc/v2.0/response.json", + "tests": [ + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "result": 19 + }, + "valid": true + }, + { + "data": { + "id": 2, + "jsonrpc": "2.0", + "result": 0 + }, + "valid": true + }, + { + "data": { + "id": 3, + "jsonrpc": "2.0", + "result": -1 + }, + "valid": true + }, + { + "data": { + "id": "req-1", + "jsonrpc": "2.0", + "result": "success" + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "result": "" + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "result": null + }, + "valid": true + }, + { + "data": { + "id": 2, + "jsonrpc": "2.0", + "result": true + }, + "valid": true + }, + { + "data": { + "id": 3, + "jsonrpc": "2.0", + "result": false + }, + "valid": true + }, + { + "data": { + "id": "req-002", + "jsonrpc": "2.0", + "result": [ 7, 8, 9 ] + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "result": [] + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0", + "result": { + "status": "ok" + } + }, + "valid": true + }, + { + "data": { + "id": 2, + "jsonrpc": "2.0", + "result": {} + }, + "valid": true + }, + { + "data": { + "id": "test", + "jsonrpc": "2.0", + "result": { + "data": { + "nested": "value" + } + } + }, + "valid": true + }, + { + "data": { + "id": 3, + "error": { + "code": -32601, + "message": "Method not found" + }, + "jsonrpc": "2.0" + }, + "valid": true + }, + { + "data": { + "id": null, + "error": { + "code": -32600, + "message": "Invalid Request" + }, + "jsonrpc": "2.0" + }, + "valid": true + }, + { + "data": { + "id": "req-1", + "error": { + "code": -32700, + "message": "Parse error" + }, + "jsonrpc": "2.0" + }, + "valid": true + }, + { + "data": { + "id": 1, + "error": { + "code": -32000, + "data": { + "details": "failed" + }, + "message": "Server error" + }, + "jsonrpc": "2.0" + }, + "valid": true + }, + { + "data": { + "id": 42, + "error": { + "code": 100, + "message": "Application error" + }, + "jsonrpc": "2.0" + }, + "valid": true + }, + { + "data": { + "id": 0, + "jsonrpc": "2.0", + "result": 42 + }, + "valid": true + }, + { + "data": { + "id": -1, + "jsonrpc": "2.0", + "result": [ 1, 2, 3, 4, 5 ] + }, + "valid": true + }, + { + "data": { + "id": 1, + "jsonrpc": "2.0" + }, + "valid": false + }, + { + "data": { + "id": 1, + "error": { + "code": -32600, + "message": "Error" + }, + "jsonrpc": "2.0", + "result": 19 + }, + "valid": false + }, + { + "data": { + "jsonrpc": "2.0", + "result": 19 + }, + "valid": false + }, + { + "data": { + "error": { + "code": -32600, + "message": "Error" + }, + "jsonrpc": "2.0" + }, + "valid": false + }, + { + "data": { + "id": 1, + "result": 19 + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": "1.0", + "result": 19 + }, + "valid": false + }, + { + "data": { + "id": 1, + "jsonrpc": 2.0, + "result": 19 + }, + "valid": false + }, + { + "data": { + "id": true, + "jsonrpc": "2.0", + "result": 19 + }, + "valid": false + }, + { + "data": { + "id": [], + "jsonrpc": "2.0", + "result": 19 + }, + "valid": false + }, + { + "data": { + "id": {}, + "jsonrpc": "2.0", + "result": 19 + }, + "valid": false + }, + { + "data": { + "id": 1.5, + "jsonrpc": "2.0", + "result": 19 + }, + "valid": false + }, + { + "data": { + "id": 1, + "error": "not an object", + "jsonrpc": "2.0" + }, + "valid": false + }, + { + "data": { + "id": 1, + "error": { + "code": "invalid" + }, + "jsonrpc": "2.0" + }, + "valid": false + }, + { + "data": { + "id": 1, + "error": { + "message": "Missing code" + }, + "jsonrpc": "2.0" + }, + "valid": false + }, + { + "data": { + "id": 1, + "custom": "extension", + "jsonrpc": "2.0", + "result": 42 + }, + "valid": true + }, + { + "data": { + "id": "req-1", + "jsonrpc": "2.0", + "result": "success", + "timing": { + "duration": 150 + } + }, + "valid": true + }, + { + "data": { + "id": 2, + "x-request-id": "abc123", + "error": { + "code": -32600, + "message": "Error" + }, + "jsonrpc": "2.0" + }, + "valid": true + }, + { + "data": {}, + "valid": false + }, + { + "data": [], + "valid": false + }, + { + "data": "response", + "valid": false + }, + { + "data": null, + "valid": false + } + ] +}