import { TEST_CHAINS } from '../../../shared/constants/network';
import migration67 from './067';

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

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

  it('should set showTestNetworks to true if the user is currently on a test network', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          preferences: {
            showTestNetworks: false,
          },
        },
        NetworkController: {
          provider: {
            chainId: TEST_CHAINS[0],
          },
        },
      },
    };

    const newStorage = await migration67.migrate(oldStorage);
    expect(
      newStorage.data.PreferencesController.preferences.showTestNetworks,
    ).toBe(true);
  });

  it('should set showTestNetworks to true if there is a transaction on a test network in state', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          preferences: {
            showTestNetworks: false,
          },
        },
        NetworkController: {
          provider: {
            chainId: 'not a test net',
          },
        },
        TransactionController: {
          transactions: {
            abc123: {
              chainId: TEST_CHAINS[0],
            },
          },
        },
      },
    };

    const newStorage = await migration67.migrate(oldStorage);
    expect(
      newStorage.data.PreferencesController.preferences.showTestNetworks,
    ).toBe(true);
  });

  it('should set showTestNetworks to true if the user has a cached balance on a test network', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          preferences: {
            showTestNetworks: false,
          },
        },
        NetworkController: {
          provider: {
            chainId: 'not a test net',
          },
        },
        TransactionController: {
          transactions: {
            abc123: {
              chainId: 'not a test net',
            },
          },
        },
        CachedBalancesController: {
          cachedBalances: {
            '0x1': {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0',
            },
            [TEST_CHAINS[0]]: {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x1',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0',
            },
            [TEST_CHAINS[1]]: {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0',
            },
          },
        },
      },
    };

    const newStorage = await migration67.migrate(oldStorage);
    expect(
      newStorage.data.PreferencesController.preferences.showTestNetworks,
    ).toBe(true);
  });

  it('should leave showTestNetworks false if there is no evidence of test network usage', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          preferences: {
            showTestNetworks: false,
          },
        },
        NetworkController: {
          provider: {
            chainId: 'not a test net',
          },
        },
        TransactionController: {
          transactions: {
            abc123: {
              chainId: 'not a test net',
            },
          },
        },
        CachedBalancesController: {
          cachedBalances: {
            '0x1': {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x10',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x20',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x30',
            },
            [TEST_CHAINS[0]]: {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0',
            },
            [TEST_CHAINS[1]]: {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0',
            },
          },
        },
      },
    };
    const newStorage = await migration67.migrate(oldStorage);
    expect(
      newStorage.data.PreferencesController.preferences.showTestNetworks,
    ).toBe(false);
  });

  it('should leave showTestNetworks true if it was true but there is no evidence of test network usage', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          preferences: {
            showTestNetworks: true,
          },
        },
        NetworkController: {
          provider: {
            chainId: 'not a test net',
          },
        },
        TransactionController: {
          transactions: {
            abc123: {
              chainId: 'not a test net',
            },
          },
        },
        CachedBalancesController: {
          cachedBalances: {
            '0x1': {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x10',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x20',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x30',
            },
            [TEST_CHAINS[0]]: {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0',
            },
            [TEST_CHAINS[1]]: {
              '0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0',
              '0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0',
              '0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0',
            },
          },
        },
      },
    };

    const newStorage = await migration67.migrate(oldStorage);
    expect(
      newStorage.data.PreferencesController.preferences.showTestNetworks,
    ).toBe(true);
  });
});