mirror of
https://github.com/knex/knex.git
synced 2025-07-15 13:01:00 +00:00
105 lines
3.4 KiB
JavaScript
105 lines
3.4 KiB
JavaScript
const { expect } = require('chai');
|
|
const { getAllDbs, getKnexForDb } = require('../util/knex-instance-provider');
|
|
const { isPgDriverName } = require('../../util/db-helpers');
|
|
|
|
describe('Schema', () => {
|
|
describe('native enum columns', () => {
|
|
getAllDbs()
|
|
// enum useNative is only supported by Postgres
|
|
.filter((db) => isPgDriverName(db))
|
|
.forEach((db) => {
|
|
describe(db, () => {
|
|
let knex;
|
|
const tblName = 'table_with_native_enum';
|
|
const enumColumns = [
|
|
{
|
|
column: 'enum_col1',
|
|
values: ['foo', 'bar'],
|
|
typeName: 'test_enum1',
|
|
},
|
|
{
|
|
column: 'enum_col2',
|
|
values: ['baz', 'qux'],
|
|
typeName: 'test_enum2',
|
|
},
|
|
];
|
|
|
|
before(async () => {
|
|
knex = getKnexForDb(db);
|
|
await knex.schema.dropTableIfExists(tblName);
|
|
|
|
for (const enumColumn of enumColumns) {
|
|
await knex.raw(`DROP TYPE IF EXISTS ${enumColumn.typeName}`);
|
|
}
|
|
|
|
await knex.schema.createTable(tblName, (table) => {
|
|
for (const enumColumn of enumColumns) {
|
|
table.enum(enumColumn.column, enumColumn.values, {
|
|
useNative: true,
|
|
enumName: enumColumn.typeName,
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
after(async () => {
|
|
await knex.schema.dropTable(tblName);
|
|
|
|
for (const enumColumn of enumColumns) {
|
|
await knex.raw(`DROP TYPE ${enumColumn.typeName}`);
|
|
}
|
|
|
|
return knex.destroy();
|
|
});
|
|
|
|
it('Creates native enums', async () => {
|
|
for (const enumColumn of enumColumns) {
|
|
const res = await knex
|
|
.select('data_type', 'udt_name')
|
|
.from('information_schema.columns')
|
|
.where({ table_name: tblName, column_name: enumColumn.column });
|
|
|
|
expect(res[0].data_type).to.equal('USER-DEFINED');
|
|
expect(res[0].udt_name).to.equal(enumColumn.typeName);
|
|
}
|
|
});
|
|
|
|
describe('Altering', async () => {
|
|
const enumColumn = enumColumns[0].column;
|
|
const enumTypeName = 'alter_test_enum';
|
|
|
|
before(async () => {
|
|
await knex.raw(`DROP TYPE IF EXISTS ${enumTypeName}`);
|
|
});
|
|
|
|
after(async () => {
|
|
await knex.schema.alterTable(tblName, (table) => {
|
|
table.dropColumn(enumColumn);
|
|
});
|
|
await knex.raw(`DROP TYPE ${enumTypeName}`);
|
|
});
|
|
|
|
it('Allows altering native enums', async () => {
|
|
await knex.schema.alterTable(tblName, (table) => {
|
|
table
|
|
.enum(enumColumn, ['altered', 'values'], {
|
|
useNative: true,
|
|
enumName: enumTypeName,
|
|
})
|
|
.alter();
|
|
});
|
|
|
|
const res = await knex
|
|
.select('data_type', 'udt_name')
|
|
.from('information_schema.columns')
|
|
.where({ table_name: tblName, column_name: enumColumn });
|
|
|
|
expect(res[0].data_type).to.equal('USER-DEFINED');
|
|
expect(res[0].udt_name).to.equal(enumTypeName);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|