|
|
|
/// <reference types="cypress" />
|
|
|
|
// ***********************************************************
|
|
|
|
// This example plugins/index.js can be used to load plugins
|
|
|
|
//
|
|
|
|
// You can change the location of this file or turn off loading
|
|
|
|
// the plugins file with the 'pluginsFile' configuration option.
|
|
|
|
//
|
|
|
|
// You can read more here:
|
|
|
|
// https://on.cypress.io/plugins-guide
|
|
|
|
// ***********************************************************
|
|
|
|
|
|
|
|
// This function is called when a project is opened or re-opened (e.g. due to
|
|
|
|
// the project's config changing)
|
|
|
|
const { rmdir, copyFile } = require("fs");
|
|
|
|
|
|
|
|
// https://stackoverflow.com/questions/61934443/read-excel-files-in-cypress
|
|
|
|
const readXlsx = require("./read-xlsx");
|
|
|
|
const makeServer = require("./server");
|
|
|
|
/**
|
|
|
|
* @type {Cypress.PluginConfig}
|
|
|
|
*/
|
|
|
|
// eslint-disable-next-line no-unused-vars
|
|
|
|
module.exports = (on, config) => {
|
|
|
|
// `on` is used to hook into various events Cypress emits
|
|
|
|
// `config` is the resolved Cypress config
|
|
|
|
|
|
|
|
// register utility tasks to read and parse Excel files
|
|
|
|
on("task", {
|
|
|
|
copyFile() {
|
|
|
|
console.log("copyFile", __dirname);
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
copyFile(
|
|
|
|
"./scripts/cypress/fixtures/quickTest/noco_0_91_7.db",
|
|
|
|
"./packages/nocodb/noco.db",
|
|
|
|
(err) => {
|
|
|
|
if (err) {
|
|
|
|
console.log(err);
|
|
|
|
return reject(err);
|
|
|
|
}
|
|
|
|
resolve(null);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
deleteFolder(folderName) {
|
|
|
|
console.log("deleting folder %s", folderName);
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
rmdir(folderName, { maxRetries: 10, recursive: true }, (err) => {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
|
|
|
|
return reject(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
resolve(null);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
readXlsx: readXlsx.read,
|
|
|
|
readSheetList: readXlsx.sheetList,
|
|
|
|
log(message) {
|
|
|
|
console.log(`##Cypress>> ${message}`);
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
queryDb: (query) => {
|
|
|
|
return queryTestDb(query, config);
|
|
|
|
},
|
|
|
|
sqliteExec: (query) => {
|
|
|
|
_sqliteExec(query);
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
sqliteExecReturnValue: (query) => {
|
|
|
|
return _sqliteExecReturnValue(query);
|
|
|
|
},
|
|
|
|
pgExec: (query) => {
|
|
|
|
_pgExec(query);
|
|
|
|
return null;
|
|
|
|
},
|
|
|
|
pgExecTest: (query) => {
|
|
|
|
return _pgExecTest(query);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
let server, port, close;
|
|
|
|
|
|
|
|
on("before:spec", async (spec) => {
|
|
|
|
// we can customize the server based on the spec about to run
|
|
|
|
const info = await makeServer();
|
|
|
|
// save the server instance information
|
|
|
|
server = info.server;
|
|
|
|
port = info.port;
|
|
|
|
close = info.close;
|
|
|
|
console.log("started the server on port %d", port);
|
|
|
|
});
|
|
|
|
|
|
|
|
on("after:spec", async (spec) => {
|
|
|
|
if (!server) {
|
|
|
|
console.log("no server to close");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
await close();
|
|
|
|
console.log("closed the server running on port %d", port);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
// mysql connection
|
|
|
|
// https://gist.github.com/fityanos/0a345e9e9de498b6c629f78e6b2835f5
|
|
|
|
|
|
|
|
const mysql = require("mysql2");
|
|
|
|
function queryTestDb(query, config) {
|
|
|
|
// creates a new mysql connection using credentials from cypress.json env's
|
|
|
|
const connection = mysql.createConnection(config.env.db);
|
|
|
|
// start connection to db
|
|
|
|
connection.connect();
|
|
|
|
// exec query + disconnect to db as a Promise
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
connection.query(query, (error, results) => {
|
|
|
|
if (error) reject(error);
|
|
|
|
else {
|
|
|
|
connection.end();
|
|
|
|
// console.log(results)
|
|
|
|
return resolve(results);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// sqlite connection
|
|
|
|
const sqlite3 = require("sqlite3").verbose();
|
|
|
|
function _sqliteExecReturnValue(query) {
|
|
|
|
// open the database
|
|
|
|
console.log("Current directory: " + process.cwd());
|
|
|
|
let db = new sqlite3.Database(
|
|
|
|
"./scripts/cypress/fixtures/sqlite-sakila/sakila.db",
|
|
|
|
sqlite3.OPEN_READWRITE,
|
|
|
|
(err) => {
|
|
|
|
if (err) {
|
|
|
|
console.error(err.message);
|
|
|
|
} else {
|
|
|
|
console.log("Connected to the noco xcdb database.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
// exec query + disconnect to db as a Promise
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
db.get(query, [], (err, row) => {
|
|
|
|
db.close();
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
} else {
|
|
|
|
return resolve(row);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function _sqliteExec(query) {
|
|
|
|
// open the database
|
|
|
|
console.log("Current directory: " + process.cwd());
|
|
|
|
let db = new sqlite3.Database(
|
|
|
|
"./scripts/cypress/fixtures/sqlite-sakila/sakila.db",
|
|
|
|
sqlite3.OPEN_READWRITE,
|
|
|
|
(err) => {
|
|
|
|
if (err) {
|
|
|
|
console.error(err.message);
|
|
|
|
} else {
|
|
|
|
console.log("Connected to the noco xcdb database.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
db.serialize(() => {
|
|
|
|
db.run(query);
|
|
|
|
});
|
|
|
|
|
|
|
|
db.close((err) => {
|
|
|
|
if (err) {
|
|
|
|
console.error(err.message);
|
|
|
|
} else {
|
|
|
|
console.log("Close the database connection.");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// pg connection
|
|
|
|
const { Pool, Client } = require("pg");
|
|
|
|
const pg_credentials = {
|
|
|
|
user: "postgres",
|
|
|
|
host: "localhost",
|
|
|
|
database: "postgres",
|
|
|
|
password: "password",
|
|
|
|
port: 5432,
|
|
|
|
};
|
|
|
|
function _pgExec(query) {
|
|
|
|
// open pg client connection
|
|
|
|
const client = new Client(pg_credentials);
|
|
|
|
client.connect();
|
|
|
|
|
|
|
|
// query & terminate
|
|
|
|
client.query(query, (err, res) => {
|
|
|
|
console.log(err, res);
|
|
|
|
client.end();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function _pgExecTest(query, retryCount = 60) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
// open pg client connection
|
|
|
|
const client = new Client(pg_credentials);
|
|
|
|
|
|
|
|
client.connect().catch(() => {
|
|
|
|
client.end();
|
|
|
|
});
|
|
|
|
|
|
|
|
// query & terminate
|
|
|
|
client.query(query, (err, res) => {
|
|
|
|
if (err) {
|
|
|
|
if (retryCount--)
|
|
|
|
return setTimeout(
|
|
|
|
() => _pgExecTest(query, retryCount).then(resolve).catch(reject),
|
|
|
|
2000
|
|
|
|
);
|
|
|
|
else reject(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log("==== success ===", res);
|
|
|
|
resolve(true);
|
|
|
|
client.end();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|