From cc6d045d4e26e31239e71c4760fea8e3fd3dd69b Mon Sep 17 00:00:00 2001 From: Ryan Smith <0ryansmith1994@gmail.com> Date: Tue, 13 Mar 2018 16:32:44 +0000 Subject: [PATCH] feat: Adds LockedMigration error. (cherry picked from commit eaf5cb22f0e011ef4ca2b2c9ba9d8bc7206923e7) --- src/factory.test.ts | 3 ++- src/migrate/test.ts | 7 +++++++ src/migrateByKey/test.ts | 11 +++++++++++ src/rollback/test.ts | 7 +++++++ src/rollbackByKey/test.ts | 12 ++++++++++++ src/utils/errors/LockedMigrationsError.ts | 8 ++++++++ 6 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/utils/errors/LockedMigrationsError.ts diff --git a/src/factory.test.ts b/src/factory.test.ts index 43c893cb..007cf561 100644 --- a/src/factory.test.ts +++ b/src/factory.test.ts @@ -2,6 +2,7 @@ import * as sourceMapSupport from 'source-map-support'; sourceMapSupport.install(); import factoryTest from './factoryTest'; +import LockedMigrationsError from './utils/errors/LockedMigrationsError'; import ProcessedMigration from './utils/types/ProcessedMigration'; let processedMigrations: ProcessedMigration[] = []; // tslint:disable-line:no-let @@ -16,7 +17,7 @@ factoryTest({ }, lockMigrations: async () => { if (hasLockedMigrations) { - throw new Error(); + throw new LockedMigrationsError(); } hasLockedMigrations = true; }, diff --git a/src/migrate/test.ts b/src/migrate/test.ts index fff05f38..22dcd8c5 100644 --- a/src/migrate/test.ts +++ b/src/migrate/test.ts @@ -4,6 +4,7 @@ import 'mocha'; // tslint:disable-line:no-import-side-effect import factory from '../factory'; import RepoFacade from '../RepoFacade'; import FailingMigrationError from '../utils/errors/FailingMigrationError'; +import LockedMigrationsError from '../utils/errors/LockedMigrationsError'; import createMigrationProcess from '../utils/tests/createMigrationProcess'; import createTestUpMigration from '../utils/tests/createTestUpMigration'; import MigrationDictionary from '../utils/types/MigrationDictionary'; @@ -71,5 +72,11 @@ export default (repo: RepoFacade) => { assert.equal(skippedMigration.getProcessed(), false); assert.equal(unskippedMigration.getProcessed(), true); }); + + it('should error when migrations are locked', async () => { + const service = createService({}); + const promise = Promise.all([service.migrate(), service.migrate()]); + await assertRejects(promise, LockedMigrationsError); + }); }); }; diff --git a/src/migrateByKey/test.ts b/src/migrateByKey/test.ts index 9693dd1e..15a5ba83 100644 --- a/src/migrateByKey/test.ts +++ b/src/migrateByKey/test.ts @@ -4,6 +4,7 @@ import 'mocha'; // tslint:disable-line:no-import-side-effect import factory from '../factory'; import RepoFacade from '../RepoFacade'; import FailingMigrationError from '../utils/errors/FailingMigrationError'; +import LockedMigrationsError from '../utils/errors/LockedMigrationsError'; import MissingMigrationError from '../utils/errors/MissingMigrationError'; import ProcessedMigrationError from '../utils/errors/ProcessedMigrationError'; import createMigrationProcess from '../utils/tests/createMigrationProcess'; @@ -11,6 +12,7 @@ import createTestUpMigration from '../utils/tests/createTestUpMigration'; import MigrationDictionary from '../utils/types/MigrationDictionary'; export default (repo: RepoFacade) => { + const successfulMigration = createTestUpMigration(); const failingMigration = createTestUpMigration(() => { throw new Error(); }); const createService = (migrations: MigrationDictionary) => { @@ -54,5 +56,14 @@ export default (repo: RepoFacade) => { await service.migrateByKey({ key: 'testMigration', force: true }); assert.equal(getProcessed(), true); }); + + it('should error when migrations are locked', async () => { + const service = createService({ successfulMigration }); + const promise = Promise.all([ + service.migrateByKey({ key: 'successfulMigration' }), + service.migrateByKey({ key: 'successfulMigration' }), + ]); + await assertRejects(promise, LockedMigrationsError); + }); }); }; diff --git a/src/rollback/test.ts b/src/rollback/test.ts index 1e3ca543..3939b8e3 100644 --- a/src/rollback/test.ts +++ b/src/rollback/test.ts @@ -4,6 +4,7 @@ import 'mocha'; // tslint:disable-line:no-import-side-effect import factory from '../factory'; import RepoFacade from '../RepoFacade'; import FailingMigrationError from '../utils/errors/FailingMigrationError'; +import LockedMigrationsError from '../utils/errors/LockedMigrationsError'; import MissingMigrationError from '../utils/errors/MissingMigrationError'; import createMigrationProcess from '../utils/tests/createMigrationProcess'; import createTestDownMigration from '../utils/tests/createTestDownMigration'; @@ -83,5 +84,11 @@ export default (repo: RepoFacade) => { assert.equal(skippedMigration.getProcessed(), false); assert.equal(unskippedMigration.getProcessed(), true); }); + + it('should error when migrations are locked', async () => { + const service = createService({}); + const promise = Promise.all([service.rollback(), service.rollback()]); + await assertRejects(promise, LockedMigrationsError); + }); }); }; diff --git a/src/rollbackByKey/test.ts b/src/rollbackByKey/test.ts index bc43d20e..0fe82c2c 100644 --- a/src/rollbackByKey/test.ts +++ b/src/rollbackByKey/test.ts @@ -4,12 +4,14 @@ import 'mocha'; // tslint:disable-line:no-import-side-effect import factory from '../factory'; import RepoFacade from '../RepoFacade'; import FailingMigrationError from '../utils/errors/FailingMigrationError'; +import LockedMigrationsError from '../utils/errors/LockedMigrationsError'; import UnprocessedMigrationError from '../utils/errors/UnprocessedMigrationError'; import createMigrationProcess from '../utils/tests/createMigrationProcess'; import createTestDownMigration from '../utils/tests/createTestDownMigration'; import MigrationDictionary from '../utils/types/MigrationDictionary'; export default (repo: RepoFacade) => { + const successfulMigration = createTestDownMigration(); const failingMigration = createTestDownMigration(() => { throw new Error(); }); const createService = (migrations: MigrationDictionary) => { @@ -53,5 +55,15 @@ export default (repo: RepoFacade) => { await service.rollbackByKey({ key: 'testMigration', force: true }); assert.equal(getProcessed(), true); }); + + it('should error when migrations are locked', async () => { + const service = createService({ successfulMigration }); + await service.migrate(); + const promise = Promise.all([ + service.rollbackByKey({ key: 'successfulMigration' }), + service.rollbackByKey({ key: 'successfulMigration' }), + ]); + await assertRejects(promise, LockedMigrationsError); + }); }); }; diff --git a/src/utils/errors/LockedMigrationsError.ts b/src/utils/errors/LockedMigrationsError.ts new file mode 100644 index 00000000..9b65f9e4 --- /dev/null +++ b/src/utils/errors/LockedMigrationsError.ts @@ -0,0 +1,8 @@ +// tslint:disable:no-class +import { BaseError } from 'make-error'; + +export default class LockedMigrationsError extends BaseError { + constructor() { + super(); + } +}