import { strict as assert } from 'assert'; import { obj as createThoughStream } from 'through2'; import metaRPCClientFactory from './metaRPCClientFactory'; describe('metaRPCClientFactory', function () { it('should be able to make an rpc request with the method', function (done) { const streamTest = createThoughStream((chunk) => { assert.strictEqual(chunk.method, 'foo'); done(); }); const metaRPCClient = metaRPCClientFactory(streamTest); metaRPCClient.foo(); }); it('should be able to make an rpc request/response with the method and params and node-style callback', function (done) { const streamTest = createThoughStream(); const metaRPCClient = metaRPCClientFactory(streamTest); // make a "foo" method call metaRPCClient.foo('bar', (_, result) => { assert.strictEqual(result, 'foobarbaz'); done(); }); // fake a response metaRPCClient.requests.forEach((_, key) => { streamTest.write({ jsonrpc: '2.0', id: key, result: 'foobarbaz', }); }); }); it('should be able to make an rpc request/error with the method and params and node-style callback', function (done) { const streamTest = createThoughStream(); const metaRPCClient = metaRPCClientFactory(streamTest); // make a "foo" method call metaRPCClient.foo('bar', (err) => { assert.strictEqual(err.message, 'foo-message'); assert.strictEqual(err.code, 1); done(); }); metaRPCClient.requests.forEach((_, key) => { streamTest.write({ jsonrpc: '2.0', id: key, error: { code: 1, message: 'foo-message', }, }); }); }); it('should be able to make an rpc request/response with the method and params and node-style callback with multiple instances of metaRPCClientFactory and the same connectionStream', function (done) { const streamTest = createThoughStream(); const metaRPCClient = metaRPCClientFactory(streamTest); const metaRPCClient2 = metaRPCClientFactory(streamTest); // make a "foo" method call, followed by "baz" call on metaRPCClient2 metaRPCClient.foo('bar', (_, result) => { assert.strictEqual(result, 'foobarbaz'); metaRPCClient2.baz('bar', (err) => { assert.strictEqual(err, null); done(); }); }); // fake a response metaRPCClient.requests.forEach((_, key) => { streamTest.write({ jsonrpc: '2.0', id: key, result: 'foobarbaz', }); }); // fake client2's response metaRPCClient2.requests.forEach((_, key) => { streamTest.write({ jsonrpc: '2.0', id: key, result: 'foobarbaz', }); }); }); it('should be able to handle notifications', function (done) { const streamTest = createThoughStream(); const metaRPCClient = metaRPCClientFactory(streamTest); metaRPCClient.onNotification((notification) => { assert(notification.method, 'foobarbaz'); done(); }); // send a notification streamTest.write({ jsonrpc: '2.0', method: 'foobarbaz', params: ['bar'], }); }); it('should be able to handle errors with no id', function (done) { const streamTest = createThoughStream(); const metaRPCClient = metaRPCClientFactory(streamTest); metaRPCClient.onUncaughtError((error) => { assert(error.code, 1); done(); }); streamTest.write({ jsonrpc: '2.0', error: { code: 1, message: 'error msg', }, }); }); it('should be able to handle errors with null id', function (done) { const streamTest = createThoughStream(); const metaRPCClient = metaRPCClientFactory(streamTest); metaRPCClient.onUncaughtError((error) => { assert(error.code, 1); done(); }); streamTest.write({ jsonrpc: '2.0', id: null, error: { code: 1, message: 'error msg', }, }); }); });