import {
  INFURA_PROVIDER_TYPES,
  BUILT_IN_NETWORKS,
} from '../../../shared/constants/network';
import migration51 from './051';

describe('migration #51', () => {
  it('should update the version metadata', async () => {
    const oldStorage = {
      meta: {
        version: 50,
      },
      data: {},
    };

    const newStorage = await migration51.migrate(oldStorage);
    expect(newStorage.meta).toStrictEqual({
      version: 51,
    });
  });

  describe('setting chainId', () => {
    INFURA_PROVIDER_TYPES.forEach(function (type) {
      it(`should correctly set the chainId for the Infura network "${type}", if no chainId is set`, async () => {
        const oldStorage = {
          meta: {},
          data: {
            NetworkController: {
              settings: {
                fizz: 'buzz',
              },
              provider: {
                type,
              },
            },
            foo: 'bar',
          },
        };
        const newStorage = await migration51.migrate(oldStorage);
        expect(newStorage.data).toStrictEqual({
          NetworkController: {
            settings: {
              fizz: 'buzz',
            },
            provider: {
              type,
              chainId: BUILT_IN_NETWORKS[type].chainId,
            },
          },
          foo: 'bar',
        });
      });

      it(`should correctly set the chainId for the Infura network "${type}", if an incorrect chainId is set`, async () => {
        const oldStorage = {
          meta: {},
          data: {
            NetworkController: {
              settings: {
                fizz: 'buzz',
              },
              provider: {
                type,
                chainId: 'foo',
              },
            },
            foo: 'bar',
          },
        };
        const newStorage = await migration51.migrate(oldStorage);
        expect(newStorage.data).toStrictEqual({
          NetworkController: {
            settings: {
              fizz: 'buzz',
            },
            provider: {
              type,
              chainId: BUILT_IN_NETWORKS[type].chainId,
            },
          },
          foo: 'bar',
        });
      });
    });

    it('should not set the chainId for a non-Infura network that does not have chainId set', async () => {
      const oldStorage = {
        meta: {},
        data: {
          NetworkController: {
            settings: {
              fizz: 'buzz',
            },
            provider: {
              type: 'foo',
            },
          },
        },
      };
      const newStorage = await migration51.migrate(oldStorage);
      expect(newStorage.data).toStrictEqual(oldStorage.data);
    });

    it('should not set the chainId for a non-Infura network that does have chainId set', async () => {
      const oldStorage = {
        meta: {},
        data: {
          NetworkController: {
            settings: {
              fizz: 'buzz',
            },
            provider: {
              type: 'foo',
              chainId: '0x999',
            },
          },
        },
      };
      const newStorage = await migration51.migrate(oldStorage);
      expect(newStorage.data).toStrictEqual(oldStorage.data);
    });
  });
});