From c1cddba5cedf1b56202557675fe900944c67f4eb Mon Sep 17 00:00:00 2001 From: Sushant Date: Sun, 21 Jun 2020 12:40:28 +0530 Subject: [PATCH] fix: seed:undo revert last --- CHANGELOG.md | 6 +++ src/commands/seed_one.js | 50 ++++++++++++++----- test/db/seed/undo.test.js | 59 ----------------------- test/db/seed/undo/one.test.js | 90 +++++++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 71 deletions(-) delete mode 100644 test/db/seed/undo.test.js create mode 100644 test/db/seed/undo/one.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 04378396..e1f7daf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. ## Future +## v6.0.0-beta.2 - 21st, June 2020 + +### Fixed + +- `db:seed:undo` now reverts last seed + ## v6.0.0-beta.1 - 7th, June 2020 ### Breaking diff --git a/src/commands/seed_one.js b/src/commands/seed_one.js index 8b6dcdb2..3759a74a 100644 --- a/src/commands/seed_one.js +++ b/src/commands/seed_one.js @@ -3,6 +3,7 @@ import { getMigrator } from '../core/migrator'; import helpers from '../helpers'; import path from 'path'; +import _ from 'lodash'; exports.builder = yargs => @@ -19,24 +20,49 @@ exports.handler = async function (args) { // legacy, gulp used to do this await helpers.config.init(); - // filter out cmd names - // for case like --seeders-path seeders --seed seedPerson.js db:seed - const seeds= (args.seed || []) - .filter(name => name !== 'db:seed' && name !== 'db:seed:undo') - .map(file => path.basename(file)); - - switch (command) { case 'db:seed': - await getMigrator('seeder', args).then(migrator => { + try { + const migrator = await getMigrator('seeder', args); + + // filter out cmd names + // for case like --seeders-path seeders --seed seedPerson.js db:seed + const seeds= (args.seed || []) + .filter(name => name !== 'db:seed' && name !== 'db:seed:undo') + .map(file => path.basename(file)); + return migrator.up(seeds); - }).catch(e => helpers.view.error(e)); + } catch (e) { + helpers.view.error(e); + } break; case 'db:seed:undo': - await getMigrator('seeder', args).then(migrator => { - return migrator.down({ migrations: seeds }); - }).catch(e => helpers.view.error(e)); + try { + const migrator = await getMigrator('seeder', args); + let seeders = helpers.umzug.getStorage('seeder') === 'none' + ? await migrator.pending() + : await migrator.executed(); + + if (args.seed) { + seeders = seeders.filter(seed => { + return args.seed.includes(seed.file); + }); + } + + if (seeders.length === 0) { + helpers.view.log('No seeders found.'); + return; + } + + if (!args.seed) { + seeders = seeders.slice(-1); + } + + return migrator.down({ migrations: _.chain(seeders).map('file').reverse().value() }); + } catch (e) { + helpers.view.error(e); + } break; } diff --git a/test/db/seed/undo.test.js b/test/db/seed/undo.test.js deleted file mode 100644 index ba20109c..00000000 --- a/test/db/seed/undo.test.js +++ /dev/null @@ -1,59 +0,0 @@ -const expect = require('expect.js'); -const Support = require(__dirname + '/../../support'); -const helpers = require(__dirname + '/../../support/helpers'); -const gulp = require('gulp'); - -[ - 'db:seed:undo --seed seedPerson.js' -].forEach(flag => { - const prepare = function (callback, options) { - const _flag = options.flag || flag; - - const pipeline = gulp - .src(Support.resolveSupportPath('tmp')) - .pipe(helpers.clearDirectory()) - .pipe(helpers.runCli('init')) - .pipe(helpers.copyMigration('createPerson.js')); - - if ( options.copySeeds ) { - pipeline.pipe(helpers.copySeeder('seedPerson.js')); - } - - pipeline.pipe(helpers.overwriteFile(JSON.stringify(helpers.getTestConfig()), - 'config/config.json')) - .pipe(helpers.runCli('db:migrate')) - .pipe(helpers.runCli(_flag, { pipeStderr: true })) - .pipe(helpers.teardown(callback)); - }; - - describe(Support.getTestDialectTeaser(flag), () => { - it('stops execution if no seeder file is found', done => { - prepare((err, output) => { - expect(output).to.contain('Unable to find migration'); - done(); - }, {copySeeds: false}); - }); - - it('is correctly undoing a seeder if they have been done already', function (done) { - const self = this; - - prepare(() => { - helpers.readTables(self.sequelize, tables => { - expect(tables).to.have.length(2); - expect(tables[0]).to.equal('Person'); - - gulp - .src(Support.resolveSupportPath('tmp')) - .pipe(helpers.runCli(flag, { pipeStdout: true })) - .pipe(helpers.teardown(() => { - helpers.countTable(self.sequelize, 'Person', res => { - expect(res).to.have.length(1); - expect(res[0].count).to.eql(0); - done(); - }); - })); - }); - }, {flag: 'db:seed:all', copySeeds: true}); - }); - }); -}); diff --git a/test/db/seed/undo/one.test.js b/test/db/seed/undo/one.test.js new file mode 100644 index 00000000..0b5cb633 --- /dev/null +++ b/test/db/seed/undo/one.test.js @@ -0,0 +1,90 @@ +const expect = require('expect.js'); +const Support = require(__dirname + '/../../../support'); +const helpers = require(__dirname + '/../../../support/helpers'); +const gulp = require('gulp'); +const _ = require('lodash'); + +[ + 'db:seed:undo --seed seedPerson.js', + 'db:seed:undo' +].forEach(flag => { + const prepare = function (callback, options) { + const _flag = options.flag || flag; + const config = _.assign({}, helpers.getTestConfig(), options.config || {}); + + const pipeline = gulp + .src(Support.resolveSupportPath('tmp')) + .pipe(helpers.clearDirectory()) + .pipe(helpers.runCli('init')) + .pipe(helpers.copyMigration('createPerson.js')); + + if ( options.copySeeds ) { + pipeline.pipe(helpers.copySeeder('seedPerson.js')) + .pipe(helpers.copySeeder('seedPerson2.js')); + } + + pipeline.pipe(helpers.overwriteFile(JSON.stringify(config), + 'config/config.json')) + .pipe(helpers.runCli('db:migrate')) + .pipe(helpers.runCli(_flag, { pipeStdout: true })) + .pipe(helpers.teardown(callback)); + }; + + describe(Support.getTestDialectTeaser(flag), () => { + it('stops execution if no seeders have been found', done => { + prepare((err, output) => { + expect(err).to.equal(null); + expect(output).to.contain('No seeders found.'); + done(); + }, {copySeeds: false}); + }); + + it('is correctly undo seed if they have been done already', function (done) { + const self = this; + + prepare(() => { + helpers.countTable(self.sequelize, 'Person', res => { + expect(res).to.have.length(1); + expect(res[0].count).to.eql(2); + + gulp + .src(Support.resolveSupportPath('tmp')) + .pipe(helpers.runCli(flag, { pipeStdout: true })) + .pipe(helpers.teardown(() => { + helpers.countTable(self.sequelize, 'Person', res => { + expect(res).to.have.length(1); + expect(res[0].count).to.eql(0); + done(); + }); + })); + }); + }, {flag: 'db:seed:all', copySeeds: true}); + }); + + it('is correctly undo seed when storage is none', function (done) { + const self = this; + + prepare(() => { + helpers.countTable(self.sequelize, 'Person', res => { + expect(res).to.have.length(1); + expect(res[0].count).to.eql(2); + + gulp + .src(Support.resolveSupportPath('tmp')) + .pipe(helpers.runCli(flag, { pipeStdout: true })) + .pipe(helpers.teardown(() => { + helpers.countTable(self.sequelize, 'Person', res => { + expect(res).to.have.length(1); + expect(res[0].count).to.eql(0); + done(); + }); + })); + }); + }, { + flag: 'db:seed:all', + copySeeds: true, + config: { seederStorage: 'none' } + }); + }); + }); +});