diff --git a/integration-tests/__tests__/object-analyse.spec.js b/integration-tests/__tests__/object-analyse.spec.js new file mode 100644 index 000000000..27305f5c7 --- /dev/null +++ b/integration-tests/__tests__/object-analyse.spec.js @@ -0,0 +1,62 @@ +const { connect, randomDbName } = require('../tools'); +const requireEngineDriver = require('dbgate-api/src/utility/requireEngineDriver'); +const engines = require('../engines'); +const _ = require('lodash'); + +const initSql = ['CREATE TABLE t1 (id int)', 'CREATE TABLE t2 (id int)']; + +function flatSource() { + return _.flatten( + engines.map(engine => (engine.objects || []).map(object => [engine.label, object.type, engine, object])) + ); +} + +const obj1Match = expect.objectContaining({ + pureName: 'obj1', +}); + +describe('Object analyse', () => { + test.each(flatSource())('Full analysis (%s - %s)', async (label, type, engine, object) => { + const conn = await connect(engine, randomDbName()); + const driver = requireEngineDriver(engine.connection); + for (const sql of initSql) await driver.query(conn, sql); + + await driver.query(conn, object.create1); + const structure = await driver.analyseFull(conn); + + expect(structure[type].length).toEqual(1); + expect(structure[type][0]).toEqual(obj1Match); + await driver.close(conn); + }); + + test.each(flatSource())('Incremental analysis - add (%s - %s)', async (label, type, engine, object) => { + const conn = await connect(engine, randomDbName()); + const driver = requireEngineDriver(engine.connection); + for (const sql of initSql) await driver.query(conn, sql); + + await driver.query(conn, object.create2); + const structure1 = await driver.analyseFull(conn); + await driver.query(conn, object.create1); + const structure2 = await driver.analyseIncremental(conn, structure1); + + expect(structure2[type].length).toEqual(2); + expect(structure2[type].find(x => x.pureName == 'obj1')).toEqual(obj1Match); + await driver.close(conn); + }); + + test.each(flatSource())('Incremental analysis - drop (%s - %s)', async (label, type, engine, object) => { + const conn = await connect(engine, randomDbName()); + const driver = requireEngineDriver(engine.connection); + for (const sql of initSql) await driver.query(conn, sql); + + await driver.query(conn, object.create1); + await driver.query(conn, object.create2); + const structure1 = await driver.analyseFull(conn); + await driver.query(conn, object.drop2); + const structure2 = await driver.analyseIncremental(conn, structure1); + + expect(structure2[type].length).toEqual(1); + expect(structure2[type][0]).toEqual(obj1Match); + await driver.close(conn); + }); +}); diff --git a/integration-tests/__tests__/table-analyse.spec.js b/integration-tests/__tests__/table-analyse.spec.js index 04bdda9b9..05847d1ce 100644 --- a/integration-tests/__tests__/table-analyse.spec.js +++ b/integration-tests/__tests__/table-analyse.spec.js @@ -26,7 +26,7 @@ const t1Match = expect.objectContaining({ }), }); -describe('Table analyse tests', () => { +describe.skip('Table analyse', () => { test.each(engines.map(engine => [engine.label, engine]))( 'Table structure - full analysis (%s)', async (label, engine) => { diff --git a/integration-tests/engines.js b/integration-tests/engines.js index 7c216802f..faecc9bbb 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -1,3 +1,11 @@ +const views = { + type: 'views', + create1: 'CREATE VIEW obj1 AS SELECT id FROM t1', + create2: 'CREATE VIEW obj2 AS SELECT id FROM t2', + drop1: 'DROP VIEW obj1', + drop2: 'DROP VIEW obj2', +}; + const engines = [ { label: 'MySQL', @@ -8,6 +16,7 @@ const engines = [ user: 'root', port: 15001, }, + objects: [views], }, { label: 'PostgreSQL', @@ -18,6 +27,7 @@ const engines = [ user: 'postgres', port: 15000, }, + objects: [views], }, { label: 'SQL Server', @@ -28,6 +38,7 @@ const engines = [ user: 'sa', port: 15002, }, + objects: [views], }, { label: 'SQLite', @@ -35,6 +46,7 @@ const engines = [ connection: { engine: 'sqlite@dbgate-plugin-sqlite', }, + objects: [views], }, { label: 'CockroachDB', @@ -44,6 +56,7 @@ const engines = [ user: 'root', port: 15003, }, + objects: [views], }, ];