diff --git a/integration-tests/__tests__/deploy-database.spec.js b/integration-tests/__tests__/deploy-database.spec.js index b75347989..db0a542cf 100644 --- a/integration-tests/__tests__/deploy-database.spec.js +++ b/integration-tests/__tests__/deploy-database.spec.js @@ -1,30 +1,41 @@ /// TODO const { testWrapper } = require('../tools'); +const _ = require('lodash'); const engines = require('../engines'); const deployDb = require('dbgate-api/src/shell/deployDb'); +const { databaseInfoFromYamlModel } = require('dbgate-tools'); -async function testDatabaseDeploy(conn, driver, dbModelYaml, checkDb) { - await deployDb({ - systemConnection: conn, - driver, - loadedDbModel: dbModelYaml, - }); +function checkStructure(structure, model) { + const expected = databaseInfoFromYamlModel(model); + expect(structure.tables.length).toEqual(expected.tables.length); + + for (const [realTable, expectedTable] of _.zip(structure.tables, expected.tables)) { + expect(realTable.columns.length).toEqual(expectedTable.columns.length); + } +} + +async function testDatabaseDeploy(conn, driver, dbModelsYaml) { + for (const loadedDbModel of dbModelsYaml) { + await deployDb({ + systemConnection: conn, + driver, + loadedDbModel, + }); + } const structure = await driver.analyseFull(conn); - checkDb(structure); + checkStructure(structure, dbModelsYaml[dbModelsYaml.length - 1]); } describe('Deploy database', () => { test.each(engines.map(engine => [engine.label, engine]))( - 'Drop referenced table - %s', + 'Deploy database simple - %s', testWrapper(async (conn, driver, engine) => { - await testDatabaseDeploy( - conn, - driver, + await testDatabaseDeploy(conn, driver, [ [ { - name: 'tables.yaml', + name: 't1.table.yaml', json: { name: 't1', columns: [{ name: 'id', type: 'int' }], @@ -32,10 +43,35 @@ describe('Deploy database', () => { }, }, ], - db => { - expect(db.tables.length).toEqual(1); - } - ); + ]); + }) + ); + + test.each(engines.map(engine => [engine.label, engine]))( + 'Deploy database simple twice - %s', + testWrapper(async (conn, driver, engine) => { + await testDatabaseDeploy(conn, driver, [ + [ + { + name: 't1.table.yaml', + json: { + name: 't1', + columns: [{ name: 'id', type: 'int' }], + primaryKey: ['id'], + }, + }, + ], + [ + { + name: 't1.table.yaml', + json: { + name: 't1', + columns: [{ name: 'id', type: 'int' }], + primaryKey: ['id'], + }, + }, + ], + ]); }) ); }); diff --git a/packages/api/src/shell/deployDb.js b/packages/api/src/shell/deployDb.js index c20d9e380..5f28c5794 100644 --- a/packages/api/src/shell/deployDb.js +++ b/packages/api/src/shell/deployDb.js @@ -10,6 +10,7 @@ async function deployDb({ connection, systemConnection, driver, analysedStructur modelFolder, loadedDbModel, }); + console.log('RUNNING DEPLOY SCRIPT:', sql); await executeQuery({ connection, systemConnection, driver, sql }); } diff --git a/packages/tools/src/yamlModelConv.ts b/packages/tools/src/yamlModelConv.ts index e5b66287d..24a51aea2 100644 --- a/packages/tools/src/yamlModelConv.ts +++ b/packages/tools/src/yamlModelConv.ts @@ -65,7 +65,7 @@ function columnInfoFromYaml(column: ColumnInfoYaml, table: TableInfoYaml): Colum columnName: column.name, dataType: column.type, autoIncrement: column.autoIncrement, - notNull: column.notNull, + notNull: column.notNull || (table.primaryKey && table.primaryKey.includes(column.name)), }; return res; } @@ -170,5 +170,8 @@ export function databaseInfoFromYamlModel(files: DatabaseModelFile[]): DatabaseI } } } + + model.tables = tablesYaml.map(table => tableInfoFromYaml(table, tablesYaml)); + return model; }