nim-ethers/testmodule/providers/jsonrpc/testJsonRpcSubscriptions.nim
2025-09-10 11:38:59 +02:00

67 lines
2.1 KiB
Nim

import std/os
import pkg/asynctest/chronos/unittest
import pkg/serde
import pkg/json_rpc/rpcclient
import pkg/json_rpc/rpcserver
import ethers/providers/jsonrpc
let providerUrl = getEnv("ETHERS_TEST_PROVIDER", "localhost:8545")
for url in ["ws://" & providerUrl, "http://" & providerUrl]:
suite "JSON-RPC Subscriptions (" & url & ")":
var provider: JsonRpcProvider
setup:
provider = await JsonRpcProvider.connect(url, pollingInterval = 100.millis)
teardown:
await provider.close()
test "subscribes to new blocks":
var latestBlock: Block
proc callback(blck: ?!Block) =
latestBlock = blck.value
let subscription = await provider.subscribe(callback)
discard await provider.send("evm_mine")
check eventually latestBlock.number.isSome
check latestBlock.hash.isSome
check latestBlock.timestamp > 0.u256
await subscription.unsubscribe()
test "stops listening to new blocks when unsubscribed":
var count = 0
proc callback(blck: ?!Block) =
if blck.isOk:
inc count
let subscription = await provider.subscribe(callback)
discard await provider.send("evm_mine")
check eventually count > 0
await subscription.unsubscribe()
count = 0
discard await provider.send("evm_mine")
await sleepAsync(200.millis)
check count == 0
test "duplicate unsubscribe is harmless":
proc callback(blck: ?!Block) = discard
let subscription = await provider.subscribe(callback)
await subscription.unsubscribe()
await subscription.unsubscribe()
test "stops listening to new blocks when provider is closed":
var count = 0
proc callback(blck: ?!Block) =
if blck.isOk:
inc count
discard await provider.subscribe(callback)
discard await provider.send("evm_mine")
check eventually count > 0
await provider.close()
count = 0
provider = await JsonRpcProvider.connect(url, pollingInterval = 100.millis)
discard await provider.send("evm_mine")
await sleepAsync(200.millis)
check count == 0