ddl-manager
Version:
store postgres procedures and triggers in files
180 lines (148 loc) • 4.72 kB
text/typescript
import assert from "assert";
import fs from "fs";
import fse from "fs-extra";
import { getDBClient } from "../../getDbClient";
import { DDLManager } from "../../../../lib/DDLManager";
import {expect, use} from "chai";
import chaiShallowDeepEqualPlugin from "chai-shallow-deep-equal";
use(chaiShallowDeepEqualPlugin);
const ROOT_TMP_PATH = __dirname + "/tmp";
describe("integration/DDLManager.build other tests", () => {
let db: any;
const dbConfig = require("../../../../ddl-manager-config");
beforeEach(async() => {
db = await getDBClient();
await db.query(`
drop schema public cascade;
create schema public;
`);
if ( fs.existsSync(ROOT_TMP_PATH) ) {
fse.removeSync(ROOT_TMP_PATH);
}
fs.mkdirSync(ROOT_TMP_PATH);
});
afterEach(async() => {
await db.end();
});
it("build nonexistent folder", async() => {
try {
await DDLManager.build({
db,
folder: "---"
});
assert.ok(false, "expected error for nonexistent folder");
} catch(err) {
assert.equal(err.message, "folder \"---\" not found");
}
});
it("build empty folder", async() => {
const folderPath = ROOT_TMP_PATH + "/empty";
fs.mkdirSync(folderPath);
await DDLManager.build({
db,
folder: folderPath
});
// expected build without errors
assert.ok(true);
});
it("build with dbConfig", async() => {
const folderPath = ROOT_TMP_PATH + "/simple-func";
fs.mkdirSync(folderPath);
fs.writeFileSync(folderPath + "/nice.sql", `
create or replace function nice()
returns integer as $body$
begin
return 1;
end
$body$
language plpgsql;
`);
await DDLManager.build({
db: {
database: dbConfig.database,
user: dbConfig.user,
password: dbConfig.password,
host: dbConfig.host,
port: dbConfig.port
},
folder: folderPath
});
const result = await db.query("select nice() as nice");
const row = result.rows[0];
expect(row).to.be.shallowDeepEqual({
nice: 1
});
});
it("build from many folders", async() => {
const folderPath1 = ROOT_TMP_PATH + "/many-folder-1";
fs.mkdirSync(folderPath1);
const folderPath2 = ROOT_TMP_PATH + "/many-folder-2";
fs.mkdirSync(folderPath2);
fs.writeFileSync(folderPath1 + "/func1.sql", `
create or replace function func1()
returns text as $body$
begin
return 'func1';
end
$body$
language plpgsql;
`);
fs.writeFileSync(folderPath2 + "/func2.sql", `
create or replace function func2()
returns text as $body$
begin
return 'func2';
end
$body$
language plpgsql;
`);
await DDLManager.build({
db,
folder: [
folderPath1,
folderPath2
]
});
const result = await db.query(`
select
func1() as func1,
func2() as func2
`);
expect(result.rows[0]).to.be.shallowDeepEqual({
func1: "func1",
func2: "func2"
});
});
it("build simple function when exists index with trim both", async() => {
const folderPath = ROOT_TMP_PATH + "/simple-func";
fs.mkdirSync(folderPath);
const rnd = Math.round( 1000 * Math.random() );
fs.writeFileSync(folderPath + "/nice.sql", `
create or replace function nice(a integer)
returns integer as $body$
begin
return a * ${ rnd };
end
$body$
language plpgsql;
`);
await db.query(`
create table test (
id serial primary key,
name text
);
create index test_idx
on test
using btree ((trim(both from name)))
`);
await DDLManager.build({
db,
folder: folderPath
});
const result = await db.query("select nice(2) as nice");
const row = result.rows[0];
expect(row).to.be.shallowDeepEqual({
nice: 2 * rnd
});
});
});