import migration39 from './039';

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

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.meta.version).toStrictEqual(39);
  });

  it('should update old DAI token symbol to SAI in tokens', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          tokens: [
            {
              address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359',
              decimals: 18,
              symbol: 'DAI',
            },
            {
              address: '0x0d8775f648430679a709e98d2b0cb6250d2887ef',
              symbol: 'BAT',
              decimals: 18,
            },
            {
              address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
              symbol: 'META',
              decimals: 18,
            },
          ],
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data.PreferencesController).toStrictEqual({
      tokens: [
        {
          address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359',
          decimals: 18,
          symbol: 'SAI',
        },
        {
          address: '0x0d8775f648430679a709e98d2b0cb6250d2887ef',
          symbol: 'BAT',
          decimals: 18,
        },
        {
          address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
          symbol: 'META',
          decimals: 18,
        },
      ],
    });
  });

  it('should update old DAI token symbol to SAI in accountTokens', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          accountTokens: {
            '0x7250739de134d33ec7ab1ee592711e15098c9d2d': {
              mainnet: [
                {
                  address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359',
                  decimals: 18,
                  symbol: 'DAI',
                },
              ],
            },
            '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': {
              mainnet: [],
              rinkeby: [],
            },
            '0x8e5d75d60224ea0c33d1041e75de68b1c3cb6dd5': {},
            '0xb3958fb96c8201486ae20be1d5c9f58083df343a': {
              mainnet: [
                {
                  address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359',
                  decimals: 18,
                  symbol: 'DAI',
                },
                {
                  address: '0x0d8775f648430679a709e98d2b0cb6250d2887ef',
                  decimals: 18,
                  symbol: 'BAT',
                },
                {
                  address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
                  decimals: 18,
                  symbol: 'META',
                },
              ],
            },
          },
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data.PreferencesController).toStrictEqual({
      accountTokens: {
        '0x7250739de134d33ec7ab1ee592711e15098c9d2d': {
          mainnet: [
            {
              address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359',
              decimals: 18,
              symbol: 'SAI',
            },
          ],
        },
        '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': {
          mainnet: [],
          rinkeby: [],
        },
        '0x8e5d75d60224ea0c33d1041e75de68b1c3cb6dd5': {},
        '0xb3958fb96c8201486ae20be1d5c9f58083df343a': {
          mainnet: [
            {
              address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359',
              decimals: 18,
              symbol: 'SAI',
            },
            {
              address: '0x0d8775f648430679a709e98d2b0cb6250d2887ef',
              decimals: 18,
              symbol: 'BAT',
            },
            {
              address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
              decimals: 18,
              symbol: 'META',
            },
          ],
        },
      },
    });
  });

  it('should NOT change any state if accountTokens is not an object', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          accountTokens: [],
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if accountTokens is an object with invalid values', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          accountTokens: {
            '0x7250739de134d33ec7ab1ee592711e15098c9d2d': [
              {
                address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359',
                decimals: 18,
                symbol: 'DAI',
              },
            ],
            '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359': null,
            '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': {
              mainnet: [null, undefined, [], 42],
              rinkeby: null,
            },
          },
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if accountTokens includes the new DAI token', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          accountTokens: {
            '0x7250739de134d33ec7ab1ee592711e15098c9d2d': {
              mainnet: [
                {
                  address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
                  decimals: 18,
                  symbol: 'DAI',
                },
              ],
            },
            '0x8e5d75d60224ea0c33d0041e75de68b1c3cb6dd5': {
              mainnet: [],
              rinkeby: [],
            },
            '0x8e5d75d60224ea0c33d1041e75de68b1c3cb6dd5': {},
            '0xb3958fb96c8201486ae20be1d5c9f58083df343a': {
              mainnet: [
                {
                  address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
                  decimals: 18,
                  symbol: 'DAI',
                },
                {
                  address: '0x0d8775f648430679a709e98d2b0cb6250d2887ef',
                  decimals: 18,
                  symbol: 'BAT',
                },
                {
                  address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
                  decimals: 18,
                  symbol: 'META',
                },
              ],
            },
          },
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if tokens includes the new DAI token', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          tokens: [
            {
              address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
              symbol: 'DAI',
              decimals: 18,
            },
            {
              address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
              symbol: 'META',
              decimals: 18,
            },
          ],
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if tokens does not include DAI', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          tokens: [
            {
              address: '0x0d8775f648430679a709e98d2b0cb6250d2887ef',
              symbol: 'BAT',
              decimals: 18,
            },
            {
              address: '0x617b3f8050a0bd94b6b1da02b4384ee5b4df13f4',
              symbol: 'META',
              decimals: 18,
            },
          ],
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if a tokens property has invalid entries', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          tokens: [null, [], undefined, 42],
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if a tokens property is not an array', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          tokens: {},
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if a tokens property is null', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          tokens: null,
        },
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if a tokens property is missing', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {},
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if a accountTokens property is missing', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {},
      },
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });

  it('should NOT change any state if PreferencesController is missing', async () => {
    const oldStorage = {
      meta: {},
      data: {},
    };

    const newStorage = await migration39.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual(oldStorage.data);
  });
});