diff --git a/integration-tests/__tests__/object-analyse.spec.js b/integration-tests/__tests__/object-analyse.spec.js index f924f2137..f9fce1dfc 100644 --- a/integration-tests/__tests__/object-analyse.spec.js +++ b/integration-tests/__tests__/object-analyse.spec.js @@ -19,6 +19,10 @@ function flatSourceParameters() { ); } +function flatSourceTriggers() { + return _.flatten(engines.map(engine => (engine.triggers || []).map(trigger => [engine.label, trigger, engine]))); +} + const obj1Match = expect.objectContaining({ pureName: 'obj1', }); @@ -136,4 +140,20 @@ describe('Object analyse', () => { } }) ); + + test.each(flatSourceTriggers())( + 'Test triggers - %s - %s', + testWrapper(async (conn, driver, testName, trigger, engine) => { + for (const sql of initSql) await runCommandOnDriver(conn, driver, sql); + + await runCommandOnDriver(conn, driver, trigger.create); + const structure = await driver.analyseFull(conn); + await runCommandOnDriver(conn, driver, trigger.drop); + + const createdTrigger = structure[trigger.objectTypeField].find(x => x.pureName == trigger.pureName); + expect(createdTrigger).toEqual(expect.objectContaining(trigger.expected)); + }) + ); }); + +console.log(flatSourceTriggers()); diff --git a/integration-tests/engines.js b/integration-tests/engines.js index da452af83..485698d04 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -108,6 +108,30 @@ const engines = [ ], }, ], + triggers: [ + { + testName: 'triggers insert after', + create: 'CREATE TRIGGER obj1 AFTER INSERT ON t1 FOR EACH ROW BEGIN END', + drop: 'DROP TRIGGER obj1;', + objectTypeField: 'triggers', + expected: { + pureName: 'obj1', + eventType: 'INSERT', + triggerTiming: 'AFTER', + }, + }, + { + testName: 'triggers insert before', + create: 'CREATE TRIGGER obj1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN END', + drop: 'DROP TRIGGER obj1;', + objectTypeField: 'triggers', + expected: { + pureName: 'obj1', + eventType: 'INSERT', + triggerTiming: 'BEFORE', + }, + }, + ], }, { label: 'MariaDB', @@ -429,25 +453,49 @@ end;$$`, }, { type: 'functions', - create1: 'CREATE FUNCTION ~obj1 RETURN NUMBER IS v_count NUMBER; \n BEGIN SELECT COUNT(*) INTO v_count FROM ~t1;\n RETURN v_count;\n END ~obj1', - create2: 'CREATE FUNCTION ~obj2 RETURN NUMBER IS v_count NUMBER; \n BEGIN SELECT COUNT(*) INTO v_count FROM ~t2;\n RETURN v_count;\n END ~obj2', + create1: + 'CREATE FUNCTION ~obj1 RETURN NUMBER IS v_count NUMBER; \n BEGIN SELECT COUNT(*) INTO v_count FROM ~t1;\n RETURN v_count;\n END ~obj1', + create2: + 'CREATE FUNCTION ~obj2 RETURN NUMBER IS v_count NUMBER; \n BEGIN SELECT COUNT(*) INTO v_count FROM ~t2;\n RETURN v_count;\n END ~obj2', drop1: 'DROP FUNCTION ~obj1', drop2: 'DROP FUNCTION ~obj2', }, ], + triggers: [ + { + testName: 'triggers after each row', + create: 'CREATE OR REPLACE TRIGGER obj1 AFTER INSERT ON T1 FOR EACH ROW BEGIN END obj1;', + drop: 'DROP TRIGGER obj1;', + objectTypeField: 'triggers', + expected: { + pureName: 'obj1', + eventType: 'AFTER EACH ROW', + }, + }, + { + testName: 'triggers before each row', + create: 'CREATE OR REPLACE TRIGGER obj1 BEFORE INSERT ON T1 FOR EACH ROW BEGIN END obj1;', + drop: 'DROP TRIGGER obj1;', + objectTypeField: 'triggers', + expected: { + pureName: 'obj1', + eventType: 'BEFORE EACH ROW', + }, + }, + ], }, ]; const filterLocal = [ // filter local testing - '-MySQL', - '-MariaDB', - '-PostgreSQL', - '-SQL Server', - '-SQLite', - '-CockroachDB', - '-ClickHouse', - 'Oracle', + 'MySQL', + // '-MariaDB', + // '-PostgreSQL', + // '-SQL Server', + // '-SQLite', + // '-CockroachDB', + // '-ClickHouse', + // 'Oracle', ]; const enginesPostgre = engines.filter(x => x.label == 'PostgreSQL');