const assert = require('assert') const clone = require('clone') const Migrator = require('../../app/scripts/lib/migrator/') const liveMigrations = require('../../app/scripts/migrations/') const stubMigrations = [ { version: 1, migrate: (data) => { // clone the data just like we do in migrations const clonedData = clone(data) clonedData.meta.version = 1 return Promise.resolve(clonedData) }, }, { version: 2, migrate: (data) => { const clonedData = clone(data) clonedData.meta.version = 2 return Promise.resolve(clonedData) }, }, { version: 3, migrate: (data) => { const clonedData = clone(data) clonedData.meta.version = 3 return Promise.resolve(clonedData) }, }, ] const versionedData = {meta: {version: 0}, data: {hello: 'world'}} const firstTimeState = { meta: { version: 0 }, data: require('../../app/scripts/first-time-state'), } describe('Migrator', () => { const migrator = new Migrator({ migrations: stubMigrations }) it('migratedData version should be version 3', (done) => { migrator.migrateData(versionedData) .then((migratedData) => { assert.equal(migratedData.meta.version, stubMigrations[2].version) done() }).catch(done) }) it('should match the last version in live migrations', (done) => { const migrator = new Migrator({ migrations: liveMigrations }) migrator.migrateData(firstTimeState) .then((migratedData) => { const last = liveMigrations.length - 1 assert.equal(migratedData.meta.version, liveMigrations[last].version) done() }).catch(done) }) it('should emit an error', function (done) { this.timeout(15000) const migrator = new Migrator({ migrations: [{ version: 1, migrate: async () => { throw new Error('test') } } ] }) migrator.on('error', () => done()) migrator.migrateData({ meta: {version: 0} }) .then((migratedData) => { }).catch(done) }) })