Skip to content
Open
167 changes: 167 additions & 0 deletions app/scripts/migrations/191.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import { cloneDeep } from 'lodash';
import { migrate, version } from './191';

const VERSION = version;
const OLD_VERSION = VERSION - 1;

describe(`migration #${VERSION}`, () => {
it('removes seedWords when value is null', async () => {
const oldStorage = {
meta: { version: OLD_VERSION },
data: {
seedWords: null,
PreferencesController: {
showTestNetworks: true,
},
},
};

const versionedData = cloneDeep(oldStorage);
const changedKeys = new Set<string>();

await migrate(versionedData, changedKeys);

expect(versionedData.meta.version).toBe(VERSION);
expect('seedWords' in versionedData.data).toBe(false);
expect(versionedData.data).toStrictEqual({
PreferencesController: {
showTestNetworks: true,
},
});
expect(changedKeys).toStrictEqual(new Set(['seedWords']));
});

it('keeps seedWords when value is not null', async () => {
const oldStorage = {
meta: { version: OLD_VERSION },
data: {
seedWords: 'mock-seed-phrase',
},
};

const versionedData = cloneDeep(oldStorage);
const changedKeys = new Set<string>();

await migrate(versionedData, changedKeys);

expect(versionedData.meta.version).toBe(VERSION);
expect(versionedData.data).toStrictEqual(oldStorage.data);
expect(changedKeys.size).toBe(0);
});

it('handles state when seedWords property does not exist', async () => {
const oldStorage = {
meta: { version: OLD_VERSION },
data: {
PreferencesController: {
showTestNetworks: true,
},
},
};

const versionedData = cloneDeep(oldStorage);
const changedKeys = new Set<string>();

await migrate(versionedData, changedKeys);

expect(versionedData.meta.version).toBe(VERSION);
expect('seedWords' in versionedData.data).toBe(false);
expect(versionedData.data).toStrictEqual(oldStorage.data);
expect(changedKeys.size).toBe(0);
});

it('removes forgottenPassword when value is null', async () => {
const oldStorage = {
meta: { version: OLD_VERSION },
data: {
forgottenPassword: null,
PreferencesController: {
showTestNetworks: true,
},
},
};

const versionedData = cloneDeep(oldStorage);
const changedKeys = new Set<string>();

await migrate(versionedData, changedKeys);

expect(versionedData.meta.version).toBe(VERSION);
expect('forgottenPassword' in versionedData.data).toBe(false);
expect(versionedData.data).toStrictEqual({
PreferencesController: {
showTestNetworks: true,
},
});
expect(changedKeys).toStrictEqual(new Set(['forgottenPassword']));
});

it('keeps forgottenPassword when value is not null', async () => {
const oldStorage = {
meta: { version: OLD_VERSION },
data: {
forgottenPassword: true,
},
};

const versionedData = cloneDeep(oldStorage);
const changedKeys = new Set<string>();

await migrate(versionedData, changedKeys);

expect(versionedData.meta.version).toBe(VERSION);
expect(versionedData.data).toStrictEqual(oldStorage.data);
expect(changedKeys.size).toBe(0);
});

it('handles state when forgottenPassword property does not exist', async () => {
const oldStorage = {
meta: { version: OLD_VERSION },
data: {
PreferencesController: {
showTestNetworks: true,
},
},
};

const versionedData = cloneDeep(oldStorage);
const changedKeys = new Set<string>();

await migrate(versionedData, changedKeys);

expect(versionedData.meta.version).toBe(VERSION);
expect('forgottenPassword' in versionedData.data).toBe(false);
expect(versionedData.data).toStrictEqual(oldStorage.data);
expect(changedKeys.size).toBe(0);
});

it('removes both seedWords and forgottenPassword when both are null', async () => {
const oldStorage = {
meta: { version: OLD_VERSION },
data: {
seedWords: null,
forgottenPassword: null,
PreferencesController: {
showTestNetworks: true,
},
},
};

const versionedData = cloneDeep(oldStorage);
const changedKeys = new Set<string>();

await migrate(versionedData, changedKeys);

expect(versionedData.meta.version).toBe(VERSION);
expect('seedWords' in versionedData.data).toBe(false);
expect('forgottenPassword' in versionedData.data).toBe(false);
expect(versionedData.data).toStrictEqual({
PreferencesController: {
showTestNetworks: true,
},
});
expect(changedKeys).toStrictEqual(
new Set(['seedWords', 'forgottenPassword']),
);
});
});
38 changes: 38 additions & 0 deletions app/scripts/migrations/191.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { hasProperty } from '@metamask/utils';
import type { Migrate } from './types';

export const version = 191;

/**
* Migration that removes `null` seedWords and forgottenPassword values from the persisted state.
*
* If the `seedWords` property exists on the data object and its value is
* `null`, this migration deletes the property and records `seedWords` in
* the set of changed keys.
*
* If the `forgottenPassword` property exists on the data object and its value is
* `null`, this migration deletes the property and records `forgottenPassword` in
* the set of changed keys.
*
* @param versionedData - The versioned data object to migrate.
* @param changedKeys - A set used to record keys that were modified.
*/
export const migrate = (async (versionedData, changedKeys) => {
versionedData.meta.version = version;

if (
hasProperty(versionedData.data, 'seedWords') &&
versionedData.data.seedWords === null
) {
delete versionedData.data.seedWords;
changedKeys.add('seedWords');
}

if (
hasProperty(versionedData.data, 'forgottenPassword') &&
versionedData.data.forgottenPassword === null
) {
delete versionedData.data.forgottenPassword;
changedKeys.add('forgottenPassword');
}
}) satisfies Migrate;
1 change: 1 addition & 0 deletions app/scripts/migrations/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ const migrations = [
require('./188'),
require('./189'),
require('./190'),
require('./191'),
];

export default migrations;
4 changes: 2 additions & 2 deletions test/e2e/fixtures/onboarding-fixture.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"announcements": {}
},
"AppMetadataController": {
"currentMigrationVersion": 190,
"currentMigrationVersion": 191,
"previousAppVersion": "",
"previousMigrationVersion": 0
},
Expand Down Expand Up @@ -2147,6 +2147,6 @@
},
"meta": {
"storageKind": "split",
"version": 190
"version": 191
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -316,5 +316,5 @@
"config": "object",
"firstTimeInfo": "object"
},
"meta": { "version": 190 }
"meta": { "version": 191 }
}
Loading