From 863d193e5339f3ed0eb182ea6101e60cc99dc23e Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 28 Jul 2023 12:33:53 -0500 Subject: [PATCH 1/5] getNetworkClientById --- .../src/NetworkController.ts | 15 +++- .../tests/NetworkController.test.ts | 74 ++++++++----------- 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/packages/network-controller/src/NetworkController.ts b/packages/network-controller/src/NetworkController.ts index 4b9adc0b59d..2f0fe8e8f24 100644 --- a/packages/network-controller/src/NetworkController.ts +++ b/packages/network-controller/src/NetworkController.ts @@ -629,7 +629,7 @@ export class NetworkController extends BaseControllerV2< * * @returns The list of known network clients. */ - getNetworkClientsById(): AutoManagedBuiltInNetworkClientRegistry & + getNetworkClients(): AutoManagedBuiltInNetworkClientRegistry & AutoManagedCustomNetworkClientRegistry { const autoManagedNetworkClientRegistry = this.#ensureAutoManagedNetworkClientRegistryPopulated(); @@ -641,6 +641,19 @@ export class NetworkController extends BaseControllerV2< ); } + /** + * Returns the network client for a given network client id. + * + * @param networkClientId - The network client id for which to retrieve the network client. + * @returns The network client. + */ + getNetworkClientById( + networkClientId: NetworkClientId, + ): AutoManagedNetworkClient { + const networkClients = this.getNetworkClients(); + return networkClients[networkClientId]; + } + /** * Executes a series of steps to apply the changes to the provider config: * diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index 096e804c994..3c0bd90e013 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -1101,7 +1101,7 @@ describe('NetworkController', () => { }); }); - describe('getNetworkClientsById', () => { + describe('getNetworkClients', () => { describe('if neither a provider config nor network configurations are present in state', () => { it('returns the built-in Infura networks by default', async () => { await withController( @@ -1110,8 +1110,8 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClientsById = controller.getNetworkClientsById(); - const simplifiedNetworkClients = Object.entries(networkClientsById) + const networkClients = controller.getNetworkClients(); + const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => [networkClientId, networkClient.configuration] as const, @@ -1198,8 +1198,8 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClientsById = controller.getNetworkClientsById(); - const simplifiedNetworkClients = Object.entries(networkClientsById) + const networkClients = controller.getNetworkClients(); + const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => [networkClientId, networkClient.configuration] as const, @@ -1271,7 +1271,7 @@ describe('NetworkController', () => { }, ], ]); - for (const networkClient of Object.values(networkClientsById)) { + for (const networkClient of Object.values(networkClients)) { expect(networkClient.provider).toHaveProperty('sendAsync'); expect(networkClient.blockTracker).toHaveProperty( 'checkForLatestBlock', @@ -1299,8 +1299,8 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClientsById = controller.getNetworkClientsById(); - const simplifiedNetworkClients = Object.entries(networkClientsById) + const networkClients = controller.getNetworkClients(); + const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => [networkClientId, networkClient.configuration] as const, @@ -1389,10 +1389,8 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClientsById = controller.getNetworkClientsById(); - const simplifiedNetworkClients = Object.entries( - networkClientsById, - ) + const networkClients = controller.getNetworkClients(); + const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => [networkClientId, networkClient.configuration] as const, @@ -1495,10 +1493,8 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClientsById = controller.getNetworkClientsById(); - const simplifiedNetworkClients = Object.entries( - networkClientsById, - ) + const networkClients = controller.getNetworkClients(); + const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => [networkClientId, networkClient.configuration] as const, @@ -1593,10 +1589,8 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClientsById = controller.getNetworkClientsById(); - const simplifiedNetworkClients = Object.entries( - networkClientsById, - ) + const networkClients = controller.getNetworkClients(); + const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => [networkClientId, networkClient.configuration] as const, @@ -1693,10 +1687,8 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClientsById = controller.getNetworkClientsById(); - const simplifiedNetworkClients = Object.entries( - networkClientsById, - ) + const networkClients = controller.getNetworkClients(); + const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => [networkClientId, networkClient.configuration] as const, @@ -4501,9 +4493,9 @@ describe('NetworkController', () => { }, ); - const networkClientsById = controller.getNetworkClientsById(); - expect(Object.keys(networkClientsById)).toHaveLength(6); - expect(networkClientsById).toMatchObject({ + const networkClients = controller.getNetworkClients(); + expect(Object.keys(networkClients)).toHaveLength(6); + expect(networkClients).toMatchObject({ 'AAAA-AAAA-AAAA-AAAA': expect.objectContaining({ configuration: { chainId: toHex(111), @@ -5008,7 +5000,7 @@ describe('NetworkController', () => { }) .mockReturnValue(newCustomNetworkClient); const networkClientToDestroy = Object.values( - controller.getNetworkClientsById(), + controller.getNetworkClients(), ).find(({ configuration }) => { return ( configuration.type === NetworkClientType.Custom && @@ -5031,10 +5023,10 @@ describe('NetworkController', () => { }, ); - const networkClientsById = controller.getNetworkClientsById(); + const networkClients = controller.getNetworkClients(); expect(networkClientToDestroy.destroy).toHaveBeenCalled(); - expect(Object.keys(networkClientsById)).toHaveLength(6); - expect(networkClientsById).not.toMatchObject({ + expect(Object.keys(networkClients)).toHaveLength(6); + expect(networkClients).not.toMatchObject({ [oldRpcUrl]: expect.objectContaining({ configuration: { chainId: toHex(111), @@ -5086,9 +5078,9 @@ describe('NetworkController', () => { }, ); - const networkClientsById = controller.getNetworkClientsById(); - expect(Object.keys(networkClientsById)).toHaveLength(6); - expect(networkClientsById).toMatchObject({ + const networkClients = controller.getNetworkClients(); + expect(Object.keys(networkClients)).toHaveLength(6); + expect(networkClients).toMatchObject({ 'AAAA-AAAA-AAAA-AAAA': expect.objectContaining({ configuration: { chainId: toHex(999), @@ -5129,7 +5121,7 @@ describe('NetworkController', () => { type: NetworkClientType.Custom, }) .mockReturnValue(newCustomNetworkClient); - const networkClientsBefore = controller.getNetworkClientsById(); + const networkClientsBefore = controller.getNetworkClients(); await controller.upsertNetworkConfiguration( { @@ -5143,7 +5135,7 @@ describe('NetworkController', () => { }, ); - const networkClientsAfter = controller.getNetworkClientsById(); + const networkClientsAfter = controller.getNetworkClients(); expect(networkClientsBefore).toStrictEqual(networkClientsAfter); }, ); @@ -5477,7 +5469,7 @@ describe('NetworkController', () => { }) .mockReturnValue(buildFakeClient()); const networkClientToDestroy = Object.values( - controller.getNetworkClientsById(), + controller.getNetworkClients(), ).find(({ configuration }) => { return ( configuration.type === NetworkClientType.Custom && @@ -5491,7 +5483,7 @@ describe('NetworkController', () => { controller.removeNetworkConfiguration('AAAA-AAAA-AAAA-AAAA'); expect(networkClientToDestroy.destroy).toHaveBeenCalled(); - expect(controller.getNetworkClientsById()).not.toMatchObject({ + expect(controller.getNetworkClients()).not.toMatchObject({ 'https://test.network': expect.objectContaining({ configuration: { chainId: toHex(111), @@ -5519,7 +5511,7 @@ describe('NetworkController', () => { it('does not update the network client registry', async () => { await withController(async ({ controller }) => { mockCreateNetworkClientWithDefaultsForBuiltInNetworkClients(); - const networkClientsById = controller.getNetworkClientsById(); + const networkClients = controller.getNetworkClients(); try { controller.removeNetworkConfiguration('NONEXISTENT'); @@ -5527,9 +5519,7 @@ describe('NetworkController', () => { // ignore error (it is tested elsewhere) } - expect(controller.getNetworkClientsById()).toStrictEqual( - networkClientsById, - ); + expect(controller.getNetworkClients()).toStrictEqual(networkClients); }); }); }); From f17185c8ac8658643fab8c0fad212d9b98623d29 Mon Sep 17 00:00:00 2001 From: Alex Donesky Date: Fri, 28 Jul 2023 13:57:08 -0500 Subject: [PATCH 2/5] Update packages/network-controller/src/NetworkController.ts Co-authored-by: Elliot Winkler --- .../src/NetworkController.ts | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/packages/network-controller/src/NetworkController.ts b/packages/network-controller/src/NetworkController.ts index 2f0fe8e8f24..fd7392fa49e 100644 --- a/packages/network-controller/src/NetworkController.ts +++ b/packages/network-controller/src/NetworkController.ts @@ -642,16 +642,56 @@ export class NetworkController extends BaseControllerV2< } /** - * Returns the network client for a given network client id. + * Returns the Infura network client with the given ID. * - * @param networkClientId - The network client id for which to retrieve the network client. - * @returns The network client. + * @param infuraNetworkClientId - An Infura network client ID. + * @returns The Infura network client. + * @throws If an Infura network client does not exist with the given ID. */ + getNetworkClientById( + infuraNetworkClientId: BuiltInNetworkClientId, + ): AutoManagedNetworkClient; + + /** + * Returns the custom network client with the given ID. + * + * @param customNetworkClientId - A custom network client ID. + * @returns The custom network client. + * @throws If a custom network client does not exist with the given ID. + */ + getNetworkClientById( + customNetworkClientId: CustomNetworkClientId, + ): AutoManagedNetworkClient; + getNetworkClientById( networkClientId: NetworkClientId, ): AutoManagedNetworkClient { - const networkClients = this.getNetworkClients(); - return networkClients[networkClientId]; + const autoManagedNetworkClientRegistry = + this.#ensureAutoManagedNetworkClientRegistryPopulated(); + + if (isInfuraProviderType(networkClientId)) { + const infuraNetworkClient = + autoManagedNetworkClientRegistry[NetworkClientType.Infura][ + networkClientId + ]; + if (!infuraNetworkClient) { + throw new Error( + `No Infura network client was found with the ID "${networkClientId}".`, + ); + } + return infuraNetworkClient; + } + + const customNetworkClient = + autoManagedNetworkClientRegistry[NetworkClientType.Custom][ + networkClientId + ]; + if (!customNetworkClient) { + throw new Error( + `No custom network client was found with the ID "${networkClientId}".`, + ); + } + return customNetworkClient; } /** From c7be0e779acf5efb32ae102e8651e33d8a0febfc Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 28 Jul 2023 14:02:49 -0500 Subject: [PATCH 3/5] rename getNetworkClients to getNetworkClientRegistry --- .../src/NetworkController.ts | 4 +-- .../tests/NetworkController.test.ts | 36 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/network-controller/src/NetworkController.ts b/packages/network-controller/src/NetworkController.ts index fd7392fa49e..495483bea78 100644 --- a/packages/network-controller/src/NetworkController.ts +++ b/packages/network-controller/src/NetworkController.ts @@ -629,7 +629,7 @@ export class NetworkController extends BaseControllerV2< * * @returns The list of known network clients. */ - getNetworkClients(): AutoManagedBuiltInNetworkClientRegistry & + getNetworkClientRegistry(): AutoManagedBuiltInNetworkClientRegistry & AutoManagedCustomNetworkClientRegistry { const autoManagedNetworkClientRegistry = this.#ensureAutoManagedNetworkClientRegistryPopulated(); @@ -1230,7 +1230,7 @@ export class NetworkController extends BaseControllerV2< /** * Before accessing or switching the network, the registry of network clients * needs to be populated. Otherwise, `#applyNetworkSelection` and - * `getNetworkClients` will throw an error. This method checks to see if the + * `getNetworkClientRegistry` will throw an error. This method checks to see if the * population step has happened yet, and if not, makes it happen. * * @returns The populated network client registry. diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index 3c0bd90e013..223d89fb022 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -1101,7 +1101,7 @@ describe('NetworkController', () => { }); }); - describe('getNetworkClients', () => { + describe('getNetworkClientRegistry', () => { describe('if neither a provider config nor network configurations are present in state', () => { it('returns the built-in Infura networks by default', async () => { await withController( @@ -1110,7 +1110,7 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => @@ -1198,7 +1198,7 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => @@ -1299,7 +1299,7 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => @@ -1389,7 +1389,7 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => @@ -1493,7 +1493,7 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => @@ -1589,7 +1589,7 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => @@ -1687,7 +1687,7 @@ describe('NetworkController', () => { const fakeNetworkClient = buildFakeClient(); mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); const simplifiedNetworkClients = Object.entries(networkClients) .map( ([networkClientId, networkClient]) => @@ -4493,7 +4493,7 @@ describe('NetworkController', () => { }, ); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); expect(Object.keys(networkClients)).toHaveLength(6); expect(networkClients).toMatchObject({ 'AAAA-AAAA-AAAA-AAAA': expect.objectContaining({ @@ -5000,7 +5000,7 @@ describe('NetworkController', () => { }) .mockReturnValue(newCustomNetworkClient); const networkClientToDestroy = Object.values( - controller.getNetworkClients(), + controller.getNetworkClientRegistry(), ).find(({ configuration }) => { return ( configuration.type === NetworkClientType.Custom && @@ -5023,7 +5023,7 @@ describe('NetworkController', () => { }, ); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); expect(networkClientToDestroy.destroy).toHaveBeenCalled(); expect(Object.keys(networkClients)).toHaveLength(6); expect(networkClients).not.toMatchObject({ @@ -5078,7 +5078,7 @@ describe('NetworkController', () => { }, ); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); expect(Object.keys(networkClients)).toHaveLength(6); expect(networkClients).toMatchObject({ 'AAAA-AAAA-AAAA-AAAA': expect.objectContaining({ @@ -5121,7 +5121,7 @@ describe('NetworkController', () => { type: NetworkClientType.Custom, }) .mockReturnValue(newCustomNetworkClient); - const networkClientsBefore = controller.getNetworkClients(); + const networkClientsBefore = controller.getNetworkClientRegistry(); await controller.upsertNetworkConfiguration( { @@ -5135,7 +5135,7 @@ describe('NetworkController', () => { }, ); - const networkClientsAfter = controller.getNetworkClients(); + const networkClientsAfter = controller.getNetworkClientRegistry(); expect(networkClientsBefore).toStrictEqual(networkClientsAfter); }, ); @@ -5469,7 +5469,7 @@ describe('NetworkController', () => { }) .mockReturnValue(buildFakeClient()); const networkClientToDestroy = Object.values( - controller.getNetworkClients(), + controller.getNetworkClientRegistry(), ).find(({ configuration }) => { return ( configuration.type === NetworkClientType.Custom && @@ -5483,7 +5483,7 @@ describe('NetworkController', () => { controller.removeNetworkConfiguration('AAAA-AAAA-AAAA-AAAA'); expect(networkClientToDestroy.destroy).toHaveBeenCalled(); - expect(controller.getNetworkClients()).not.toMatchObject({ + expect(controller.getNetworkClientRegistry()).not.toMatchObject({ 'https://test.network': expect.objectContaining({ configuration: { chainId: toHex(111), @@ -5511,7 +5511,7 @@ describe('NetworkController', () => { it('does not update the network client registry', async () => { await withController(async ({ controller }) => { mockCreateNetworkClientWithDefaultsForBuiltInNetworkClients(); - const networkClients = controller.getNetworkClients(); + const networkClients = controller.getNetworkClientRegistry(); try { controller.removeNetworkConfiguration('NONEXISTENT'); @@ -5519,7 +5519,7 @@ describe('NetworkController', () => { // ignore error (it is tested elsewhere) } - expect(controller.getNetworkClients()).toStrictEqual(networkClients); + expect(controller.getNetworkClientRegistry()).toStrictEqual(networkClients); }); }); }); From d9dbd48bb3bd8ad6de0f3dc0a10ffde2a0a5215a Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 28 Jul 2023 14:14:39 -0500 Subject: [PATCH 4/5] lint --- .../network-controller/tests/NetworkController.test.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index 223d89fb022..58f6747444a 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -5121,7 +5121,8 @@ describe('NetworkController', () => { type: NetworkClientType.Custom, }) .mockReturnValue(newCustomNetworkClient); - const networkClientsBefore = controller.getNetworkClientRegistry(); + const networkClientsBefore = + controller.getNetworkClientRegistry(); await controller.upsertNetworkConfiguration( { @@ -5135,7 +5136,8 @@ describe('NetworkController', () => { }, ); - const networkClientsAfter = controller.getNetworkClientRegistry(); + const networkClientsAfter = + controller.getNetworkClientRegistry(); expect(networkClientsBefore).toStrictEqual(networkClientsAfter); }, ); @@ -5519,7 +5521,9 @@ describe('NetworkController', () => { // ignore error (it is tested elsewhere) } - expect(controller.getNetworkClientRegistry()).toStrictEqual(networkClients); + expect(controller.getNetworkClientRegistry()).toStrictEqual( + networkClients, + ); }); }); }); From 346837c40f99cdbba6ba45b4d83fcdcfc77539a4 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 29 Jul 2023 18:41:17 -0500 Subject: [PATCH 5/5] add tests --- .../src/NetworkController.ts | 4 + .../tests/NetworkController.test.ts | 89 +++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/packages/network-controller/src/NetworkController.ts b/packages/network-controller/src/NetworkController.ts index 495483bea78..4f86db461ac 100644 --- a/packages/network-controller/src/NetworkController.ts +++ b/packages/network-controller/src/NetworkController.ts @@ -666,6 +666,10 @@ export class NetworkController extends BaseControllerV2< getNetworkClientById( networkClientId: NetworkClientId, ): AutoManagedNetworkClient { + if (!networkClientId) { + throw new Error('No network client ID was provided.'); + } + const autoManagedNetworkClientRegistry = this.#ensureAutoManagedNetworkClientRegistryPopulated(); diff --git a/packages/network-controller/tests/NetworkController.test.ts b/packages/network-controller/tests/NetworkController.test.ts index 58f6747444a..5b9f8caf63a 100644 --- a/packages/network-controller/tests/NetworkController.test.ts +++ b/packages/network-controller/tests/NetworkController.test.ts @@ -1101,6 +1101,95 @@ describe('NetworkController', () => { }); }); + describe('getNetworkClientById', () => { + describe('If passed an existing networkClientId', () => { + it('returns a valid built-in Infura NetworkClient', async () => { + await withController( + { infuraProjectId: 'some-infura-project-id' }, + async ({ controller }) => { + const fakeNetworkClient = buildFakeClient(); + mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); + + const networkClientRegistry = controller.getNetworkClientRegistry(); + const networkClient = controller.getNetworkClientById( + NetworkType.mainnet, + ); + + expect(networkClient).toBe( + networkClientRegistry[NetworkType.mainnet], + ); + }, + ); + }); + + it('returns a valid custom NetworkClient', async () => { + await withController( + { + state: { + networkConfigurations: { + testNetworkConfigurationId: { + rpcUrl: 'https://mock-rpc-url', + chainId: '0x1337', + ticker: 'ABC', + id: 'testNetworkConfigurationId', + }, + }, + }, + infuraProjectId: 'some-infura-project-id', + }, + async ({ controller }) => { + const fakeNetworkClient = buildFakeClient(); + mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); + + const networkClientRegistry = controller.getNetworkClientRegistry(); + const networkClient = controller.getNetworkClientById( + 'testNetworkConfigurationId', + ); + + expect(networkClient).toBe( + networkClientRegistry.testNetworkConfigurationId, + ); + }, + ); + }); + }); + + describe('If passed a networkClientId that does not match a NetworkClient in the registry', () => { + it('throws an error', async () => { + await withController( + { infuraProjectId: 'some-infura-project-id' }, + async ({ controller }) => { + const fakeNetworkClient = buildFakeClient(); + mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); + + expect(() => + controller.getNetworkClientById('non-existent-network-id'), + ).toThrow( + 'No custom network client was found with the ID "non-existent-network-id', + ); + }, + ); + }); + }); + + describe('If not passed a networkClientId', () => { + it('throws an error', async () => { + await withController( + { infuraProjectId: 'some-infura-project-id' }, + async ({ controller }) => { + const fakeNetworkClient = buildFakeClient(); + mockCreateNetworkClient().mockReturnValue(fakeNetworkClient); + + expect(() => + // @ts-expect-error Intentionally passing invalid type + controller.getNetworkClientById(), + ).toThrow('No network client ID was provided.'); + }, + ); + }); + }); + }); + describe('getNetworkClientRegistry', () => { describe('if neither a provider config nor network configurations are present in state', () => { it('returns the built-in Infura networks by default', async () => {