nim-json-rpc/tests/test_client_hook.nim
2024-01-07 16:12:23 +07:00

77 lines
2.0 KiB
Nim

# json-rpc
# Copyright (c) 2023 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
# at your option.
# This file may not be copied, modified, or distributed except according to
# those terms.
import
unittest2,
../json_rpc/rpcclient,
../json_rpc/rpcserver
createRpcSigsFromNim(RpcClient):
proc get_Banana(id: int): int
proc installHandlers(s: RpcServer) =
s.rpc("get_Banana") do(id: int) -> JsonString:
if id == 99:
return "123".JsonString
elif id == 100:
return "\"stop\"".JsonString
else:
return "\"error\"".JsonString
type
Shadow = ref object
something: int
proc setupClientHook(client: RpcClient): Shadow =
var shadow = Shadow(something: 0)
client.onProcessMessage = proc(client: RpcClient, line: string):
Result[bool, string] {.gcsafe, raises: [].} =
try:
let m = JrpcConv.decode(line, JsonNode)
if m["result"].kind == JString:
if m["result"].str == "stop":
shadow.something = 123
return ok(false)
else:
shadow.something = 77
return err("not stop")
return ok(true)
except CatchableError as exc:
return err(exc.msg)
shadow
suite "test callsigs":
var server = newRpcHttpServer(["127.0.0.1:0"])
server.installHandlers()
var client = newRpcHttpClient()
let shadow = client.setupClientHook()
server.start()
waitFor client.connect("http://" & $server.localAddress()[0])
test "client onProcessMessage hook":
let res = waitFor client.get_Banana(99)
check res == 123
check shadow.something == 0
expect JsonRpcError:
let res2 = waitFor client.get_Banana(123)
check res2 == 0
check shadow.something == 77
expect InvalidResponse:
let res2 = waitFor client.get_Banana(100)
check res2 == 0
check shadow.something == 123
waitFor server.stop()
waitFor server.closeWait()