Skip to content

Commit

Permalink
feat: added parameter validation for getConnectedNetwork
Browse files Browse the repository at this point in the history
  • Loading branch information
andreabadesso committed Jan 15, 2025
1 parent 6fd7768 commit 157bdc0
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,59 @@
* LICENSE file in the root directory of this source tree.
*/

import { HathorWallet } from "@hathor/wallet-lib";
import { getConnectedNetwork } from "../../src/rpcMethods/getConnectedNetwork";
import { mockGetConnectedNetworkRequest } from "../mocks";
import { HathorWallet } from '@hathor/wallet-lib';
import {
RpcMethods,
GetConnectedNetworkRpcRequest,
RpcResponseTypes,
} from '../../src/types';
import { getConnectedNetwork } from '../../src/rpcMethods/getConnectedNetwork';
import { InvalidParamsError } from '../../src/errors';

export const mockWallet = {
getNetwork: jest.fn().mockReturnValue('mainnet')
} as unknown as HathorWallet;
describe('getConnectedNetwork parameter validation', () => {
const mockWallet = {
getNetwork: jest.fn().mockReturnValue('testnet'),
} as unknown as HathorWallet;

describe('getConnectedNetwork', () => {
afterEach(() => {
const mockTriggerHandler = jest.fn();

beforeEach(() => {
jest.clearAllMocks();
});

it('should return network information', async () => {
const result = await getConnectedNetwork(
mockGetConnectedNetworkRequest,
mockWallet,
{},
jest.fn(),
);
it('should reject when method is missing', async () => {
const invalidRequest = {
// method is missing
} as GetConnectedNetworkRpcRequest;

expect(mockWallet.getNetwork).toHaveBeenCalled();
expect(result.response).toStrictEqual({
network: 'mainnet',
genesisHash: '', // TODO: Update when logic to retrieve genesisHash is implemented
await expect(
getConnectedNetwork(invalidRequest, mockWallet, {}, mockTriggerHandler)
).rejects.toThrow(InvalidParamsError);
});

it('should reject when method is invalid', async () => {
const invalidRequest = {
method: 'invalid_method',
} as unknown as GetConnectedNetworkRpcRequest;

await expect(
getConnectedNetwork(invalidRequest, mockWallet, {}, mockTriggerHandler)
).rejects.toThrow(InvalidParamsError);
});

it('should accept valid request', async () => {
const validRequest = {
method: RpcMethods.GetConnectedNetwork,
} as GetConnectedNetworkRpcRequest;

const result = await getConnectedNetwork(validRequest, mockWallet, {}, mockTriggerHandler);

expect(result).toBeDefined();
expect(result.type).toBe(RpcResponseTypes.GetConnectedNetworkResponse);
expect(result.response).toEqual({
network: 'testnet',
genesisHash: '',
});
expect(mockWallet.getNetwork).toHaveBeenCalled();
});
});
42 changes: 31 additions & 11 deletions packages/hathor-rpc-handler/src/rpcMethods/getConnectedNetwork.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,59 @@
* LICENSE file in the root directory of this source tree.
*/

import { z } from 'zod';
import type { HathorWallet } from '@hathor/wallet-lib';
import {
GetConnectedNetworkRpcRequest,
RequestMetadata,
RpcResponse,
RpcResponseTypes,
TriggerHandler,
RpcMethods,
} from '../types';
import { InvalidParamsError } from '../errors';

const getConnectedNetworkSchema = z.object({
method: z.literal(RpcMethods.GetConnectedNetwork),
});

/**
* Handles the 'get_connected_network' RPC request by retrieving the network information
* from the wallet and returning the network name and genesis hash.
*
* @param _rpcRequest - (unused) The RPC request object containing the method and parameters.
* @param rpcRequest - The RPC request object containing the method.
* @param wallet - The Hathor wallet instance used to get the network information.
* @param _requestMetadata - (unused) Metadata related to the dApp that sent the RPC
* @param _promptHandler - (unused) The function to handle prompts for user confirmation.
*
* @returns An object containing the network name and genesis hash.
*
* @throws {InvalidParamsError} - If the request parameters are invalid.
*/
export async function getConnectedNetwork(
_rpcRequest: GetConnectedNetworkRpcRequest,
rpcRequest: GetConnectedNetworkRpcRequest,
wallet: HathorWallet,
_requestMetadata: RequestMetadata,
_promptHandler: TriggerHandler,
) {
const network: string = wallet.getNetwork();
try {
getConnectedNetworkSchema.parse(rpcRequest);

const network: string = wallet.getNetwork();

const result = {
network,
genesisHash: '', // TODO
};
const result = {
network,
genesisHash: '', // TODO
};

return {
type: RpcResponseTypes.GetConnectedNetworkResponse,
response: result,
} as RpcResponse;
return {
type: RpcResponseTypes.GetConnectedNetworkResponse,
response: result,
} as RpcResponse;
} catch (err) {
if (err instanceof z.ZodError) {
throw new InvalidParamsError(err.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', '));
}
throw err;
}
}

0 comments on commit 157bdc0

Please sign in to comment.