Skip to content

Commit b81782f

Browse files
fix: seed:undo revert last (#908)
1 parent e02a540 commit b81782f

File tree

4 files changed

+134
-71
lines changed

4 files changed

+134
-71
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
44

55
## Future
66

7+
## v6.0.0-beta.2 - 21st, June 2020
8+
9+
### Fixed
10+
11+
- `db:seed:undo` now reverts last seed
12+
713
## v6.0.0-beta.1 - 7th, June 2020
814

915
### Breaking

src/commands/seed_one.js

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { getMigrator } from '../core/migrator';
33

44
import helpers from '../helpers';
55
import path from 'path';
6+
import _ from 'lodash';
67

78
exports.builder =
89
yargs =>
@@ -19,24 +20,49 @@ exports.handler = async function (args) {
1920
// legacy, gulp used to do this
2021
await helpers.config.init();
2122

22-
// filter out cmd names
23-
// for case like --seeders-path seeders --seed seedPerson.js db:seed
24-
const seeds= (args.seed || [])
25-
.filter(name => name !== 'db:seed' && name !== 'db:seed:undo')
26-
.map(file => path.basename(file));
27-
28-
2923
switch (command) {
3024
case 'db:seed':
31-
await getMigrator('seeder', args).then(migrator => {
25+
try {
26+
const migrator = await getMigrator('seeder', args);
27+
28+
// filter out cmd names
29+
// for case like --seeders-path seeders --seed seedPerson.js db:seed
30+
const seeds= (args.seed || [])
31+
.filter(name => name !== 'db:seed' && name !== 'db:seed:undo')
32+
.map(file => path.basename(file));
33+
3234
return migrator.up(seeds);
33-
}).catch(e => helpers.view.error(e));
35+
} catch (e) {
36+
helpers.view.error(e);
37+
}
3438
break;
3539

3640
case 'db:seed:undo':
37-
await getMigrator('seeder', args).then(migrator => {
38-
return migrator.down({ migrations: seeds });
39-
}).catch(e => helpers.view.error(e));
41+
try {
42+
const migrator = await getMigrator('seeder', args);
43+
let seeders = helpers.umzug.getStorage('seeder') === 'none'
44+
? await migrator.pending()
45+
: await migrator.executed();
46+
47+
if (args.seed) {
48+
seeders = seeders.filter(seed => {
49+
return args.seed.includes(seed.file);
50+
});
51+
}
52+
53+
if (seeders.length === 0) {
54+
helpers.view.log('No seeders found.');
55+
return;
56+
}
57+
58+
if (!args.seed) {
59+
seeders = seeders.slice(-1);
60+
}
61+
62+
return migrator.down({ migrations: _.chain(seeders).map('file').reverse().value() });
63+
} catch (e) {
64+
helpers.view.error(e);
65+
}
4066
break;
4167
}
4268

test/db/seed/undo.test.js

Lines changed: 0 additions & 59 deletions
This file was deleted.

test/db/seed/undo/one.test.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
const expect = require('expect.js');
2+
const Support = require(__dirname + '/../../../support');
3+
const helpers = require(__dirname + '/../../../support/helpers');
4+
const gulp = require('gulp');
5+
const _ = require('lodash');
6+
7+
[
8+
'db:seed:undo --seed seedPerson.js',
9+
'db:seed:undo'
10+
].forEach(flag => {
11+
const prepare = function (callback, options) {
12+
const _flag = options.flag || flag;
13+
const config = _.assign({}, helpers.getTestConfig(), options.config || {});
14+
15+
const pipeline = gulp
16+
.src(Support.resolveSupportPath('tmp'))
17+
.pipe(helpers.clearDirectory())
18+
.pipe(helpers.runCli('init'))
19+
.pipe(helpers.copyMigration('createPerson.js'));
20+
21+
if ( options.copySeeds ) {
22+
pipeline.pipe(helpers.copySeeder('seedPerson.js'))
23+
.pipe(helpers.copySeeder('seedPerson2.js'));
24+
}
25+
26+
pipeline.pipe(helpers.overwriteFile(JSON.stringify(config),
27+
'config/config.json'))
28+
.pipe(helpers.runCli('db:migrate'))
29+
.pipe(helpers.runCli(_flag, { pipeStdout: true }))
30+
.pipe(helpers.teardown(callback));
31+
};
32+
33+
describe(Support.getTestDialectTeaser(flag), () => {
34+
it('stops execution if no seeders have been found', done => {
35+
prepare((err, output) => {
36+
expect(err).to.equal(null);
37+
expect(output).to.contain('No seeders found.');
38+
done();
39+
}, {copySeeds: false});
40+
});
41+
42+
it('is correctly undo seed if they have been done already', function (done) {
43+
const self = this;
44+
45+
prepare(() => {
46+
helpers.countTable(self.sequelize, 'Person', res => {
47+
expect(res).to.have.length(1);
48+
expect(res[0].count).to.eql(2);
49+
50+
gulp
51+
.src(Support.resolveSupportPath('tmp'))
52+
.pipe(helpers.runCli(flag, { pipeStdout: true }))
53+
.pipe(helpers.teardown(() => {
54+
helpers.countTable(self.sequelize, 'Person', res => {
55+
expect(res).to.have.length(1);
56+
expect(res[0].count).to.eql(0);
57+
done();
58+
});
59+
}));
60+
});
61+
}, {flag: 'db:seed:all', copySeeds: true});
62+
});
63+
64+
it('is correctly undo seed when storage is none', function (done) {
65+
const self = this;
66+
67+
prepare(() => {
68+
helpers.countTable(self.sequelize, 'Person', res => {
69+
expect(res).to.have.length(1);
70+
expect(res[0].count).to.eql(2);
71+
72+
gulp
73+
.src(Support.resolveSupportPath('tmp'))
74+
.pipe(helpers.runCli(flag, { pipeStdout: true }))
75+
.pipe(helpers.teardown(() => {
76+
helpers.countTable(self.sequelize, 'Person', res => {
77+
expect(res).to.have.length(1);
78+
expect(res[0].count).to.eql(0);
79+
done();
80+
});
81+
}));
82+
});
83+
}, {
84+
flag: 'db:seed:all',
85+
copySeeds: true,
86+
config: { seederStorage: 'none' }
87+
});
88+
});
89+
});
90+
});

0 commit comments

Comments
 (0)