import migration57 from './057'; describe('migration #57', () => { it('should update the version metadata', async () => { const oldStorage = { meta: { version: 56, }, data: {}, }; const newStorage = await migration57.migrate(oldStorage); expect(newStorage.meta).toStrictEqual({ version: 57, }); }); it('should transactions array into an object keyed by id', async () => { const oldStorage = { meta: {}, data: { TransactionController: { transactions: [ { id: 0, txParams: { foo: 'bar' }, }, { id: 1, txParams: { foo: 'bar' }, }, { id: 2, txParams: { foo: 'bar' }, }, { id: 3, txParams: { foo: 'bar' }, }, ], }, foo: 'bar', }, }; const newStorage = await migration57.migrate(oldStorage); expect(newStorage.data).toStrictEqual({ TransactionController: { transactions: { 0: { id: 0, txParams: { foo: 'bar' }, }, 1: { id: 1, txParams: { foo: 'bar' }, }, 2: { id: 2, txParams: { foo: 'bar' }, }, 3: { id: 3, txParams: { foo: 'bar' } }, }, }, foo: 'bar', }); }); it('should handle transactions without an id, just in case', async () => { const oldStorage = { meta: {}, data: { TransactionController: { transactions: [ { id: 0, txParams: { foo: 'bar' }, }, { txParams: { foo: 'bar' }, }, { txParams: { foo: 'bar' }, }, { txParams: { foo: 'bar' }, }, ], }, foo: 'bar', }, }; const newStorage = await migration57.migrate(oldStorage); const expectedTransactions = {}; for (const transaction of Object.values( newStorage.data.TransactionController.transactions, )) { // Make sure each transaction now has an id. expect(typeof transaction.id !== 'undefined').toStrictEqual(true); // Build expected transaction object expectedTransactions[transaction.id] = transaction; } // Ensure that we got the correct number of transactions expect(Object.keys(expectedTransactions)).toHaveLength( oldStorage.data.TransactionController.transactions.length, ); // Ensure that the one transaction with id is preserved, even though it is // a falsy id. expect( newStorage.data.TransactionController.transactions[0].id, ).toStrictEqual(0); }); it('should not blow up if transactions are not an array', async () => { const storageWithTransactionsAsString = { meta: {}, data: { TransactionController: { transactions: 'someone might have weird state in the future', }, }, }; const storageWithTransactionsAsArrayOfString = { meta: {}, data: { TransactionController: { transactions: 'someone might have weird state in the future'.split( '', ), }, }, }; const result1 = await migration57.migrate(storageWithTransactionsAsString); const result2 = await migration57.migrate( storageWithTransactionsAsArrayOfString, ); expect(storageWithTransactionsAsString.data).toStrictEqual(result1.data); expect(storageWithTransactionsAsArrayOfString.data).toStrictEqual( result2.data, ); }); it('should do nothing if transactions state does not exist', async () => { const oldStorage = { meta: {}, data: { TransactionController: { bar: 'baz', }, foo: 'bar', }, }; const newStorage = await migration57.migrate(oldStorage); expect(oldStorage.data).toStrictEqual(newStorage.data); }); it('should convert empty array into empty object', async () => { const oldStorage = { meta: {}, data: { TransactionController: { transactions: [], bar: 'baz', }, foo: 'bar', }, }; const newStorage = await migration57.migrate(oldStorage); expect(newStorage.data).toStrictEqual({ TransactionController: { transactions: {}, bar: 'baz', }, foo: 'bar', }); }); it('should do nothing if state is empty', async () => { const oldStorage = { meta: {}, data: {}, }; const newStorage = await migration57.migrate(oldStorage); expect(oldStorage.data).toStrictEqual(newStorage.data); }); });