UNPKG

@lukasrosario/account

Version:

Base Account SDK

130 lines (111 loc) 4.7 kB
import { vi } from 'vitest'; import { standardErrors } from ':core/error/errors.js'; import { checkErrorForInvalidRequestArgs, fetchRPCRequest } from './provider.js'; // @ts-expect-error-next-line const invalidArgsError = (args) => standardErrors.rpc.invalidRequest({ message: 'Expected a single, non-array, object argument.', data: args, }); // @ts-expect-error-next-line const invalidMethodError = (args) => standardErrors.rpc.invalidRequest({ message: "'args.method' must be a non-empty string.", data: args, }); // @ts-expect-error-next-line const invalidParamsError = (args) => standardErrors.rpc.invalidRequest({ message: "'args.params' must be an object or array if provided.", data: args, }); describe('Utils', () => { describe('fetchRPCRequest', () => { function mockFetchResponse(response: unknown) { global.fetch = vi.fn().mockResolvedValue({ json: vi.fn().mockResolvedValue(response), }); } it('should throw if the response has an error', async () => { mockFetchResponse({ id: 1, result: null, error: new Error('rpc fetch error'), }); await expect( fetchRPCRequest({ method: 'foo', params: [] }, 'https://example.com') ).rejects.toThrow('rpc fetch error'); }); it('should return the result if the response is successful', async () => { mockFetchResponse({ id: 1, result: 'some result value', error: null, }); await expect( fetchRPCRequest({ method: 'foo', params: [] }, 'https://example.com') ).resolves.toBe('some result value'); }); }); describe('getErrorForInvalidRequestArgs', () => { it('should throw if args is not an object', () => { const args = 'not an object'; expect(() => checkErrorForInvalidRequestArgs(args)).toThrow(invalidArgsError(args)); }); it('should throw if args is an array', () => { const args = ['an array']; expect(() => checkErrorForInvalidRequestArgs(args)).toThrow(invalidArgsError(args)); }); it('should throw if args.method is not a string', () => { const args = { method: 123 }; expect(() => checkErrorForInvalidRequestArgs(args)).toThrow(invalidMethodError(args)); const args2 = { method: { method: 'string' } }; expect(() => checkErrorForInvalidRequestArgs(args2)).toThrow(invalidMethodError(args2)); }); it('should throw if args.method is an empty string', () => { const args = { method: '' }; expect(() => checkErrorForInvalidRequestArgs(args)).toThrow(invalidMethodError(args)); }); it('should throw if args.params is not an array or object', () => { const args = { method: 'foo', params: 'not an array or object' }; expect(() => checkErrorForInvalidRequestArgs(args)).toThrow(invalidParamsError(args)); const args2 = { method: 'foo', params: 123 }; expect(() => checkErrorForInvalidRequestArgs(args2)).toThrow(invalidParamsError(args2)); }); it('should throw if args.params is null', () => { const args = { method: 'foo', params: null }; expect(() => checkErrorForInvalidRequestArgs(args)).toThrow(invalidParamsError(args)); }); it('should not throw if args.params is undefined', () => { expect(() => checkErrorForInvalidRequestArgs({ method: 'foo', params: undefined }) ).not.toThrow(); expect(() => checkErrorForInvalidRequestArgs({ method: 'foo' })).not.toThrow(); }); it('should not throw if args.params is an array', () => { expect(() => checkErrorForInvalidRequestArgs({ method: 'foo', params: ['an array'] }) ).not.toThrow(); }); it('should not throw if args.params is an object', () => { expect(() => checkErrorForInvalidRequestArgs({ method: 'foo', params: { foo: 'bar' } }) ).not.toThrow(); }); it('should not throw if args.params is an empty array', () => { expect(() => checkErrorForInvalidRequestArgs({ method: 'foo', params: [] })).not.toThrow(); }); it('should not throw if args.params is an empty object', () => { expect(() => checkErrorForInvalidRequestArgs({ method: 'foo', params: {} })).not.toThrow(); }); it('throws error for requests with unsupported or deprecated method', async () => { const deprecated = ['eth_sign', 'eth_signTypedData_v2']; const unsupported = ['eth_subscribe', 'eth_unsubscribe']; for (const method of [...deprecated, ...unsupported]) { expect(() => checkErrorForInvalidRequestArgs({ method })).toThrow( standardErrors.provider.unsupportedMethod() ); } }); }); });