diff --git a/.github/workflows/run-tests-pro.yaml b/.github/workflows/run-tests-pro.yaml index e7bdba28c..aecafcbb9 100644 --- a/.github/workflows/run-tests-pro.yaml +++ b/.github/workflows/run-tests-pro.yaml @@ -62,6 +62,7 @@ jobs: run: | mkdir screenshots cp ../dbgate-merged/e2e-tests/cypress/screenshots/**/*.png screenshots/ + cp ../dbgate-merged/e2e-tests/cypress/screenshots/*.png screenshots/ - name: Upload E2E screenshots uses: actions/upload-artifact@v4 with: diff --git a/e2e-tests/cypress/e2e/browse-data.cy.js b/e2e-tests/cypress/e2e/browse-data.cy.js index e7987c93e..d1bf1a492 100644 --- a/e2e-tests/cypress/e2e/browse-data.cy.js +++ b/e2e-tests/cypress/e2e/browse-data.cy.js @@ -1,12 +1,47 @@ +Cypress.on('uncaught:exception', (err, runnable) => { + // if the error message matches the one about WorkerGlobalScope importScripts + if (err.message.includes("Failed to execute 'importScripts' on 'WorkerGlobalScope'")) { + // return false to let Cypress know we intentionally want to ignore this error + return false; + } + // otherwise let Cypress throw the error +}); + beforeEach(() => { cy.visit('http://localhost:3000'); cy.viewport(1250, 900); }); describe('Data browser data', () => { + it('Export to data archive', () => { + cy.contains('MySql-connection').click(); + // cy.contains('MyChinook').click(); + // cy.contains('Album').click(); + cy.contains('MyChinook').rightclick(); + cy.contains('Export').click(); + cy.wait(1000); + cy.testid('SourceTargetConfig_buttonCurrentArchive_target').click(); + cy.testid('FormTablesSelect_buttonAll_tables').click(); + // cy.wait(4000); + // cy.contains('All tables').click(); + cy.contains('Run').click(); + cy.contains('Finished job script'); + }); + + it('Data archive editor', () => { + cy.testid('WidgetIconPanel_archive').click(); + cy.contains('Album').click(); + cy.testid('DataGrid_itemFilters').click(); + cy.contains('Let There Be Rock').click(); + cy.contains('Out Of Exile').click({ shiftKey: true }); + cy.contains('Change text case').click(); + cy.contains('AUDIOSLAVE'); + cy.screenshot('freetable'); + }); + it('Load table data', () => { cy.contains('MySql-connection').click(); - cy.contains('Chinook').click(); + cy.contains('MyChinook').click(); cy.contains('Album').click(); cy.contains('Let There Be Rock').click(); cy.contains('Rows: 347'); @@ -16,7 +51,7 @@ describe('Data browser data', () => { it('Filter model', () => { cy.contains('MySql-connection').click(); - cy.contains('Chinook').click(); + cy.contains('MyChinook').click(); cy.testid('SqlObjectList_search').clear().type('album'); cy.contains('Tables (1/11)'); cy.contains('347 rows, InnoDB'); @@ -31,7 +66,7 @@ describe('Data browser data', () => { it('Show raw data', () => { cy.contains('MySql-connection').click(); - cy.contains('Chinook').click(); + cy.contains('MyChinook').click(); cy.contains('Album').rightclick(); cy.contains('Open raw data').click(); cy.contains('Let There Be Rock').click(); diff --git a/e2e-tests/init/browse-data.js b/e2e-tests/init/browse-data.js index 2f88f824a..ab25c1ba1 100644 --- a/e2e-tests/init/browse-data.js +++ b/e2e-tests/init/browse-data.js @@ -1,4 +1,6 @@ const path = require('path'); +const fs = require('fs'); + const dbgateApi = require('dbgate-api'); dbgateApi.initializeApiEnvironment(); const dbgatePluginMysql = require('dbgate-plugin-mysql'); @@ -78,12 +80,100 @@ async function initPostgresDatabase(dbname, inputFile) { }); } +async function initMongoDatabase(dbname, inputDirectory) { + await dbgateApi.executeQuery({ + connection: { + server: process.env.SERVER_mongo, + user: process.env.USER_mongo, + password: process.env.PASSWORD_mongo, + port: process.env.PORT_mongo, + database: dbname, + engine: 'mongo@dbgate-plugin-mongo', + }, + sql: 'db.dropDatabase()', + }); + + for (const file of fs.readdirSync(inputDirectory)) { + const pureName = path.parse(file).name; + const src = await dbgateApi.jsonLinesReader({ fileName: path.join(inputDirectory, file) }); + const dst = await dbgateApi.tableWriter({ + connection: { + server: process.env.SERVER_mongo, + user: process.env.USER_mongo, + password: process.env.PASSWORD_mongo, + port: process.env.PORT_mongo, + database: dbname, + engine: 'mongo@dbgate-plugin-mongo', + }, + pureName, + createIfNotExists: true, + }); + await dbgateApi.copyStream(src, dst); + } + + // await dbgateApi.importDatabase({ + // connection: { + // server: process.env.SERVER_postgres, + // user: process.env.USER_postgres, + // password: process.env.PASSWORD_postgres, + // port: process.env.PORT_postgres, + // database: dbname, + // engine: 'postgres@dbgate-plugin-postgres', + // }, + // inputFile, + // }); +} + +async function initRedisDatabase(inputDirectory) { + await dbgateApi.executeQuery({ + connection: { + server: process.env.SERVER_redis, + user: process.env.USER_redis, + password: process.env.PASSWORD_redis, + port: process.env.PORT_redis, + engine: 'redis@dbgate-plugin-redis', + }, + sql: 'FLUSHALL', + }); + + for (const file of fs.readdirSync(inputDirectory)) { + await dbgateApi.executeQuery({ + connection: { + server: process.env.SERVER_redis, + user: process.env.USER_redis, + password: process.env.PASSWORD_redis, + port: process.env.PORT_redis, + engine: 'redis@dbgate-plugin-redis', + database: 0, + }, + sqlFile: path.join(inputDirectory, file), + // logScriptItems: true, + }); + } + + // await dbgateApi.importDatabase({ + // connection: { + // server: process.env.SERVER_postgres, + // user: process.env.USER_postgres, + // password: process.env.PASSWORD_postgres, + // port: process.env.PORT_postgres, + // database: dbname, + // engine: 'postgres@dbgate-plugin-postgres', + // }, + // inputFile, + // }); +} + async function run() { await initMySqlDatabase('MyChinook', path.resolve(path.join(__dirname, '../data/chinook-mysql.sql'))); // await initMySqlDatabase('Northwind', path.resolve(path.join(__dirname, '../data/northwind-mysql.sql'))); // await initMySqlDatabase('Sakila', path.resolve(path.join(__dirname, '../data/sakila-mysql.sql'))); await initPostgresDatabase('PgChinook', path.resolve(path.join(__dirname, '../data/chinook-postgres.sql'))); + + await initMongoDatabase('MgChinook', path.resolve(path.join(__dirname, '../data/mongo'))); + + await initRedisDatabase(path.resolve(path.join(__dirname, '../data/redis'))); } dbgateApi.runScript(run); diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 77926241f..059b7ca43 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -23,7 +23,7 @@ "start:add-connection": "cd .. && node packer/build/bundle.js --listen-api --run-e2e-tests", "start:portal": "cd .. && env-cmd -f e2e-tests/env/portal/.env node e2e-tests/init/portal.js && env-cmd -f e2e-tests/env/portal/.env node packer/build/bundle.js --listen-api --run-e2e-tests", "start:oauth": "cd .. && env-cmd -f e2e-tests/env/oauth/.env node packer/build/bundle.js --listen-api --run-e2e-tests", - "start:browse-data": "cd .. && env-cmd -f e2e-tests/env/portal/.env node e2e-tests/init/browse-data.js && env-cmd -f e2e-tests/env/browse-data/.env node packer/build/bundle.js --listen-api --run-e2e-tests", + "start:browse-data": "cd .. && env-cmd -f e2e-tests/env/browse-data/.env node e2e-tests/init/browse-data.js && env-cmd -f e2e-tests/env/browse-data/.env node packer/build/bundle.js --listen-api --run-e2e-tests", "test": "start-server-and-test start:add-connection http://localhost:3000 cy:run:add-connection && start-server-and-test start:portal http://localhost:3000 cy:run:portal && start-server-and-test start:oauth http://localhost:3000 cy:run:oauth && start-server-and-test start:browse-data http://localhost:3000 cy:run:browse-data", "test:ci": "yarn test" diff --git a/packages/api/src/utility/processArgs.js b/packages/api/src/utility/processArgs.js index d62cc66f3..f4f9301a7 100644 --- a/packages/api/src/utility/processArgs.js +++ b/packages/api/src/utility/processArgs.js @@ -28,9 +28,9 @@ function getPassArgs() { if (listenApiChild) { res.push('listen-api-child'); } - // if (runE2eTests) { - // res.push('--run-e2e-tests'); - // } + if (runE2eTests) { + res.push('--run-e2e-tests'); + } return res; } diff --git a/packages/web/src/datagrid/DataGrid.svelte b/packages/web/src/datagrid/DataGrid.svelte index 4dc94ad72..42725ae41 100644 --- a/packages/web/src/datagrid/DataGrid.svelte +++ b/packages/web/src/datagrid/DataGrid.svelte @@ -172,7 +172,13 @@ >