197 lines
5.2 KiB
V
197 lines
5.2 KiB
V
module jsonrpc
|
|
|
|
import json
|
|
|
|
fn test_try_decode_encode() {
|
|
obj_data := {
|
|
'key': 'value'
|
|
}
|
|
mut enc_data := try_encode[map[string]string](obj_data)
|
|
assert enc_data == json.encode(obj_data)
|
|
assert try_decode[map[string]string](enc_data)! == obj_data
|
|
|
|
str_data := 'string'
|
|
enc_data = try_encode[string](str_data)
|
|
assert enc_data == '"${str_data}"'
|
|
assert try_decode[string](enc_data)! == str_data
|
|
|
|
bool_data := true
|
|
enc_data = try_encode[bool](bool_data)
|
|
assert enc_data == bool_data.str()
|
|
assert try_decode[bool](enc_data)! == bool_data
|
|
|
|
int_data := 123
|
|
enc_data = try_encode[int](int_data)
|
|
assert enc_data == int_data.str()
|
|
assert try_decode[int](enc_data)! == int_data
|
|
|
|
null_data := null
|
|
enc_data = try_encode[Null](null_data)
|
|
assert enc_data == null_data.str()
|
|
assert try_decode[Null](enc_data)! == null_data
|
|
|
|
empty_data := empty
|
|
enc_data = try_encode[Empty](empty)
|
|
assert enc_data == empty_data.str()
|
|
assert try_decode[Empty](enc_data)! == empty_data
|
|
}
|
|
|
|
fn test_request_obj_params() {
|
|
id := 'obj'
|
|
method := 'params.' + id
|
|
params := {
|
|
'key': 'value'
|
|
}
|
|
mut req := new_request(method, params, id)
|
|
assert req.jsonrpc == version
|
|
assert req.method == method
|
|
assert req.params == json.encode(params)
|
|
assert req.id == id
|
|
|
|
enc_req := req.encode()
|
|
assert enc_req == '{"jsonrpc":"${version}","method":"${method}","params":${json.encode(params)},"id":"${id}"}'
|
|
|
|
assert req.decode_params[map[string]string]()! == params
|
|
|
|
dec_req := decode_request(enc_req)!
|
|
assert req.jsonrpc == dec_req.jsonrpc
|
|
assert req.method == dec_req.method
|
|
assert req.params == dec_req.params
|
|
assert req.id == dec_req.id
|
|
}
|
|
|
|
fn test_request_notification() {
|
|
id := ''
|
|
method := 'req.notif'
|
|
params := 'notif'
|
|
mut req := new_request(method, params, id)
|
|
assert req.jsonrpc == version
|
|
assert req.method == method
|
|
assert req.params == '"${params}"'
|
|
assert req.id == id
|
|
|
|
assert req.encode() == '{"jsonrpc":"${version}","method":"${method}","params":"${params}"}'
|
|
assert req.decode_params[string]()! == params
|
|
}
|
|
|
|
fn test_request_empty_params() {
|
|
id := ''
|
|
method := 'req.empty'
|
|
params := empty
|
|
mut req := new_request(method, params, id)
|
|
assert req.jsonrpc == version
|
|
assert req.method == method
|
|
assert req.params == params.str()
|
|
assert req.id == id
|
|
|
|
assert req.encode() == '{"jsonrpc":"${version}","method":"${method}"}'
|
|
assert req.decode_params[Empty]()! == params
|
|
}
|
|
|
|
fn test_request_batch() {
|
|
n_id := ''
|
|
n_method := 'req.notif'
|
|
n_params := 'notif'
|
|
mut notif := new_request(n_method, n_params, n_id)
|
|
|
|
r_id := 'obj'
|
|
r_method := 'params.obj'
|
|
r_params := {
|
|
'key': 'value'
|
|
}
|
|
mut req := new_request(r_method, r_params, r_id)
|
|
|
|
batch := [notif, req]
|
|
enc_batch := batch.encode_batch()
|
|
assert enc_batch == '[{"jsonrpc":"${version}","method":"${n_method}","params":"${n_params}"},{"jsonrpc":"${version}","method":"${r_method}","params":${json.encode(r_params)},"id":"${r_id}"}]'
|
|
|
|
assert decode_batch_request(enc_batch)! == batch
|
|
}
|
|
|
|
fn test_response_obj_result() {
|
|
id := 'obj'
|
|
result := {
|
|
'key': 'value'
|
|
}
|
|
mut resp := new_response(result, ResponseError{}, id)
|
|
assert resp.jsonrpc == version
|
|
assert resp.result == json.encode(result)
|
|
assert resp.error == ResponseError{}
|
|
assert resp.id == id
|
|
|
|
enc_resp := resp.encode()
|
|
assert enc_resp == '{"jsonrpc":"${version}","result":${json.encode(result)},"id":"${id}"}'
|
|
|
|
assert resp.decode_result[map[string]string]()! == result
|
|
|
|
dec_resp := decode_response(enc_resp)!
|
|
assert resp.jsonrpc == dec_resp.jsonrpc
|
|
assert resp.result == dec_resp.result
|
|
assert resp.error == dec_resp.error
|
|
assert resp.id == dec_resp.id
|
|
}
|
|
|
|
fn test_response_error() {
|
|
id := 'error'
|
|
result := 'should be null'
|
|
err := parse_error
|
|
mut resp := new_response(result, err, id)
|
|
assert resp.jsonrpc == version
|
|
assert resp.result == ''
|
|
assert resp.error == parse_error
|
|
assert resp.id == id
|
|
|
|
enc_resp := resp.encode()
|
|
assert enc_resp == '{"jsonrpc":"${version}","error":${json.encode(err)},"id":"${id}"}'
|
|
|
|
assert resp.decode_result[Empty]()! == empty
|
|
|
|
dec_resp := decode_response(enc_resp)!
|
|
assert resp.jsonrpc == dec_resp.jsonrpc
|
|
assert resp.result == dec_resp.result
|
|
assert resp.error == dec_resp.error
|
|
assert resp.id == dec_resp.id
|
|
}
|
|
|
|
fn test_response_null_id() {
|
|
id := ''
|
|
result := 'should be null'
|
|
err := parse_error
|
|
mut resp := new_response(result, err, id)
|
|
assert resp.jsonrpc == version
|
|
assert resp.result == ''
|
|
assert resp.error == parse_error
|
|
assert resp.id == id
|
|
|
|
enc_resp := resp.encode()
|
|
assert enc_resp == '{"jsonrpc":"${version}","error":${json.encode(err)},"id":${null.str()}}'
|
|
|
|
assert resp.decode_result[Empty]()! == empty
|
|
|
|
dec_resp := decode_response(enc_resp)!
|
|
assert resp.jsonrpc == dec_resp.jsonrpc
|
|
assert resp.result == dec_resp.result
|
|
assert resp.error == dec_resp.error
|
|
assert resp.id == dec_resp.id
|
|
}
|
|
|
|
fn test_response_batch() {
|
|
r_id := 'obj'
|
|
r_err := ResponseError{}
|
|
r_result := {
|
|
'key': 'value'
|
|
}
|
|
mut r_resp := new_response(r_result, r_err, r_id)
|
|
|
|
e_id := ''
|
|
e_result := 'should be null'
|
|
e_err := parse_error
|
|
mut e_resp := new_response(e_result, e_err, e_id)
|
|
|
|
batch := [r_resp, e_resp]
|
|
enc_batch := batch.encode_batch()
|
|
assert enc_batch == '[{"jsonrpc":"${version}","result":${json.encode(r_result)},"id":"${r_id}"},{"jsonrpc":"${version}","error":${json.encode(e_err)},"id":${null.str()}}]'
|
|
|
|
assert decode_batch_response(enc_batch)! == batch
|
|
}
|