import migration65 from './065';

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

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

  it('should move completedOnboarding from PreferencesController to OnboardingController when completedOnboarding is true', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          completedOnboarding: true,
          bar: 'baz',
        },
        OnboardingController: {
          foo: 'bar',
        },
      },
    };

    const newStorage = await migration65.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual({
      PreferencesController: {
        bar: 'baz',
      },
      OnboardingController: {
        completedOnboarding: true,
        foo: 'bar',
      },
    });
  });

  it('should move completedOnboarding from PreferencesController to OnboardingController when completedOnboarding is false', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          completedOnboarding: false,
          bar: 'baz',
        },
        OnboardingController: {
          foo: 'bar',
        },
      },
    };

    const newStorage = await migration65.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual({
      PreferencesController: {
        bar: 'baz',
      },
      OnboardingController: {
        completedOnboarding: false,
        foo: 'bar',
      },
    });
  });

  it('should move firstTimeFlowType from PreferencesController to OnboardingController when firstTimeFlowType is truthy', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          firstTimeFlowType: 'create',
          bar: 'baz',
        },
        OnboardingController: {
          foo: 'bar',
        },
      },
    };

    const newStorage = await migration65.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual({
      PreferencesController: {
        bar: 'baz',
      },
      OnboardingController: {
        firstTimeFlowType: 'create',
        foo: 'bar',
      },
    });
  });

  it('should move firstTimeFlowType from PreferencesController to OnboardingController when firstTimeFlowType is falsy', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          firstTimeFlowType: null,
          bar: 'baz',
        },
        OnboardingController: {
          foo: 'bar',
        },
      },
    };

    const newStorage = await migration65.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual({
      PreferencesController: {
        bar: 'baz',
      },
      OnboardingController: {
        firstTimeFlowType: null,
        foo: 'bar',
      },
    });
  });

  it('should not modify PreferencesController or OnboardingController when completedOnboarding and firstTimeFlowType are undefined', async () => {
    const oldStorage = {
      meta: {},
      data: {
        PreferencesController: {
          bar: 'baz',
        },
        OnboardingController: {
          foo: 'bar',
        },
      },
    };

    const newStorage = await migration65.migrate(oldStorage);
    expect(newStorage.data).toStrictEqual({
      PreferencesController: {
        bar: 'baz',
      },
      OnboardingController: {
        foo: 'bar',
      },
    });
  });
});