UNPKG

json-rpc-dual-engine

Version:

JSON-RPC-2.0 client and server protocol-agnostic engine.

50 lines (49 loc) 2.54 kB
import { expect } from 'expect'; import { JsonRpcClient } from './json-rpc-client.js'; import { JsonRpcRequest } from './json-rpc-request.js'; import { describe, beforeEach, it } from 'node:test'; describe(JsonRpcClient.name, () => { let client; beforeEach(() => client = new JsonRpcClient()); it('should build requests correctly', async () => { const request = client.buildRequest('testMethod', ['param1', 'param2'], { id: 99 }); expect(request).toBe('{"jsonrpc":"2.0","id":99,"method":"testMethod","params":["param1","param2"]}'); }); it('should send a request and receive a response', async () => { client.transport = (message) => { const requestObj = JsonRpcRequest.parse(message); expect(requestObj.method).toBe('testMethod'); expect(requestObj.params).toEqual(['param1', 'param2']); queueMicrotask(() => client.accept(JSON.stringify({ jsonrpc: '2.0', id: requestObj.id, result: 'testResult' }))); }; await expect(client.sendRequest('testMethod', ['param1', 'param2'])).resolves.toBe('testResult'); }); it('should handle a notification', async () => { client.transport = (message) => { const requestObj = JsonRpcRequest.parse(message); expect(requestObj.method).toBe('testNotification'); expect(requestObj.params).toEqual(['param1', 'param2']); }; await client.sendNotification('testNotification', ['param1', 'param2']); }); it('should handle a response with an error', async () => { client.transport = (message) => { const requestObj = JsonRpcRequest.parse(message); expect(requestObj.method).toBe('testMethod'); expect(requestObj.params).toBe(undefined); const responseObj = { jsonrpc: '2.0', id: requestObj.id, error: { code: -32603, message: 'Internal error', data: 'Error data' } }; queueMicrotask(() => client.accept(JSON.stringify(responseObj))); }; try { await client.sendRequest('testMethod'); } catch (error) { expect(error).toBeInstanceOf(Error); expect(error.cause).toEqual({ code: -32603, message: 'Internal error', data: 'Error data' }); } }); it('should handle a response with an unexpected id', () => { const responseObj = { jsonrpc: '2.0', id: 'unexpectedId', result: 'testResult' }; expect(() => client.accept(JSON.stringify(responseObj))).toThrowError(); }); });