/* eslint-disable jest/valid-expect-in-promise */
import wallet1 from '../../../test/lib/migrations/001.json';
import vault4 from '../../../test/lib/migrations/004.json';
import migration2 from './002';
import migration3 from './003';
import migration4 from './004';
import migration5 from './005';
import migration6 from './006';
import migration7 from './007';
import migration8 from './008';
import migration9 from './009';
import migration10 from './010';
import migration11 from './011';
import migration12 from './012';
import migration13 from './013';

let vault5, vault6, vault7, vault8, vault9; // vault10, vault11

const oldTestRpc = 'https://rawtestrpc.metamask.io/';
const newTestRpc = 'https://testrpc.metamask.io/';

describe('wallet1 is migrated successfully', () => {
  it('should convert providers', () => {
    wallet1.data.config.provider = { type: 'etherscan', rpcTarget: null };

    migration2
      .migrate(wallet1)
      .then((secondResult) => {
        const secondData = secondResult.data;
        expect(secondData.config.provider.type).toStrictEqual('rpc');
        expect(secondData.config.provider.rpcTarget).toStrictEqual(
          'https://rpc.metamask.io/',
        );
        secondResult.data.config.provider.rpcTarget = oldTestRpc;
        return migration3.migrate(secondResult);
      })
      .then((thirdResult) => {
        expect(thirdResult.data.config.provider.rpcTarget).toStrictEqual(
          newTestRpc,
        );
        return migration4.migrate(thirdResult);
      })
      .then((fourthResult) => {
        const fourthData = fourthResult.data;
        expect(fourthData.config.provider.rpcTarget).toBeUndefined();
        expect(fourthData.config.provider.type).toStrictEqual('testnet');

        return migration5.migrate(vault4);
      })
      .then((fifthResult) => {
        const fifthData = fifthResult.data;
        expect(fifthData.vault).toBeUndefined();
        expect(fifthData.walletNicknames).toBeUndefined();
        expect(fifthData.config.selectedAccount).toBeUndefined();
        expect(fifthData.KeyringController.vault).toStrictEqual(
          vault4.data.vault,
        );
        expect(fifthData.KeyringController.selectedAccount).toStrictEqual(
          vault4.data.config.selectedAccount,
        );
        expect(
          fifthData.KeyringController.walletNicknames[
            '0x0beb674745816b125fbc07285d39fd373e64895c'
          ],
        ).toStrictEqual(
          vault4.data.walletNicknames[
            '0x0beb674745816b125fbc07285d39fd373e64895c'
          ],
        );

        vault5 = fifthResult;
        return migration6.migrate(fifthResult);
      })
      .then((sixthResult) => {
        expect(
          sixthResult.data.KeyringController.selectedAccount,
        ).toBeUndefined();
        expect(
          sixthResult.data.PreferencesController.selectedAddress,
        ).toStrictEqual(vault5.data.KeyringController.selectedAccount);

        vault6 = sixthResult;
        return migration7.migrate(sixthResult);
      })
      .then((seventhResult) => {
        expect(seventhResult.data.transactions).toBeUndefined();
        expect(seventhResult.data.gasMultiplier).toBeUndefined();
        expect(
          seventhResult.data.TransactionManager.transactions[0].id,
        ).toStrictEqual(vault6.data.transactions[0].id);
        expect(
          seventhResult.data.TransactionManager.gasMultiplier,
        ).toStrictEqual(vault6.data.gasMultiplier);

        vault7 = seventhResult;
        return migration8.migrate(seventhResult);
      })
      .then((eighthResult) => {
        expect(eighthResult.data.noticesList).toBeUndefined();
        expect(
          eighthResult.data.NoticeController.noticesList[0].title,
        ).toStrictEqual(vault7.data.noticesList[0].title);

        vault8 = eighthResult;
        return migration9.migrate(eighthResult);
      })
      .then((ninthResult) => {
        expect(ninthResult.data.currentFiat).toBeUndefined();
        expect(ninthResult.data.fiatCurrency).toBeUndefined();
        expect(ninthResult.data.conversionRate).toBeUndefined();
        expect(ninthResult.data.conversionDate).toBeUndefined();

        expect(
          ninthResult.data.CurrencyController.currentCurrency,
        ).toStrictEqual(vault8.data.fiatCurrency);
        expect(
          ninthResult.data.CurrencyController.conversionRate,
        ).toStrictEqual(vault8.data.conversionRate);
        expect(
          ninthResult.data.CurrencyController.conversionDate,
        ).toStrictEqual(vault8.data.conversionDate);

        vault9 = ninthResult;
        return migration10.migrate(ninthResult);
      })
      .then((tenthResult) => {
        expect(tenthResult.data.shapeShiftTxList).toBeUndefined();
        expect(
          tenthResult.data.ShapeShiftController.shapeShiftTxList[0].transaction,
        ).toStrictEqual(vault9.data.shapeShiftTxList[0].transaction);

        return migration11.migrate(tenthResult);
      })
      .then((eleventhResult) => {
        expect(eleventhResult.data.isDisclaimerConfirmed).toBeUndefined();
        expect(eleventhResult.data.TOSHash).toBeUndefined();

        return migration12.migrate(eleventhResult);
      })
      .then((twelfthResult) => {
        expect(
          twelfthResult.data.NoticeController.noticesList[0].body,
        ).toStrictEqual('');
        expect(
          twelfthResult.data.NoticeController.noticesList[1].body,
        ).toStrictEqual('nonempty');

        expect(twelfthResult.data.config.provider.type).toStrictEqual(
          'testnet',
        );
        return migration13.migrate(twelfthResult);
      })
      .then((thirteenthResult) => {
        expect(thirteenthResult.data.config.provider.type).toStrictEqual(
          'ropsten',
        );
      });
  });
});