@joethefkingfrypan/sequelize-replace-enum-postgres
Version:
This package provides the methods needed to replace a PostgreSQL ENUM in Sequelize migrations.
114 lines (97 loc) • 3.14 kB
JavaScript
;
import sinon from 'sinon';
import { removeWhiteSpace } from './utils/testUtils';
import replaceEnum from '../src/index';
describe('replaceEnum() - enum replacement:', () => {
it('should run all queries within a transaction', async () => {
const queryInterface = queryInterfaceMock();
const transactionSpy = sinon.spy(queryInterface.sequelize, 'transaction');
await replaceEnum({
queryInterface,
tableName: 'table1',
columnName: 'column1',
defaultValue: 'A',
newValues: ['A', 'B', 'C'],
enumName: 'enum1'
});
expect(transactionSpy.calledOnce).to.be.true;
});
it('should pass correct queries to queryInterface', async () => {
const queryInterface = queryInterfaceMock();
await replaceEnum({
queryInterface,
tableName: 'table1',
columnName: 'column1',
defaultValue: 'A',
newValues: ['A', 'B', 'C'],
enumName: 'enum1'
});
expect(
queryInterface.getQueries().map((q) => removeWhiteSpace(q.sql))
).to.deep.equal([
`CREATE TYPE "enum1_new" AS ENUM (\'A\', \'B\', \'C\')`,
`ALTER TABLE "table1" ALTER COLUMN "column1" DROP DEFAULT`,
` ALTER TABLE "table1" ALTER COLUMN "column1" TYPE "enum1_new"` +
` USING ("column1"::text::"enum1_new") `,
`DROP TYPE "enum1"`,
`ALTER TYPE "enum1_new" RENAME TO "enum1"`,
` ALTER TABLE "table1" ALTER COLUMN "column1"` +
` SET DEFAULT 'A'::"enum1" `
]);
});
it('should pass correct queries to queryInterface when not using a default value', async () => {
const queryInterface = queryInterfaceMock();
await replaceEnum({
queryInterface,
tableName: 'table1',
columnName: 'column1',
newValues: ['A', 'B', 'C'],
enumName: 'enum1'
});
expect(
queryInterface.getQueries().map((q) => removeWhiteSpace(q.sql))
).to.deep.equal([
`CREATE TYPE "enum1_new" AS ENUM (\'A\', \'B\', \'C\')`,
` ALTER TABLE "table1" ALTER COLUMN "column1" TYPE "enum1_new"` +
` USING ("column1"::text::"enum1_new") `,
`DROP TYPE "enum1"`,
`ALTER TYPE "enum1_new" RENAME TO "enum1"`
]);
});
it('should pass correct options - transaction', async () => {
const queryInterface = queryInterfaceMock();
await replaceEnum({
queryInterface,
tableName: 'table1',
columnName: 'column1',
defaultValue: 'A',
newValues: ['A', 'B', 'C'],
enumName: 'enum1'
});
const queries = queryInterface.getQueries();
expect(queries).to.have.length(6, 'should create 6 queries');
queries.forEach((query) =>
expect(query.options).to.deep.equal({
transaction: { mockTransaction: true }
})
);
});
});
function queryInterfaceMock() {
const queries = [];
return {
sequelize: {
query(sql, options) {
queries.push({ sql, options });
return Promise.resolve();
},
async transaction(callback) {
await callback({ mockTransaction: true });
return Promise.resolve();
}
},
getQueries() {
return queries;
}
};
}