diff --git a/integration-tests/__tests__/analyse.spec.js b/integration-tests/__tests__/analyse.spec.js index c720ef369..a198b5230 100644 --- a/integration-tests/__tests__/analyse.spec.js +++ b/integration-tests/__tests__/analyse.spec.js @@ -25,7 +25,7 @@ async function connect(connection, database) { describe('Analyse tests', () => { test.each(engines.map(engine => [engine.label, engine.connection]))( - 'Create table (%s)', + 'Table - full analysis (%s)', async (label, connection) => { const conn = await connect(connection, randomDbName()); const driver = requireEngineDriver(connection); @@ -48,4 +48,30 @@ describe('Analyse tests', () => { await driver.close(conn); } ); + + test.each(engines.map(engine => [engine.label, engine.connection]))( + 'Table add - incremental analysis (%s)', + async (label, connection) => { + const conn = await connect(connection, randomDbName()); + const driver = requireEngineDriver(connection); + + await driver.query(conn, 'CREATE TABLE t1 (id int)'); + const structure1 = await driver.analyseFull(conn); + await driver.query(conn, 'CREATE TABLE t2 (id2 int)'); + const structure2 = await driver.analyseIncremental(conn, structure1); + + expect(structure2.tables.length).toEqual(2); + expect(structure2.tables.find(x => x.pureName == 't2')).toEqual( + expect.objectContaining({ + pureName: 't2', + columns: [ + expect.objectContaining({ + columnName: 'id2', + }), + ], + }) + ); + await driver.close(conn); + } + ); }); diff --git a/integration-tests/engines.js b/integration-tests/engines.js index 821a41d92..25e0e1a92 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -9,6 +9,26 @@ const engines = [ port: 15001, }, }, + { + label: 'PostgreSQL', + connection: { + engine: 'postgres@dbgate-plugin-postgres', + server: 'localhost', + password: 'Pwd2020Db', + user: 'postgres', + port: 15000, + }, + }, + { + label: 'SQL Server', + connection: { + engine: 'mssql@dbgate-plugin-mssql', + server: 'localhost', + password: 'Pwd2020Db', + user: 'sa', + port: 15002, + }, + }, ]; module.exports = engines; diff --git a/integration-tests/package.json b/integration-tests/package.json index 02fb7f63a..7f15ff9b6 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -9,9 +9,9 @@ "author": "Jan Prochazka", "license": "MIT", "scripts": { - "prepare": "cross-env DEVMODE=1 node prepare.js", + "wait": "cross-env DEVMODE=1 node wait.js", "test": "cross-env DEVMODE=1 jest --runInBand", - "start": "docker-compose down && docker-compose up -d && node wait.js && yarn prepare && yarn test" + "run:all": "docker-compose down && docker-compose up -d && yarn wait && yarn test" }, "devDependencies": { "cross-env": "^7.0.3", diff --git a/integration-tests/prepare.js b/integration-tests/prepare.js deleted file mode 100644 index 2500b486d..000000000 --- a/integration-tests/prepare.js +++ /dev/null @@ -1,14 +0,0 @@ -const requireEngineDriver = require('dbgate-api/src/utility/requireEngineDriver'); -const engines = require('./engines'); -global.DBGATE_TOOLS = require('dbgate-tools'); - -async function run() { - for (const engine of engines) { - const driver = requireEngineDriver(engine.connection); - const conn = await driver.connect(engine.connection); - await driver.query(conn, 'CREATE DATABASE dbtest'); - await driver.close(conn); - } -} - -run(); diff --git a/integration-tests/wait.js b/integration-tests/wait.js index 0210edf5c..6b2c2b3d9 100644 --- a/integration-tests/wait.js +++ b/integration-tests/wait.js @@ -1,6 +1,23 @@ +const requireEngineDriver = require('dbgate-api/src/utility/requireEngineDriver'); +const engines = require('./engines'); +global.DBGATE_TOOLS = require('dbgate-tools'); + async function run() { - console.log('Waiting for starting containers...'); - await new Promise(resolve => setTimeout(resolve, 20000)); + for (const engine of engines) { + const driver = requireEngineDriver(engine.connection); + for (;;) { + try { + const conn = await driver.connect(engine.connection); + await driver.getVersion(conn); + await driver.close(conn); + break; + } catch (err) { + console.log(`Waiting for ${engine.label}`); + await new Promise(resolve => setTimeout(resolve, 1000)); + continue; + } + } + } } run(); diff --git a/plugins/dbgate-plugin-mssql/src/backend/driver.js b/plugins/dbgate-plugin-mssql/src/backend/driver.js index 15ea84471..af87acaf5 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/driver.js +++ b/plugins/dbgate-plugin-mssql/src/backend/driver.js @@ -63,6 +63,9 @@ const driver = { return tediousConnect(conn); }, + async close(pool) { + return pool.close(); + }, async queryCore(pool, sql, options) { if (pool._connectionType == 'msnodesqlv8') { return nativeQueryCore(pool, sql, options); diff --git a/plugins/dbgate-plugin-postgres/src/backend/drivers.js b/plugins/dbgate-plugin-postgres/src/backend/drivers.js index ce216fc16..7f7cae48e 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/drivers.js +++ b/plugins/dbgate-plugin-postgres/src/backend/drivers.js @@ -113,6 +113,9 @@ const drivers = driverBases.map(driverBase => ({ await client.connect(); return client; }, + async close(pool) { + return pool.end(); + }, async query(client, sql) { if (sql == null) { return {