| 1 | module jsonrpc |
| 2 | |
| 3 | import json |
| 4 | |
| 5 | fn test_try_decode_encode() { |
| 6 | obj_data := { |
| 7 | 'key': 'value' |
| 8 | } |
| 9 | mut enc_data := try_encode[map[string]string](obj_data) |
| 10 | assert enc_data == json.encode(obj_data) |
| 11 | assert try_decode[map[string]string](enc_data)! == obj_data |
| 12 | |
| 13 | str_data := 'string' |
| 14 | enc_data = try_encode[string](str_data) |
| 15 | assert enc_data == '"${str_data}"' |
| 16 | assert try_decode[string](enc_data)! == str_data |
| 17 | |
| 18 | bool_data := true |
| 19 | enc_data = try_encode[bool](bool_data) |
| 20 | assert enc_data == bool_data.str() |
| 21 | assert try_decode[bool](enc_data)! == bool_data |
| 22 | |
| 23 | int_data := 123 |
| 24 | enc_data = try_encode[int](int_data) |
| 25 | assert enc_data == int_data.str() |
| 26 | assert try_decode[int](enc_data)! == int_data |
| 27 | |
| 28 | null_data := null |
| 29 | enc_data = try_encode[Null](null_data) |
| 30 | assert enc_data == null_data.str() |
| 31 | assert try_decode[Null](enc_data)! == null_data |
| 32 | |
| 33 | empty_data := empty |
| 34 | enc_data = try_encode[Empty](empty) |
| 35 | assert enc_data == empty_data.str() |
| 36 | assert try_decode[Empty](enc_data)! == empty_data |
| 37 | } |
| 38 | |
| 39 | fn test_request_obj_params() { |
| 40 | id := 'obj' |
| 41 | method := 'params.' + id |
| 42 | params := { |
| 43 | 'key': 'value' |
| 44 | } |
| 45 | mut req := new_request(method, params, id) |
| 46 | assert req.jsonrpc == version |
| 47 | assert req.method == method |
| 48 | assert req.params == json.encode(params) |
| 49 | assert req.id == id |
| 50 | |
| 51 | enc_req := req.encode() |
| 52 | assert enc_req == '{"jsonrpc":"${version}","method":"${method}","params":${json.encode(params)},"id":"${id}"}' |
| 53 | |
| 54 | assert req.decode_params[map[string]string]()! == params |
| 55 | |
| 56 | dec_req := decode_request(enc_req)! |
| 57 | assert req.jsonrpc == dec_req.jsonrpc |
| 58 | assert req.method == dec_req.method |
| 59 | assert req.params == dec_req.params |
| 60 | assert req.id == dec_req.id |
| 61 | } |
| 62 | |
| 63 | fn test_request_notification() { |
| 64 | id := '' |
| 65 | method := 'req.notif' |
| 66 | params := 'notif' |
| 67 | mut req := new_request(method, params, id) |
| 68 | assert req.jsonrpc == version |
| 69 | assert req.method == method |
| 70 | assert req.params == '"${params}"' |
| 71 | assert req.id == id |
| 72 | |
| 73 | assert req.encode() == '{"jsonrpc":"${version}","method":"${method}","params":"${params}"}' |
| 74 | assert req.decode_params[string]()! == params |
| 75 | } |
| 76 | |
| 77 | fn test_request_empty_params() { |
| 78 | id := '' |
| 79 | method := 'req.empty' |
| 80 | params := empty |
| 81 | mut req := new_request(method, params, id) |
| 82 | assert req.jsonrpc == version |
| 83 | assert req.method == method |
| 84 | assert req.params == params.str() |
| 85 | assert req.id == id |
| 86 | |
| 87 | assert req.encode() == '{"jsonrpc":"${version}","method":"${method}"}' |
| 88 | assert req.decode_params[Empty]()! == params |
| 89 | } |
| 90 | |
| 91 | fn test_request_batch() { |
| 92 | n_id := '' |
| 93 | n_method := 'req.notif' |
| 94 | n_params := 'notif' |
| 95 | mut notif := new_request(n_method, n_params, n_id) |
| 96 | |
| 97 | r_id := 'obj' |
| 98 | r_method := 'params.obj' |
| 99 | r_params := { |
| 100 | 'key': 'value' |
| 101 | } |
| 102 | mut req := new_request(r_method, r_params, r_id) |
| 103 | |
| 104 | batch := [notif, req] |
| 105 | enc_batch := batch.encode_batch() |
| 106 | assert enc_batch == '[{"jsonrpc":"${version}","method":"${n_method}","params":"${n_params}"},{"jsonrpc":"${version}","method":"${r_method}","params":${json.encode(r_params)},"id":"${r_id}"}]' |
| 107 | |
| 108 | assert decode_batch_request(enc_batch)! == batch |
| 109 | } |
| 110 | |
| 111 | fn test_response_obj_result() { |
| 112 | id := 'obj' |
| 113 | result := { |
| 114 | 'key': 'value' |
| 115 | } |
| 116 | mut resp := new_response(result, ResponseError{}, id) |
| 117 | assert resp.jsonrpc == version |
| 118 | assert resp.result == json.encode(result) |
| 119 | assert resp.error == ResponseError{} |
| 120 | assert resp.id == id |
| 121 | |
| 122 | enc_resp := resp.encode() |
| 123 | assert enc_resp == '{"jsonrpc":"${version}","result":${json.encode(result)},"id":"${id}"}' |
| 124 | |
| 125 | assert resp.decode_result[map[string]string]()! == result |
| 126 | |
| 127 | dec_resp := decode_response(enc_resp)! |
| 128 | assert resp.jsonrpc == dec_resp.jsonrpc |
| 129 | assert resp.result == dec_resp.result |
| 130 | assert resp.error == dec_resp.error |
| 131 | assert resp.id == dec_resp.id |
| 132 | } |
| 133 | |
| 134 | fn test_response_error() { |
| 135 | id := 'error' |
| 136 | result := 'should be null' |
| 137 | err := parse_error |
| 138 | mut resp := new_response(result, err, id) |
| 139 | assert resp.jsonrpc == version |
| 140 | assert resp.result == '' |
| 141 | assert resp.error == parse_error |
| 142 | assert resp.id == id |
| 143 | |
| 144 | enc_resp := resp.encode() |
| 145 | assert enc_resp == '{"jsonrpc":"${version}","error":${json.encode(err)},"id":"${id}"}' |
| 146 | |
| 147 | assert resp.decode_result[Empty]()! == empty |
| 148 | |
| 149 | dec_resp := decode_response(enc_resp)! |
| 150 | assert resp.jsonrpc == dec_resp.jsonrpc |
| 151 | assert resp.result == dec_resp.result |
| 152 | assert resp.error == dec_resp.error |
| 153 | assert resp.id == dec_resp.id |
| 154 | } |
| 155 | |
| 156 | fn test_response_null_id() { |
| 157 | id := '' |
| 158 | result := 'should be null' |
| 159 | err := parse_error |
| 160 | mut resp := new_response(result, err, id) |
| 161 | assert resp.jsonrpc == version |
| 162 | assert resp.result == '' |
| 163 | assert resp.error == parse_error |
| 164 | assert resp.id == id |
| 165 | |
| 166 | enc_resp := resp.encode() |
| 167 | assert enc_resp == '{"jsonrpc":"${version}","error":${json.encode(err)},"id":${null.str()}}' |
| 168 | |
| 169 | assert resp.decode_result[Empty]()! == empty |
| 170 | |
| 171 | dec_resp := decode_response(enc_resp)! |
| 172 | assert resp.jsonrpc == dec_resp.jsonrpc |
| 173 | assert resp.result == dec_resp.result |
| 174 | assert resp.error == dec_resp.error |
| 175 | assert resp.id == dec_resp.id |
| 176 | } |
| 177 | |
| 178 | fn test_response_batch() { |
| 179 | r_id := 'obj' |
| 180 | r_err := ResponseError{} |
| 181 | r_result := { |
| 182 | 'key': 'value' |
| 183 | } |
| 184 | mut r_resp := new_response(r_result, r_err, r_id) |
| 185 | |
| 186 | e_id := '' |
| 187 | e_result := 'should be null' |
| 188 | e_err := parse_error |
| 189 | mut e_resp := new_response(e_result, e_err, e_id) |
| 190 | |
| 191 | batch := [r_resp, e_resp] |
| 192 | enc_batch := batch.encode_batch() |
| 193 | assert enc_batch == '[{"jsonrpc":"${version}","result":${json.encode(r_result)},"id":"${r_id}"},{"jsonrpc":"${version}","error":${json.encode(e_err)},"id":${null.str()}}]' |
| 194 | |
| 195 | assert decode_batch_response(enc_batch)! == batch |
| 196 | } |
| 197 | |