@@ -1579,6 +1579,109 @@ describe('NetworkController', () => {
15791579 });
15801580 });
15811581
1582+ describe('if all subscriptions are removed from the messenger before the call to lookupNetwork completes', () => {
1583+ it('does not throw an error', async () => {
1584+ const infuraProjectId = 'some-infura-project-id';
1585+
1586+ await withController(
1587+ {
1588+ state: {
1589+ selectedNetworkClientId: infuraNetworkType,
1590+ },
1591+ infuraProjectId,
1592+ },
1593+ async ({ controller, messenger }) => {
1594+ const fakeProvider = buildFakeProvider([
1595+ // Called during provider initialization
1596+ {
1597+ request: {
1598+ method: 'eth_getBlockByNumber',
1599+ },
1600+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
1601+ },
1602+ // Called via `lookupNetwork` directly
1603+ {
1604+ request: {
1605+ method: 'eth_getBlockByNumber',
1606+ },
1607+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
1608+ },
1609+ ]);
1610+ const fakeNetworkClient = buildFakeClient(fakeProvider);
1611+ mockCreateNetworkClient()
1612+ .calledWith({
1613+ chainId: ChainId[infuraNetworkType],
1614+ infuraProjectId,
1615+ network: infuraNetworkType,
1616+ ticker: NetworksTicker[infuraNetworkType],
1617+ type: NetworkClientType.Infura,
1618+ })
1619+ .mockReturnValue(fakeNetworkClient);
1620+ await controller.initializeProvider();
1621+
1622+ const lookupNetworkPromise = controller.lookupNetwork();
1623+ messenger.clearSubscriptions();
1624+ expect(await lookupNetworkPromise).toBeUndefined();
1625+ },
1626+ );
1627+ });
1628+ });
1629+
1630+ describe('if removing the networkDidChange subscription fails for an unknown reason', () => {
1631+ it('re-throws the error', async () => {
1632+ const infuraProjectId = 'some-infura-project-id';
1633+
1634+ await withController(
1635+ {
1636+ state: {
1637+ selectedNetworkClientId: infuraNetworkType,
1638+ },
1639+ infuraProjectId,
1640+ },
1641+ async ({ controller, messenger }) => {
1642+ const fakeProvider = buildFakeProvider([
1643+ // Called during provider initialization
1644+ {
1645+ request: {
1646+ method: 'eth_getBlockByNumber',
1647+ },
1648+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
1649+ },
1650+ // Called via `lookupNetwork` directly
1651+ {
1652+ request: {
1653+ method: 'eth_getBlockByNumber',
1654+ },
1655+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
1656+ },
1657+ ]);
1658+ const fakeNetworkClient = buildFakeClient(fakeProvider);
1659+ mockCreateNetworkClient()
1660+ .calledWith({
1661+ chainId: ChainId[infuraNetworkType],
1662+ infuraProjectId,
1663+ network: infuraNetworkType,
1664+ ticker: NetworksTicker[infuraNetworkType],
1665+ type: NetworkClientType.Infura,
1666+ })
1667+ .mockReturnValue(fakeNetworkClient);
1668+ await controller.initializeProvider();
1669+
1670+ const lookupNetworkPromise = controller.lookupNetwork();
1671+ const error = new Error('oops');
1672+ jest
1673+ .spyOn(messenger, 'unsubscribe')
1674+ .mockImplementation((eventType) => {
1675+ if (eventType === 'NetworkController:networkDidChange') {
1676+ throw error;
1677+ }
1678+ });
1679+ await expect(lookupNetworkPromise).rejects.toThrow(error);
1680+ },
1681+ );
1682+ });
1683+ });
1684+
15821685 lookupNetworkTests({
15831686 expectedNetworkClientType: NetworkClientType.Infura,
15841687 initialState: {
@@ -1889,6 +1992,131 @@ describe('NetworkController', () => {
18891992 });
18901993 });
18911994
1995+ describe('if all subscriptions are removed from the messenger before the call to lookupNetwork completes', () => {
1996+ it('does not throw an error', async () => {
1997+ const infuraProjectId = 'some-infura-project-id';
1998+
1999+ await withController(
2000+ {
2001+ state: {
2002+ selectedNetworkClientId: 'AAAA-AAAA-AAAA-AAAA',
2003+ networkConfigurationsByChainId: {
2004+ '0x1337': buildCustomNetworkConfiguration({
2005+ chainId: '0x1337',
2006+ nativeCurrency: 'TEST',
2007+ rpcEndpoints: [
2008+ buildCustomRpcEndpoint({
2009+ networkClientId: 'AAAA-AAAA-AAAA-AAAA',
2010+ url: 'https://test.network',
2011+ }),
2012+ ],
2013+ }),
2014+ },
2015+ },
2016+ infuraProjectId,
2017+ },
2018+ async ({ controller, messenger }) => {
2019+ const fakeProvider = buildFakeProvider([
2020+ // Called during provider initialization
2021+ {
2022+ request: {
2023+ method: 'eth_getBlockByNumber',
2024+ },
2025+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
2026+ },
2027+ // Called via `lookupNetwork` directly
2028+ {
2029+ request: {
2030+ method: 'eth_getBlockByNumber',
2031+ },
2032+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
2033+ },
2034+ ]);
2035+ const fakeNetworkClient = buildFakeClient(fakeProvider);
2036+ mockCreateNetworkClient()
2037+ .calledWith({
2038+ chainId: '0x1337',
2039+ rpcUrl: 'https://test.network',
2040+ ticker: 'TEST',
2041+ type: NetworkClientType.Custom,
2042+ })
2043+ .mockReturnValue(fakeNetworkClient);
2044+ await controller.initializeProvider();
2045+
2046+ const lookupNetworkPromise = controller.lookupNetwork();
2047+ messenger.clearSubscriptions();
2048+ await lookupNetworkPromise;
2049+ },
2050+ );
2051+ });
2052+ });
2053+
2054+ describe('if removing the networkDidChange subscription fails for an unknown reason', () => {
2055+ it('re-throws the error', async () => {
2056+ const infuraProjectId = 'some-infura-project-id';
2057+
2058+ await withController(
2059+ {
2060+ state: {
2061+ selectedNetworkClientId: 'AAAA-AAAA-AAAA-AAAA',
2062+ networkConfigurationsByChainId: {
2063+ '0x1337': buildCustomNetworkConfiguration({
2064+ chainId: '0x1337',
2065+ nativeCurrency: 'TEST',
2066+ rpcEndpoints: [
2067+ buildCustomRpcEndpoint({
2068+ networkClientId: 'AAAA-AAAA-AAAA-AAAA',
2069+ url: 'https://test.network',
2070+ }),
2071+ ],
2072+ }),
2073+ },
2074+ },
2075+ infuraProjectId,
2076+ },
2077+ async ({ controller, messenger }) => {
2078+ const fakeProvider = buildFakeProvider([
2079+ // Called during provider initialization
2080+ {
2081+ request: {
2082+ method: 'eth_getBlockByNumber',
2083+ },
2084+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
2085+ },
2086+ // Called via `lookupNetwork` directly
2087+ {
2088+ request: {
2089+ method: 'eth_getBlockByNumber',
2090+ },
2091+ response: SUCCESSFUL_ETH_GET_BLOCK_BY_NUMBER_RESPONSE,
2092+ },
2093+ ]);
2094+ const fakeNetworkClient = buildFakeClient(fakeProvider);
2095+ mockCreateNetworkClient()
2096+ .calledWith({
2097+ chainId: '0x1337',
2098+ rpcUrl: 'https://test.network',
2099+ ticker: 'TEST',
2100+ type: NetworkClientType.Custom,
2101+ })
2102+ .mockReturnValue(fakeNetworkClient);
2103+ await controller.initializeProvider();
2104+
2105+ const lookupNetworkPromise = controller.lookupNetwork();
2106+ const error = new Error('oops');
2107+ jest
2108+ .spyOn(messenger, 'unsubscribe')
2109+ .mockImplementation((eventType) => {
2110+ if (eventType === 'NetworkController:networkDidChange') {
2111+ throw error;
2112+ }
2113+ });
2114+ await expect(lookupNetworkPromise).rejects.toThrow(error);
2115+ },
2116+ );
2117+ });
2118+ });
2119+
18922120 lookupNetworkTests({
18932121 expectedNetworkClientType: NetworkClientType.Custom,
18942122 initialState: {
0 commit comments