mirror of
https://github.com/nocodb/nocodb.git
synced 2026-05-02 13:16:48 +00:00
chore: move cypress-v2 to cypress
This commit is contained in:
279
scripts/cypress/integration/common/00_pre_configurations.js
Normal file
279
scripts/cypress/integration/common/00_pre_configurations.js
Normal file
@@ -0,0 +1,279 @@
|
||||
// Cypress test suite: project pre-configurations
|
||||
//
|
||||
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
staticProjects,
|
||||
roles,
|
||||
isTestSuiteActive,
|
||||
getCurrentMode,
|
||||
isXcdb,
|
||||
setProjectString,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
function prepareSqliteQuery(projId) {
|
||||
let sqliteQuery = [
|
||||
`ALTER TABLE "actor" RENAME TO "${projId}actor"`,
|
||||
`ALTER TABLE "address" RENAME TO "${projId}address"`,
|
||||
`ALTER TABLE "category" RENAME TO "${projId}category"`,
|
||||
`ALTER TABLE "city" RENAME TO "${projId}city"`,
|
||||
`ALTER TABLE "country" RENAME TO "${projId}country"`,
|
||||
`ALTER TABLE "customer" RENAME TO "${projId}customer"`,
|
||||
`ALTER TABLE "film" RENAME TO "${projId}film"`,
|
||||
`ALTER TABLE "film_actor" RENAME TO "${projId}film_actor"`,
|
||||
`ALTER TABLE "film_category" RENAME TO "${projId}film_category"`,
|
||||
`ALTER TABLE "film_text" RENAME TO "${projId}film_text"`,
|
||||
`ALTER TABLE "inventory" RENAME TO "${projId}inventory"`,
|
||||
`ALTER TABLE "language" RENAME TO "${projId}language"`,
|
||||
`ALTER TABLE "payment" RENAME TO "${projId}payment"`,
|
||||
`ALTER TABLE "rental" RENAME TO "${projId}rental"`,
|
||||
`ALTER TABLE "staff" RENAME TO "${projId}staff"`,
|
||||
`ALTER TABLE "store" RENAME TO "${projId}store"`,
|
||||
`CREATE VIEW ${projId}customer_list
|
||||
AS
|
||||
SELECT cu.customer_id AS ID,
|
||||
cu.first_name||' '||cu.last_name AS name,
|
||||
a.address AS address,
|
||||
a.postal_code AS zip_code,
|
||||
a.phone AS phone,
|
||||
"${projId}city".city AS city,
|
||||
"${projId}country".country AS country,
|
||||
case when cu.active=1 then 'active' else '' end AS notes,
|
||||
cu.store_id AS SID
|
||||
FROM "${projId}customer" AS cu JOIN "${projId}address" AS a ON cu.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id
|
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
`CREATE VIEW ${projId}film_list
|
||||
AS
|
||||
SELECT "${projId}film".film_id AS FID,
|
||||
"${projId}film".title AS title,
|
||||
"${projId}film".description AS description,
|
||||
"${projId}category".name AS category,
|
||||
"${projId}film".rental_rate AS price,
|
||||
"${projId}film".length AS length,
|
||||
"${projId}film".rating AS rating,
|
||||
"${projId}actor".first_name||' '||"${projId}actor".last_name AS actors
|
||||
FROM "${projId}category" LEFT JOIN "${projId}film_category" ON "${projId}category".category_id = "${projId}film_category".category_id LEFT JOIN "${projId}film" ON "${projId}Film_category".film_id = "${projId}film".film_id
|
||||
JOIN "${projId}film_actor" ON "${projId}film".film_id = "${projId}film_actor".film_id
|
||||
JOIN "${projId}actor" ON "${projId}film_actor".actor_id = "${projId}actor".actor_id`,
|
||||
`CREATE VIEW ${projId}sales_by_film_category
|
||||
AS
|
||||
SELECT
|
||||
c.name AS category
|
||||
, SUM(p.amount) AS total_sales
|
||||
FROM "${projId}payment" AS p
|
||||
INNER JOIN "${projId}rental" AS r ON p.rental_id = r.rental_id
|
||||
INNER JOIN "${projId}inventory" AS i ON r.inventory_id = i.inventory_id
|
||||
INNER JOIN "${projId}film" AS f ON i.film_id = f.film_id
|
||||
INNER JOIN "${projId}film_category" AS fc ON f.film_id = fc.film_id
|
||||
INNER JOIN "${projId}category" AS c ON fc.category_id = c.category_id
|
||||
GROUP BY c.name`,
|
||||
`CREATE VIEW ${projId}sales_by_store
|
||||
AS
|
||||
SELECT
|
||||
s.store_id
|
||||
,c.city||','||cy.country AS store
|
||||
,m.first_name||' '||m.last_name AS manager
|
||||
,SUM(p.amount) AS total_sales
|
||||
FROM "${projId}payment" AS p
|
||||
INNER JOIN "${projId}rental" AS r ON p.rental_id = r.rental_id
|
||||
INNER JOIN "${projId}inventory" AS i ON r.inventory_id = i.inventory_id
|
||||
INNER JOIN "${projId}store" AS s ON i.store_id = s.store_id
|
||||
INNER JOIN "${projId}address" AS a ON s.address_id = a.address_id
|
||||
INNER JOIN "${projId}city" AS c ON a.city_id = c.city_id
|
||||
INNER JOIN "${projId}country" AS cy ON c.country_id = cy.country_id
|
||||
INNER JOIN "${projId}staff" AS m ON s.manager_staff_id = m.staff_id
|
||||
GROUP BY
|
||||
s.store_id
|
||||
, c.city||','||cy.country
|
||||
, m.first_name||' '||m.last_name`,
|
||||
`CREATE VIEW ${projId}staff_list
|
||||
AS
|
||||
SELECT s.staff_id AS ID,
|
||||
s.first_name||' '||s.last_name AS name,
|
||||
a.address AS address,
|
||||
a.postal_code AS zip_code,
|
||||
a.phone AS phone,
|
||||
"${projId}city".city AS city,
|
||||
"${projId}country".country AS country,
|
||||
s.store_id AS SID
|
||||
FROM "${projId}staff" AS s JOIN "${projId}address" AS a ON s.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id
|
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
// below two are dummy entries to ensure view record exists
|
||||
`CREATE VIEW ${projId}actor_info
|
||||
AS
|
||||
SELECT s.staff_id AS ID,
|
||||
s.first_name||' '||s.last_name AS name,
|
||||
a.address AS address,
|
||||
a.postal_code AS zip_code,
|
||||
a.phone AS phone,
|
||||
"${projId}city".city AS city,
|
||||
"${projId}country".country AS country,
|
||||
s.store_id AS SID
|
||||
FROM "${projId}staff" AS s JOIN "${projId}address" AS a ON s.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id
|
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
`CREATE VIEW ${projId}nice_but_slower_film_list
|
||||
AS
|
||||
SELECT s.staff_id AS ID,
|
||||
s.first_name||' '||s.last_name AS name,
|
||||
a.address AS address,
|
||||
a.postal_code AS zip_code,
|
||||
a.phone AS phone,
|
||||
"${projId}city".city AS city,
|
||||
"${projId}country".country AS country,
|
||||
s.store_id AS SID
|
||||
FROM "${projId}staff" AS s JOIN "${projId}address" AS a ON s.address_id = a.address_id JOIN "${projId}city" ON a.city_id = "${projId}city".city_id
|
||||
JOIN "${projId}country" ON "${projId}city".country_id = "${projId}country".country_id`,
|
||||
// `CREATE VIEW ${projId}actor_info
|
||||
// AS
|
||||
// SELECT
|
||||
// a.actor_id AS actor_id,
|
||||
// a.first_name AS first_name,
|
||||
// a.last_name AS last_name,
|
||||
// GROUP_CONCAT(DISTINCT CONCAT(c.name,
|
||||
// ': ',
|
||||
// (SELECT
|
||||
// GROUP_CONCAT(f.title
|
||||
// ORDER BY f.title ASC
|
||||
// SEPARATOR ', ')
|
||||
// FROM
|
||||
// ((${projId}film f
|
||||
// JOIN ${projId}film_category fc ON ((f.film_id = fc.film_id)))
|
||||
// JOIN ${projId}film_actor fa ON ((f.film_id = fa.film_id)))
|
||||
// WHERE
|
||||
// ((fc.category_id = c.category_id)
|
||||
// AND (fa.actor_id = a.actor_id))))
|
||||
// ORDER BY c.name ASC
|
||||
// SEPARATOR '; ') AS ${projId}film_info
|
||||
// FROM
|
||||
// (((actor a
|
||||
// LEFT JOIN ${projId}film_actor fa ON ((a.actor_id = fa.actor_id)))
|
||||
// LEFT JOIN ${projId}film_category fc ON ((fa.film_id = fc.film_id)))
|
||||
// LEFT JOIN ${projId}category c ON ((fc.category_id = c.category_id)))
|
||||
// GROUP BY a.actor_id , a.first_name , a.last_name`,
|
||||
];
|
||||
return sqliteQuery;
|
||||
}
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
describe(`Project pre-configurations`, () => {
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
it("Admin SignUp", () => {
|
||||
cy.task("log", "This will be output to the terminal");
|
||||
cy.saveLocalStorage();
|
||||
loginPage.signUp(roles.owner.credentials);
|
||||
});
|
||||
|
||||
const createProject = (proj) => {
|
||||
it(`Create ${proj.basic.name} project`, () => {
|
||||
|
||||
// click home button
|
||||
cy.get(".nc-noco-brand-icon").click();
|
||||
cy.get(".ant-table-content").then((obj) => {
|
||||
|
||||
// if project already created, open
|
||||
// else, create a new one
|
||||
if (true == obj[0].innerHTML.includes(proj.basic.name)) {
|
||||
projectsPage.openProject(proj.basic.name);
|
||||
let projId;
|
||||
if (dbType === "xcdb") {
|
||||
let query = `SELECT prefix from nc_projects_v2 where title = "sampleREST"; `;
|
||||
cy.task("sqliteExecReturnValue", query).then(
|
||||
(resolve) => {
|
||||
cy.log(resolve);
|
||||
projId = resolve.prefix;
|
||||
setProjectString(projId);
|
||||
cy.log(projId);
|
||||
}
|
||||
);
|
||||
}
|
||||
} else {
|
||||
projectsPage.createProject(proj.basic, proj.config);
|
||||
cy.wait(5000);
|
||||
if (dbType === "xcdb") {
|
||||
// store base URL- to re-visit and delete form view later
|
||||
let projId;
|
||||
cy.url()
|
||||
.then((url) => {
|
||||
// project prefix code can include "_"
|
||||
// projId = url.split("_")[1].split("?")[0];
|
||||
let startIdx = url.indexOf("_");
|
||||
let endIdx = url.indexOf("?");
|
||||
projId = url.slice(startIdx + 1, endIdx);
|
||||
|
||||
let query = `SELECT prefix from nc_projects_v2 where title = "sampleREST"; `;
|
||||
cy.task("sqliteExecReturnValue", query)
|
||||
.then((resolve) => {
|
||||
cy.log(resolve);
|
||||
projId = resolve.prefix;
|
||||
cy.log(projId);
|
||||
setProjectString(projId);
|
||||
})
|
||||
.then(() => {
|
||||
let query =
|
||||
prepareSqliteQuery(projId);
|
||||
for (
|
||||
let i = 0;
|
||||
i < query.length;
|
||||
i++
|
||||
) {
|
||||
cy.task("sqliteExec", query[i]);
|
||||
cy.wait(1000);
|
||||
}
|
||||
});
|
||||
})
|
||||
.then(() => {
|
||||
cy.log(projId);
|
||||
mainPage.openMetaTab();
|
||||
mainPage.metaSyncValidate(
|
||||
`${projId}actor`,
|
||||
`New table, New relation added`
|
||||
);
|
||||
mainPage.closeMetaTab();
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// hack to disable dark mode
|
||||
cy.fileHook();
|
||||
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
if ("xcdb" === dbType) {
|
||||
createProject(staticProjects.sampleREST);
|
||||
} else if (dbType === "mysql") {
|
||||
createProject(staticProjects.externalREST);
|
||||
} else if (dbType === "postgres") {
|
||||
createProject(staticProjects.pgExternalREST);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
112
scripts/cypress/integration/common/1a_table_operations.js
Normal file
112
scripts/cypress/integration/common/1a_table_operations.js
Normal file
@@ -0,0 +1,112 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${
|
||||
dbType === "xcdb" ? "Meta - " : ""
|
||||
}${apiType.toUpperCase()} api - Table`, () => {
|
||||
before(() => {
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
});
|
||||
|
||||
const name = "tablex";
|
||||
|
||||
// create a new random table
|
||||
it("Create Table", () => {
|
||||
cy.createTable(name);
|
||||
});
|
||||
|
||||
// delete newly created table
|
||||
it("Delete Table", () => {
|
||||
cy.deleteTable(name, dbType);
|
||||
});
|
||||
|
||||
const getAuditCell = (row, col) => {
|
||||
return cy.get("tbody > tr").eq(row).find("td.ant-table-cell").eq(col);
|
||||
};
|
||||
|
||||
it("Open Audit tab", () => {
|
||||
// mainPage.navigationDraw(mainPage.AUDIT).click();
|
||||
settingsPage.openMenu(settingsPage.AUDIT);
|
||||
// wait for column headers to appear
|
||||
//
|
||||
cy.get("thead > tr > th.ant-table-cell").should("have.length", 5);
|
||||
|
||||
cy.wait(3000)
|
||||
|
||||
// Audit table entries
|
||||
// [Header] Operation Type, Operation Sub Type, Description, User, Created
|
||||
// [0] TABLE, DELETED, delete table table-x, user@nocodb.com, ...
|
||||
// [1] TABLE, Created, created table table-x, user@nocodb.com, ...
|
||||
|
||||
getAuditCell(0, 0).contains("TABLE").should("exist");
|
||||
getAuditCell(0, 1).contains("DELETED").should("exist");
|
||||
getAuditCell(0, 3).contains("user@nocodb.com").should("exist");
|
||||
|
||||
getAuditCell(1, 0).contains("TABLE").should("exist");
|
||||
getAuditCell(1, 1).contains("CREATED").should("exist");
|
||||
getAuditCell(1, 3).contains("user@nocodb.com").should("exist");
|
||||
|
||||
settingsPage.closeMenu()
|
||||
});
|
||||
|
||||
it("Table Rename operation", () => {
|
||||
cy.get(".nc-project-tree-tbl-City").should("exist").click();
|
||||
|
||||
cy.renameTable("City", "CityX");
|
||||
|
||||
// verify
|
||||
// 1. Table name in project tree has changed
|
||||
// cy.get(".nc-tbl-title").contains("CityX").should("exist");
|
||||
cy.get(".nc-project-tree-tbl-CityX").should("exist");
|
||||
|
||||
// 2. Table tab name has changed
|
||||
cy.get(`.ant-tabs-tab:contains('CityX'):visible`).should("exist");
|
||||
|
||||
// 3. contents of the table are valid
|
||||
mainPage
|
||||
.getCell(`City`, 1)
|
||||
.contains("A Corua (La Corua)")
|
||||
.should("exist");
|
||||
|
||||
cy.closeTableTab("CityX");
|
||||
|
||||
// revert re-name operation to not impact rest of test suite
|
||||
cy.renameTable("CityX", "City");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
195
scripts/cypress/integration/common/1b_table_column_operations.js
Normal file
195
scripts/cypress/integration/common/1b_table_column_operations.js
Normal file
@@ -0,0 +1,195 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
isTestSuiteActive,
|
||||
isXcdb,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
function addNewRow(index, cellValue) {
|
||||
cy.get(".nc-add-new-row-btn:visible").should("exist");
|
||||
cy.get(".nc-add-new-row-btn").click();
|
||||
// cy.get("#data-table-form-Title > input").first().type(cellValue);
|
||||
cy.get(".nc-expand-col-Title").find(".nc-cell > input")
|
||||
.should("exist")
|
||||
.first()
|
||||
.clear()
|
||||
.type(cellValue);
|
||||
|
||||
cy.getActiveDrawer()
|
||||
.find("button")
|
||||
.contains("Save row")
|
||||
.click({ force: true });
|
||||
|
||||
cy.toastWait("updated successfully");
|
||||
cy.get("body").type("{esc}");
|
||||
mainPage.getCell("Title", index).contains(cellValue).should("exist");
|
||||
}
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Table Column`, () => {
|
||||
const name = "tablex";
|
||||
const colName = "column_name_a";
|
||||
const updatedColName = "updated_column_name";
|
||||
const randVal = "Test@1234.com";
|
||||
const updatedRandVal = "Updated@1234.com";
|
||||
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
cy.createTable(name);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
// delete table
|
||||
after(() => {
|
||||
cy.deleteTable(name, dbType);
|
||||
});
|
||||
|
||||
it("Create Table Column", () => {
|
||||
mainPage.addColumn(colName, name);
|
||||
});
|
||||
|
||||
// edit the newly created column
|
||||
it("Edit table column - change datatype", () => {
|
||||
|
||||
if (!isXcdb()) {
|
||||
cy.get(`th:contains(${colName}) .nc-icon.ant-dropdown-trigger`)
|
||||
.trigger("mouseover", { force: true })
|
||||
.click({ force: true });
|
||||
|
||||
cy.get(".nc-column-edit").click();
|
||||
cy.get(".nc-column-edit").should("not.be.visible");
|
||||
|
||||
// change column type and verify
|
||||
cy.get(".nc-column-type-input").last().click();
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains("LongText").click();
|
||||
cy.get(".ant-btn-primary:visible").contains("Save").click();
|
||||
|
||||
cy.toastWait("Column updated");
|
||||
}
|
||||
});
|
||||
|
||||
// edit the newly created column
|
||||
it("Edit table column - rename", () => {
|
||||
cy.get(`th:contains(${colName}) .nc-icon.ant-dropdown-trigger`)
|
||||
.trigger("mouseover", { force: true })
|
||||
.click({ force: true });
|
||||
|
||||
cy.get(".nc-column-edit").click();
|
||||
cy.get(".nc-column-edit").should("not.be.visible");
|
||||
|
||||
// rename column and verify
|
||||
cy.getActiveMenu().find('input.nc-column-name-input', { timeout: 3000 })
|
||||
.should('exist')
|
||||
.clear()
|
||||
.type(updatedColName);
|
||||
cy.get(".ant-btn-primary:visible").contains("Save").click();
|
||||
|
||||
cy.toastWait("Column updated");
|
||||
|
||||
cy.get(`th:contains(${colName})`).should("not.exist");
|
||||
cy.get(`th:contains(${updatedColName})`).should("exist");
|
||||
});
|
||||
|
||||
// delete the newly created column
|
||||
it("Delete table column", () => {
|
||||
mainPage.deleteColumn(updatedColName);
|
||||
});
|
||||
|
||||
it("Add new row", () => {
|
||||
addNewRow(1, randVal);
|
||||
});
|
||||
|
||||
it("Update row", () => {
|
||||
mainPage
|
||||
.getRow(1)
|
||||
.find('.nc-row-no').should('exist').eq(0).trigger('mouseover', { force: true })
|
||||
cy.get(".nc-row-expand")
|
||||
.click({ force: true });
|
||||
|
||||
cy.get(".nc-expand-col-Title").find(".nc-cell > input")
|
||||
.should("exist")
|
||||
.first()
|
||||
.clear()
|
||||
.type(updatedRandVal);
|
||||
|
||||
cy.getActiveDrawer()
|
||||
.find("button")
|
||||
.contains("Save row")
|
||||
.click({ force: true });
|
||||
|
||||
// partial toast message
|
||||
cy.toastWait("updated successfully");
|
||||
cy.get("body").type("{esc}");
|
||||
|
||||
mainPage.getCell("Title", 1).contains(randVal).should("not.exist");
|
||||
mainPage
|
||||
.getCell("Title", 1)
|
||||
.contains(updatedRandVal)
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it("Delete Row", () => {
|
||||
mainPage
|
||||
.getCell("Title", 1)
|
||||
.contains(updatedRandVal)
|
||||
.rightclick({ force: true });
|
||||
|
||||
// delete row
|
||||
cy.getActiveMenu()
|
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")')
|
||||
.first()
|
||||
.click({ force: true });
|
||||
cy.get("td").contains(randVal).should("not.exist");
|
||||
});
|
||||
|
||||
it("Select all row check-box validation", () => {
|
||||
// add multiple rows
|
||||
addNewRow(1, "a1");
|
||||
addNewRow(2, "a2");
|
||||
addNewRow(3, "a3");
|
||||
addNewRow(4, "a4");
|
||||
addNewRow(5, "a5");
|
||||
|
||||
cy.get('.nc-no-label').should('exist').eq(0).trigger('mouseover', { force: true })
|
||||
cy.get(".ant-checkbox").should('exist')
|
||||
.eq(0).click({ force: true });
|
||||
|
||||
// delete selected rows
|
||||
mainPage.getCell("Title", 3).rightclick({ force: true });
|
||||
cy.getActiveMenu()
|
||||
.contains("Delete Selected Rows")
|
||||
.click({ force: true });
|
||||
|
||||
// verify if everything is wiped off
|
||||
mainPage.getCell("Title", 1).contains("a1").should("not.exist");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
199
scripts/cypress/integration/common/1c_sql_view.js
Normal file
199
scripts/cypress/integration/common/1c_sql_view.js
Normal file
@@ -0,0 +1,199 @@
|
||||
import {
|
||||
isTestSuiteActive,
|
||||
isXcdb,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} SQL Views`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
it(`XCDB: SQL View Column operations`, () => {
|
||||
// Open one of the views & verify validity of first two entries
|
||||
if (isXcdb()) {
|
||||
cy.openViewsTab("CustomerList", 25);
|
||||
|
||||
// Record-1 validation
|
||||
mainPage.getCell(`ID`, 1).contains("1").should("exist");
|
||||
mainPage
|
||||
.getCell(`Name`, 1)
|
||||
.contains("MARY SMITH")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`Address`, 1)
|
||||
.contains("1913 Hanoi Way")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`ZipCode`, 1)
|
||||
.contains("35200")
|
||||
.should("exist");
|
||||
|
||||
// Record-2 validation
|
||||
mainPage.getCell(`ID`, 2).contains("2").should("exist");
|
||||
mainPage
|
||||
.getCell(`Name`, 2)
|
||||
.contains("PATRICIA JOHNSON")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`Address`, 2)
|
||||
.contains("1121 Loja Avenue")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`ZipCode`, 2)
|
||||
.contains("17886")
|
||||
.should("exist");
|
||||
|
||||
// Column operations: Hide
|
||||
mainPage.hideField(`ZipCode`);
|
||||
mainPage.unhideField(`ZipCode`);
|
||||
|
||||
// Column operations: Sort
|
||||
mainPage.sortField("Name", "Z → A");
|
||||
mainPage
|
||||
.getCell(`Name`, 1)
|
||||
.contains("ZACHARY HITE")
|
||||
.should("exist");
|
||||
mainPage.clearSort();
|
||||
|
||||
// Column operations: Filter
|
||||
mainPage.filterField("Name", "is like", "MARY");
|
||||
mainPage
|
||||
.getCell(`Name`, 1)
|
||||
.contains("MARY SMITH")
|
||||
.should("exist");
|
||||
mainPage.filterReset();
|
||||
|
||||
cy.closeViewsTab("CustomerList");
|
||||
}
|
||||
});
|
||||
|
||||
it(`SQL View Column operations`, () => {
|
||||
if (!isXcdb()) {
|
||||
// Open one of the views & verify validity of first two entries
|
||||
|
||||
cy.openViewsTab("ActorInfo", 25);
|
||||
|
||||
// Record-1 validation
|
||||
mainPage.getCell(`ActorId`, 1).contains("1").should("exist");
|
||||
mainPage
|
||||
.getCell(`FirstName`, 1)
|
||||
.contains("PENELOPE")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`LastName`, 1)
|
||||
.contains("GUINESS")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`FilmInfo`, 1)
|
||||
.contains("Animation: ANACONDA CONFESSIONS")
|
||||
.should("exist");
|
||||
|
||||
// Record-2 validation
|
||||
mainPage.getCell(`ActorId`, 2).contains("2").should("exist");
|
||||
mainPage
|
||||
.getCell(`FirstName`, 2)
|
||||
.contains("NICK")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`LastName`, 2)
|
||||
.contains("WAHLBERG")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(`FilmInfo`, 2)
|
||||
.contains("Action: BULL SHAWSHANK")
|
||||
.should("exist");
|
||||
|
||||
// Column operations: Hide
|
||||
mainPage.hideField("FilmInfo");
|
||||
mainPage.unhideField("FilmInfo");
|
||||
|
||||
// Column operations: Sort
|
||||
mainPage.sortField("FirstName", "Z → A");
|
||||
mainPage
|
||||
.getCell(`FirstName`, 1)
|
||||
.contains("ZERO")
|
||||
.should("exist");
|
||||
mainPage.clearSort();
|
||||
|
||||
// Column operations: Filter
|
||||
mainPage.filterField("FirstName", "is like", "PENELOPE");
|
||||
mainPage
|
||||
.getCell(`FirstName`, 1)
|
||||
.contains("PENELOPE")
|
||||
.should("exist");
|
||||
mainPage.filterReset();
|
||||
|
||||
cy.closeViewsTab("ActorInfo");
|
||||
}
|
||||
});
|
||||
|
||||
it.skip(`SQL View List`, () => {
|
||||
// confirm if other views exist
|
||||
//
|
||||
cy.openViewsTab("CustomerList", 25);
|
||||
cy.closeViewsTab("CustomerList");
|
||||
|
||||
cy.openViewsTab("FilmList", 25);
|
||||
cy.closeViewsTab("FilmList");
|
||||
|
||||
cy.openViewsTab("SalesByFilmCategory", 16);
|
||||
cy.closeViewsTab("SalesByFilmCategory");
|
||||
|
||||
if (!isXcdb()) {
|
||||
cy.openViewsTab("NicerButSlowerFilmList", 25);
|
||||
cy.closeViewsTab("NicerButSlowerFilmList");
|
||||
|
||||
// SalesByStore && StaffList contain no entries. Hence marking row count to 0
|
||||
cy.openViewsTab("SalesByStore", 0);
|
||||
cy.closeViewsTab("SalesByStore");
|
||||
|
||||
cy.openViewsTab("StaffList", 0);
|
||||
cy.closeViewsTab("StaffList");
|
||||
} else {
|
||||
cy.openViewsTab("SalesByStore", 2);
|
||||
cy.closeViewsTab("SalesByStore");
|
||||
|
||||
cy.openViewsTab("StaffList", 2);
|
||||
cy.closeViewsTab("StaffList");
|
||||
}
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// void
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
@@ -0,0 +1,168 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
isTestSuiteActive,
|
||||
isXcdb,
|
||||
getProjectString,
|
||||
isPostgres,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} Table/view drag-drop reorder`, () => {
|
||||
function validateTreeField(index, tblName) {
|
||||
cy.get(`:nth-child(${index}) > .v-list-item__title > .caption`)
|
||||
.contains(tblName)
|
||||
.should("exist");
|
||||
}
|
||||
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
});
|
||||
|
||||
/*
|
||||
Original order of list items
|
||||
Actor, Address, Category, City, Country, Customer, FIlm, FilmText, Language, Payment, Rental Staff
|
||||
ActorInfo, Customer List, Film List, NiceButSlowerFilm List, SalesByFilmCategory, SalesByStore, Staff List
|
||||
*/
|
||||
|
||||
it(`Table & SQL View list, Drag/drop`, () => {
|
||||
// expand tree-view menu
|
||||
// cy.get(".nc-project-tree")
|
||||
// .find(".v-list-item__title:contains(Tables)", { timeout: 10000 })
|
||||
// .should("exist")
|
||||
// .first()
|
||||
// .click({ force: true });
|
||||
|
||||
validateTreeField(1, "Actor");
|
||||
|
||||
// move Actor field down, above Staff (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor").drag(
|
||||
".nc-child-draggable-icon-Film"
|
||||
);
|
||||
|
||||
validateTreeField(7, "Actor");
|
||||
|
||||
// // move ActorInfo (View) field up to first place (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Address"
|
||||
// );
|
||||
|
||||
// validateTreeField(1, "ActorInfo");
|
||||
// validateTreeField(2, "Address");
|
||||
// validateTreeField(8, "Actor");
|
||||
|
||||
// // restore ActorInfo field (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Staff"
|
||||
// );
|
||||
|
||||
// restore Actor field (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor").drag(
|
||||
".nc-child-draggable-icon-Address"
|
||||
);
|
||||
|
||||
validateTreeField(1, "Actor");
|
||||
validateTreeField(2, "Address");
|
||||
|
||||
// undo project-tree expand operation
|
||||
cy.get(".nc-project-tree")
|
||||
.find(".v-list-item__title:contains(Tables)", {
|
||||
timeout: 10000,
|
||||
})
|
||||
.should("exist")
|
||||
.first()
|
||||
.click({ force: true });
|
||||
});
|
||||
|
||||
// create new view as specified by 'viewType'
|
||||
// can be - grid/ gallery/ form
|
||||
// wait for toast to appear
|
||||
//
|
||||
function createView(viewType) {
|
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click();
|
||||
|
||||
cy.snipActiveModal(`Modal_createView_${viewType}`);
|
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal().find("button:contains(Submit)").click();
|
||||
|
||||
cy.toastWait("View created successfully");
|
||||
}
|
||||
|
||||
// verify view 'viewName' to be present at position 'index'
|
||||
// index starts from 0
|
||||
function validateViewField(index, viewName) {
|
||||
cy.get(".nc-view-item.nc-draggable-child")
|
||||
.eq(index)
|
||||
.contains(viewName)
|
||||
.should("exist");
|
||||
}
|
||||
|
||||
it(`View (Gallery/ Grid/ Form) re-order`, () => {
|
||||
cy.openTableTab("Actor", 25);
|
||||
|
||||
// create 3 views, use default names
|
||||
// Actor1, Actor2, Actor3
|
||||
createView("grid");
|
||||
createView("gallery");
|
||||
createView("form");
|
||||
|
||||
// validate position order
|
||||
validateViewField(0, "Actor");
|
||||
validateViewField(1, "Actor1");
|
||||
validateViewField(2, "Actor2");
|
||||
validateViewField(3, "Actor3");
|
||||
|
||||
// move Actor3 field on top (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor3").drag(
|
||||
`.nc-child-draggable-icon-${
|
||||
isXcdb() ? `${getProjectString()}` : ``
|
||||
}actor`
|
||||
);
|
||||
|
||||
// validate new position order, Actor3 on top
|
||||
validateViewField(0, "Actor3");
|
||||
validateViewField(1, "Actor");
|
||||
validateViewField(2, "Actor1");
|
||||
validateViewField(3, "Actor2");
|
||||
|
||||
// delete all created views
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.toastWait("View deleted successfully");
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.toastWait("View deleted successfully");
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.toastWait("View deleted successfully");
|
||||
|
||||
// wind up
|
||||
cy.closeTableTab("Actor");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
@@ -0,0 +1,172 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
isTestSuiteActive,
|
||||
isXcdb,
|
||||
getProjectString,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} Table/view drag-drop reorder`, () => {
|
||||
function validateTreeField(index, tblName) {
|
||||
cy.get(`.nc-project-tree-tbl`).eq(index-1).find('.nc-tbl-title').contains(tblName).should('exist');
|
||||
}
|
||||
|
||||
/*
|
||||
Original order of list items
|
||||
Actor, Address, Category, City, Country, Customer, FIlm, FilmText, Language, Payment, Rental Staff
|
||||
ActorInfo, Customer List, Film List, NiceButSlowerFilm List, SalesByFilmCategory, SalesByStore, Staff List
|
||||
*/
|
||||
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
});
|
||||
|
||||
it(`Table & SQL View list, Drag/drop`, () => {
|
||||
// expand tree-view menu
|
||||
// cy.get(".nc-project-tree")
|
||||
// .find(".v-list-item__title:contains(Tables)", { timeout: 10000 })
|
||||
// .should("exist")
|
||||
// .first()
|
||||
// .click({ force: true });
|
||||
|
||||
validateTreeField(1, "Actor");
|
||||
|
||||
// move Actor field down, above Staff (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor").click({ force: true });
|
||||
cy.get(".nc-child-draggable-icon-Actor").should("be.visible");
|
||||
cy.get(".nc-child-draggable-icon-Actor").drag(
|
||||
".nc-child-draggable-icon-Staff", { force: true }
|
||||
);
|
||||
|
||||
validateTreeField(12, "Actor");
|
||||
|
||||
// // move ActorInfo (View) field up to first place (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Address"
|
||||
// );
|
||||
//
|
||||
// validateTreeField(1, "ActorInfo");
|
||||
// validateTreeField(2, "Address");
|
||||
// validateTreeField(13, "Actor");
|
||||
//
|
||||
// // restore ActorInfo field (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-ActorInfo").drag(
|
||||
// ".nc-child-draggable-icon-Actor"
|
||||
// );
|
||||
//
|
||||
// // restore Actor field (drag, drop)
|
||||
// cy.get(".nc-child-draggable-icon-Actor").drag(
|
||||
// ".nc-child-draggable-icon-Address"
|
||||
// );
|
||||
//
|
||||
// validateTreeField(1, "Actor");
|
||||
// validateTreeField(2, "Address");
|
||||
// validateTreeField(12, "Staff");
|
||||
// validateTreeField(13, "ActorInfo");
|
||||
// validateTreeField(14, "CustomerList");
|
||||
//
|
||||
// // undo project-tree expand operation
|
||||
// cy.get(".nc-project-tree")
|
||||
// .should("exist")
|
||||
// .first()
|
||||
// .click({ force: true });
|
||||
});
|
||||
|
||||
// create new view as specified by 'viewType'
|
||||
// can be - grid/ gallery/ form
|
||||
// wait for toast to appear
|
||||
//
|
||||
function createView(viewType) {
|
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click();
|
||||
|
||||
cy.snipActiveModal(`Modal_createView_${viewType}`);
|
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal().find("button:contains(Submit)").click();
|
||||
|
||||
cy.toastWait("View created successfully");
|
||||
}
|
||||
|
||||
// verify view 'viewName' to be present at position 'index'
|
||||
// index starts from 0
|
||||
function validateViewField(index, viewName) {
|
||||
cy.get(".nc-view-item.nc-draggable-child")
|
||||
.eq(index)
|
||||
.contains(viewName)
|
||||
.should("exist");
|
||||
}
|
||||
|
||||
// exclude@ncv2: to be investigated & fixed
|
||||
it.skip(`View (Gallery/ Grid/ Form) re-order`, () => {
|
||||
cy.openTableTab("Actor", 25);
|
||||
|
||||
// create 3 views, use default names
|
||||
// Actor1, Actor2, Actor3
|
||||
createView("grid");
|
||||
createView("gallery");
|
||||
createView("form");
|
||||
|
||||
// validate position order
|
||||
validateViewField(0, "Actor");
|
||||
validateViewField(1, "Actor1");
|
||||
validateViewField(2, "Actor2");
|
||||
validateViewField(3, "Actor3");
|
||||
|
||||
// move Actor3 field on top (drag, drop)
|
||||
cy.get(".nc-child-draggable-icon-Actor3").drag(
|
||||
`.nc-child-draggable-icon-${
|
||||
isXcdb() ? `${getProjectString()}` : ``
|
||||
}Actor`
|
||||
);
|
||||
|
||||
// validate new position order, Actor3 on top
|
||||
validateViewField(0, "Actor3");
|
||||
validateViewField(1, "Actor");
|
||||
validateViewField(2, "Actor1");
|
||||
validateViewField(3, "Actor2");
|
||||
|
||||
// delete all created views
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.toastWait("View deleted successfully");
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.toastWait("View deleted successfully");
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.toastWait("View deleted successfully");
|
||||
|
||||
// wind up
|
||||
cy.closeTableTab("Actor");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
200
scripts/cypress/integration/common/1e_meta_sync.js
Normal file
200
scripts/cypress/integration/common/1e_meta_sync.js
Normal file
@@ -0,0 +1,200 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
import {
|
||||
getCurrentMode,
|
||||
getProjectString,
|
||||
isTestSuiteActive,
|
||||
isXcdb,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
let projPrefix = `sakila.`;
|
||||
let dbCmd = `queryDb`;
|
||||
let tblDisplayPrefix = ``;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Meta Sync`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
if (isXcdb()) {
|
||||
cy.log(getProjectString());
|
||||
projPrefix = `${getProjectString()}`;
|
||||
dbCmd = `sqliteExec`;
|
||||
tblDisplayPrefix = `${getProjectString()}`;
|
||||
}
|
||||
mainPage.tabReset();
|
||||
mainPage.openMetaTab();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// mainPage.closeMetaTab();
|
||||
});
|
||||
|
||||
it(`Create table`, () => {
|
||||
// Create Table
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`CREATE TABLE ${projPrefix}table1 (id INT NOT NULL, col1 INT NULL, PRIMARY KEY (id))`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`CREATE TABLE ${projPrefix}table2 (id INT NOT NULL, col1 INT NULL, PRIMARY KEY (id))`
|
||||
);
|
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table");
|
||||
});
|
||||
|
||||
it(`Add relation`, () => {
|
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
if (!isXcdb()) {
|
||||
// Add relation (FK)
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`ALTER TABLE ${projPrefix}table1 ADD INDEX fk1_idx (col1 ASC) VISIBLE`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`ALTER TABLE ${projPrefix}table1 ADD CONSTRAINT fk1 FOREIGN KEY (col1) REFERENCES ${projPrefix}table2 (id) ON DELETE NO ACTION ON UPDATE NO ACTION`
|
||||
);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New relation added"
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
it(`Remove relation`, () => {
|
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
if (!isXcdb()) {
|
||||
// Remove relation (FK)
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`ALTER TABLE ${projPrefix}table1 DROP FOREIGN KEY fk1`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`ALTER TABLE ${projPrefix}table1 DROP INDEX fk1_idx`
|
||||
);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"Relation removed"
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
it(`Add column`, () => {
|
||||
// Add Column
|
||||
let queryString = `ALTER TABLE ${projPrefix}table1 ADD COLUMN newCol VARCHAR(45) NULL AFTER id`;
|
||||
if (isXcdb())
|
||||
queryString = `ALTER TABLE ${projPrefix}table1 ADD COLUMN newCol TEXT NULL`;
|
||||
cy.task(dbCmd, queryString);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New column(newCol)"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Rename column`, () => {
|
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE ${projPrefix}table1 CHANGE COLUMN newCol newColName VARCHAR(45) NULL DEFAULT NULL`;
|
||||
if (isXcdb())
|
||||
queryString = `ALTER TABLE ${projPrefix}table1 RENAME COLUMN newCol TO newColName`;
|
||||
cy.task(dbCmd, queryString);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New column(newColName), Column removed(newCol)"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Delete column`, () => {
|
||||
// Remove Column
|
||||
// to be fixed for SQLITE
|
||||
if (!isXcdb()) {
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`ALTER TABLE ${projPrefix}table1 DROP COLUMN newColName`
|
||||
);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"Column removed(newColName)"
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
it(`Delete table`, () => {
|
||||
// DROP TABLE
|
||||
cy.task(dbCmd, `DROP TABLE ${projPrefix}table1`);
|
||||
cy.task(dbCmd, `DROP TABLE ${projPrefix}table2`);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"Table removed"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Hide, Filter, Sort`, () => {
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`CREATE TABLE ${projPrefix}table1 (id INT NOT NULL, col1 INT NULL, col2 INT NULL, col3 INT NULL, col4 INT NULL, PRIMARY KEY (id))`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO ${projPrefix}table1 (id, col1, col2, col3, col4) VALUES (1,1,1,1,1), (2,2,2,2,2), (3,3,3,3,3), (4,4,4,4,4), (5,5,5,5,5), (6,6,6,6,6), (7,7,7,7,7), (8,8,8,8,8), (9,9,9,9,9);`
|
||||
);
|
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table");
|
||||
mainPage.closeMetaTab();
|
||||
|
||||
cy.openTableTab("Table1", 9);
|
||||
mainPage.hideField("Col1");
|
||||
mainPage.sortField("Col1", "9 → 1");
|
||||
mainPage.filterField(`Col1`, ">=", "5");
|
||||
cy.get(".nc-grid-row").should("have.length", 5);
|
||||
cy.closeTableTab("Table1");
|
||||
});
|
||||
|
||||
it(`Verify`, () => {
|
||||
mainPage.openMetaTab();
|
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE ${projPrefix}table1 CHANGE COLUMN col1 newCol INT NULL DEFAULT NULL`;
|
||||
if (isXcdb())
|
||||
queryString = `ALTER TABLE ${projPrefix}table1 RENAME COLUMN col1 TO newCol`;
|
||||
cy.task(dbCmd, queryString);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New column(newCol), Column removed(col1)"
|
||||
);
|
||||
mainPage.closeMetaTab();
|
||||
|
||||
cy.openTableTab("Table1", 9);
|
||||
cy.deleteTable("Table1", dbType);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
207
scripts/cypress/integration/common/1e_pg_meta_sync.js
Normal file
207
scripts/cypress/integration/common/1e_pg_meta_sync.js
Normal file
@@ -0,0 +1,207 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
import {
|
||||
getCurrentMode,
|
||||
getProjectString,
|
||||
isTestSuiteActive,
|
||||
isXcdb,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
let projPrefix = `sakila.`;
|
||||
let dbCmd = `pgExec`;
|
||||
let tblDisplayPrefix = ``;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Meta Sync`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
mainPage.tabReset();
|
||||
mainPage.openMetaTab();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// mainPage.closeMetaTab();
|
||||
});
|
||||
|
||||
it(`Create table`, () => {
|
||||
cy.log("this works");
|
||||
// Create Table
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`CREATE TABLE table1( id INT NOT NULL, col1 INT NOT NULL, PRIMARY KEY(id))`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`CREATE TABLE table2( id INT NOT NULL, col1 INT NOT NULL, PRIMARY KEY(id))`
|
||||
);
|
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table");
|
||||
});
|
||||
|
||||
it(`Add relation`, () => {
|
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
// Add relation (FK)
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`ALTER TABLE table1 ADD CONSTRAINT fk_idx FOREIGN KEY (id) REFERENCES table2 (id);`
|
||||
);
|
||||
// cy.task(
|
||||
// dbCmd,
|
||||
// `ALTER TABLE ${projPrefix}table1 ADD CONSTRAINT fk1 FOREIGN KEY (col1) REFERENCES ${projPrefix}table2 (id) ON DELETE NO ACTION ON UPDATE NO ACTION`
|
||||
// );
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New relation added"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Remove relation`, () => {
|
||||
// working with relations in sqlite requires table to be deleted & recreated
|
||||
//
|
||||
// Remove relation (FK)
|
||||
cy.task(dbCmd, `ALTER TABLE table1 DROP CONSTRAINT fk_idx`);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"Relation removed"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Add column`, () => {
|
||||
// Add Column
|
||||
let queryString = `ALTER TABLE table1 ADD COLUMN newCol INT`;
|
||||
cy.task(dbCmd, queryString);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New column(newcol)"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Rename column`, () => {
|
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE table1 RENAME COLUMN newCol TO newColName`;
|
||||
cy.task(dbCmd, queryString);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New column(newcolname), Column removed(newcol)"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Delete column`, () => {
|
||||
// Remove Column
|
||||
cy.task(dbCmd, `ALTER TABLE table1 DROP COLUMN newColName`);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"Column removed(newcolname)"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Delete table`, () => {
|
||||
// DROP TABLE
|
||||
cy.task(dbCmd, `DROP TABLE IF EXISTS table1`);
|
||||
cy.task(dbCmd, `DROP TABLE IF EXISTS table2`);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"Table removed"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Hide, Filter, Sort`, () => {
|
||||
// kludge: bulk insert fail.
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`CREATE TABLE table1( id INT NOT NULL, col1 INT NOT NULL, col2 INT NOT NULL, col3 INT NOT NULL, col4 INT NOT NULL, PRIMARY KEY(id))`
|
||||
);
|
||||
cy.wait(3000);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (1,1,1,1,1)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (2,2,2,2,2)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (3,3,3,3,3)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (4,4,4,4,4)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (5,5,5,5,5)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (6,6,6,6,6)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (7,7,7,7,7)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (8,8,8,8,8)`
|
||||
);
|
||||
cy.task(
|
||||
dbCmd,
|
||||
`INSERT INTO table1 (id, col1, col2, col3, col4) VALUES (9,9,9,9,9)`
|
||||
);
|
||||
mainPage.metaSyncValidate(`${tblDisplayPrefix}table1`, "New table");
|
||||
mainPage.closeMetaTab();
|
||||
|
||||
cy.openTableTab("Table1", 9);
|
||||
mainPage.hideField("Col1");
|
||||
mainPage.sortField("Col1", "9 → 1");
|
||||
mainPage.filterField(`Col1`, ">=", "5");
|
||||
cy.get(".nc-grid-row").should("have.length", 5);
|
||||
cy.closeTableTab("Table1");
|
||||
});
|
||||
|
||||
it(`Verify`, () => {
|
||||
mainPage.openMetaTab();
|
||||
// Rename Column
|
||||
let queryString = `ALTER TABLE table1 RENAME COLUMN col1 TO newcol`;
|
||||
cy.task(dbCmd, queryString);
|
||||
mainPage.metaSyncValidate(
|
||||
`${tblDisplayPrefix}table1`,
|
||||
"New column(newcol), Column removed(col1)"
|
||||
);
|
||||
mainPage.closeMetaTab();
|
||||
|
||||
cy.openTableTab("Table1", 9);
|
||||
// kludge- delete table triggered post sql backend operations doesnt carry any trigger toast
|
||||
cy.deleteTable("Table1", "mysql");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
@@ -0,0 +1,131 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Table: belongs to, link record`, () => {
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
//
|
||||
// // kludge: wait for page load to finish
|
||||
// cy.wait(1000);
|
||||
// // close team & auth tab
|
||||
// cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
// cy.wait(1000);
|
||||
|
||||
cy.openTableTab("Country", 25);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("City");
|
||||
});
|
||||
|
||||
it("URL validation", () => {
|
||||
// column name validation
|
||||
// cy.get(`.project-tab:contains(Country):visible`).should("exist");
|
||||
// URL validation
|
||||
cy.url().should("contain", `table/Country`);
|
||||
});
|
||||
|
||||
it("Grid cell chip content validation", () => {
|
||||
// grid cell content validation
|
||||
mainPage.getCell("City List", 1)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("Kabul")
|
||||
.should('exist');
|
||||
mainPage.getCell("City List", 2)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("Batna")
|
||||
.should('exist');
|
||||
mainPage.getCell("City List", 2)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("Bchar")
|
||||
.should('exist');
|
||||
mainPage.getCell("City List", 2)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("Skikda")
|
||||
.should('exist');
|
||||
})
|
||||
|
||||
it("Expand has-many column", () => {
|
||||
mainPage.getCell("City List", 1).should("exist").trigger("mouseover").click();
|
||||
cy.get('.nc-action-icon').eq(0).should('exist').click({ force: true });
|
||||
});
|
||||
|
||||
it("Expand Link record, validate", () => {
|
||||
cy.getActiveModal()
|
||||
.find("button:contains(Link to 'City')")
|
||||
.click()
|
||||
.then(() => {
|
||||
|
||||
// Link record form validation
|
||||
cy.getActiveModal().contains("Link record").should("exist");
|
||||
cy.getActiveModal()
|
||||
.find(".nc-reload")
|
||||
.should("exist");
|
||||
cy.getActiveModal()
|
||||
.find('button:contains("Add new record")')
|
||||
.should("exist");
|
||||
cy.getActiveModal()
|
||||
.find(".ant-card")
|
||||
.eq(0)
|
||||
.contains("A Corua (La Corua)")
|
||||
.should("exist");
|
||||
|
||||
cy.getActiveModal()
|
||||
.find("button.ant-modal-close")
|
||||
.click();
|
||||
// .then(() => {
|
||||
// cy.getActiveModal()
|
||||
// .find("button.ant-modal-close")
|
||||
// .click();
|
||||
// });
|
||||
});
|
||||
});
|
||||
|
||||
it("Belongs to column, validate", () => {
|
||||
cy.closeTableTab("Country");
|
||||
cy.openTableTab("City", 25);
|
||||
cy.url().should("contain", `table/City`);
|
||||
|
||||
// grid cell content validation
|
||||
mainPage.getCell("Country", 1)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("Spain")
|
||||
.should('exist');
|
||||
mainPage.getCell("Country", 2)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("Saudi Arabia")
|
||||
.should('exist');
|
||||
})
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
145
scripts/cypress/integration/common/2b_table_with_m2m_column.js
Normal file
145
scripts/cypress/integration/common/2b_table_with_m2m_column.js
Normal file
@@ -0,0 +1,145 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - M2M Column validation`, () => {
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
|
||||
// // kludge: wait for page load to finish
|
||||
// cy.wait(1000);
|
||||
// // close team & auth tab
|
||||
// cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
// cy.wait(1000);
|
||||
|
||||
cy.openTableTab("Actor", 25);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("Actor");
|
||||
});
|
||||
|
||||
it("Table column header, URL validation", () => {
|
||||
// column name validation
|
||||
// cy.get(`.project-tab:contains(Actor):visible`).should("exist");
|
||||
// URL validation
|
||||
cy.url().should("contain", `table/Actor`);
|
||||
});
|
||||
|
||||
it("M2m chip content validation on grid", () => {
|
||||
// grid m2m content validation
|
||||
mainPage.getCell("Film List", 1)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("ACADEMY DINOSAUR")
|
||||
.should('exist');
|
||||
mainPage.getCell("Film List", 1)
|
||||
.find('.nc-virtual-cell > .chips-wrapper > .chips > .group > .name')
|
||||
.contains("ANACONDA CONFESSIONS")
|
||||
.should('exist');
|
||||
});
|
||||
|
||||
it("Expand m2m column", () => {
|
||||
// expand first row
|
||||
mainPage.getCell("Film List", 1).should("exist").trigger("mouseover").click();
|
||||
cy.get('.nc-action-icon').eq(0).should('exist').click({ force: true });
|
||||
|
||||
// GUI-v2 Kludge:
|
||||
// validations
|
||||
// cy.getActiveModal().contains("Film").should("exist");
|
||||
// cy.getActiveModal().find("button.mdi-reload").should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find("button:contains(Link to 'Film')")
|
||||
// .should("exist");
|
||||
cy.getActiveModal()
|
||||
.find(".ant-card")
|
||||
.eq(0)
|
||||
.contains("ACADEMY DINOSAUR")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it('Expand "Link to" record, validate', () => {
|
||||
cy.getActiveModal()
|
||||
.find("button:contains(Link to 'Film')")
|
||||
.click()
|
||||
.then(() => {
|
||||
// Link record form validation
|
||||
cy.getActiveModal().contains("Link record").should("exist");
|
||||
cy.getActiveModal()
|
||||
.find(".nc-reload")
|
||||
.should("exist");
|
||||
cy.getActiveModal()
|
||||
.find('button:contains("Add new record")')
|
||||
.should("exist");
|
||||
cy.getActiveModal()
|
||||
.find(".ant-card")
|
||||
.eq(0)
|
||||
.contains("ACE GOLDFINGER")
|
||||
.should("exist");
|
||||
cy.getActiveModal().find("button.ant-modal-close").click();
|
||||
});
|
||||
});
|
||||
|
||||
it("Expand first linked card, validate", () => {
|
||||
|
||||
// expand first row
|
||||
mainPage.getCell("Film List", 1).should("exist").trigger("mouseover").click();
|
||||
cy.get('.nc-action-icon').eq(0).should('exist').click({ force: true });
|
||||
|
||||
cy.getActiveModal()
|
||||
.find(".ant-card")
|
||||
.eq(0)
|
||||
.contains("ACADEMY DINOSAUR", { timeout: 2000 })
|
||||
.click()
|
||||
.then(() => {
|
||||
// wait to ensure pop up appears before we proceed further
|
||||
cy.wait(1000)
|
||||
// Link card validation
|
||||
cy.getActiveDrawer()
|
||||
.find(".text-lg")
|
||||
.contains("ACADEMY DINOSAUR")
|
||||
.should("exist");
|
||||
cy.getActiveDrawer()
|
||||
.find('button:contains("Save row")')
|
||||
.should("exist");
|
||||
cy.getActiveDrawer()
|
||||
.find('button:contains("Cancel")')
|
||||
.should("exist");
|
||||
|
||||
cy.getActiveDrawer()
|
||||
.find('button:contains("Cancel")')
|
||||
.click();
|
||||
cy.getActiveModal().find("button.ant-modal-close").click();
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
@@ -0,0 +1,243 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Filter, Fields, Sort`, () => {
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
|
||||
// // kludge: wait for page load to finish
|
||||
// cy.wait(1000);
|
||||
// // close team & auth tab
|
||||
// cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
// cy.wait(1000);
|
||||
|
||||
// open country table
|
||||
cy.openTableTab("Country", 25);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
describe(`Pagination`, () => {
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
// check pagination
|
||||
it("Check country table - Pagination", () => {
|
||||
cy.get(".nc-pagination").should("exist");
|
||||
|
||||
// verify > pagination option
|
||||
mainPage.getPagination(">").click();
|
||||
mainPage
|
||||
.getPagination(2)
|
||||
.should("have.class", "ant-pagination-item-active");
|
||||
|
||||
// verify < pagination option
|
||||
mainPage.getPagination("<").click();
|
||||
mainPage
|
||||
.getPagination(1)
|
||||
.should("have.class", "ant-pagination-item-active");
|
||||
});
|
||||
});
|
||||
|
||||
describe(`Row operations`, () => {
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
// create new row using + button in header
|
||||
//
|
||||
it("Add row using tool header button", () => {
|
||||
// add a row to end of Country table
|
||||
cy.get(".nc-add-new-row-btn").click();
|
||||
cy.wait(1000);
|
||||
cy.get(".nc-expand-col-Country").find(".nc-cell > input").first().type("Test Country");
|
||||
cy.getActiveDrawer()
|
||||
.find(".ant-btn-primary")
|
||||
.contains("Save row")
|
||||
.click();
|
||||
|
||||
// cy.get("#data-table-form-Country > input")
|
||||
// .first()
|
||||
// .type("Test Country");
|
||||
// cy.contains("Save row").filter("button").click();
|
||||
|
||||
cy.toastWait("updated successfully");
|
||||
cy.getActiveDrawer()
|
||||
.find(".ant-btn")
|
||||
.contains("Cancel")
|
||||
.click();
|
||||
|
||||
// verify
|
||||
mainPage.getPagination(5).click();
|
||||
// kludge: flicker on load
|
||||
cy.wait(3000)
|
||||
mainPage
|
||||
.getCell("Country", 10)
|
||||
.contains("Test Country")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
// delete single row
|
||||
//
|
||||
it("Delete Row", () => {
|
||||
// delete row added in previous step
|
||||
mainPage.getCell("Country", 10).rightclick();
|
||||
cy.getActiveMenu().contains("Delete Row").click();
|
||||
|
||||
// cy.toastWait('Deleted row successfully')
|
||||
|
||||
// verify
|
||||
cy.get(`:nth-child(10) > [data-title="Country"]`).should("not.exist");
|
||||
});
|
||||
|
||||
// create new row using right click menu option
|
||||
//
|
||||
it.skip("Add row using rightclick menu option", () => {
|
||||
// Temporary
|
||||
mainPage.getPagination(5).click();
|
||||
|
||||
mainPage.getCell("Country", 9).rightclick({ force: true });
|
||||
cy.getActiveMenu()
|
||||
.contains("Insert New Row")
|
||||
.click({ force: true });
|
||||
mainPage
|
||||
.getCell("Country", 10)
|
||||
.dblclick()
|
||||
.find("input")
|
||||
.type("Test Country-1{enter}");
|
||||
|
||||
mainPage.getCell("Country", 10).rightclick({ force: true });
|
||||
cy.getActiveMenu()
|
||||
.contains("Insert New Row")
|
||||
.click({ force: true });
|
||||
mainPage
|
||||
.getCell("Country", 11)
|
||||
.dblclick()
|
||||
.find("input")
|
||||
.type("Test Country-2{enter}");
|
||||
|
||||
// GUI-v2 Kludge:
|
||||
// to move cursor away from input field; enter key is not recognized
|
||||
// mainPage.getCell("Country", 10).click()
|
||||
|
||||
// verify
|
||||
mainPage
|
||||
.getCell("Country", 10)
|
||||
.contains("Test Country-1")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell("Country", 11)
|
||||
.contains("Test Country-2")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
// delete selected rows (multiple)
|
||||
//
|
||||
it.skip("Delete Selected", () => {
|
||||
cy.get(".ant-checkbox").should('exist')
|
||||
.eq(10).click({ force: true });
|
||||
cy.get(".ant-checkbox").should('exist')
|
||||
.eq(11).click({ force: true });
|
||||
|
||||
mainPage.getCell("Country", 10).rightclick({ force: true });
|
||||
cy.getActiveMenu()
|
||||
.contains("Delete Selected Rows")
|
||||
.click({ force: true });
|
||||
|
||||
// verify
|
||||
// mainPage.getCell("Country", 10).should("not.exist");
|
||||
// mainPage.getCell("Country", 11).should("not.exist");
|
||||
cy.get(
|
||||
`:nth-child(10) > [data-title="Country"]`
|
||||
).should("not.exist");
|
||||
cy.get(
|
||||
`:nth-child(11) > [data-title="Country"]`
|
||||
).should("not.exist");
|
||||
|
||||
mainPage.getPagination(1).click();
|
||||
});
|
||||
});
|
||||
|
||||
describe(`Sort operations`, () => {
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
it("Enable sort", () => {
|
||||
mainPage.sortField("Country", "Z → A");
|
||||
cy.contains("Zambia").should("exist");
|
||||
});
|
||||
|
||||
it("Disable sort", () => {
|
||||
mainPage.clearSort();
|
||||
cy.contains("Zambia").should("not.exist");
|
||||
});
|
||||
});
|
||||
|
||||
describe("Field Operation", () => {
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
it("Hide field", () => {
|
||||
mainPage.hideField("LastUpdate");
|
||||
});
|
||||
|
||||
it("Show field", () => {
|
||||
mainPage.unhideField("LastUpdate");
|
||||
});
|
||||
});
|
||||
|
||||
describe("Filter operations", () => {
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
it("Create Filter", () => {
|
||||
mainPage.filterField("Country", "is equal", "India");
|
||||
// cy.get("td:contains(India)").should("exist");
|
||||
mainPage.getCell("Country", 1)
|
||||
.contains("India")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it("Delete Filter", () => {
|
||||
// remove sort and check
|
||||
mainPage.filterReset();
|
||||
mainPage.getCell("Country", 1)
|
||||
.contains("India")
|
||||
.should("not.exist");
|
||||
// cy.contains("td:contains(India)").should("not.exist");
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
257
scripts/cypress/integration/common/3b_formula_column.js
Normal file
257
scripts/cypress/integration/common/3b_formula_column.js
Normal file
@@ -0,0 +1,257 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
import {
|
||||
isTestSuiteActive,
|
||||
isXcdb,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - FORMULA`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
// loginPage.loginAndOpenProject(apiType, dbType)
|
||||
|
||||
mainPage.tabReset();
|
||||
// open a table to work on views
|
||||
//
|
||||
|
||||
// // kludge: wait for page load to finish
|
||||
// cy.wait(1000);
|
||||
// // close team & auth tab
|
||||
// cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
// cy.wait(1000);
|
||||
|
||||
cy.openTableTab("City", 25);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("City");
|
||||
});
|
||||
|
||||
// Given rowname & expected result for first 10 entries, validate
|
||||
// NOTE: Scroll issue with Cypress automation, to fix
|
||||
// validating partial data, row number 5 to 9
|
||||
//
|
||||
const rowValidation = (rowName, result) => {
|
||||
// scroll back
|
||||
// cy.get(
|
||||
// `tbody > :nth-child(1) > [data-col="City"]`
|
||||
// ).scrollIntoView();
|
||||
|
||||
// for (let i = 0; i < 10; i++)
|
||||
for (let i = 3; i < 5; i++)
|
||||
mainPage.getCell(rowName, i+1).contains(result[i].toString()).should("exist");
|
||||
// cy.get(`tbody > :nth-child(${i + 1}) > [data-col="${rowName}"]`)
|
||||
// .contains(result[i].toString())
|
||||
// .should("exist");
|
||||
};
|
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addFormulaBasedColumn = (columnName, formula) => {
|
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({
|
||||
force: true,
|
||||
});
|
||||
|
||||
cy.getActiveMenu().find('input.nc-column-name-input', { timeout: 3000 })
|
||||
.should('exist')
|
||||
.clear()
|
||||
.type(columnName);
|
||||
cy.get(".nc-column-type-input").last().click().type("Formula");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains("Formula").click();
|
||||
cy.get('textarea.nc-formula-input').click().type(formula, { parseSpecialCharSequences: false });
|
||||
cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
|
||||
// cy.toastWait(`Column created`);
|
||||
cy.closeTableTab("City");
|
||||
cy.openTableTab("City", 25);
|
||||
cy.get(`th[data-title="${columnName}"]`).should("exist");
|
||||
};
|
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (columnName) => {
|
||||
mainPage.deleteColumn(columnName);
|
||||
};
|
||||
|
||||
// routine to edit column
|
||||
//
|
||||
const editColumnByName = (oldName, newName, newFormula) => {
|
||||
|
||||
cy.get(`th:contains(${oldName}) .nc-icon.ant-dropdown-trigger`)
|
||||
.trigger("mouseover", { force: true })
|
||||
.click({ force: true });
|
||||
|
||||
cy.get(".nc-column-edit").click();
|
||||
cy.get(".nc-column-edit").should("not.be.visible");
|
||||
|
||||
cy.getActiveMenu().find('input.nc-column-name-input', { timeout: 3000 })
|
||||
.should('exist')
|
||||
.clear()
|
||||
.type(newName);
|
||||
|
||||
cy.get('textarea.nc-formula-input').click().clear().type(newFormula, { parseSpecialCharSequences: false });
|
||||
cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
// cy.toastWait(`Column created`);
|
||||
cy.get(`th[data-title="${oldName}"]`).should("not.exist");
|
||||
cy.get(`th[data-title="${newName}"]`).should("exist");
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
|
||||
// On City table (from Sakila DB), first 10 entries recorded here for verification
|
||||
let cityId = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||
let countryId = [87, 82, 101, 60, 97, 31, 107, 44, 44, 50];
|
||||
let city = [
|
||||
"A corua (La Corua)",
|
||||
"Abha",
|
||||
"Abu Dhabi",
|
||||
"Acua",
|
||||
"Adana",
|
||||
"Addis Abeba",
|
||||
"Aden",
|
||||
"Adoni",
|
||||
"Ahmadnagar",
|
||||
"Akishima",
|
||||
];
|
||||
|
||||
// Temporary locally computed expected results
|
||||
let RESULT_STRING = [];
|
||||
let RESULT_MATH_0 = [];
|
||||
let RESULT_MATH_1 = [];
|
||||
let RESULT_MATH_2 = [];
|
||||
let RESULT_WEEKDAY_0 = [];
|
||||
let RESULT_WEEKDAY_1 = [];
|
||||
|
||||
for (let i = 0; i < 10; i++) {
|
||||
// CONCAT, LOWER, UPPER, TRIM
|
||||
RESULT_STRING[i] = `${city[i].toUpperCase()}${city[
|
||||
i
|
||||
].toLowerCase()}trimmed`;
|
||||
|
||||
// ADD, AVG, LEN
|
||||
RESULT_MATH_0[i] =
|
||||
cityId[i] +
|
||||
countryId[i] +
|
||||
(cityId[i] + countryId[i]) / 2 +
|
||||
city[i].length;
|
||||
|
||||
// CEILING, FLOOR, ROUND, MOD, MIN, MAX
|
||||
RESULT_MATH_1[i] =
|
||||
Math.ceil(1.4) +
|
||||
Math.floor(1.6) +
|
||||
Math.round(2.5) +
|
||||
(cityId[i] % 3) +
|
||||
Math.min(cityId[i], countryId[i]) +
|
||||
Math.max(cityId[i], countryId[i]);
|
||||
|
||||
// LOG, EXP, POWER, SQRT
|
||||
// only integer verification being computed, hence trunc
|
||||
RESULT_MATH_2[i] = Math.trunc(
|
||||
Math.log(cityId[i]) +
|
||||
Math.exp(cityId[i]) +
|
||||
Math.pow(cityId[i], 3) +
|
||||
Math.sqrt(countryId[i])
|
||||
);
|
||||
|
||||
// WEEKDAY: starts from Monday
|
||||
RESULT_WEEKDAY_0[i] = 1;
|
||||
// WEEKDAY: starts from Sunday
|
||||
RESULT_WEEKDAY_1[i] = 2;
|
||||
}
|
||||
|
||||
it("Formula: ADD, AVG, LEN", () => {
|
||||
addFormulaBasedColumn(
|
||||
"NC_MATH_0",
|
||||
"ADD({CityId}, {CountryId}) + AVG({CityId}, {CountryId}) + LEN({City})"
|
||||
);
|
||||
rowValidation("NC_MATH_0", RESULT_MATH_0);
|
||||
});
|
||||
|
||||
it.skip("Formula: WEEKDAY", () => {
|
||||
editColumnByName(
|
||||
"NC_MATH_0",
|
||||
"NC_WEEKDAY_0",
|
||||
`WEEKDAY("2022-07-19")`
|
||||
);
|
||||
rowValidation("NC_WEEKDAY_0", RESULT_WEEKDAY_0);
|
||||
|
||||
editColumnByName(
|
||||
"NC_WEEKDAY_0",
|
||||
"NC_WEEKDAY_1",
|
||||
`WEEKDAY("2022-07-19", "sunday")`
|
||||
);
|
||||
rowValidation("NC_WEEKDAY_1", RESULT_WEEKDAY_1);
|
||||
});
|
||||
|
||||
it("Formula: CONCAT, LOWER, UPPER, TRIM", () => {
|
||||
editColumnByName(
|
||||
// "NC_WEEKDAY_1",
|
||||
"NC_MATH_0",
|
||||
"NC_STR_1",
|
||||
`CONCAT(UPPER({City}), LOWER({City}), TRIM(' trimmed '))`
|
||||
);
|
||||
rowValidation("NC_STR_1", RESULT_STRING);
|
||||
});
|
||||
|
||||
it("Formula: CEILING, FLOOR, ROUND, MOD, MIN, MAX", () => {
|
||||
editColumnByName(
|
||||
"NC_STR_1",
|
||||
"NC_MATH_1",
|
||||
`CEILING(1.4) + FLOOR(1.6) + ROUND(2.5) + MOD({CityId}, 3) + MIN({CityId}, {CountryId}) + MAX({CityId}, {CountryId})`
|
||||
);
|
||||
rowValidation("NC_MATH_1", RESULT_MATH_1);
|
||||
});
|
||||
|
||||
it("Formula: LOG, EXP, POWER, SQRT", () => {
|
||||
// if (!isXcdb()) {
|
||||
if(dbType === "mysql") {
|
||||
// SQLITE doesnt support LOG, EXP, POWER SQRT construct
|
||||
editColumnByName(
|
||||
"NC_MATH_1",
|
||||
"NC_MATH_2",
|
||||
`LOG({CityId}) + EXP({CityId}) + POWER({CityId}, 3) + SQRT({CountryId})`
|
||||
);
|
||||
rowValidation("NC_MATH_2", RESULT_MATH_2);
|
||||
}
|
||||
});
|
||||
|
||||
it("Formula: NOW, EDIT & Delete column", () => {
|
||||
// if (!isXcdb()) editColumnByName("NC_MATH_2", "NC_NOW", `NOW()`);
|
||||
if (dbType === 'mysql') editColumnByName("NC_MATH_2", "NC_NOW", `NOW()`);
|
||||
else editColumnByName("NC_MATH_1", "NC_NOW", `NOW()`);
|
||||
deleteColumnByName("NC_NOW");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
* @author Wing-Kam Wong <wingkwong.code@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
123
scripts/cypress/integration/common/3c_lookup_column.js
Normal file
123
scripts/cypress/integration/common/3c_lookup_column.js
Normal file
@@ -0,0 +1,123 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - LookUp column`, () => {
|
||||
// to retrieve few v-input nodes from their label
|
||||
//
|
||||
const fetchParentFromLabel = (label) => {
|
||||
cy.get("label").contains(label).parents(".ant-row").click();
|
||||
};
|
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
// open a table to work on views
|
||||
//
|
||||
|
||||
// // kludge: wait for page load to finish
|
||||
// cy.wait(1000);
|
||||
// // close team & auth tab
|
||||
// cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
// cy.wait(1000);
|
||||
|
||||
cy.openTableTab("City", 25);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("City");
|
||||
});
|
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addLookUpColumn = (childTable, childCol) => {
|
||||
|
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({
|
||||
force: true,
|
||||
});
|
||||
|
||||
cy.getActiveMenu().find('input.nc-column-name-input', { timeout: 3000 })
|
||||
.should('exist')
|
||||
.clear()
|
||||
.type(childCol);
|
||||
cy.get(".nc-column-type-input").last().click().type("Lookup");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains("Lookup").click();
|
||||
|
||||
// Configure Child table & column names
|
||||
fetchParentFromLabel("Child table");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains(childTable).click();
|
||||
// cy.getActiveMenu().contains(childTable).click();
|
||||
|
||||
fetchParentFromLabel("Child column");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains(childCol).click();
|
||||
// cy.getActiveMenu().contains(childCol).click();
|
||||
|
||||
cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
cy.toastWait(`Column created`);
|
||||
|
||||
cy.get(`th[data-title="${childCol}"]`).should("exist");
|
||||
};
|
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (childCol) => {
|
||||
mainPage.deleteColumn(childCol);
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
|
||||
it("Add Lookup column (Address, PostalCode) & Delete", () => {
|
||||
addLookUpColumn("Address", "PostalCode");
|
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
mainPage.getCell("PostalCode", 1)
|
||||
.contains("4166")
|
||||
.should("exist");
|
||||
|
||||
deleteColumnByName("PostalCode");
|
||||
});
|
||||
|
||||
it.skip("Add Lookup column (Country, CountryId) & Delete", () => {
|
||||
addLookUpColumn("Country", "CountryId");
|
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
cy.get(`tbody > :nth-child(1) > [data-col="CountryId"]`)
|
||||
.contains("87")
|
||||
.should("exist");
|
||||
|
||||
deleteColumnByName("CountryId");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
156
scripts/cypress/integration/common/3d_rollup_column.js
Normal file
156
scripts/cypress/integration/common/3d_rollup_column.js
Normal file
@@ -0,0 +1,156 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - RollUp column`, () => {
|
||||
// to retrieve few v-input nodes from their label
|
||||
//
|
||||
const fetchParentFromLabel = (label) => {
|
||||
cy.get("label").contains(label).parents(".ant-row").click();
|
||||
cy.wait(500);
|
||||
};
|
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
|
||||
// // kludge: wait for page load to finish
|
||||
// cy.wait(1000);
|
||||
// // close team & auth tab
|
||||
// cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
// cy.wait(1000);
|
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.openTableTab("Country", 25);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.fileHook();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addRollUpColumn = (
|
||||
columnName,
|
||||
childTable,
|
||||
childCol,
|
||||
aggregateFunc
|
||||
) => {
|
||||
|
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({
|
||||
force: true,
|
||||
});
|
||||
|
||||
cy.getActiveMenu().find('input.nc-column-name-input', { timeout: 3000 })
|
||||
.should('exist')
|
||||
.clear()
|
||||
.type(columnName);
|
||||
cy.get(".nc-column-type-input").last().click().type("RollUp");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains("Rollup").click();
|
||||
|
||||
// Configure Child table & column names
|
||||
fetchParentFromLabel("Child table");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains(childTable).click();
|
||||
|
||||
fetchParentFromLabel("Child column");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains(childCol).click();
|
||||
|
||||
fetchParentFromLabel("Aggregate function");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains(aggregateFunc).click();
|
||||
|
||||
cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
cy.toastWait(`Column created`);
|
||||
|
||||
cy.get(`th[data-title="${columnName}"]`).should("exist");
|
||||
};
|
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (columnName) => {
|
||||
mainPage.deleteColumn(columnName);
|
||||
};
|
||||
|
||||
// routine to edit column
|
||||
//
|
||||
const editColumnByName = (oldName, newName) => {
|
||||
// verify if column exists before delete
|
||||
cy.get(`th:contains(${oldName})`).should("exist");
|
||||
|
||||
// delete opiton visible on mouse-over
|
||||
cy.get(`th:contains(${oldName}) .mdi-menu-down`)
|
||||
.trigger("mouseover")
|
||||
.click();
|
||||
|
||||
// edit/ save on pop-up
|
||||
cy.get(".nc-column-edit").click();
|
||||
cy.get(".nc-column-name-input input").clear().type(newName);
|
||||
cy.get(".nc-col-create-or-edit-card").contains("Save").click();
|
||||
|
||||
cy.toastWait("Successfully updated alias");
|
||||
|
||||
// validate if deleted (column shouldnt exist)
|
||||
cy.get(`th:contains(${oldName})`).should("not.exist");
|
||||
cy.get(`th:contains(${newName})`).should("exist");
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
|
||||
it("Add Rollup column (City, City, count) & Delete", () => {
|
||||
addRollUpColumn("RollUpCol", "City", "City", "count");
|
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
// intentionally verifying 4th item, as initial items are being masked out by list scroll down
|
||||
mainPage.getCell("RollUpCol", 4)
|
||||
.contains("2")
|
||||
.should("exist");
|
||||
|
||||
// editColumnByName("RollUpCol_2", "RollUpCol_New");
|
||||
deleteColumnByName("RollUpCol");
|
||||
});
|
||||
|
||||
it.skip("Add Rollup column (City, CountryId, count) & Delete", () => {
|
||||
addRollUpColumn("RollUpCol_1", "City", "CountryId", "count");
|
||||
|
||||
// Verify first entry, will be displayed as alias here 'childColumn (from childTable)'
|
||||
cy.get(`tbody > :nth-child(4) > [data-col="RollUpCol_1"]`)
|
||||
.contains("2")
|
||||
.should("exist");
|
||||
|
||||
editColumnByName("RollUpCol_1", "RollUpCol_New");
|
||||
deleteColumnByName("RollUpCol_New");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
276
scripts/cypress/integration/common/3e_duration_column.js
Normal file
276
scripts/cypress/integration/common/3e_duration_column.js
Normal file
@@ -0,0 +1,276 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
isTestSuiteActive,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - DURATION`, () => {
|
||||
const tableName = "DurationTable";
|
||||
|
||||
// to retrieve few v-input nodes from their label
|
||||
//
|
||||
const fetchParentFromLabel = (label) => {
|
||||
cy.get("label").contains(label).parents(".ant-row").first().click();
|
||||
};
|
||||
|
||||
// Run once before test- create table
|
||||
//
|
||||
before(() => {
|
||||
mainPage.tabReset();
|
||||
|
||||
// // kludge: wait for page load to finish
|
||||
// cy.wait(1000);
|
||||
// // close team & auth tab
|
||||
// cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
// cy.wait(1000);
|
||||
|
||||
cy.createTable(tableName);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.deleteTable(tableName);
|
||||
});
|
||||
|
||||
// Routine to create a new look up column
|
||||
//
|
||||
const addDurationColumn = (columnName, durationFormat) => {
|
||||
|
||||
cy.get(".nc-grid tr > th:last .nc-icon").click({
|
||||
force: true,
|
||||
});
|
||||
|
||||
cy.getActiveMenu().find('input.nc-column-name-input', { timeout: 3000 })
|
||||
.should('exist')
|
||||
.clear()
|
||||
.type(columnName);
|
||||
cy.get(".nc-column-type-input").last().click().type("Duration");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains("Duration").click();
|
||||
|
||||
// Configure Duration format
|
||||
fetchParentFromLabel("Duration Format");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains(durationFormat).click();
|
||||
// cy.getActiveMenu().contains(durationFormat).click();
|
||||
|
||||
cy.get(".ant-btn-primary").contains("Save").should('exist').click();
|
||||
cy.toastWait(`Column created`);
|
||||
|
||||
cy.get(`th[data-title="${columnName}"]`).should("exist");
|
||||
};
|
||||
|
||||
// routine to delete column
|
||||
//
|
||||
const deleteColumnByName = (columnName) => {
|
||||
mainPage.deleteColumn(columnName);
|
||||
};
|
||||
|
||||
// routine to edit column
|
||||
//
|
||||
const editColumnByName = (oldName, newName, newDurationFormat) => {
|
||||
|
||||
cy.get(`th:contains(${oldName}) .nc-icon.ant-dropdown-trigger`)
|
||||
.trigger("mouseover", { force: true })
|
||||
.click({ force: true });
|
||||
|
||||
cy.get(".nc-column-edit").click();
|
||||
cy.get(".nc-column-edit").should("not.be.visible");
|
||||
|
||||
// rename column and verify
|
||||
cy.getActiveMenu().find('input.nc-column-name-input', { timeout: 3000 })
|
||||
.should('exist')
|
||||
.clear()
|
||||
.type(newName);
|
||||
// Configure Duration format
|
||||
fetchParentFromLabel("Duration Format");
|
||||
cy.getActiveSelection().find('.ant-select-item-option').contains(newDurationFormat).click();
|
||||
|
||||
cy.get(".ant-btn-primary:visible").contains("Save").click();
|
||||
|
||||
cy.toastWait("Column updated");
|
||||
|
||||
cy.get(`th:contains(${oldName})`).should("not.exist");
|
||||
cy.get(`th:contains(${newName})`).should("exist");
|
||||
};
|
||||
|
||||
const addDurationData = (colName, index, cellValue, expectedValue, isNewRow = false) => {
|
||||
if (isNewRow) {
|
||||
cy.get(".nc-add-new-row-btn:visible").should("exist");
|
||||
cy.wait(500)
|
||||
cy.get(".nc-add-new-row-btn").click();
|
||||
} else {
|
||||
// mainPage.getRow(index).find(".nc-row-expand-icon").click({ force: true });
|
||||
cy.get(".nc-row-expand")
|
||||
.eq(index-1)
|
||||
.click({ force: true });
|
||||
}
|
||||
cy.get(".duration-cell-wrapper > input").first().should('exist').type(cellValue);
|
||||
cy.getActiveDrawer().find("button").contains("Save row").click({ force: true });
|
||||
cy.toastWait("Row updated successfully");
|
||||
cy.getActiveDrawer().find("button").contains("Cancel").click({ force: true });
|
||||
// mainPage.getCell(colName, index).find('input').then(($e) => {
|
||||
// expect($e[0].value).to.equal(expectedValue)
|
||||
// })
|
||||
mainPage.getCell(colName, index)
|
||||
.contains(expectedValue)
|
||||
.should("exist");
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
// Test case
|
||||
{
|
||||
// Duration: h:mm
|
||||
it("Duration: h:mm", () => {
|
||||
addDurationColumn("NC_DURATION_0", "h:mm (e.g. 1:23)");
|
||||
addDurationData("NC_DURATION_0", 1, "1:30", "01:30", true);
|
||||
addDurationData("NC_DURATION_0", 2, "30", "00:30", true);
|
||||
addDurationData("NC_DURATION_0", 3, "60", "01:00", true);
|
||||
addDurationData("NC_DURATION_0", 4, "80", "01:20", true);
|
||||
addDurationData("NC_DURATION_0", 5, "12:34", "12:34", true);
|
||||
addDurationData("NC_DURATION_0", 6, "15:130", "17:10", true);
|
||||
addDurationData("NC_DURATION_0", 7, "123123", "2052:03", true);
|
||||
});
|
||||
|
||||
it("Duration: Edit Column NC_DURATION_0", () => {
|
||||
editColumnByName(
|
||||
"NC_DURATION_0",
|
||||
"NC_DURATION_EDITED_0",
|
||||
"h:mm:ss (e.g. 3:45, 1:23:40)"
|
||||
);
|
||||
});
|
||||
|
||||
it("Duration: Delete column", () => {
|
||||
deleteColumnByName("NC_DURATION_EDITED_0");
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
// Duration: h:mm:ss
|
||||
it("Duration: h:mm:ss", () => {
|
||||
addDurationColumn("NC_DURATION_1", "h:mm:ss (e.g. 3:45, 1:23:40)");
|
||||
addDurationData("NC_DURATION_1", 1, "11:22:33", "11:22:33");
|
||||
addDurationData("NC_DURATION_1", 2, "1234", "00:20:34");
|
||||
addDurationData("NC_DURATION_1", 3, "50", "00:00:50");
|
||||
addDurationData("NC_DURATION_1", 4, "1:1111", "00:19:31");
|
||||
addDurationData("NC_DURATION_1", 5, "1:11:1111", "01:29:31");
|
||||
addDurationData("NC_DURATION_1", 6, "15:130", "00:17:10");
|
||||
addDurationData("NC_DURATION_1", 7, "123123", "34:12:03");
|
||||
});
|
||||
|
||||
it("Duration: Edit Column NC_DURATION_1", () => {
|
||||
editColumnByName(
|
||||
"NC_DURATION_1",
|
||||
"NC_DURATION_EDITED_1",
|
||||
"h:mm:ss.s (e.g. 3:34.6, 1:23:40.0)"
|
||||
);
|
||||
});
|
||||
|
||||
it("Duration: Delete column", () => {
|
||||
deleteColumnByName("NC_DURATION_EDITED_1");
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
// h:mm:ss.s
|
||||
it("Duration: h:mm:ss.s", () => {
|
||||
addDurationColumn("NC_DURATION_2", "h:mm:ss.s (e.g. 3:34.6, 1:23:40.0)");
|
||||
addDurationData("NC_DURATION_2", 1, "1234", "00:20:34.0");
|
||||
addDurationData("NC_DURATION_2", 2, "12:34", "00:12:34.0");
|
||||
addDurationData("NC_DURATION_2", 3, "12:34:56", "12:34:56.0");
|
||||
addDurationData("NC_DURATION_2", 4, "12:34:999", "12:50:39.0");
|
||||
addDurationData("NC_DURATION_2", 5, "12:999:56", "28:39:56.0");
|
||||
addDurationData("NC_DURATION_2", 6, "12:34:56.12", "12:34:56.1");
|
||||
addDurationData("NC_DURATION_2", 7, "12:34:56.199", "12:34:56.2");
|
||||
});
|
||||
|
||||
it("Duration: Edit Column NC_DURATION_2", () => {
|
||||
editColumnByName(
|
||||
"NC_DURATION_2",
|
||||
"NC_DURATION_EDITED_2",
|
||||
"h:mm:ss (e.g. 3:45, 1:23:40)"
|
||||
);
|
||||
});
|
||||
|
||||
it("Duration: Delete column", () => {
|
||||
deleteColumnByName("NC_DURATION_EDITED_2");
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
// h:mm:ss.ss
|
||||
it("Duration: h:mm:ss.ss", () => {
|
||||
addDurationColumn("NC_DURATION_3", "h:mm:ss.ss (e.g. 3.45.67, 1:23:40.00)");
|
||||
addDurationData("NC_DURATION_3", 1, "1234", "00:20:34.00");
|
||||
addDurationData("NC_DURATION_3", 2, "12:34", "00:12:34.00");
|
||||
addDurationData("NC_DURATION_3", 3, "12:34:56", "12:34:56.00");
|
||||
addDurationData("NC_DURATION_3", 4, "12:34:999", "12:50:39.00");
|
||||
addDurationData("NC_DURATION_3", 5, "12:999:56", "28:39:56.00");
|
||||
addDurationData("NC_DURATION_3", 6, "12:34:56.12", "12:34:56.12");
|
||||
addDurationData("NC_DURATION_3", 7, "12:34:56.199", "12:34:56.20");
|
||||
});
|
||||
|
||||
it("Duration: Edit Column NC_DURATION_3", () => {
|
||||
editColumnByName(
|
||||
"NC_DURATION_3",
|
||||
"NC_DURATION_EDITED_3",
|
||||
"h:mm:ss.ss (e.g. 3.45.67, 1:23:40.00)"
|
||||
);
|
||||
});
|
||||
|
||||
it("Duration: Delete column", () => {
|
||||
deleteColumnByName("NC_DURATION_EDITED_3");
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
// h:mm:ss.sss
|
||||
it("Duration: h:mm:ss.sss", () => {
|
||||
addDurationColumn("NC_DURATION_4", "h:mm:ss.sss (e.g. 3.45.678, 1:23:40.000)");
|
||||
addDurationData("NC_DURATION_4", 1, "1234", "00:20:34.000");
|
||||
addDurationData("NC_DURATION_4", 2, "12:34", "00:12:34.000");
|
||||
addDurationData("NC_DURATION_4", 3, "12:34:56", "12:34:56.000");
|
||||
addDurationData("NC_DURATION_4", 4, "12:34:999", "12:50:39.000");
|
||||
addDurationData("NC_DURATION_4", 5, "12:999:56", "28:39:56.000");
|
||||
addDurationData("NC_DURATION_4", 6, "12:34:56.12", "12:34:56.012");
|
||||
addDurationData("NC_DURATION_4", 7, "12:34:56.199", "12:34:56.199");
|
||||
});
|
||||
|
||||
it("Duration: Edit Column NC_DURATION_4", () => {
|
||||
editColumnByName(
|
||||
"NC_DURATION_4",
|
||||
"NC_DURATION_EDITED_4",
|
||||
"h:mm (e.g. 1:23)"
|
||||
);
|
||||
});
|
||||
|
||||
it("Duration: Delete column", () => {
|
||||
deleteColumnByName("NC_DURATION_EDITED_4");
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Wing-Kam Wong <wingkwong.code@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
@@ -0,0 +1,126 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
function capitalizeFirstLetter(string) {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||
}
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Table views: Create/Edit/Delete`, () => {
|
||||
const name = "Test" + Date.now();
|
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
mainPage.tabReset();
|
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.openTableTab("Country", 25);
|
||||
|
||||
// toggle right navbar (open)
|
||||
// cy.get('.nc-toggle-right-navbar').should('exist').click();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => {
|
||||
it(`Create ${viewType} view`, () => {
|
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click();
|
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal().find(".ant-btn-primary").click();
|
||||
cy.toastWait("View created successfully");
|
||||
|
||||
// kludge: right navbar closes abruptly. force it open again
|
||||
// window.localStorage.setItem('nc-right-sidebar', '{"isOpen":true,"hasSidebar":true}')
|
||||
|
||||
// validate if view was created && contains default name 'Country1'
|
||||
cy.get(`.nc-${viewType}-view-item`)
|
||||
.contains(`${capitalizeFirstLetter(viewType)}-1`)
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Edit ${viewType} view name`, () => {
|
||||
// click on edit-icon (becomes visible on hovering mouse)
|
||||
cy.get(`.nc-${viewType}-view-item`).last().dblclick();
|
||||
|
||||
// feed new name
|
||||
cy.get(`.nc-${viewType}-view-item input`)
|
||||
.clear()
|
||||
.type(`${viewType}View-1{enter}`);
|
||||
cy.toastWait("View renamed successfully");
|
||||
|
||||
// kludge: right navbar closes abruptly. force it open again
|
||||
// window.localStorage.setItem('nc-right-sidebar', '{"isOpen":true,"hasSidebar":true}')
|
||||
|
||||
// validate
|
||||
cy.get(`.nc-${viewType}-view-item`)
|
||||
.contains(`${viewType}View-1`)
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Delete ${viewType} view`, () => {
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2);
|
||||
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").click({ force: true });
|
||||
cy.wait(300)
|
||||
cy.getActiveModal().find('.ant-btn-dangerous').click();
|
||||
cy.toastWait("View deleted successfully");
|
||||
|
||||
// kludge: right navbar closes abruptly. force it open again
|
||||
// window.localStorage.setItem('nc-right-sidebar', '{"isOpen":true,"hasSidebar":true}')
|
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1);
|
||||
});
|
||||
};
|
||||
|
||||
// below four scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("grid"); // grid view
|
||||
viewTest("gallery"); // gallery view
|
||||
viewTest("form"); // form view
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
* @author Wing-Kam Wong <wingkwong.code@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
144
scripts/cypress/integration/common/4b_table_view_share.js
Normal file
144
scripts/cypress/integration/common/4b_table_view_share.js
Normal file
@@ -0,0 +1,144 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import {loginPage} from "../../support/page_objects/navigation";
|
||||
|
||||
let storedURL = "";
|
||||
let linkText = "";
|
||||
|
||||
const generateLinkWithPwd = () => {
|
||||
mainPage.shareView().click();
|
||||
cy.getActiveModal().find(".ant-modal-title").contains("This view is shared via a private link").should("be.visible");
|
||||
|
||||
// enable checkbox & feed pwd, save
|
||||
cy.getActiveModal().find('.ant-collapse').should('exist').click()
|
||||
cy.getActiveModal().find('.ant-checkbox-input').should('exist').first().then(($el) => {
|
||||
if (!$el.prop("checked")) {
|
||||
cy.wrap($el).click({ force: true });
|
||||
cy.getActiveModal().find('input[type="password"]').clear().type("1");
|
||||
cy.getActiveModal().find('button:contains("Save password")').click();
|
||||
cy.toastWait("Successfully updated");
|
||||
}
|
||||
});
|
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal()
|
||||
.find(".nc-share-link-box")
|
||||
.then(($obj) => {
|
||||
linkText = $obj.text().trim();
|
||||
cy.log(linkText);
|
||||
});
|
||||
};
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Shared VIEWs (GRID)`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
mainPage.tabReset();
|
||||
cy.openTableTab("City", 25);
|
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => {
|
||||
storedURL = url;
|
||||
});
|
||||
generateLinkWithPwd();
|
||||
|
||||
cy.signOut();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
});
|
||||
|
||||
it("Share view with incorrect password", () => {
|
||||
cy.visit(linkText, {
|
||||
baseUrl: null,
|
||||
});
|
||||
|
||||
cy.getActiveModal().should("exist");
|
||||
|
||||
// feed password
|
||||
cy.getActiveModal().find('input[type="password"]').clear().type("a");
|
||||
cy.getActiveModal().find('button:contains("Unlock")').click();
|
||||
|
||||
// if pwd is incorrect, active modal requesting to feed in password again will persist
|
||||
cy.getActiveModal().find('button:contains("Unlock")').should('exist');
|
||||
});
|
||||
|
||||
// fallover test- use previously opened view & continue verification instead of opening again
|
||||
it("Share view with correct password", () => {
|
||||
|
||||
// feed password
|
||||
cy.getActiveModal()
|
||||
.find('input[type="password"]')
|
||||
.clear()
|
||||
.type("1");
|
||||
cy.getActiveModal().find('button:contains("Unlock")').click();
|
||||
|
||||
// if pwd is incorrect, active modal requesting to feed in password again will persist
|
||||
// cy.getActiveModal().find('button:contains("Unlock")').should('not.exist');
|
||||
// cy.get(".ant-modal-content:visible").should("not.exist")
|
||||
|
||||
cy.wait(1000);
|
||||
|
||||
// Verify Download as CSV is here
|
||||
mainPage.downloadCsv().should("exist");
|
||||
cy.get(".nc-actions-menu-btn").should('exist').click();
|
||||
|
||||
mainPage.downloadExcel().should("exist");
|
||||
cy.get(".nc-actions-menu-btn").should('exist').click();
|
||||
});
|
||||
|
||||
it("Delete view", () => {
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.openTableTab("City", 25);
|
||||
cy.wait(500);
|
||||
mainPage.toggleRightSidebar();
|
||||
cy.wait(500);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
// wait for page load to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 25);
|
||||
mainPage.deleteCreatedViews();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
cy.closeTableTab("City");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
471
scripts/cypress/integration/common/4c_form_view_detailed.js
Normal file
471
scripts/cypress/integration/common/4c_form_view_detailed.js
Normal file
@@ -0,0 +1,471 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage";
|
||||
import {loginPage} from "../../support/page_objects/navigation";
|
||||
|
||||
let formViewURL;
|
||||
|
||||
function verifyFormDrawerFieldLocation(fieldName, position) {
|
||||
cy.get(".nc-editable.item")
|
||||
.eq(position)
|
||||
.contains(fieldName)
|
||||
.should("exist");
|
||||
}
|
||||
|
||||
function verifyFormDrawerHideObjectCount(count) {
|
||||
if(count) {
|
||||
cy.get(".nc-form")
|
||||
.find(".nc-field-remove-icon")
|
||||
.its("length")
|
||||
.should("eq", count);
|
||||
} else {
|
||||
cy.get(".nc-form")
|
||||
.find(".nc-field-remove-icon")
|
||||
.should("not.exist");
|
||||
}
|
||||
}
|
||||
|
||||
function verifyFormMenuDrawerCardCount(cardCount) {
|
||||
if(cardCount) {
|
||||
cy.get('.nc-form-left-drawer').find('.ant-card').should('have.length', cardCount);
|
||||
} else {
|
||||
cy.get('.nc-form-left-drawer').find('.ant-card').should('not.exist');
|
||||
}
|
||||
}
|
||||
|
||||
function validateFormHeader() {
|
||||
cy.get(".nc-form").should("exist");
|
||||
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Form Title"]')
|
||||
.should("exist").then(($el) => {
|
||||
cy.log($el)
|
||||
expect($el.val()).to.equal("A B C D");
|
||||
})
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Add form description"]')
|
||||
.should("exist").then(($el) => {
|
||||
cy.log($el)
|
||||
expect($el.val()).to.equal("Some description about form comes here");
|
||||
})
|
||||
}
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - FORM view`, () => {
|
||||
const name = "Test" + Date.now();
|
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
mainPage.tabReset();
|
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
|
||||
// kludge: wait for page load to finish
|
||||
cy.wait(2000);
|
||||
// close team & auth tab
|
||||
cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
cy.wait(1000);
|
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.openTableTab("Country", 25);
|
||||
mainPage.toggleRightSidebar();
|
||||
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(500);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
// fix me!
|
||||
// window.localStorage.setItem('nc-right-sidebar', '{"isOpen":true,"hasSidebar":true}')
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => {
|
||||
it(`Create ${viewType} view`, () => {
|
||||
// click on 'Grid/Gallery' button on Views bar
|
||||
cy.get(`.nc-create-${viewType}-view`).click();
|
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal().find("button:contains(Submit)").click();
|
||||
|
||||
cy.toastWait("View created successfully");
|
||||
|
||||
// validate if view was creted && contains default name 'Form-1'
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Validate ${viewType} view: Drag & drop for re-order items`, () => {
|
||||
// default order: Country, LastUpdate, Country => City
|
||||
verifyFormDrawerFieldLocation("Country", 0);
|
||||
verifyFormDrawerFieldLocation("LastUpdate", 1);
|
||||
|
||||
// move Country field down (drag, drop)
|
||||
cy.get(".nc-form-drag-LastUpdate").drag(
|
||||
".nc-form-drag-Country"
|
||||
);
|
||||
cy.wait(1000);
|
||||
|
||||
// Verify if order is: LastUpdate, Country, Country => City
|
||||
verifyFormDrawerFieldLocation("LastUpdate", 0);
|
||||
verifyFormDrawerFieldLocation("Country", 1);
|
||||
});
|
||||
|
||||
it(`Validate ${viewType} view: Drag & drop for add/remove items`, () => {
|
||||
// default, only one item in menu-bar; ensure LastUpdate field was present in form view
|
||||
verifyFormMenuDrawerCardCount(0)
|
||||
verifyFormDrawerFieldLocation("LastUpdate", 0);
|
||||
|
||||
// drag 'LastUpdate' & drop into menu bar drag-drop box
|
||||
cy.get(".nc-form-drag-LastUpdate").drag(
|
||||
".nc-drag-n-drop-to-hide"
|
||||
);
|
||||
|
||||
// validate- fields count in menu bar to be increased by 1 &&
|
||||
// first member in 'formView' is Country
|
||||
verifyFormDrawerFieldLocation("Country", 0);
|
||||
verifyFormMenuDrawerCardCount(1);
|
||||
});
|
||||
|
||||
it(`Validate ${viewType} view: Inverted order field member addition from menu`, () => {
|
||||
|
||||
cy.get(".nc-form-remove-all").click();
|
||||
verifyFormMenuDrawerCardCount(2)
|
||||
|
||||
// click fields in inverted order: LastUpdate, Country => City
|
||||
cy.get('.nc-form-left-drawer').find('.ant-card').eq(1).click();
|
||||
|
||||
verifyFormMenuDrawerCardCount(1);
|
||||
cy.get('.nc-form-left-drawer').find('.ant-card').eq(0).click();
|
||||
|
||||
// verify if order of appearance in form is right
|
||||
// Country was never removed as its required field. Other two will appear in inverted order
|
||||
verifyFormMenuDrawerCardCount(0);
|
||||
verifyFormDrawerFieldLocation("Country", 0);
|
||||
verifyFormDrawerFieldLocation("City List", 1);
|
||||
verifyFormDrawerFieldLocation("LastUpdate", 2);
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Form header & description validation`, () => {
|
||||
// Header & description should exist
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Form Title"]')
|
||||
.should("exist");
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Add form description"]')
|
||||
.should("exist");
|
||||
|
||||
// Update header & add some description, verify
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Form Title"]')
|
||||
.clear()
|
||||
.type("A B C D");
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Add form description"]')
|
||||
.type("Some description about form comes here");
|
||||
|
||||
cy.get(".nc-form").click()
|
||||
|
||||
// validate new contents
|
||||
validateFormHeader();
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Add all, Remove all validation`, () => {
|
||||
|
||||
// ensure buttons exist on left hand menu
|
||||
cy.get(".nc-form-left-drawer").find(".nc-form-add-all").should("not.exist");
|
||||
cy.get(".nc-form-left-drawer").find(".nc-form-remove-all").should("be.visible");
|
||||
|
||||
// click: remove-all
|
||||
cy.get(".nc-form-left-drawer").find(".nc-form-remove-all").click();
|
||||
cy.wait(1000);
|
||||
// form should not contain any "field remove icons"
|
||||
verifyFormDrawerHideObjectCount(0);
|
||||
// menu bar should contain 2 .pointer.item (LastUpdate, County->City)
|
||||
verifyFormMenuDrawerCardCount(2);
|
||||
|
||||
// click: Add all
|
||||
cy.get(".nc-form-left-drawer").find(".nc-form-add-all").should('be.visible').click();
|
||||
cy.get(".nc-form-left-drawer").find(".nc-form-remove-all").should("be.visible");
|
||||
|
||||
// form should contain "field remove icons"
|
||||
verifyFormDrawerHideObjectCount(2);
|
||||
|
||||
// menu bar should not contain .pointer.item (column name/ field name add options)
|
||||
verifyFormMenuDrawerCardCount(0);
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Submit default, empty show this message textbox`, () => {
|
||||
// fill up mandatory fields
|
||||
cy.get(".nc-form-input-Country").type("_abc");
|
||||
cy.get(".nc-form-input-LastUpdate").click();
|
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click();
|
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click();
|
||||
|
||||
// default message, no update
|
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click();
|
||||
|
||||
cy.get(".ant-alert-message")
|
||||
.contains("Successfully submitted form data")
|
||||
.should("exist");
|
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Submit default, with valid Show message entry`, () => {
|
||||
// clicking again on view name shows blank still. work around- toggling between two views
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.click();
|
||||
|
||||
// fill up mandatory fields
|
||||
cy.get(".nc-form-input-Country").should('exist').type("_abc");
|
||||
cy.get(".nc-form-input-LastUpdate").click();
|
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click();
|
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click();
|
||||
|
||||
// add message
|
||||
cy.get("textarea.nc-form-after-submit-msg")
|
||||
.type("Congratulations!");
|
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click();
|
||||
cy.get(".ant-alert-message").contains("Congratulations!").should("exist");
|
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Submit default, Enable checkbox "Submit another form`, () => {
|
||||
// clicking again on view name shows blank still. work around- toggling between two views
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.click();
|
||||
|
||||
// fill up mandatory fields
|
||||
cy.get(".nc-form-input-Country").type("_abc");
|
||||
cy.get(".nc-form-input-LastUpdate").click();
|
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click();
|
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click();
|
||||
|
||||
// enable "Submit another form" check box
|
||||
cy.get("button.nc-form-checkbox-submit-another-form").click();
|
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click();
|
||||
cy.get(".ant-alert-message").contains("Congratulations").should("exist");
|
||||
cy.get("button")
|
||||
.contains("Submit Another Form")
|
||||
.should("exist")
|
||||
.click();
|
||||
|
||||
// New form appeared? Header & description should exist
|
||||
validateFormHeader();
|
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Submit default, Enable checkbox "blank form after 5 seconds"`, () => {
|
||||
|
||||
cy.get(".nc-form-input-Country").type("_abc");
|
||||
cy.get(".nc-form-input-LastUpdate").click();
|
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click();
|
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click();
|
||||
|
||||
// enable "New form after 5 seconds" button
|
||||
cy.get("button.nc-form-checkbox-submit-another-form")
|
||||
.click();
|
||||
cy.get("button.nc-form-checkbox-show-blank-form")
|
||||
.click();
|
||||
|
||||
// submit button & validate
|
||||
cy.get(".nc-form").find("button").contains("Submit").click();
|
||||
cy.get(".ant-alert-message")
|
||||
.contains("Congratulations")
|
||||
.should("exist")
|
||||
.then(() => {
|
||||
// validate if form has appeared again
|
||||
validateFormHeader();
|
||||
});
|
||||
|
||||
// end of test removes newly added rows from table. that step validates if row was successfully added.
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Email me verification, without SMTP configuration`, () => {
|
||||
// open formview & enable "email me" option
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.click();
|
||||
|
||||
// validate if form has appeared again
|
||||
cy.wait(1000);
|
||||
validateFormHeader();
|
||||
cy.get(".nc-form-remove-all").click();
|
||||
|
||||
cy.get(".nc-form-checkbox-send-email").click();
|
||||
// validate if toaster pops up requesting to activate SMTP
|
||||
cy.toastWait(
|
||||
"Please activate SMTP plugin in App store for enabling email notification"
|
||||
);
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Email me verification, with SMTP configuration`, () => {
|
||||
// activate SMTP, dummy profile
|
||||
settingsPage.openMenu(settingsPage.APPSTORE)
|
||||
mainPage.configureSMTP(
|
||||
"admin@ex.com",
|
||||
"smtp.ex.com",
|
||||
"8080",
|
||||
"TLS"
|
||||
);
|
||||
|
||||
// open form view & enable "email me" option
|
||||
cy.openTableTab("Country", 25);
|
||||
cy.wait(1000);
|
||||
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.click();
|
||||
|
||||
// validate if form has appeared again
|
||||
validateFormHeader();
|
||||
|
||||
cy.get(".nc-form-checkbox-send-email")
|
||||
.click();
|
||||
|
||||
settingsPage.openMenu(settingsPage.APPSTORE)
|
||||
mainPage.resetSMTP();
|
||||
|
||||
cy.wait(300);
|
||||
cy.openTableTab("Country", 25);
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: Add/ remove field verification"`, () => {
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.click();
|
||||
cy.get(".nc-form-add-all").click();
|
||||
|
||||
cy.wait(300);
|
||||
|
||||
// validate if form has appeared again
|
||||
validateFormHeader();
|
||||
|
||||
cy.get(".nc-form-input-LastUpdate").should("exist");
|
||||
// remove "LastUpdate field"
|
||||
cy.get(".nc-form").find(".nc-field-remove-icon").eq(1).click();
|
||||
cy.get(".nc-form-input-LastUpdate").should("not.exist");
|
||||
|
||||
cy.get('.nc-form-left-drawer').find('.ant-card').contains('LastUpdate').should('exist').click();
|
||||
cy.get(".nc-form-input-LastUpdate").should("exist");
|
||||
|
||||
cy.wait(300);
|
||||
});
|
||||
|
||||
it(`Validate ${viewType}: URL verification`, () => {
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.click();
|
||||
|
||||
// validate if form has appeared again
|
||||
validateFormHeader();
|
||||
|
||||
// verify URL & copy it for subsequent test
|
||||
cy.url().should("contain", `Country/Form-1`);
|
||||
cy.url().then((url) => {
|
||||
cy.log(url);
|
||||
formViewURL = url;
|
||||
});
|
||||
|
||||
cy.wait(300);
|
||||
});
|
||||
|
||||
it.skip(`Validate ${viewType}: URL validation after re-access`, () => {
|
||||
// visit URL
|
||||
cy.log(formViewURL);
|
||||
|
||||
cy.visit(formViewURL, {
|
||||
baseUrl: null,
|
||||
});
|
||||
|
||||
// New form appeared? Header & description should exist
|
||||
validateFormHeader();
|
||||
});
|
||||
|
||||
it(`Delete ${viewType} view`, () => {
|
||||
// cy.visit("/");
|
||||
// cy.wait(5000);
|
||||
// projectsPage.openConfiguredProject(apiType, dbType);
|
||||
// cy.openTableTab("Country", 25);
|
||||
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2);
|
||||
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").click({ force: true });
|
||||
cy.wait(1000)
|
||||
cy.getActiveModal().find('.ant-btn-dangerous').click();
|
||||
cy.toastWait("View deleted successfully");
|
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1);
|
||||
|
||||
// clean up newly added rows into Country table operations
|
||||
// this auto verifies successfull addition of rows to table as well
|
||||
mainPage.getPagination(5).click();
|
||||
|
||||
cy.get(".nc-grid-row").should("have.length", 13);
|
||||
cy.get(".ant-checkbox").should('exist').eq(10).click({ force: true });
|
||||
cy.get(".ant-checkbox").should('exist').eq(11).click({ force: true });
|
||||
cy.get(".ant-checkbox").should('exist').eq(12).click({ force: true });
|
||||
cy.get(".ant-checkbox").should('exist').eq(13).click({ force: true });
|
||||
|
||||
mainPage.getCell("Country", 10).rightclick({ force: true });
|
||||
cy.getActiveMenu()
|
||||
.contains("Delete Selected Rows")
|
||||
.click({ force: true });
|
||||
});
|
||||
};
|
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("form");
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
135
scripts/cypress/integration/common/4d_table_view_grid_locked.js
Normal file
135
scripts/cypress/integration/common/4d_table_view_grid_locked.js
Normal file
@@ -0,0 +1,135 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Lock view`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
mainPage.tabReset();
|
||||
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.openTableTab("Country", 25);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500)
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
const lockViewTest = (enabled) => {
|
||||
it(`Grid: lock view set to ${enabled}: validation`, () => {
|
||||
let vString = enabled ? "not." : "";
|
||||
let menuOption = enabled ? 'Locked View' : 'Collaborative View';
|
||||
|
||||
// on menu, collaboration view appears first (at index 0)
|
||||
// followed by Locked view (at index 1)
|
||||
cy.get(".nc-actions-menu-btn").click();
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-submenu').eq(0).click();
|
||||
cy.wait(1000);
|
||||
cy.get('.nc-locked-menu-item').contains(menuOption).should('exist').click();
|
||||
|
||||
// cy.get(".nc-sidebar-lock-menu")
|
||||
// .click();
|
||||
// cy.getActiveMenu()
|
||||
// .find('.nc-menu-item:visible')
|
||||
// .eq(menuOption)
|
||||
// .click();
|
||||
|
||||
if(enabled) {
|
||||
cy.toastWait('Successfully Switched to locked view')
|
||||
cy.get(".nc-icon-locked").should("exist");
|
||||
} else {
|
||||
cy.toastWait('Successfully Switched to collaborative view')
|
||||
cy.get(".nc-icon-collaborative").should("exist");
|
||||
}
|
||||
|
||||
// expected toolbar for Lock view: Only lock-view menu, reload, toggle-nav-drawer to be enabled
|
||||
//
|
||||
// cy.get(".nc-sidebar-lock-menu:enabled")
|
||||
// .should("exist");
|
||||
|
||||
cy.get(".nc-toolbar-reload-btn")
|
||||
.should("exist");
|
||||
cy.get(".nc-add-new-row-btn > .cursor-pointer")
|
||||
.should(`${vString}exist`);
|
||||
cy.get(".nc-fields-menu-btn:enabled")
|
||||
.should(`${vString}exist`);
|
||||
cy.get(".nc-sort-menu-btn:enabled")
|
||||
.should(`${vString}exist`);
|
||||
cy.get(".nc-filter-menu-btn:enabled")
|
||||
.should(`${vString}exist`);
|
||||
|
||||
// dblClick on a cell & see if we can edit
|
||||
mainPage.getCell("Country", 1).dblclick();
|
||||
mainPage
|
||||
.getCell("Country", 1)
|
||||
.find("input")
|
||||
.should(`${vString}exist`);
|
||||
|
||||
cy.get(".nc-row-expand")
|
||||
.should(`${vString}exist`);
|
||||
|
||||
// check if add/ expand options available for 'has many' column type
|
||||
// GUI-v2: TBD
|
||||
mainPage
|
||||
.getCell("City List", 1)
|
||||
.click()
|
||||
.find(".nc-action-icon.nc-plus")
|
||||
.should(`${vString}exist`);
|
||||
mainPage
|
||||
.getCell("City List", 1)
|
||||
.click()
|
||||
.find(".nc-action-icon.nc-arrow-expand")
|
||||
.should(`${vString}exist`);
|
||||
|
||||
// update row option (right click) - should not be available for Lock view
|
||||
mainPage.getCell("City List", 1).rightclick();
|
||||
cy.get(".ant-dropdown-content").should(
|
||||
`${vString}be.visible`
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
// Locked view
|
||||
lockViewTest(true);
|
||||
|
||||
// collaboration view
|
||||
lockViewTest(false);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
260
scripts/cypress/integration/common/4e_form_view_share.js
Normal file
260
scripts/cypress/integration/common/4e_form_view_share.js
Normal file
@@ -0,0 +1,260 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {loginPage} from "../../support/page_objects/navigation";
|
||||
|
||||
let storedURL = "";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - FORM view (Share)`, () => {
|
||||
const name = "Test" + Date.now();
|
||||
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
// cy.openTableTab("City", 25);
|
||||
// cy.wait(500);
|
||||
// mainPage.toggleRightSidebar();
|
||||
// cy.wait(500);
|
||||
// cy.saveLocalStorage();
|
||||
// cy.wait(500);
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
mainPage.tabReset();
|
||||
// open a table to work on views
|
||||
//
|
||||
|
||||
cy.openTableTab("City", 25);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
cy.closeTableTab("City");
|
||||
});
|
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => {
|
||||
it(`Create ${viewType} view`, () => {0
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// click on create grid view button
|
||||
cy.get(`.nc-create-${viewType}-view`).click();
|
||||
|
||||
// Pop up window, click Submit (accepting default name for view)
|
||||
cy.getActiveModal().find("button:contains(Submit)").click();
|
||||
|
||||
cy.toastWait("View created successfully");
|
||||
|
||||
// validate if view was creted && contains default name 'Country1'
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.should("exist");
|
||||
|
||||
// Prepare form
|
||||
// add header, description
|
||||
// add post submission message
|
||||
// swap position for City, LastUpdate fields
|
||||
// remove City=>Address field
|
||||
// enable "Submit another form" check box
|
||||
cy.get("button.nc-form-checkbox-show-blank-form").click();
|
||||
|
||||
// Update header & add some description, verify
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Form Title"]')
|
||||
.clear()
|
||||
.type("A B C D");
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Add form description"]')
|
||||
.type("Some description about form comes here");
|
||||
|
||||
// add message
|
||||
cy.get("textarea.nc-form-after-submit-msg")
|
||||
.type("Congratulations!");
|
||||
|
||||
// move Country field down (drag, drop)
|
||||
cy.get(".nc-form-drag-LastUpdate").drag(
|
||||
".nc-form-drag-City");
|
||||
|
||||
cy.get('[title="Address List"]').drag(".nc-drag-n-drop-to-hide");
|
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => {
|
||||
storedURL = url;
|
||||
});
|
||||
});
|
||||
|
||||
it(`Share form view`, () => {
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Form-1")
|
||||
.click();
|
||||
|
||||
cy.wait(2000);
|
||||
mainPage.shareView().click();
|
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal()
|
||||
.should('exist')
|
||||
.find(".share-link-box")
|
||||
.contains("/nc/form/", { timeout: 10000 })
|
||||
.should("exist")
|
||||
.then(($obj) => {
|
||||
let linkText = $obj.text().trim();
|
||||
cy.log(linkText);
|
||||
|
||||
cy.signOut();
|
||||
|
||||
cy.visit(linkText, {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
// wait for share view page to load!
|
||||
|
||||
cy.get(".nc-form").should("exist");
|
||||
|
||||
// New form appeared? Header & description should exist
|
||||
cy.get(".nc-form-view", { timeout: 10000 })
|
||||
.find("h1")
|
||||
.contains("A B C D")
|
||||
.should("exist");
|
||||
cy.get(".nc-form-view", { timeout: 10000 })
|
||||
.find("h2")
|
||||
.contains("Some description about form comes here")
|
||||
.should("exist");
|
||||
|
||||
// all fields, barring removed field should exist
|
||||
cy.get('[title="City"]').should("exist");
|
||||
cy.get('[title="LastUpdate"]').should("exist");
|
||||
cy.get('[title="Country"]').should("exist");
|
||||
cy.get('[title="Address List"]').should("not.exist");
|
||||
|
||||
// order of LastUpdate & City field is retained
|
||||
cy.get(".nc-form-column-label")
|
||||
.eq(0)
|
||||
.contains("LastUpdate")
|
||||
.should("exist");
|
||||
cy.get(".nc-form-column-label")
|
||||
.eq(1)
|
||||
.contains("City")
|
||||
.should("exist");
|
||||
|
||||
// submit form, to read message
|
||||
cy.get(".nc-form-input-City").type("_abc");
|
||||
cy.get(".nc-form-input-LastUpdate").click();
|
||||
cy.get(".ant-picker-now-btn:visible").contains("Now").click();
|
||||
cy.get(".ant-btn-primary:visible").contains("Ok").click();
|
||||
|
||||
// cy.get('.nc-form-field-Country')
|
||||
// .trigger('mouseover')
|
||||
// .click()
|
||||
// .find('.nc-action-icon')
|
||||
// .click();
|
||||
// // cy.get("button").contains("Link to 'Country'").click();
|
||||
// cy.getActiveModal()
|
||||
// .find(".ant-card")
|
||||
// .contains("Afghanistan")
|
||||
// .click();
|
||||
//
|
||||
// // submit button & validate
|
||||
// cy.get(".nc-form")
|
||||
// .find("button")
|
||||
// .contains("Submit")
|
||||
// .click();
|
||||
//
|
||||
// cy.get(".ant-alert-message")
|
||||
// .contains("Congratulations")
|
||||
// .should("exist")
|
||||
// .then(() => {
|
||||
// cy.get(".nc-form").should("exist");
|
||||
//
|
||||
// // validate if form has appeared again
|
||||
// cy.get(".nc-share-form-title")
|
||||
// .contains("A B C D")
|
||||
// .should("exist");
|
||||
// cy.get(".nc-share-form-desc")
|
||||
// .contains("Some description about form comes here")
|
||||
// .should("exist");
|
||||
// });
|
||||
});
|
||||
});
|
||||
|
||||
it(`Delete ${viewType} view`, () => {
|
||||
// go back to base page
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.openTableTab("City", 25);
|
||||
cy.wait(500);
|
||||
mainPage.toggleRightSidebar();
|
||||
cy.wait(500);
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2);
|
||||
|
||||
// click on delete icon (becomes visible on hovering mouse)
|
||||
cy.get(".nc-view-delete-icon").click({ force: true });
|
||||
cy.wait(1000);
|
||||
cy.getActiveModal().find('.ant-btn-dangerous').should('exist').click();
|
||||
cy.toastWait("View deleted successfully");
|
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1);
|
||||
|
||||
// // clean up newly added rows into Country table operations
|
||||
// // this auto verifies successfull addition of rows to table as well
|
||||
// mainPage.getPagination(25).click();
|
||||
// // kludge: flicker on load
|
||||
// cy.wait(3000)
|
||||
//
|
||||
// cy.get(".nc-grid-row").should("have.length", 1);
|
||||
// cy.get(".ant-checkbox").should('exist').eq(1).click({ force: true });
|
||||
// mainPage.getCell("Country", 1).rightclick({ force: true });
|
||||
// cy.getActiveMenu()
|
||||
// .contains("Delete Selected Rows")
|
||||
// .click({ force: true });
|
||||
});
|
||||
};
|
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("form");
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
515
scripts/cypress/integration/common/4f_grid_view_share.js
Normal file
515
scripts/cypress/integration/common/4f_grid_view_share.js
Normal file
@@ -0,0 +1,515 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {loginPage} from "../../support/page_objects/navigation";
|
||||
|
||||
let storedURL = "";
|
||||
|
||||
// 0: all enabled
|
||||
// 1: field hide
|
||||
// 2: field sort
|
||||
// 3: field filter
|
||||
// 4: default (address table): for view operation validation
|
||||
// 5: default (country table): for update row/column validation
|
||||
let viewURL = {};
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
const generateViewLink = (viewName) => {
|
||||
mainPage.shareView().click();
|
||||
|
||||
cy.wait(1000);
|
||||
|
||||
// wait, as URL initially will be /undefined
|
||||
cy.getActiveModal()
|
||||
.find(".share-link-box")
|
||||
.contains("/nc/view/", { timeout: 10000 })
|
||||
.should("exist");
|
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal()
|
||||
.find(".share-link-box")
|
||||
.contains("/nc/view/", { timeout: 10000 })
|
||||
.then(($obj) => {
|
||||
cy.get("body").type("{esc}");
|
||||
// viewURL.push($obj.text())
|
||||
viewURL[viewName] = $obj.text().trim();
|
||||
});
|
||||
};
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - GRID view (Share)`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
mainPage.tabReset();
|
||||
cy.openTableTab("Address", 25);
|
||||
|
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
//
|
||||
// // open a table to work on views
|
||||
// //
|
||||
// cy.openTableTab("Address", 25);
|
||||
// mainPage.toggleRightSidebar();
|
||||
// //
|
||||
// cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// close table
|
||||
// mainPage.deleteCreatedViews()
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
cy.closeTableTab("Address");
|
||||
});
|
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => {
|
||||
it(`Create ${viewType.toUpperCase()} view`, () => {
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// create a normal public view
|
||||
cy.get(`.nc-create-${viewType}-view`).click();
|
||||
cy.getActiveModal().find("button:contains(Submit)").click();
|
||||
cy.toastWait("View created successfully");
|
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => {
|
||||
storedURL = url;
|
||||
});
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} hide, sort, filter & verify`, () => {
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Grid-1")
|
||||
.click();
|
||||
mainPage.hideField("Address2");
|
||||
mainPage.sortField("District", "Z → A");
|
||||
mainPage.filterField("Address", "is like", "Ab");
|
||||
generateViewLink("combined");
|
||||
cy.log(viewURL["combined"]);
|
||||
});
|
||||
|
||||
it(`Share GRID view : ensure we have only one link even if shared multiple times`, () => {
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// generate view link multiple times
|
||||
generateViewLink("combined");
|
||||
generateViewLink("combined");
|
||||
|
||||
// verify if only one link exists in table
|
||||
mainPage.shareViewList().click();
|
||||
|
||||
cy.get('th:contains("View Link")').should("exist");
|
||||
|
||||
cy.get('th:contains("View Link")')
|
||||
.parent()
|
||||
.parent()
|
||||
.next()
|
||||
.find("tr")
|
||||
.its("length")
|
||||
.should("eq", 1)
|
||||
.then(() => {
|
||||
cy.get('button.ant-modal-close:visible').click();
|
||||
});
|
||||
|
||||
cy.signOut();
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Visit URL, Verify title`, () => {
|
||||
// visit public view
|
||||
cy.visit(viewURL["combined"], {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 18);
|
||||
|
||||
// verify title
|
||||
cy.get(".nc-shared-view-title").contains("Grid-1").should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields hidden/open`, () => {
|
||||
// verify column headers
|
||||
cy.get('[data-title="Address"]').should("exist");
|
||||
cy.get('[data-title="Address2"]').should("not.exist");
|
||||
cy.get('[data-title="District"]').should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields sort/ filter`, () => {
|
||||
// country column content verification before sort
|
||||
mainPage
|
||||
.getCell("District", 1)
|
||||
.contains("West Bengali")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell("District", 2)
|
||||
.contains("Tutuila")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell("District", 3)
|
||||
.contains("Tamil Nadu")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV`, () => {
|
||||
mainPage.hideField("LastUpdate");
|
||||
const verifyCsv = (retrievedRecords) => {
|
||||
// expected output, statically configured
|
||||
let storedRecords = [
|
||||
`Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List`,
|
||||
`1013 Tabuk Boulevard,West Bengali,96203,158399646978,[object Object],2,,Kanchrapara,`,
|
||||
`1892 Nabereznyje Telny Lane,Tutuila,28396,478229987054,[object Object],2,,Tafuna,`,
|
||||
`1993 Tabuk Lane,Tamil Nadu,64221,648482415405,[object Object],2,,Tambaram,`,
|
||||
`1661 Abha Drive,Tamil Nadu,14400,270456873752,[object Object],1,,Pudukkottai,`,
|
||||
];
|
||||
|
||||
for (let i = 0; i < storedRecords.length; i++) {
|
||||
let strCol = storedRecords[i].split(",");
|
||||
let retCol = retrievedRecords[i].split(",");
|
||||
for (let j = 0; j < 4; j++) {
|
||||
expect(strCol[j]).to.be.equal(retCol[j]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsvFromSharedView(
|
||||
`Address_exported_1.csv`,
|
||||
verifyCsv
|
||||
);
|
||||
mainPage.unhideField("LastUpdate");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Disable sort`, () => {
|
||||
// remove sort and validate
|
||||
mainPage.clearSort();
|
||||
mainPage
|
||||
.getCell("District", 1)
|
||||
.contains("West Bengali")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Enable sort`, () => {
|
||||
// Sort menu operations (Country Column, Z → A)
|
||||
mainPage.sortField("District", "Z → A");
|
||||
mainPage
|
||||
.getCell("District", 1)
|
||||
.contains("West Bengali")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Create Filter`, () => {
|
||||
// add filter & validate
|
||||
mainPage.filterField("District", "is like", "Tamil");
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 2);
|
||||
mainPage
|
||||
.getCell("District", 1)
|
||||
.contains("Tamil")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV after local filter`, () => {
|
||||
mainPage.hideField("LastUpdate");
|
||||
const verifyCsv = (retrievedRecords) => {
|
||||
// expected output, statically configured
|
||||
let storedRecords = [
|
||||
`Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List`,
|
||||
`1993 Tabuk Lane,Tamil Nadu,64221,648482415405,[object Object],2,,Tambaram,`,
|
||||
`1661 Abha Drive,Tamil Nadu,14400,270456873752,[object Object],1,,Pudukkottai,`,
|
||||
];
|
||||
|
||||
// for (let i = 0; i < storedRecords.length; i++) {
|
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i])
|
||||
// }
|
||||
|
||||
// ncv2@fixme
|
||||
// for (let i = 0; i < storedRecords.length; i++) {
|
||||
// let strCol = storedRecords[i].split(",");
|
||||
// let retCol = retrievedRecords[i].split(",");
|
||||
// for (let j = 0; j < 4; j++) {
|
||||
// expect(strCol[j]).to.be.equal(retCol[j]);
|
||||
// }
|
||||
// }
|
||||
};
|
||||
mainPage.downloadAndVerifyCsvFromSharedView(
|
||||
`Address_exported_1.csv`,
|
||||
verifyCsv
|
||||
);
|
||||
mainPage.unhideField("LastUpdate");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Delete Filter`, () => {
|
||||
// Remove sort and Validate
|
||||
mainPage.filterReset();
|
||||
mainPage
|
||||
.getCell("District", 1)
|
||||
.contains("West Bengali")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share GRID view : Virtual column validation > has many`, () => {
|
||||
// verify column headers
|
||||
cy.get('[data-title="Customer List"]').should("exist");
|
||||
cy.get('[data-title="Staff List"]').should("exist");
|
||||
cy.get('[data-title="City"]').should("exist");
|
||||
cy.get('[data-title="Staff List"]').should("exist");
|
||||
|
||||
// has many field validation
|
||||
mainPage
|
||||
.getCell("Customer List", 3)
|
||||
.click()
|
||||
.find(".nc-icon.nc-unlink-icon")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("Customer List", 3)
|
||||
.click()
|
||||
.find(".nc-icon.nc-action-icon.nc-plus")
|
||||
.should("not.exist");
|
||||
|
||||
// mainPage
|
||||
// .getCell("Customer List", 3)
|
||||
// .click()
|
||||
// .find(".nc-icon.nc-action-icon.nc-arrow-expand")
|
||||
// .click({ force: true });
|
||||
//
|
||||
// // reload button
|
||||
// cy.getActiveModal().find(".nc-icon").should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find("button")
|
||||
// .contains("Link to")
|
||||
// .should("not.exist");
|
||||
// cy.getActiveModal()
|
||||
// .find(".ant-card")
|
||||
// .contains("2")
|
||||
// .should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find(".ant-card")
|
||||
// .find("button")
|
||||
// .should("not.exist");
|
||||
// cy.get('button.ant-modal-close').click();
|
||||
});
|
||||
|
||||
it(`Share GRID view : Virtual column validation > belongs to`, () => {
|
||||
// belongs to field validation
|
||||
mainPage
|
||||
.getCell("City", 1)
|
||||
.click()
|
||||
.find(".nc-icon.nc-unlink-icon")
|
||||
.should("not.exist");
|
||||
|
||||
mainPage
|
||||
.getCell("City", 1)
|
||||
.click()
|
||||
.find(".nc-icon.nc-action-icon.nc-arrow-expand")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("City", 1)
|
||||
.find(".chips")
|
||||
.contains("Kanchrapara")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share GRID view : Virtual column validation > many to many`, () => {
|
||||
// many-to-many field validation
|
||||
mainPage
|
||||
.getCell("Staff List", 1)
|
||||
.click()
|
||||
.find(".nc-icon.nc-unlink-icon")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("Staff List", 1)
|
||||
.click()
|
||||
.find(".nc-icon.nc-action-icon.nc-plus")
|
||||
.should("not.exist");
|
||||
|
||||
mainPage
|
||||
.getCell("Staff List", 1)
|
||||
.click()
|
||||
.find(".nc-icon.nc-action-icon.nc-arrow-expand")
|
||||
.click({ force: true });
|
||||
|
||||
// // reload button
|
||||
// Fix me : ncv2@fixme
|
||||
// cy.getActiveModal().find(".nc-icon").should("exist");
|
||||
// cy.getActiveModal()
|
||||
// .find("button")
|
||||
// .contains("Link to")
|
||||
// .should("not.exist");
|
||||
// cy.get('button.ant-modal-close:visible').last().click();
|
||||
});
|
||||
|
||||
it(`Delete ${viewType.toUpperCase()} view`, () => {
|
||||
// go back to base page
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.openTableTab("Address", 25);
|
||||
|
||||
mainPage.toggleRightSidebar();
|
||||
cy.wait(500);
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2);
|
||||
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.getActiveModal().find(".ant-btn-dangerous").click();
|
||||
cy.toastWait("View deleted successfully");
|
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1);
|
||||
});
|
||||
};
|
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("grid");
|
||||
});
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Grid view/ row-column update verification`, () => {
|
||||
before(() => {
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// Address table has belongs to, has many & many-to-many
|
||||
cy.openTableTab("Country", 25);
|
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => {
|
||||
storedURL = url;
|
||||
generateViewLink("rowColUpdate");
|
||||
});
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// close table
|
||||
// cy.visit(storedURL, {
|
||||
// baseUrl: null,
|
||||
// });
|
||||
// cy.wait(5000);
|
||||
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.openTableTab("Country", 25)
|
||||
cy.wait(500);
|
||||
mainPage.toggleRightSidebar();
|
||||
cy.wait(500);
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// delete row
|
||||
mainPage.getPagination(5).click();
|
||||
// kludge: flicker on load
|
||||
cy.wait(3000)
|
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10);
|
||||
mainPage.getCell("Country", 10).rightclick();
|
||||
cy.getActiveMenu()
|
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")')
|
||||
.first()
|
||||
.click();
|
||||
|
||||
// delete column
|
||||
mainPage.deleteColumn("dummy");
|
||||
mainPage.deleteCreatedViews();
|
||||
|
||||
// close table
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
it(`Generate default Shared GRID view URL`, () => {
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(500);
|
||||
|
||||
// add row
|
||||
cy.get(".nc-add-new-row-btn").click();
|
||||
cy.get(".nc-expand-col-Country").find(".nc-cell > input")
|
||||
.should("exist")
|
||||
.first()
|
||||
.clear({ force: true })
|
||||
.type("a");
|
||||
cy.getActiveDrawer()
|
||||
.find("button")
|
||||
.contains("Save row")
|
||||
.click();
|
||||
cy.toastWait("updated successfully");
|
||||
cy.getActiveDrawer()
|
||||
.find("button")
|
||||
.contains("Cancel")
|
||||
.click();
|
||||
// add column
|
||||
mainPage.addColumn("dummy", "Country");
|
||||
|
||||
cy.signOut();
|
||||
|
||||
// visit public view
|
||||
cy.log(viewURL["rowColUpdate"]);
|
||||
cy.visit(viewURL["rowColUpdate"], {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
// wait for public view page to load!
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 25);
|
||||
});
|
||||
|
||||
it(`Share GRID view : new row visible`, () => {
|
||||
// verify row
|
||||
// cy.get(`.v-pagination > li:contains('5') button`).click();
|
||||
cy.get(`.nc-pagination > .ant-pagination-item.ant-pagination-item-5`).click();
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10);
|
||||
mainPage.getCell("Country", 10).contains("a").should("exist");
|
||||
});
|
||||
|
||||
it(`Share GRID view : new column visible`, () => {
|
||||
// verify column headers
|
||||
cy.get('[data-title="dummy"]').should("exist");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
487
scripts/cypress/integration/common/4f_pg_grid_view_share.js
Normal file
487
scripts/cypress/integration/common/4f_pg_grid_view_share.js
Normal file
@@ -0,0 +1,487 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
|
||||
let storedURL = "";
|
||||
|
||||
// 0: all enabled
|
||||
// 1: field hide
|
||||
// 2: field sort
|
||||
// 3: field filter
|
||||
// 4: default (address table): for view operation validation
|
||||
// 5: default (country table): for update row/column validation
|
||||
let viewURL = {};
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
const generateViewLink = (viewName) => {
|
||||
// click on share view
|
||||
// cy.get(".v-navigation-drawer__content > .container")
|
||||
// .find(".v-list > .v-list-item")
|
||||
// .contains("Share View")
|
||||
// .click();
|
||||
mainPage.shareView().click({ force: true });
|
||||
|
||||
cy.wait(5000);
|
||||
|
||||
// wait, as URL initially will be /undefined
|
||||
cy.getActiveModal()
|
||||
.find(".share-link-box")
|
||||
.contains("/nc/view/", { timeout: 10000 })
|
||||
.should("exist");
|
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal()
|
||||
.find(".share-link-box")
|
||||
.contains("/nc/view/", { timeout: 10000 })
|
||||
.then(($obj) => {
|
||||
cy.get("body").type("{esc}");
|
||||
// viewURL.push($obj.text())
|
||||
viewURL[viewName] = $obj.text().trim();
|
||||
});
|
||||
};
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - GRID view (Share)`, () => {
|
||||
// Run once before test- create project (rest/graphql)
|
||||
//
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
mainPage.tabReset();
|
||||
// open a table to work on views
|
||||
//
|
||||
cy.openTableTab("Address", 25);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// close table
|
||||
// mainPage.deleteCreatedViews()
|
||||
cy.closeTableTab("Address");
|
||||
});
|
||||
|
||||
// Common routine to create/edit/delete GRID & GALLERY view
|
||||
// Input: viewType - 'grid'/'gallery'
|
||||
//
|
||||
const viewTest = (viewType) => {
|
||||
it(`Create ${viewType.toUpperCase()} view`, () => {
|
||||
// create a normal public view
|
||||
cy.get(`.nc-create-${viewType}-view`).click();
|
||||
cy.getActiveModal().find("button:contains(Submit)").click();
|
||||
cy.toastWait("View created successfully");
|
||||
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => {
|
||||
storedURL = url;
|
||||
});
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} hide, sort, filter & verify`, () => {
|
||||
cy.get(`.nc-view-item.nc-${viewType}-view-item`)
|
||||
.contains("Address1")
|
||||
.click();
|
||||
mainPage.hideField("Address2");
|
||||
mainPage.sortField("Address", "Z → A");
|
||||
mainPage.filterField("Address", "is like", "Ab");
|
||||
generateViewLink("combined");
|
||||
cy.log(viewURL["combined"]);
|
||||
});
|
||||
|
||||
it(`Share GRID view : ensure we have only one link even if shared multiple times`, () => {
|
||||
// generate view link multiple times
|
||||
generateViewLink("combined");
|
||||
generateViewLink("combined");
|
||||
|
||||
// verify if only one link exists in table
|
||||
// cy.get(".v-navigation-drawer__content > .container")
|
||||
// .find(".v-list > .v-list-item")
|
||||
// .contains("Share View")
|
||||
// .parent()
|
||||
// .find("button.mdi-dots-vertical")
|
||||
// .click();
|
||||
mainPage.shareViewList().click();
|
||||
|
||||
// cy.getActiveMenu().find(".v-list-item").contains("Views List").click();
|
||||
|
||||
cy.get('th:contains("View Link")').should("exist");
|
||||
|
||||
cy.get('th:contains("View Link")')
|
||||
.parent()
|
||||
.parent()
|
||||
.next()
|
||||
.find("tr")
|
||||
.its("length")
|
||||
.should("eq", 1)
|
||||
.then(() => {
|
||||
// cy.get(".v-overlay__content > .d-flex > .v-icon").click();
|
||||
// close modal (fix me! add a close button to share view list modal)
|
||||
cy.get(".v-overlay--active > .v-overlay__scrim").click({
|
||||
force: true,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Visit URL, Verify title`, () => {
|
||||
// visit public view
|
||||
cy.visit(viewURL["combined"], {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 18);
|
||||
|
||||
// verify title
|
||||
cy.get("div.model-name").contains("Address1").should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields hidden/open`, () => {
|
||||
// verify column headers
|
||||
cy.get('[data-col="Address"]').should("exist");
|
||||
cy.get('[data-col="Address2"]').should("not.exist");
|
||||
cy.get('[data-col="District"]').should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify fields sort/ filter`, () => {
|
||||
// country column content verification before sort
|
||||
mainPage
|
||||
.getCell("Address", 1)
|
||||
.contains("669 Firozabad Loop")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell("Address", 2)
|
||||
.contains("48 Maracabo Place")
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell("Address", 3)
|
||||
.contains("44 Najafabad Way")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV`, () => {
|
||||
mainPage.hideField("LastUpdate");
|
||||
const verifyCsv = (retrievedRecords) => {
|
||||
// expected output, statically configured
|
||||
let storedRecords = [
|
||||
`Address,District,PostalCode,Phone`,
|
||||
`669 Firozabad Loop,,92265,,[object Object],2,,Kanchrapara,`,
|
||||
`48 Maracabo Place,,1570,,[object Object],2,,Tafuna,`,
|
||||
`44 Najafabad Way,,61391,,[object Object],2,,Tambaram,`,
|
||||
`381 Kabul Way,,87272,,[object Object],1,,Pudukkottai,`,
|
||||
];
|
||||
|
||||
for (let i = 0; i < storedRecords.length; i++) {
|
||||
let strCol = storedRecords[i].split(",");
|
||||
let retCol = retrievedRecords[i].split(",");
|
||||
expect(strCol[0]).to.be.equal(retCol[0]);
|
||||
expect(strCol[2]).to.be.equal(retCol[2]);
|
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i])
|
||||
}
|
||||
};
|
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsv(
|
||||
`Address_exported_1.csv`,
|
||||
verifyCsv
|
||||
);
|
||||
mainPage.unhideField("LastUpdate");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Disable sort`, () => {
|
||||
// remove sort and validate
|
||||
mainPage.clearSort();
|
||||
mainPage
|
||||
.getCell("Address", 1)
|
||||
//ncv2@fixme
|
||||
.contains("669 Firozabad Loop")
|
||||
//.contains("217 Botshabelo Place")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Enable sort`, () => {
|
||||
// Sort menu operations (Country Column, Z->A)
|
||||
mainPage.sortField("Address", "Z → A");
|
||||
mainPage
|
||||
.getCell("Address", 1)
|
||||
.contains("669 Firozabad Loop")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Create Filter`, () => {
|
||||
// add filter & validate
|
||||
mainPage.filterField("Address", "is like", "drive");
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 3);
|
||||
mainPage
|
||||
.getCell("Address", 1)
|
||||
.contains("1888 Kabul Drive")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : verify download CSV after local filter`, () => {
|
||||
mainPage.hideField("LastUpdate");
|
||||
const verifyCsv = (retrievedRecords) => {
|
||||
// expected output, statically configured
|
||||
let storedRecords = [
|
||||
`Address,District,PostalCode,Phone,Location,Customer List,Staff List,City,Staff List`,
|
||||
`1888 Kabul Drive,,20936,,1,,Ife,,`,
|
||||
`1661 Abha Drive,,14400,,1,,Pudukkottai,,`,
|
||||
];
|
||||
|
||||
// for (let i = 0; i < storedRecords.length; i++) {
|
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i])
|
||||
// }
|
||||
|
||||
for (let i = 0; i < storedRecords.length; i++) {
|
||||
let strCol = storedRecords[i].split(",");
|
||||
let retCol = retrievedRecords[i].split(",");
|
||||
expect(strCol[0]).to.be.equal(retCol[0]);
|
||||
expect(strCol[2]).to.be.equal(retCol[2]);
|
||||
}
|
||||
};
|
||||
mainPage.downloadAndVerifyCsv(
|
||||
`Address_exported_1.csv`,
|
||||
verifyCsv
|
||||
);
|
||||
mainPage.unhideField("LastUpdate");
|
||||
});
|
||||
|
||||
it(`Share ${viewType.toUpperCase()} view : Delete Filter`, () => {
|
||||
// Remove sort and Validate
|
||||
mainPage.filterReset();
|
||||
mainPage
|
||||
.getCell("Address", 1)
|
||||
.contains("669 Firozabad Loop")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share GRID view : Virtual column validation > has many`, () => {
|
||||
// verify column headers
|
||||
cy.get('[data-col="Customer List"]').should("exist");
|
||||
cy.get('[data-col="Staff List"]').should("exist");
|
||||
cy.get('[data-col="City"]').should("exist");
|
||||
cy.get('[data-col="Staff List"]').should("exist");
|
||||
|
||||
// has many field validation
|
||||
mainPage
|
||||
.getCell("Customer List", 3)
|
||||
.click()
|
||||
.find("button.mdi-close-thick")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("Customer List", 3)
|
||||
.click()
|
||||
.find("button.mdi-plus")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("Customer List", 3)
|
||||
.click()
|
||||
.find("button.mdi-arrow-expand")
|
||||
.click();
|
||||
|
||||
cy.getActiveModal().find("button.mdi-reload").should("exist");
|
||||
cy.getActiveModal()
|
||||
.find("button")
|
||||
.contains("Link to")
|
||||
.should("not.exist");
|
||||
cy.getActiveModal()
|
||||
.find(".child-card")
|
||||
.contains("2")
|
||||
.should("exist");
|
||||
cy.getActiveModal()
|
||||
.find(".child-card")
|
||||
.find("button")
|
||||
.should("not.exist");
|
||||
cy.get("body").type("{esc}");
|
||||
});
|
||||
|
||||
it(`Share GRID view : Virtual column validation > belongs to`, () => {
|
||||
// belongs to field validation
|
||||
mainPage
|
||||
.getCell("City", 1)
|
||||
.click()
|
||||
.find("button.mdi-close-thick")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("City", 1)
|
||||
.click()
|
||||
.find("button.mdi-arrow-expand")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("City", 1)
|
||||
.find(".v-chip")
|
||||
.contains("al-Ayn")
|
||||
.should("exist");
|
||||
});
|
||||
|
||||
it(`Share GRID view : Virtual column validation > many to many`, () => {
|
||||
// many-to-many field validation
|
||||
mainPage
|
||||
.getCell("Staff List", 1)
|
||||
.click()
|
||||
.find("button.mdi-close-thick")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("Staff List", 1)
|
||||
.click()
|
||||
.find("button.mdi-plus")
|
||||
.should("not.exist");
|
||||
mainPage
|
||||
.getCell("Staff List", 1)
|
||||
.click()
|
||||
.find("button.mdi-arrow-expand")
|
||||
.click();
|
||||
|
||||
cy.getActiveModal().find("button.mdi-reload").should("exist");
|
||||
cy.getActiveModal()
|
||||
.find("button")
|
||||
.contains("Link to")
|
||||
.should("not.exist");
|
||||
cy.get("body").type("{esc}");
|
||||
});
|
||||
|
||||
it(`Delete ${viewType.toUpperCase()} view`, () => {
|
||||
// go back to base page
|
||||
cy.visit(storedURL, {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
// number of view entries should be 2 before we delete
|
||||
cy.get(".nc-view-item").its("length").should("eq", 2);
|
||||
|
||||
cy.get(".nc-view-delete-icon").eq(0).click({ force: true });
|
||||
cy.toastWait("View deleted successfully");
|
||||
|
||||
// confirm if the number of veiw entries is reduced by 1
|
||||
cy.get(".nc-view-item").its("length").should("eq", 1);
|
||||
});
|
||||
};
|
||||
|
||||
// below scenario's will be invoked twice, once for rest & then for graphql
|
||||
viewTest("grid");
|
||||
});
|
||||
|
||||
describe(`${apiType.toUpperCase()} api - Grid view/ row-column update verification`, () => {
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
// Address table has belongs to, has many & many-to-many
|
||||
cy.openTableTab("Country", 25);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
// store base URL- to re-visit and delete form view later
|
||||
cy.url().then((url) => {
|
||||
storedURL = url;
|
||||
generateViewLink("rowColUpdate");
|
||||
});
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// close table
|
||||
cy.restoreLocalStorage();
|
||||
cy.visit(storedURL, {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
// delete row
|
||||
mainPage.getPagination(5).click();
|
||||
// kludge: flicker on load
|
||||
cy.wait(3000)
|
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10);
|
||||
mainPage
|
||||
.getRow(10)
|
||||
.find(".mdi-checkbox-blank-outline")
|
||||
.click({ force: true });
|
||||
mainPage.getCell("Country", 10).rightclick();
|
||||
cy.getActiveMenu().contains("Delete Selected Row").click();
|
||||
|
||||
// delete column
|
||||
cy.get(`th:contains('dummy') .mdi-menu-down`)
|
||||
.trigger("mouseover")
|
||||
.click();
|
||||
cy.get(".nc-column-delete").click();
|
||||
cy.get("button:contains(Confirm)").click();
|
||||
|
||||
cy.toastWait("Update table successful");
|
||||
|
||||
mainPage.deleteCreatedViews();
|
||||
|
||||
// close table
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
it(`Generate default Shared GRID view URL`, () => {
|
||||
// add row
|
||||
cy.get(".nc-add-new-row-btn").click();
|
||||
cy.get("#data-table-form-Country > input")
|
||||
.first()
|
||||
.click()
|
||||
.type("a");
|
||||
cy.contains("Save row").filter("button").click({ force: true });
|
||||
cy.toastWait("updated successfully");
|
||||
|
||||
// add column
|
||||
mainPage.addColumn("dummy", "Country");
|
||||
|
||||
// visit public view
|
||||
cy.log(viewURL["rowColUpdate"]);
|
||||
cy.restoreLocalStorage();
|
||||
cy.visit(viewURL["rowColUpdate"], {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
//5
|
||||
// wait for public view page to load!
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 25);
|
||||
});
|
||||
|
||||
it(`Share GRID view : new row visible`, () => {
|
||||
// verify row
|
||||
cy.get(`.v-pagination > li:contains('5') button`).click();
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10);
|
||||
mainPage.getCell("Country", 10).contains("a").should("exist");
|
||||
});
|
||||
|
||||
it.skip(`Share GRID view : new column visible`, () => {
|
||||
// verify column headers
|
||||
cy.get('[data-col="dummy"]').should("exist");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
299
scripts/cypress/integration/common/5a_user_role.js
Normal file
299
scripts/cypress/integration/common/5a_user_role.js
Normal file
@@ -0,0 +1,299 @@
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation";
|
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
isPostgres,
|
||||
isXcdb,
|
||||
roles,
|
||||
staticProjects,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import {
|
||||
_advSettings,
|
||||
_editSchema,
|
||||
_editData,
|
||||
_editComment,
|
||||
_viewMenu,
|
||||
_topRightMenu,
|
||||
disableTableAccess,
|
||||
_accessControl,
|
||||
} from "../spec/roleValidation.spec";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe("Static user creations (different roles)", () => {
|
||||
before(() => {
|
||||
mainPage.tabReset();
|
||||
|
||||
// kludge: wait for page load to finish
|
||||
cy.wait(4000);
|
||||
// close team & auth tab
|
||||
cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
cy.wait(1000);
|
||||
|
||||
settingsPage.openMenu(settingsPage.TEAM_N_AUTH)
|
||||
|
||||
cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.signOut();
|
||||
});
|
||||
|
||||
const addUser = (user) => {
|
||||
it(`RoleType: ${user.name}`, () => {
|
||||
// for first project, users need to be added explicitly using "New User" button
|
||||
// for subsequent projects, they will be required to just add to this project
|
||||
// using ROW count to identify if its former or latter scenario
|
||||
// 5 users (owner, creator, editor, viewer, commenter) = 5
|
||||
// cy.get(`.nc-user-row`).then((obj) => {
|
||||
// cy.log(obj.length);
|
||||
// if (obj.length == 5) {
|
||||
// mainPage.addExistingUserToProject(
|
||||
// user.credentials.username,
|
||||
// user.name
|
||||
// );
|
||||
// } else {
|
||||
// mainPage.addNewUserToProject(
|
||||
// user.credentials,
|
||||
// user.name
|
||||
// );
|
||||
// }
|
||||
// });
|
||||
|
||||
cy.get(`.nc-user-row`).should('exist')
|
||||
mainPage.addNewUserToProject(
|
||||
user.credentials,
|
||||
user.name
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
addUser(roles.creator);
|
||||
addUser(roles.editor);
|
||||
addUser(roles.commenter);
|
||||
addUser(roles.viewer);
|
||||
|
||||
// Access control list- configuration
|
||||
//
|
||||
it(`Access control list- configuration`, () => {
|
||||
mainPage.closeMetaTab();
|
||||
|
||||
// open Project metadata tab
|
||||
//
|
||||
settingsPage.openMenu(settingsPage.PROJ_METADATA);
|
||||
settingsPage.openTab(settingsPage.UI_ACCESS_CONTROL);
|
||||
|
||||
// validate if it has 19 entries representing tables & views
|
||||
if (isPostgres())
|
||||
cy.get(".nc-acl-table-row").should("have.length", 24);
|
||||
else if (isXcdb())
|
||||
cy.get(".nc-acl-table-row").should("have.length", 19);
|
||||
else cy.get(".nc-acl-table-row").should("have.length", 19);
|
||||
|
||||
// disable table & view access
|
||||
//
|
||||
disableTableAccess("Language", "editor");
|
||||
disableTableAccess("Language", "commenter");
|
||||
disableTableAccess("Language", "viewer");
|
||||
|
||||
disableTableAccess("CustomerList", "editor");
|
||||
disableTableAccess("CustomerList", "commenter");
|
||||
disableTableAccess("CustomerList", "viewer");
|
||||
|
||||
cy.get("button.nc-acl-save").click({ force: true });
|
||||
cy.toastWait("Updated UI ACL for tables successfully");
|
||||
|
||||
mainPage.closeMetaTab();
|
||||
});
|
||||
});
|
||||
|
||||
const roleValidation = (roleType) => {
|
||||
describe(`User role validation`, () => {
|
||||
|
||||
before(() => {
|
||||
// cy.restoreLocalStorage();
|
||||
cy.visit(mainPage.roleURL[roleType])
|
||||
cy.wait(5000);
|
||||
|
||||
cy.get('button:contains("SIGN UP")').should('exist')
|
||||
cy.get('input[type="text"]', { timeout: 20000 }).type(
|
||||
roles[roleType].credentials.username
|
||||
);
|
||||
cy.get('input[type="password"]').type(roles[roleType].credentials.password);
|
||||
cy.get('button:contains("SIGN UP")').click();
|
||||
|
||||
cy.wait(3000);
|
||||
|
||||
cy.get('.nc-project-page-title').contains("My Projects").should("be.visible");
|
||||
|
||||
if (dbType === "xcdb") {
|
||||
if ("rest" == apiType)
|
||||
projectsPage.openProject(
|
||||
staticProjects.sampleREST.basic.name
|
||||
);
|
||||
else
|
||||
projectsPage.openProject(
|
||||
staticProjects.sampleGQL.basic.name
|
||||
);
|
||||
} else if (dbType === "mysql") {
|
||||
if ("rest" == apiType)
|
||||
projectsPage.openProject(
|
||||
staticProjects.externalREST.basic.name
|
||||
);
|
||||
else
|
||||
projectsPage.openProject(
|
||||
staticProjects.externalGQL.basic.name
|
||||
);
|
||||
} else if (dbType === "postgres") {
|
||||
if ("rest" == apiType)
|
||||
projectsPage.openProject(
|
||||
staticProjects.pgExternalREST.basic.name
|
||||
);
|
||||
else
|
||||
projectsPage.openProject(
|
||||
staticProjects.pgExternalGQL.basic.name
|
||||
);
|
||||
}
|
||||
|
||||
if (roleType === "creator") {
|
||||
// kludge: wait for page load to finish
|
||||
// close team & auth tab
|
||||
cy.wait(2000);
|
||||
cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
cy.wait(1000);
|
||||
}
|
||||
|
||||
cy.saveLocalStorage();
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// sign out
|
||||
cy.signOut();
|
||||
});
|
||||
|
||||
///////////////////////////////////////////////////////
|
||||
// Test suite
|
||||
|
||||
it(`[${roles[roleType].name}] Left navigation menu, New User add`, () => {
|
||||
// project configuration settings
|
||||
//
|
||||
_advSettings(roleType, "userRole");
|
||||
});
|
||||
|
||||
it(`[${roles[roleType].name}] Access control`, () => {
|
||||
// Access control validation
|
||||
//
|
||||
_accessControl(roleType, "userRole");
|
||||
});
|
||||
|
||||
it(`[${roles[roleType].name}] Schema: create table, add/modify/delete column`, () => {
|
||||
// Schema related validations
|
||||
// - Add/delete table
|
||||
// - Add/Update/delete column
|
||||
//
|
||||
_editSchema(roleType, "userRole");
|
||||
});
|
||||
|
||||
it(`[${roles[roleType].name}] Data: add/modify/delete row, update cell contents`, () => {
|
||||
// Table data related validations
|
||||
// - Add/delete/modify row
|
||||
//
|
||||
_editData(roleType, "userRole");
|
||||
});
|
||||
|
||||
it(`[${roles[roleType].name}] Comments: view/add`, () => {
|
||||
// read &/ update comment
|
||||
// Viewer: only allowed to read
|
||||
// Everyone else: read &/ update
|
||||
//
|
||||
_editComment(roleType, "userRole");
|
||||
});
|
||||
|
||||
it(`[${roles[roleType].name}] Right navigation menu, share view`, () => {
|
||||
// right navigation menu bar
|
||||
// Editor/Viewer/Commenter : can only view 'existing' views
|
||||
// Rest: can create/edit
|
||||
_viewMenu(roleType, "userRole");
|
||||
});
|
||||
|
||||
it(`[${roles[roleType].name}] Download files`, () => {
|
||||
|
||||
// to be fixed
|
||||
if(roleType === 'commenter' || roleType === 'viewer') {}
|
||||
else {
|
||||
// viewer & commenter doesn't contain hideField option in ncv2
|
||||
// #ID, City, LastUpdate, City => Address, Country <= City, +
|
||||
mainPage.hideField("LastUpdate");
|
||||
|
||||
const verifyCsv = (retrievedRecords) => {
|
||||
// expected output, statically configured
|
||||
let storedRecords = [
|
||||
`City,Address List,Country`,
|
||||
`A Corua (La Corua),939 Probolinggo Loop,Spain`,
|
||||
`Abha,733 Mandaluyong Place,Saudi Arabia`,
|
||||
`Abu Dhabi,535 Ahmadnagar Manor,United Arab Emirates`,
|
||||
`Acua,1789 Saint-Denis Parkway,Mexico`,
|
||||
];
|
||||
|
||||
// skip if xcdb
|
||||
if (!isXcdb()) {
|
||||
for (let i = 0; i < storedRecords.length; i++) {
|
||||
// cy.log(retrievedRecords[i])
|
||||
expect(retrievedRecords[i]).to.be.equal(
|
||||
storedRecords[i]
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsv(
|
||||
`City_exported_1.csv`,
|
||||
verifyCsv,
|
||||
roleType
|
||||
);
|
||||
mainPage.unhideField("LastUpdate");
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// skip owner validation as rest of the cases pretty much cover the same
|
||||
// roleValidation('owner')
|
||||
roleValidation("creator");
|
||||
roleValidation("editor");
|
||||
roleValidation("commenter");
|
||||
roleValidation("viewer");
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
181
scripts/cypress/integration/common/5b_preview_role.js
Normal file
181
scripts/cypress/integration/common/5b_preview_role.js
Normal file
@@ -0,0 +1,181 @@
|
||||
// pre-requisite:
|
||||
// user@nocodb.com signed up as admin
|
||||
// sakilaDb database created already
|
||||
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation";
|
||||
import { mainPage, settingsPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
isPostgres,
|
||||
isTestSuiteActive,
|
||||
isXcdb, roles
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
import {
|
||||
_advSettings,
|
||||
_editSchema,
|
||||
_editData,
|
||||
_editComment,
|
||||
_viewMenu,
|
||||
_topRightMenu,
|
||||
enableTableAccess,
|
||||
_accessControl,
|
||||
} from "../spec/roleValidation.spec";
|
||||
|
||||
export const genTest = (apiType, dbType, roleType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
//// Test Suite
|
||||
|
||||
describe("Role preview validations", () => {
|
||||
// Sign in/ open project
|
||||
before(() => {
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.openTableTab("City", 25);
|
||||
|
||||
cy.wait(3000);
|
||||
|
||||
settingsPage.openProjectMenu();
|
||||
cy.getActiveMenu().find(`[data-submenu-id="preview-as"]`).should('exist').click()
|
||||
cy.wait(1000)
|
||||
cy.get('.ant-dropdown-menu-submenu').eq(4).find(`[data-menu-id="editor"]`).should('exist').click()
|
||||
|
||||
cy.wait(10000)
|
||||
|
||||
cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// cy.get(".nc-preview-reset").click({ force: true });
|
||||
cy.get(".mdi-exit-to-app").click();
|
||||
// cy.wait(20000)
|
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row", { timeout: 25000 }).should(
|
||||
"have.length",
|
||||
25
|
||||
);
|
||||
|
||||
// cy.get('.nc-preview-reset:visible').should('not-exist')
|
||||
|
||||
// mainPage.navigationDraw(mainPage.ROLE_VIEW).contains('Reset Preview').should('not.exist')
|
||||
// cy.get('.nc-preview-reset').should('not-exist')
|
||||
cy.closeTableTab("City");
|
||||
|
||||
// open Project metadata tab
|
||||
//
|
||||
mainPage.navigationDraw(mainPage.PROJ_METADATA).click();
|
||||
// cy.get(".nc-exp-imp-metadata").dblclick({ force: true });
|
||||
cy.get(".nc-ui-acl-tab").click({ force: true });
|
||||
|
||||
// validate if it has 19 entries representing tables & views
|
||||
if (isPostgres())
|
||||
cy.get(".nc-acl-table-row").should("have.length", 24);
|
||||
else if (isXcdb())
|
||||
cy.get(".nc-acl-table-row").should("have.length", 19);
|
||||
else cy.get(".nc-acl-table-row").should("have.length", 19);
|
||||
|
||||
// restore access
|
||||
//
|
||||
enableTableAccess("language", "editor");
|
||||
enableTableAccess("language", "commenter");
|
||||
enableTableAccess("language", "viewer");
|
||||
|
||||
enableTableAccess("customerlist", "editor");
|
||||
enableTableAccess("customerlist", "commenter");
|
||||
enableTableAccess("customerlist", "viewer");
|
||||
});
|
||||
|
||||
const genTestSub = (roleType) => {
|
||||
it(`Role preview: ${roleType}: Enable preview`, () => {
|
||||
cy.get(".nc-floating-preview-btn", {timeout: 30000}).should("exist");
|
||||
cy.get('.nc-floating-preview-btn')
|
||||
.find(`[type="radio"][value="${roleType}"]`)
|
||||
.should('exist')
|
||||
.click();
|
||||
|
||||
cy.wait(5000)
|
||||
cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
it(`Role preview: ${roleType}: Advance settings`, () => {
|
||||
// project configuration settings
|
||||
//
|
||||
_advSettings(roleType, "preview");
|
||||
});
|
||||
|
||||
it(`Role preview: ${roleType}: Access control`, () => {
|
||||
// Access control validation
|
||||
//
|
||||
_accessControl(roleType, "preview");
|
||||
});
|
||||
|
||||
it(`Role preview: ${roleType}: Edit data`, () => {
|
||||
// Table data related validations
|
||||
// - Add/delete/modify row
|
||||
//
|
||||
_editData(roleType, "preview");
|
||||
});
|
||||
|
||||
it(`Role preview: ${roleType}: Edit comment`, () => {
|
||||
// read &/ update comment
|
||||
// Viewer: not allowed to read
|
||||
// Everyone else: read &/ update
|
||||
//
|
||||
_editComment(roleType, "preview");
|
||||
});
|
||||
|
||||
it(`Role preview: ${roleType}: Preview menu`, () => {
|
||||
// right navigation menu bar
|
||||
// Editor/Viewer/Commenter : can only view 'existing' views
|
||||
// Rest: can create/edit
|
||||
_viewMenu(roleType, "preview");
|
||||
});
|
||||
|
||||
it(`Role preview: ${roleType}: Top Right Menu bar`, () => {
|
||||
// Share button is conditional
|
||||
// Rest are static/ mandatory
|
||||
//
|
||||
_topRightMenu(roleType, "preview");
|
||||
});
|
||||
|
||||
it(`Role preview: ${roleType}: Edit Schema`, () => {
|
||||
// Schema related validations
|
||||
// - Add/delete table
|
||||
// - Add/Update/delete column
|
||||
//
|
||||
_editSchema(roleType, "preview");
|
||||
});
|
||||
};
|
||||
|
||||
genTestSub("editor");
|
||||
genTestSub("commenter");
|
||||
genTestSub("viewer");
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
105
scripts/cypress/integration/common/6b_downloadCsv.js
Normal file
105
scripts/cypress/integration/common/6b_downloadCsv.js
Normal file
@@ -0,0 +1,105 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
import {
|
||||
isPostgres,
|
||||
isTestSuiteActive,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} Upload/ Download CSV`, () => {
|
||||
before(() => {
|
||||
|
||||
// kludge: wait for page load to finish
|
||||
cy.wait(2000);
|
||||
// close team & auth tab
|
||||
cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
cy.wait(1000);
|
||||
|
||||
cy.openTableTab("Country", 25);
|
||||
cy.wait(1000);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.closeTableTab("Country");
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it("Download verification- base view, default columns", () => {
|
||||
mainPage.hideField("LastUpdate");
|
||||
const verifyCsv = (retrievedRecords) => {
|
||||
// expected output, statically configured
|
||||
// let storedRecords = [
|
||||
// `Country,CityList`,
|
||||
// `Afghanistan,Kabul`,
|
||||
// `Algeria,"Batna, Bchar, Skikda"`,
|
||||
// `American Samoa,Tafuna`,
|
||||
// `Angola,"Benguela, Namibe"`,
|
||||
// ];
|
||||
let storedRecords = [
|
||||
['Country','City List'],
|
||||
['Afghanistan','Kabul'],
|
||||
['Algeria','Skikda', 'Bchar', 'Batna'],
|
||||
['American Samoa','Tafuna'],
|
||||
['Angola','Benguela', 'Namibe'],
|
||||
];
|
||||
|
||||
// if (isPostgres()) {
|
||||
// // order of second entry is different
|
||||
// storedRecords = [
|
||||
// `Country,City List`,
|
||||
// `Afghanistan,Kabul`,
|
||||
// `Algeria,"Skikda, Bchar, Batna"`,
|
||||
// `American Samoa,Tafuna`,
|
||||
// `Angola,"Benguela, Namibe"`,
|
||||
// ];
|
||||
// }
|
||||
|
||||
for (let i = 0; i < storedRecords.length - 1; i++) {
|
||||
for(let j=0; j<storedRecords[i].length; j++)
|
||||
expect(retrievedRecords[i]).to.have.string(storedRecords[i][j])
|
||||
|
||||
// often, the order in which records "Skikda, Bchar, Batna" appear, used to toggle
|
||||
// hence verifying record contents separately
|
||||
// expect(retrievedRecords[i]).to.be.equal(storedRecords[i]);
|
||||
}
|
||||
};
|
||||
|
||||
// download & verify
|
||||
mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv);
|
||||
mainPage.unhideField("LastUpdate");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
276
scripts/cypress/integration/common/6c_swagger_api.js
Normal file
276
scripts/cypress/integration/common/6c_swagger_api.js
Normal file
@@ -0,0 +1,276 @@
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { roles } from "../../support/page_objects/projectConstants";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} : API List - Test preparation`, () => {
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
});
|
||||
|
||||
it("Open project & record swagger URL, AuthToken", () => {
|
||||
let authToken = mainPage.getAuthToken();
|
||||
cy.url().then((url) => {
|
||||
// retrieve project name from URL & use it to construct Swagger URL
|
||||
// URL on homepage: http://localhost:3000/#/nc/externalrest_weUO?type=roles&dbalias=&name=Team%20%26%20Auth%20
|
||||
// [REST] Swagger URL: http://localhost:8080/nc/externalrest_weUO/db/swagger
|
||||
// [GQL] http://localhost:8080/nc/externalgql_dgwx/v1/graphql
|
||||
const projectName = url.split("/")[5].split("?")[0];
|
||||
let swaggerURL = ``;
|
||||
if ("rest" == apiType) {
|
||||
swaggerURL = `http://localhost:8080/nc/${projectName}/db/swagger`;
|
||||
} else {
|
||||
swaggerURL = `http://localhost:8080/nc/${projectName}/v1/graphql`;
|
||||
}
|
||||
|
||||
// exchange information between two tests using a file
|
||||
// https://stackoverflow.com/questions/52050657/what-is-the-best-practice-of-pass-states-between-tests-in-cypress
|
||||
//
|
||||
cy.writeFile("shared.json", {
|
||||
SWAGGER_URL: swaggerURL,
|
||||
AUTH_TOKEN: authToken,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
if ("rest" == apiType) {
|
||||
describe(`Swagger page, base verification`, () => {
|
||||
before(() => {
|
||||
cy.fileHook();
|
||||
})
|
||||
|
||||
// returns swagger button intended for
|
||||
//
|
||||
const getSwaggerButton = (tag, idx, desc) => {
|
||||
return cy
|
||||
.get(`#operations-tag-${tag}`)
|
||||
.next()
|
||||
.find(".opblock")
|
||||
.eq(idx)
|
||||
.find(`button:contains(${desc})`);
|
||||
};
|
||||
|
||||
let Token;
|
||||
|
||||
// basic authentication tag verification
|
||||
//
|
||||
it("Swagger URL access & basic validation", () => {
|
||||
// retrieve information stored in previous IT block
|
||||
//
|
||||
cy.readFile("shared.json").then((jsonPayload) => {
|
||||
let URL = jsonPayload.SWAGGER_URL;
|
||||
Token = jsonPayload.AUTH_TOKEN;
|
||||
|
||||
cy.visit(URL, {
|
||||
baseUrl: null,
|
||||
}).then(() => {
|
||||
// wait to allow time for SWAGGER Library loading to finish
|
||||
cy.log(Token);
|
||||
|
||||
// cy.snip("Swagger");
|
||||
|
||||
// validate; API order assumed
|
||||
cy.get("#operations-tag-Authentication", {
|
||||
timeout: 20000,
|
||||
})
|
||||
.should("exist")
|
||||
.next()
|
||||
.find(".opblock")
|
||||
.should("has.length", 9);
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
0,
|
||||
"User login"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
1,
|
||||
"User signup"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
2,
|
||||
"Password Forgot"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
3,
|
||||
"Email validate link"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
4,
|
||||
"Validate password reset token"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
5,
|
||||
"Password reset"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
6,
|
||||
"User details"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
7,
|
||||
"Update user details"
|
||||
).should("exist");
|
||||
getSwaggerButton(
|
||||
"Authentication",
|
||||
8,
|
||||
"Update user details"
|
||||
).should("exist");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it("Authorize success: Valid token", () => {
|
||||
// authorize button, feed token, click authorize
|
||||
cy.get('[class="btn authorize unlocked"]').click();
|
||||
cy.get("input").type(Token);
|
||||
cy.get(".auth-btn-wrapper > .authorize").click();
|
||||
|
||||
// Response: "Authorized" should exist on DOM
|
||||
cy.get(".auth-container")
|
||||
.contains("Authorized")
|
||||
.should("exist");
|
||||
cy.get(".btn-done").click();
|
||||
|
||||
// Authorize button is LOCKED now
|
||||
cy.get('[class="btn authorize locked"]').should("exist");
|
||||
});
|
||||
|
||||
it("Execute Authentication (valid token case) > GET: User details API", () => {
|
||||
// Auth> User details API
|
||||
getSwaggerButton("Authentication", 6, "User details").click();
|
||||
|
||||
// "Try it out" button, followed by "Execute"
|
||||
cy.get(".try-out > .btn").click();
|
||||
cy.get(".execute-wrapper > .btn").click();
|
||||
|
||||
// check response: validate email credentials
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains("email")
|
||||
.should("exist");
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains(roles.owner.credentials.username)
|
||||
.should("exist");
|
||||
|
||||
// reset operations (clear, cancel, windback User details tab)
|
||||
cy.get(".btn-clear").click();
|
||||
cy.get(".try-out > .btn").click();
|
||||
getSwaggerButton("Authentication", 6, "User details").click();
|
||||
});
|
||||
|
||||
it("Logout post authorization", () => {
|
||||
// authorize button, logout
|
||||
cy.get('[class="btn authorize locked"]').click();
|
||||
cy.get('.auth-btn-wrapper > button:contains("Logout")').click();
|
||||
cy.get(".btn-done").click();
|
||||
|
||||
// Authorize button is UNLOCKED now
|
||||
cy.get('[class="btn authorize unlocked"]').should("exist");
|
||||
});
|
||||
|
||||
it("Execute Authentication (logout case) > GET: User details API", () => {
|
||||
// Auth> User details API
|
||||
getSwaggerButton("Authentication", 6, "User details").click();
|
||||
|
||||
// "Try it out" button, followed by "Execute"
|
||||
cy.get(".try-out > .btn").click();
|
||||
cy.get(".execute-wrapper > .btn").click();
|
||||
|
||||
// check response: email credentials shouldnt exist. should display 'guest:true'
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains("guest")
|
||||
.should("exist");
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains("email")
|
||||
.should("not.exist");
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains(roles.owner.credentials.username)
|
||||
.should("not.exist");
|
||||
|
||||
// reset operations (clear, cancel, windback User details tab)
|
||||
cy.get(".btn-clear").click();
|
||||
cy.get(".try-out > .btn").click();
|
||||
getSwaggerButton("Authentication", 6, "User details").click();
|
||||
});
|
||||
|
||||
it("Authorize failure: invalid token", () => {
|
||||
// authorize button, feed *invalid* token, click authorize
|
||||
cy.get('[class="btn authorize unlocked"]').click();
|
||||
cy.get("input").type("xyz");
|
||||
cy.get(".auth-btn-wrapper > .authorize").click();
|
||||
|
||||
// Response: "Authorized" should *not* exist on DOM
|
||||
// TBD: cy.get('.auth-container').contains('Authorized').should('not.exist')
|
||||
cy.get(".btn-done").click();
|
||||
|
||||
// Authorize button should be UNLOCKED now
|
||||
// TBD: cy.get('[class="btn authorize unlocked"]').should('exist')
|
||||
});
|
||||
|
||||
it("Execute Authentication (invalid token case) > GET: User details API", () => {
|
||||
// Auth> User details API
|
||||
getSwaggerButton("Authentication", 6, "User details").click();
|
||||
|
||||
// "Try it out" button, followed by "Execute"
|
||||
cy.get(".try-out > .btn").click();
|
||||
cy.get(".execute-wrapper > .btn").click();
|
||||
|
||||
// check response: email credentials shouldnt exist. should display 'guest:true'
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains("guest")
|
||||
.should("exist");
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains("email")
|
||||
.should("not.exist");
|
||||
cy.get(".highlight-code > .microlight")
|
||||
.contains(roles.owner.credentials.username)
|
||||
.should("not.exist");
|
||||
|
||||
// reset operations (clear, cancel, windback User details tab)
|
||||
cy.get(".btn-clear").click();
|
||||
cy.get(".try-out > .btn").click();
|
||||
getSwaggerButton("Authentication", 6, "User details").click();
|
||||
});
|
||||
|
||||
// clean-up created file (shared.json)
|
||||
// after(() => {
|
||||
// cy.exec("del shared.json").then(()=> {
|
||||
// cy.log("file cleaned up!")
|
||||
// })
|
||||
// })
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
121
scripts/cypress/integration/common/6d_language_validation.js
Normal file
121
scripts/cypress/integration/common/6d_language_validation.js
Normal file
@@ -0,0 +1,121 @@
|
||||
const { mainPage } = require("../../support/page_objects/mainPage");
|
||||
const { loginPage } = require("../../support/page_objects/navigation");
|
||||
const { roles } = require("../../support/page_objects/projectConstants");
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
describe(`Language support`, () => {
|
||||
before(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
cy.visit("/")
|
||||
cy.wait(5000);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.get('.nc-menu-accounts').should('exist').click();
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-item').eq(1).click();
|
||||
|
||||
cy.wait(5000);
|
||||
cy.get('button:contains("SIGN")').should('exist')
|
||||
})
|
||||
|
||||
const langVerification = (idx, lang) => {
|
||||
// pick json from the file specified
|
||||
it(`Language verification: ${lang} > Projects page`, () => {
|
||||
let json = require(`../../../../packages/nc-gui-v2/lang/${lang}`);
|
||||
|
||||
cy.wait(500);
|
||||
// toggle menu as per index
|
||||
cy.get(".nc-menu-translate").should('exist').last().click();
|
||||
cy.wait(500);
|
||||
cy.getActiveMenu().find(".ant-dropdown-menu-item").eq(idx).click();
|
||||
cy.wait(200);
|
||||
|
||||
// basic validations
|
||||
// 1. Page title: "My Projects"
|
||||
// 2. Button: "New Project"
|
||||
// 3. Search box palceholder text: "Search Projects"
|
||||
// cy.get("b").contains(json.title.myProject).should("exist");
|
||||
cy.get(".nc-project-page-title")
|
||||
.contains(json.title.myProject)
|
||||
.should("exist");
|
||||
cy.get(".nc-new-project-menu")
|
||||
.contains(json.title.newProj)
|
||||
.should("exist");
|
||||
cy.get(`[placeholder="${json.activity.searchProject}"]`).should(
|
||||
"exist"
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
let langMenu = [
|
||||
"da.json",
|
||||
"de.json",
|
||||
"en.json",
|
||||
"es.json",
|
||||
"fa.json",
|
||||
"fi.json",
|
||||
"fr.json",
|
||||
"hr.json",
|
||||
"id.json",
|
||||
"it_IT.json",
|
||||
"iw.json",
|
||||
"ja.json",
|
||||
"ko.json",
|
||||
"lv.json",
|
||||
"nl.json",
|
||||
"no.json",
|
||||
"pt_BR.json",
|
||||
"ru.json",
|
||||
"sl.json",
|
||||
"sv.json",
|
||||
"th.json",
|
||||
"tr.json",
|
||||
"uk.json",
|
||||
"vi.json",
|
||||
"zh_CN.json",
|
||||
"zh_HK.json",
|
||||
"zh_TW.json",
|
||||
];
|
||||
|
||||
// Index is the order in which menu options appear
|
||||
for (let i = 0; i < langMenu.length; i++)
|
||||
langVerification(i, langMenu[i]);
|
||||
|
||||
// reset to English
|
||||
langVerification(2, langMenu[2]);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
53
scripts/cypress/integration/common/6e_project_operations.js
Normal file
53
scripts/cypress/integration/common/6e_project_operations.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
import { isXcdb, roles } from "../../support/page_objects/projectConstants";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
describe(`${apiType.toUpperCase()} Project operations`, () => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
before(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
// loginPage.signIn(roles.owner.credentials);
|
||||
cy.visit("/");
|
||||
cy.wait(4000);
|
||||
});
|
||||
|
||||
it("Delete Project", () => {
|
||||
|
||||
cy.get(`.nc-action-btn`)
|
||||
.should("exist")
|
||||
.last()
|
||||
.click();
|
||||
|
||||
cy.getActiveModal()
|
||||
.find(".ant-btn-dangerous")
|
||||
.should("exist")
|
||||
.click();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Pranav C Balan <pranavxc@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
177
scripts/cypress/integration/common/6f_attachments.js
Normal file
177
scripts/cypress/integration/common/6f_attachments.js
Normal file
@@ -0,0 +1,177 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {loginPage, projectsPage} from "../../support/page_objects/navigation";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`${apiType.toUpperCase()} Columns of type attachment`, () => {
|
||||
before(() => {
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.openTableTab("Country", 25);
|
||||
cy.wait(1000);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
// clean up
|
||||
mainPage.deleteColumn("testAttach");
|
||||
|
||||
// clean up newly added rows into Country table operations
|
||||
// this auto verifies successfull addition of rows to table as well
|
||||
mainPage.getPagination(5).click();
|
||||
// kludge: flicker on load
|
||||
cy.wait(3000)
|
||||
|
||||
// wait for page rendering to complete
|
||||
cy.get(".nc-grid-row").should("have.length", 10);
|
||||
// mainPage
|
||||
// .getRow(10)
|
||||
// .find(".mdi-checkbox-blank-outline")
|
||||
// .click({ force: true });
|
||||
|
||||
mainPage.getCell("Country", 10).rightclick();
|
||||
cy.getActiveMenu().contains("Delete Row").click();
|
||||
|
||||
cy.closeTableTab("Country");
|
||||
});
|
||||
|
||||
it(`Add column of type attachments`, () => {
|
||||
mainPage.addColumnWithType("testAttach", "Attachment", "Country");
|
||||
|
||||
for (let i = 4; i <= 6; i++) {
|
||||
let filepath = `sampleFiles/${i}.json`;
|
||||
cy.get('.nc-attachment-cell')
|
||||
.eq(i)
|
||||
.attachFile(filepath, { subjectType: 'drag-n-drop' });
|
||||
cy.get('.nc-attachment-cell')
|
||||
.eq(i)
|
||||
.find(".nc-attachment")
|
||||
.should("exist");
|
||||
}
|
||||
});
|
||||
|
||||
it(`Form view with Attachment field- Submit & verify`, () => {
|
||||
|
||||
// open right navbar
|
||||
cy.get('.nc-toggle-right-navbar').should('exist').click();
|
||||
|
||||
// create form-view
|
||||
cy.get(`.nc-create-form-view`).click();
|
||||
cy.getActiveModal().find("button:contains(Submit)").click();
|
||||
|
||||
cy.toastWait("View created successfully");
|
||||
|
||||
mainPage.shareView().click();
|
||||
|
||||
cy.wait(5000);
|
||||
|
||||
// copy link text, visit URL
|
||||
cy.getActiveModal()
|
||||
.find(".share-link-box")
|
||||
.contains("/nc/form/", { timeout: 10000 })
|
||||
.should('exist')
|
||||
.then(($obj) => {
|
||||
let linkText = $obj.text().trim();
|
||||
cy.log(linkText);
|
||||
|
||||
cy.visit(linkText, {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
|
||||
// wait for share view page to load!
|
||||
cy.get(".nc-form").should("exist");
|
||||
|
||||
// fill form
|
||||
// 0: Country
|
||||
// 1: LastUpdate
|
||||
cy.get(".nc-input").eq(0).type("_abc");
|
||||
cy.get(".nc-input").eq(1).click();
|
||||
cy.get('.ant-picker-dropdown').find(".ant-picker-now-btn").click();
|
||||
cy.get('.ant-picker-dropdown').find("button.ant-btn-primary").click();
|
||||
|
||||
|
||||
cy.get('.nc-attachment-cell')
|
||||
.attachFile(`sampleFiles/1.json`, { subjectType: 'drag-n-drop' });
|
||||
|
||||
cy.get(".nc-form").find("button").contains("Submit").click();
|
||||
|
||||
cy.get(".ant-alert-message")
|
||||
.contains("Successfully submitted form data")
|
||||
.should("exist");
|
||||
|
||||
cy.toastWait("Saved successfully");
|
||||
});
|
||||
});
|
||||
|
||||
it(`Filter column which contain only attachments, download CSV`, () => {
|
||||
// come back to main window
|
||||
// loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.visit('/')
|
||||
cy.wait(5000)
|
||||
|
||||
projectsPage.openConfiguredProject(apiType, dbType);
|
||||
cy.openTableTab("Country", 25);
|
||||
cy.wait(1000);
|
||||
|
||||
mainPage.filterField("testAttach", "is not null", null);
|
||||
mainPage.hideField("LastUpdate");
|
||||
|
||||
const verifyCsv = (retrievedRecords) => {
|
||||
let storedRecords = [
|
||||
`Country,City List,testAttach`,
|
||||
`Afghanistan,Kabul,1.json(http://localhost:8080/download/p_h0wxjx5kgoq3w4/vw_skyvc7hsp9i34a/2HvU8R.json)`,
|
||||
];
|
||||
|
||||
expect(retrievedRecords[0]).to.be.equal(storedRecords[0]);
|
||||
for (let i = 1; i < storedRecords.length; i++) {
|
||||
const columns = retrievedRecords[i].split(",");
|
||||
expect(columns[2]).to.contain(
|
||||
".json(http://localhost:8080/download/"
|
||||
);
|
||||
}
|
||||
|
||||
cy.log(retrievedRecords[109]);
|
||||
cy.log(retrievedRecords[110]);
|
||||
cy.log(retrievedRecords[111]);
|
||||
};
|
||||
|
||||
mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv);
|
||||
mainPage.unhideField("LastUpdate");
|
||||
mainPage.filterReset();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
206
scripts/cypress/integration/common/6g_base_share.js
Normal file
206
scripts/cypress/integration/common/6g_base_share.js
Normal file
@@ -0,0 +1,206 @@
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { projectsPage } from "../../support/page_objects/navigation";
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import {
|
||||
_advSettings,
|
||||
_editSchema,
|
||||
_editData,
|
||||
_editComment,
|
||||
_viewMenu,
|
||||
_topRightMenu,
|
||||
} from "../spec/roleValidation.spec";
|
||||
import {linkSync} from "fs";
|
||||
|
||||
// fix me
|
||||
let linkText = "";
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
const permissionValidation = (roleType) => {
|
||||
it(`${roleType}: Visit base shared URL`, () => {
|
||||
cy.log(linkText);
|
||||
|
||||
// visit URL & wait for page load to complete
|
||||
cy.visit(linkText, {
|
||||
baseUrl: null,
|
||||
});
|
||||
cy.wait(5000);
|
||||
});
|
||||
|
||||
it(`${roleType}: Validate access permissions: advance menu`, () => {
|
||||
// cy.restoreLocalStorage();
|
||||
_advSettings(roleType, "baseShare");
|
||||
});
|
||||
|
||||
it(`${roleType}: Validate access permissions: edit schema`, () => {
|
||||
// cy.restoreLocalStorage();
|
||||
_editSchema(roleType, "baseShare");
|
||||
});
|
||||
|
||||
it(`${roleType}: Validate access permissions: edit data`, () => {
|
||||
// cy.restoreLocalStorage();
|
||||
_editData(roleType, "baseShare");
|
||||
});
|
||||
|
||||
it(`${roleType}: Validate access permissions: edit comments`, () => {
|
||||
// cy.restoreLocalStorage();
|
||||
_editComment(roleType, "baseShare");
|
||||
});
|
||||
|
||||
it(`${roleType}: Validate access permissions: view's menu`, () => {
|
||||
// cy.restoreLocalStorage();
|
||||
_viewMenu(roleType, "baseShare");
|
||||
});
|
||||
};
|
||||
|
||||
describe(`${apiType.toUpperCase()} Base VIEW share`, () => {
|
||||
before(() => {
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
|
||||
cy.openTableTab("Country", 25);
|
||||
cy.wait(1000);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it(`Generate base share URL`, () => {
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
// click SHARE
|
||||
cy.get(".nc-share-base:visible").should('exist').click();
|
||||
|
||||
// Click on readonly base text
|
||||
cy.getActiveModal().find(".nc-disable-shared-base").click();
|
||||
|
||||
cy.getActiveMenu()
|
||||
.find(".ant-dropdown-menu-title-content")
|
||||
.contains("Anyone with the link")
|
||||
.click();
|
||||
|
||||
cy.getActiveModal().find(".nc-shared-base-role").click();
|
||||
|
||||
cy.getActiveSelection()
|
||||
.find('.ant-select-item')
|
||||
.eq(1)
|
||||
.click();
|
||||
|
||||
// Copy URL
|
||||
cy.getActiveModal()
|
||||
.find(".nc-url")
|
||||
.then(($obj) => {
|
||||
cy.log($obj[0]);
|
||||
linkText = $obj[0].innerText.trim();
|
||||
|
||||
const htmlFile = `
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<iframe
|
||||
class="nc-embed"
|
||||
src="${linkText}?embed"
|
||||
frameborder="0"
|
||||
width="100%"
|
||||
height="700"
|
||||
style="background: transparent; "></iframe>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
cy.writeFile(
|
||||
"scripts/cypress-v2/fixtures/sampleFiles/iFrame.html",
|
||||
htmlFile
|
||||
);
|
||||
});
|
||||
|
||||
cy.log(linkText);
|
||||
|
||||
cy.signOut();
|
||||
cy.deleteLocalStorage();
|
||||
cy.wait(1000);
|
||||
cy.printLocalStorage();
|
||||
|
||||
});
|
||||
|
||||
permissionValidation("viewer");
|
||||
|
||||
it("Update to EDITOR base share link", () => {
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
|
||||
// click SHARE
|
||||
cy.get(".nc-share-base:visible").should('exist').click();
|
||||
|
||||
cy.getActiveModal().find(".nc-shared-base-role").click();
|
||||
|
||||
cy.getActiveSelection()
|
||||
.find('.ant-select-item')
|
||||
.eq(0)
|
||||
.click();
|
||||
|
||||
cy.signOut();
|
||||
cy.deleteLocalStorage();
|
||||
cy.wait(1000);
|
||||
cy.printLocalStorage();
|
||||
|
||||
});
|
||||
|
||||
permissionValidation("editor");
|
||||
});
|
||||
|
||||
describe(`${apiType.toUpperCase()} iFrame Test`, () => {
|
||||
// https://docs.cypress.io/api/commands/visit#Prefixes
|
||||
it("Generate & verify embed HTML IFrame", {baseUrl: null}, () => {
|
||||
|
||||
let filePath = "scripts/cypress-v2/fixtures/sampleFiles/iFrame.html";
|
||||
cy.log(filePath);
|
||||
cy.visit(filePath, {baseUrl: null});
|
||||
|
||||
// wait for iFrame to load
|
||||
cy.frameLoaded(".nc-embed");
|
||||
|
||||
// cy.openTableTab("Country", 25);
|
||||
cy.iframe().find(`.nc-project-tree-tbl-Actor`, {timeout: 10000}).should("exist")
|
||||
.first()
|
||||
.click({force: true});
|
||||
|
||||
// validation for base menu opitons
|
||||
cy.iframe().find(".nc-project-tree").should("exist");
|
||||
cy.iframe().find(".nc-fields-menu-btn").should("exist");
|
||||
cy.iframe().find(".nc-sort-menu-btn").should("exist");
|
||||
cy.iframe().find(".nc-filter-menu-btn").should("exist");
|
||||
cy.iframe().find(".nc-actions-menu-btn").should("exist");
|
||||
|
||||
// validate data (row-1)
|
||||
cy.iframe().find(`.nc-grid-cell`).eq(1).contains("PENELOPE").should("exist");
|
||||
cy.iframe().find(`.nc-grid-cell`).eq(2).contains("GUINESS").should("exist");
|
||||
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
@@ -0,0 +1,309 @@
|
||||
// Cypress test suite: Project creation using EXCEL
|
||||
//
|
||||
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import {
|
||||
roles,
|
||||
isTestSuiteActive,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
|
||||
// stores sheet names (table name)
|
||||
let sheetList;
|
||||
|
||||
// stores table data (read from excel)
|
||||
let sheetData;
|
||||
//let UrlSheetData
|
||||
|
||||
let URL = "https://go.microsoft.com/fwlink/?LinkID=521962";
|
||||
|
||||
let filepath = `sampleFiles/simple.xlsx`;
|
||||
// let UrlFilePath = `sampleFiles/Financial Sample.xlsx`
|
||||
|
||||
let expectedData = {
|
||||
0: ["number", "Number", "Number"],
|
||||
1: ["float", "Decimal", "Float"],
|
||||
2: ["text", "SingleLineText", "Text"],
|
||||
};
|
||||
|
||||
// column names with spaces will be converted to include _
|
||||
let UrlFileExpectedData = {
|
||||
0: ["Segment", "SingleSelect", ["Government"]],
|
||||
1: ["Country", "SingleSelect", ["Canada"]],
|
||||
2: ["Product", "SingleSelect", ["Carretera"]],
|
||||
3: ["Discount_Band", "SingleSelect", ["None"]],
|
||||
4: ["Units_Sold", "Decimal", [1618.5]],
|
||||
5: ["Manufacturing_Price", "Number", [3]],
|
||||
6: ["Sale_Price", "Number", [20]],
|
||||
7: ["Gross_Sales", "Decimal", [32370]],
|
||||
8: ["Discounts", "Decimal", [0]],
|
||||
9: ["Sales", "Decimal", [32370]],
|
||||
10: ["COGS", "Decimal", [16185]],
|
||||
11: ["Profit", "Decimal", [16185]],
|
||||
12: ["Date", "Date", ["2014-01-01"]],
|
||||
13: ["Month_Number", "Number", [1]],
|
||||
14: ["Month_Name", "SingleSelect", ["January"]],
|
||||
15: ["Year", "SingleSelect", [2014]],
|
||||
};
|
||||
|
||||
// let filepath = `sampleFiles/sample.xlsx`
|
||||
// let expectedData = {
|
||||
// 0: ['number', 'Number'],
|
||||
// 1: ['float', 'Decimal'],
|
||||
// 2: ['text', 'SingleLineText'],
|
||||
// 3: ['boolean', 'Checkbox'],
|
||||
// 4: ['currency', 'Currency'],
|
||||
// 5: ['date', 'Date'],
|
||||
// 6: ['field7', 'SingleLineText'],
|
||||
// 7: ['multi line', 'LongText'],
|
||||
// 8: ['multi select', 'MultiSelect'],
|
||||
// 9: ['field10', 'SingleLineText'],
|
||||
// 10: ['formula', 'Decimal'],
|
||||
// 11: ['percentage', 'Decimal'],
|
||||
// 12: ['dateTime', 'DateTime']
|
||||
// }
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`Import from excel`, () => {
|
||||
before(() => {
|
||||
|
||||
// loginPage.signIn(roles.owner.credentials);
|
||||
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
|
||||
cy.task("readSheetList", {
|
||||
file: `./scripts/cypress-v2/fixtures/${filepath}`,
|
||||
}).then((rows) => {
|
||||
cy.log(rows);
|
||||
sheetList = rows;
|
||||
});
|
||||
|
||||
cy.task("readXlsx", {
|
||||
file: `./scripts/cypress-v2/fixtures/${filepath}`,
|
||||
sheet: "Sheet2",
|
||||
}).then((rows) => {
|
||||
cy.log(rows);
|
||||
sheetData = rows;
|
||||
});
|
||||
|
||||
// loginPage.signIn(roles.owner.credentials);
|
||||
projectsPage.createProject({ dbType: "none", apiType: "REST", name: "importSample" }, {})
|
||||
cy.wait(4000);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it("File Upload: Upload excel as template", () => {
|
||||
|
||||
cy.get('.nc-add-new-table').should('exist').trigger('mouseover')
|
||||
cy.get('.nc-import-menu').should('exist').click()
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-item').contains('Microsoft Excel').click()
|
||||
|
||||
cy.get(".nc-input-import").should('exist').find('input').attachFile(filepath);
|
||||
cy.toastWait("Uploaded file simple.xlsx successfully");
|
||||
cy.get(".nc-btn-import").should('exist').click();
|
||||
});
|
||||
|
||||
it("File Upload: Verify pre-load template page", () => {
|
||||
cy.getActiveModal()
|
||||
.find(".ant-collapse-item")
|
||||
.then((sheets) => {
|
||||
|
||||
// hardcoded. fix me.
|
||||
let sheetList = ["Sheet2", "Sheet3", "Sheet4"];
|
||||
|
||||
for (let i = 0; i < sheets.length; i++) {
|
||||
cy.wrap(sheets[i])
|
||||
.find('.ant-collapse-header')
|
||||
.contains(sheetList[i])
|
||||
.should("exist");
|
||||
|
||||
// for each sheet, expand to verify table names & their data types
|
||||
if(i!==0)
|
||||
cy.wrap(sheets[i]).find(".ant-collapse-arrow").click();
|
||||
|
||||
// sheet > tables > rows > cells > inputs
|
||||
cy.wrap(sheets[i]).find(".ant-table-tbody").then((tables) => {
|
||||
cy.wrap(tables).find(".ant-table-row:visible")
|
||||
.should("have.length", 3)
|
||||
.then((rows) => {
|
||||
// cy.log(rows)
|
||||
for (let j = 0; j < rows.length; j++) {
|
||||
cy.wrap(rows[j]).find(".ant-table-cell")
|
||||
.then((cells) => {
|
||||
cy.wrap(cells[0]).find("input")
|
||||
.then((input) => {
|
||||
expect(input.val()).to.equal(expectedData[j][0])
|
||||
})
|
||||
cy.wrap(cells[1]).find(".ant-select-selection-item")
|
||||
.contains(expectedData[j][1])
|
||||
.should("exist")
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// unwind
|
||||
cy.wrap(sheets[i]).find(".ant-collapse-arrow").click();
|
||||
}
|
||||
});
|
||||
cy.getActiveModal().find(".ant-btn-primary").click();
|
||||
|
||||
// wait for page to get loaded (issue observed in CI-CD)
|
||||
cy.wait(5000);
|
||||
});
|
||||
|
||||
it("File Upload: Verify loaded data", () => {
|
||||
|
||||
cy.openTableTab("Sheet2", 2);
|
||||
for (const [key, value] of Object.entries(expectedData)) {
|
||||
mainPage
|
||||
.getCell(value[2], 1)
|
||||
.contains(sheetData[0][value[0]])
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(value[2], 2)
|
||||
.contains(sheetData[1][value[0]])
|
||||
.should("exist");
|
||||
}
|
||||
cy.closeTableTab("Sheet2");
|
||||
|
||||
cy.openTableTab("Sheet3", 2);
|
||||
for (const [key, value] of Object.entries(expectedData)) {
|
||||
mainPage
|
||||
.getCell(value[2], 1)
|
||||
.contains(sheetData[0][value[0]])
|
||||
.should("exist");
|
||||
mainPage
|
||||
.getCell(value[2], 2)
|
||||
.contains(sheetData[1][value[0]])
|
||||
.should("exist");
|
||||
}
|
||||
cy.closeTableTab("Sheet3");
|
||||
});
|
||||
|
||||
it.skip("URL: Upload excel as template", () => {
|
||||
// trigger import
|
||||
cy.get(`[data-menu-id="addORImport"]`).click();
|
||||
cy.getActivePopUp().contains("Microsoft Excel").should('exist').click();
|
||||
|
||||
cy.getActiveModal().find('.ant-tabs-tab').last().click()
|
||||
|
||||
cy.get("input[type=\"text\"]")
|
||||
.last()
|
||||
.click()
|
||||
.type(URL);
|
||||
cy.get(".nc-btn-primary").should('exist').click();
|
||||
});
|
||||
|
||||
it.skip("URL: Verify pre-load template page", () => {
|
||||
cy.getActiveModal()
|
||||
.find(".ant-collapse-item")
|
||||
.then((sheets) => {
|
||||
|
||||
let sheetList = ["Sheet1"];
|
||||
|
||||
for (let i = 0; i < sheets.length; i++) {
|
||||
cy.wrap(sheets[i])
|
||||
.find('.ant-collapse-header')
|
||||
.contains(sheetList[i])
|
||||
.should("exist");
|
||||
|
||||
cy.wrap(sheets[i]).find(".ant-table-tbody").then((tables) => {
|
||||
cy.wrap(tables).find(".ant-table-row:visible")
|
||||
.then((rows) => {
|
||||
// cy.log(rows)
|
||||
for (let j = 0; j < 10; j++) {
|
||||
cy.wrap(rows[j]).find(".ant-table-cell").then((cells) => {
|
||||
// cy.log(cells)
|
||||
for (let k = 0; k < 2; k++) {
|
||||
cy.wrap(cells[k]).find("input").then((input) => {
|
||||
// cy.log(input)
|
||||
expect(input.val()).to.equal(UrlFileExpectedData[j][k])
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// unwind
|
||||
cy.wrap(sheets[i]).find(".ant-collapse-arrow").click();
|
||||
}
|
||||
});
|
||||
|
||||
cy.getActiveModal().find(".ant-btn-primary").click();
|
||||
})
|
||||
|
||||
it.skip("URL: Verify loaded data", () => {
|
||||
|
||||
// wait for loading to be completed
|
||||
projectsPage.waitHomePageLoad();
|
||||
|
||||
// open sheet & validate contents
|
||||
// sheetData contains data read from excel in format
|
||||
// 0: { float: 1.1, number: 1, text: "abc" }
|
||||
// 1: { float: 1.2, number: 0, text: "def" }
|
||||
|
||||
cy.openTableTab("Sheet1", 25);
|
||||
let idx = 0;
|
||||
for (const [key, value] of Object.entries(UrlFileExpectedData)) {
|
||||
if (UrlFileExpectedData[idx][1] != "Date")
|
||||
mainPage
|
||||
.getCell(value[0], 1)
|
||||
.contains(UrlFileExpectedData[idx++][2][0])
|
||||
.should("exist");
|
||||
}
|
||||
cy.closeTableTab("Sheet1");
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// delete project once all operations are completed
|
||||
// mainPage.toolBarTopLeft(mainPage.HOME).click();
|
||||
// projectsPage.deleteProject("importSample");
|
||||
|
||||
// cy.get('.nc-noco-brand-icon').click();
|
||||
//
|
||||
// cy.get(`.nc-action-btn`)
|
||||
// .should("exist")
|
||||
// .last()
|
||||
// .click();
|
||||
//
|
||||
// cy.getActiveModal()
|
||||
// .find(".ant-btn-dangerous")
|
||||
// .should("exist")
|
||||
// .click();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
@@ -0,0 +1,70 @@
|
||||
// Cypress test suite: Project import from Airtable
|
||||
//
|
||||
|
||||
import { isTestSuiteActive, roles } from "../../support/page_objects/projectConstants";
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
|
||||
let apiKey = ""
|
||||
let sharedBase = ""
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
|
||||
describe(`Import from airtable`, () => {
|
||||
before(() => {
|
||||
apiKey = Cypress.env("airtable").apiKey;
|
||||
sharedBase = Cypress.env("airtable").sharedBase;
|
||||
|
||||
loginPage.signIn(roles.owner.credentials);
|
||||
projectsPage.createProject({ dbType: "none", apiType: "REST", name: "importSample" }, {})
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
it("Import", () => {
|
||||
cy.log(apiKey, sharedBase);
|
||||
|
||||
// trigger import
|
||||
cy.get('.nc-add-new-table').should('exist').trigger('mouseover')
|
||||
cy.get('.nc-import-menu').should('exist').click()
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-item').contains('Airtable').click()
|
||||
|
||||
cy.getActiveModal().find(".nc-input-api-key").should('exist').clear().type(apiKey)
|
||||
cy.getActiveModal().find(".nc-input-shared-base").should('exist').clear().type(sharedBase)
|
||||
cy.getActiveModal().find(".nc-btn-airtable-import").should('exist').click()
|
||||
|
||||
// it will take a while for import to finish
|
||||
// cy.getActiveModal().find(".nc-btn-go-dashboard", {timeout: 180000}).should('exist').click()
|
||||
|
||||
// wait for import to finish (kludge/hardcoded)
|
||||
cy.get(':nth-child(51) > .flex', {timeout: 180000}).contains('Complete!').should('exist')
|
||||
cy.get('.ant-modal-close-x').should('exist').click()
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
446
scripts/cypress/integration/common/8a_webhook.js
Normal file
446
scripts/cypress/integration/common/8a_webhook.js
Normal file
@@ -0,0 +1,446 @@
|
||||
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
import { loginPage } from "../../support/page_objects/navigation";
|
||||
|
||||
// locally configured hook (server.js)
|
||||
let hookPath = "http://localhost:9090/hook";
|
||||
|
||||
function createWebhook(hook, test) {
|
||||
cy.get('.nc-actions-menu-btn').should('exist').click();
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-title-content').contains('Webhooks').click()
|
||||
|
||||
// cy.get(".nc-btn-webhook").should("exist").click();
|
||||
cy.get(".nc-btn-create-webhook").should("exist").click();
|
||||
|
||||
// hardcode "Content-type: application/json"
|
||||
cy.get(".ant-tabs-tab-btn").contains("Headers").should("exist").click();
|
||||
|
||||
// kludge : as neither scrollIntoView nor scrollTo didn't yield any results
|
||||
// cy.getActiveSelection().find('.ant-select-item').contains('Content-Type).scrollIntoView();
|
||||
// cy.getActiveSelection().find('.rc-virtual-list').scrollTo('center');
|
||||
// cy.getActiveSelection().select('Content-Type', { force: true });
|
||||
|
||||
cy.get(".nc-input-hook-header-key")
|
||||
.should("exist")
|
||||
.click()
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
.type('{downarrow}')
|
||||
|
||||
cy.getActiveSelection().find('.ant-select-item-option-content').contains('Content-Type').should('exist').click();
|
||||
|
||||
cy.get("input.nc-input-hook-header-value")
|
||||
.should("exist")
|
||||
.clear({ force: true })
|
||||
.type("application/json", { force: true });
|
||||
|
||||
cy.get('.nc-hook-header-tab-checkbox').find('input.ant-checkbox-input').should('exist').click();
|
||||
|
||||
// common routine for both create & modify to configure hook
|
||||
configureWebhook(hook, test);
|
||||
}
|
||||
|
||||
function deleteWebhook(index) {
|
||||
cy.get('.nc-actions-menu-btn').should('exist').click();
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-title-content').contains('Webhooks').click()
|
||||
|
||||
cy.get(".nc-hook-delete-icon").eq(index).click({ force: true });
|
||||
cy.toastWait("Hook deleted successfully");
|
||||
cy.get("body").type("{esc}");
|
||||
}
|
||||
|
||||
function openWebhook(index) {
|
||||
cy.get('.nc-actions-menu-btn').should('exist').click();
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-title-content').contains('Webhooks').click()
|
||||
|
||||
cy.get(".nc-hook").eq(index).click({ force: true });
|
||||
}
|
||||
|
||||
function configureWebhook(hook, test) {
|
||||
// configure what ever is present. ignore rest
|
||||
// currently works for only URL type
|
||||
|
||||
if (hook?.title) {
|
||||
cy.get(".nc-text-field-hook-title")
|
||||
.should("exist")
|
||||
.clear()
|
||||
.type(hook.title);
|
||||
}
|
||||
|
||||
if (hook?.event) {
|
||||
cy.get(".nc-text-field-hook-event").should("exist").click();
|
||||
cy.getActiveSelection()
|
||||
.find(`.ant-select-item`)
|
||||
.contains(hook.event)
|
||||
.should("exist")
|
||||
.click();
|
||||
}
|
||||
|
||||
if (hook?.url?.path) {
|
||||
cy.get(".nc-text-field-hook-url-path")
|
||||
.should("exist")
|
||||
.clear()
|
||||
.type(hook.url.path);
|
||||
}
|
||||
|
||||
if (hook?.deleteCondition === true) {
|
||||
cy.get(".nc-filter-item-remove-btn")
|
||||
.should("exist")
|
||||
.click({ force: true });
|
||||
}
|
||||
|
||||
if (hook?.condition) {
|
||||
cy.get(".nc-check-box-hook-condition").should("exist").click();
|
||||
cy.get(".menu-filter-dropdown")
|
||||
.last()
|
||||
.find("button")
|
||||
.contains("Add Filter")
|
||||
.click();
|
||||
|
||||
cy.get(".nc-filter-field-select")
|
||||
.should("exist")
|
||||
.last()
|
||||
.click()
|
||||
cy.get('.ant-select-dropdown:visible')
|
||||
.should('exist')
|
||||
.find(`.ant-select-item`)
|
||||
.contains(new RegExp("^" + hook.condition.column + "$", "g"))
|
||||
.should('exist')
|
||||
.click();
|
||||
cy.wait(1000);
|
||||
|
||||
cy.get(".nc-filter-operation-select").should("exist").last().click();
|
||||
cy.get('.ant-select-dropdown:visible')
|
||||
.should('exist')
|
||||
.find(`.ant-select-item`)
|
||||
.contains(hook.condition.operator)
|
||||
.should('exist')
|
||||
.click();
|
||||
if (hook.condition.operator != "is null" && hook.condition.operator != "is not null") {
|
||||
cy.get(".nc-filter-value-select")
|
||||
.should("exist")
|
||||
.last()
|
||||
.type(hook.condition.value);
|
||||
cy.get(".nc-filter-operation-select").last().click();
|
||||
}
|
||||
}
|
||||
|
||||
if (test) {
|
||||
cy.get(".nc-btn-webhook-test").should("exist").click();
|
||||
cy.toastWait("Webhook tested successfully");
|
||||
}
|
||||
|
||||
cy.get(".nc-btn-webhook-save").should("exist").click();
|
||||
cy.toastWait("Webhook details updated successfully");
|
||||
cy.get(".nc-icon-hook-navigate-left").should("exist").click();
|
||||
cy.get("body").type("{esc}");
|
||||
}
|
||||
|
||||
function clearServerData() {
|
||||
// clear stored data in server
|
||||
cy.request("http://localhost:9090/hook/clear");
|
||||
|
||||
// ensure stored message count is 0
|
||||
cy.request("http://localhost:9090/hook/count").then((msg) => {
|
||||
cy.log(msg.body);
|
||||
expect(msg.body).to.equal(0);
|
||||
});
|
||||
}
|
||||
|
||||
function addNewRow(index, cellValue) {
|
||||
cy.get(".nc-add-new-row-btn:visible").should("exist");
|
||||
cy.get(".nc-add-new-row-btn").click();
|
||||
cy.wait(1000);
|
||||
cy.get(".nc-expand-col-Title").find(".nc-cell > input").first().type(cellValue);
|
||||
cy.getActiveDrawer()
|
||||
.find(".ant-btn-primary")
|
||||
.click();
|
||||
|
||||
cy.toastWait("updated successfully");
|
||||
cy.getActiveDrawer()
|
||||
.find(".ant-btn")
|
||||
.contains("Cancel")
|
||||
.click();
|
||||
mainPage.getCell("Title", index).contains(cellValue).should("exist");
|
||||
}
|
||||
|
||||
function updateRow(index, cellValue) {
|
||||
cy.get(".nc-row-expand")
|
||||
.eq(index-1)
|
||||
.click({ force: true });
|
||||
|
||||
cy.get(".nc-expand-col-Title").find(".nc-cell > input")
|
||||
.should("exist")
|
||||
.first()
|
||||
.clear()
|
||||
.type(cellValue);
|
||||
|
||||
cy.getActiveDrawer()
|
||||
.find("button")
|
||||
.contains("Save row")
|
||||
.click({ force: true });
|
||||
|
||||
// partial toast message
|
||||
cy.toastWait("updated successfully");
|
||||
cy.getActiveDrawer()
|
||||
.find("button")
|
||||
.contains("Cancel")
|
||||
.click({ force: true });
|
||||
}
|
||||
|
||||
function verifyHookTrigger(count, lastValue) {
|
||||
cy.request("http://localhost:9090/hook/count").then((msg) => {
|
||||
cy.log(msg.body);
|
||||
expect(msg.body).to.equal(count);
|
||||
});
|
||||
if (count) {
|
||||
cy.request("http://localhost:9090/hook/last").then((msg) => {
|
||||
cy.log(msg.body);
|
||||
expect(msg.body.Title).to.equal(lastValue);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function deleteRow(index) {
|
||||
mainPage
|
||||
.getCell("Title", index)
|
||||
.rightclick();
|
||||
|
||||
// delete row
|
||||
cy.getActiveMenu()
|
||||
.find('.ant-dropdown-menu-item:contains("Delete Row")')
|
||||
.first()
|
||||
.click({ force: true });
|
||||
}
|
||||
|
||||
export const genTest = (apiType, dbType) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
describe(`Webhook`, () => {
|
||||
before(() => {
|
||||
loginPage.loginAndOpenProject(apiType, dbType);
|
||||
cy.createTable("Temp");
|
||||
cy.wait(1000);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
cy.deleteTable("Temp");
|
||||
cy.saveLocalStorage();
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it("Create: 'After Insert' event", () => {
|
||||
createWebhook({
|
||||
title: "hook-1",
|
||||
event: "After Insert",
|
||||
type: "URL",
|
||||
url: {
|
||||
method: "POST",
|
||||
path: hookPath,
|
||||
},
|
||||
});
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
verifyHookTrigger(1, "Poole");
|
||||
updateRow(1, "Delaware");
|
||||
verifyHookTrigger(1, "Poole");
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(1, "Poole");
|
||||
});
|
||||
|
||||
it("Add 'After Update' event", () => {
|
||||
createWebhook({
|
||||
title: "hook-2",
|
||||
event: "After Update",
|
||||
type: "URL",
|
||||
url: {
|
||||
method: "POST",
|
||||
path: hookPath,
|
||||
},
|
||||
});
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
verifyHookTrigger(1, "Poole");
|
||||
updateRow(1, "Delaware");
|
||||
verifyHookTrigger(2, "Delaware");
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(2, "Delaware");
|
||||
});
|
||||
|
||||
it("Add 'After Delete' event", () => {
|
||||
createWebhook({
|
||||
title: "hook-3",
|
||||
event: "After Delete",
|
||||
type: "URL",
|
||||
url: {
|
||||
method: "POST",
|
||||
path: hookPath,
|
||||
},
|
||||
});
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
verifyHookTrigger(1, "Poole");
|
||||
updateRow(1, "Delaware");
|
||||
verifyHookTrigger(2, "Delaware");
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(3, "Delaware");
|
||||
});
|
||||
|
||||
it("Modify webhook", () => {
|
||||
openWebhook(0);
|
||||
configureWebhook({ event: "After Delete" });
|
||||
openWebhook(1);
|
||||
configureWebhook({ event: "After Delete" });
|
||||
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
verifyHookTrigger(0, "");
|
||||
updateRow(1, "Delaware");
|
||||
verifyHookTrigger(0, "");
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(3, "Delaware");
|
||||
});
|
||||
|
||||
it("Delete webhook", () => {
|
||||
deleteWebhook(2);
|
||||
deleteWebhook(1);
|
||||
deleteWebhook(0);
|
||||
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
verifyHookTrigger(0, "");
|
||||
updateRow(1, "Delaware");
|
||||
verifyHookTrigger(0, "");
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(0, "");
|
||||
});
|
||||
|
||||
it("Create, with condition", () => {
|
||||
// create 3 webhooks with all three events, with condition this time
|
||||
createWebhook({
|
||||
title: "hook-with-condition-1",
|
||||
event: "After Insert",
|
||||
type: "URL",
|
||||
url: {
|
||||
method: "POST",
|
||||
path: hookPath,
|
||||
},
|
||||
condition: {
|
||||
column: "Title",
|
||||
operator: "is like",
|
||||
value: "Poole",
|
||||
},
|
||||
});
|
||||
createWebhook({
|
||||
title: "hook-with-condition-2",
|
||||
event: "After Update",
|
||||
type: "URL",
|
||||
url: {
|
||||
method: "POST",
|
||||
path: hookPath,
|
||||
},
|
||||
condition: {
|
||||
column: "Title",
|
||||
operator: "is like",
|
||||
value: "Poole",
|
||||
},
|
||||
});
|
||||
createWebhook({
|
||||
title: "hook-with-condition-3",
|
||||
event: "After Delete",
|
||||
type: "URL",
|
||||
url: {
|
||||
method: "POST",
|
||||
path: hookPath,
|
||||
},
|
||||
condition: {
|
||||
column: "Title",
|
||||
operator: "is like",
|
||||
value: "Poole",
|
||||
},
|
||||
});
|
||||
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
addNewRow(2, "Delaware");
|
||||
verifyHookTrigger(1, "Poole");
|
||||
updateRow(1, "Delaware");
|
||||
updateRow(2, "Poole");
|
||||
verifyHookTrigger(2, "Poole");
|
||||
deleteRow(2);
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(3, "Poole");
|
||||
});
|
||||
|
||||
it("Modify trigger condition", () => {
|
||||
openWebhook(0);
|
||||
configureWebhook({ deleteCondition: true });
|
||||
openWebhook(1);
|
||||
configureWebhook({ deleteCondition: true });
|
||||
openWebhook(2);
|
||||
configureWebhook({ deleteCondition: true });
|
||||
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
addNewRow(2, "Delaware");
|
||||
verifyHookTrigger(2, "Delaware");
|
||||
updateRow(1, "Delaware");
|
||||
updateRow(2, "Poole");
|
||||
verifyHookTrigger(4, "Poole");
|
||||
deleteRow(2);
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(6, "Delaware");
|
||||
});
|
||||
|
||||
it("Delete trigger condition", () => {
|
||||
deleteWebhook(2);
|
||||
deleteWebhook(1);
|
||||
deleteWebhook(0);
|
||||
|
||||
clearServerData();
|
||||
addNewRow(1, "Poole");
|
||||
verifyHookTrigger(0, "");
|
||||
updateRow(1, "Delaware");
|
||||
verifyHookTrigger(0, "");
|
||||
deleteRow(1);
|
||||
verifyHookTrigger(0, "");
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
452
scripts/cypress/integration/common/9a_QuickTest.js
Normal file
452
scripts/cypress/integration/common/9a_QuickTest.js
Normal file
@@ -0,0 +1,452 @@
|
||||
import {
|
||||
isTestSuiteActive,
|
||||
roles,
|
||||
} from "../../support/page_objects/projectConstants";
|
||||
import { loginPage, projectsPage } from "../../support/page_objects/navigation";
|
||||
import { mainPage } from "../../support/page_objects/mainPage";
|
||||
|
||||
// normal fields
|
||||
let records = {
|
||||
Name: "Movie-1",
|
||||
Notes: "Good",
|
||||
Status: "Todo",
|
||||
Tags: "Jan",
|
||||
Phone: "123123123",
|
||||
Email: "a@b.com",
|
||||
URL: "www.a.com",
|
||||
Number: "1",
|
||||
Value: "$1.00",
|
||||
Percent: "0.01",
|
||||
};
|
||||
|
||||
// links/ computed fields
|
||||
let records2 = {
|
||||
Duration: "00:01",
|
||||
Done: true,
|
||||
Date: "2022-05-31",
|
||||
Rating: "1",
|
||||
Actor: ["Actor1", "Actor2"],
|
||||
"Status (from Actor)": ["Todo", "In progress"],
|
||||
RollUp: "128",
|
||||
Computation: "4.04",
|
||||
Producer: ["P1", "P2"]
|
||||
};
|
||||
|
||||
let tn = [ "Film", "Actor", "Producer", ]
|
||||
|
||||
let cn = [ "Name", "Notes", "Status", "Tags", "Done", "Date", "Phone",
|
||||
"Email", "URL", "Number", "Percent", "Duration", "Rating",
|
||||
"Actor", "Status (from Actor)", "RollUp", "Computation", "Producer" ]
|
||||
|
||||
function openWebhook(index) {
|
||||
cy.get('.nc-actions-menu-btn').should('exist').click();
|
||||
cy.getActiveMenu().find('.ant-dropdown-menu-title-content').contains('Webhooks').click()
|
||||
|
||||
cy.get(".nc-hook").eq(index).click();
|
||||
}
|
||||
|
||||
// to be invoked after open
|
||||
function verifyWebhook(config) {
|
||||
cy.get(".nc-text-field-hook-title").then(($element) => {
|
||||
expect($element[0].value).to.have.string(config.title)
|
||||
})
|
||||
cy.get(".nc-text-field-hook-event")
|
||||
.find('.ant-select-selection-item')
|
||||
.contains(config.event)
|
||||
.should('exist')
|
||||
cy.get(".nc-select-hook-notification-type")
|
||||
.find('.ant-select-selection-item')
|
||||
.contains(config.notification)
|
||||
.should('exist')
|
||||
cy.get('.nc-select-hook-url-method')
|
||||
.find('.ant-select-selection-item')
|
||||
.contains(config.type)
|
||||
.should('exist')
|
||||
cy.get(".nc-text-field-hook-url-path")
|
||||
.then(($element) => {
|
||||
expect($element[0].value).to.have.string(config.url)
|
||||
})
|
||||
cy.get(".nc-icon-hook-navigate-left").click({force:true})
|
||||
}
|
||||
|
||||
export const genTest = (apiType, dbType, testMode) => {
|
||||
if (!isTestSuiteActive(apiType, dbType)) return;
|
||||
describe(`Quick Tests`, () => {
|
||||
|
||||
let cellIdx = 1;
|
||||
let columnCount = cn.length
|
||||
if(testMode === 'AT_IMPORT') {
|
||||
cellIdx = 3;
|
||||
columnCount -= 3;
|
||||
}
|
||||
|
||||
before(() => {
|
||||
cy.restoreLocalStorage();
|
||||
|
||||
if( testMode === 'CY_QUICK') {
|
||||
// cy.task("copyFile")
|
||||
loginPage.signIn(roles.owner.credentials);
|
||||
projectsPage.openProject("sample");
|
||||
|
||||
// kludge: wait for page load to finish
|
||||
cy.wait(2000);
|
||||
// close team & auth tab
|
||||
cy.get('button.ant-tabs-tab-remove').should('exist').click();
|
||||
cy.wait(1000);
|
||||
|
||||
cy.saveLocalStorage();
|
||||
}
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
cy.restoreLocalStorage();
|
||||
})
|
||||
|
||||
// afterEach(() => {
|
||||
// cy.saveLocalStorage();
|
||||
// })
|
||||
|
||||
after(() => {
|
||||
cy.restoreLocalStorage();
|
||||
|
||||
// sign out
|
||||
cy.signOut();
|
||||
});
|
||||
|
||||
it("Verify Schema", () => {
|
||||
cy.openTableTab("Film", 3)
|
||||
|
||||
// verify if all tables exist
|
||||
for(let i=0; i<tn.length; i++) {
|
||||
cy.get(`.nc-project-tree-tbl-${tn[i]}`).should('exist')
|
||||
}
|
||||
|
||||
// for Film table, verify columns
|
||||
for(let i=0; i<columnCount; i++) {
|
||||
cy.get(`th[data-title="${cn[i]}"]`).should("exist");
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
it("Verify Data types", () => {
|
||||
cy.openTableTab("Film", 3);
|
||||
|
||||
// normal cells
|
||||
for (let [key, value] of Object.entries(records)) {
|
||||
mainPage.getCell(key, cellIdx).contains(value).should("exist");
|
||||
}
|
||||
|
||||
// checkbox
|
||||
mainPage
|
||||
.getCell("Done", cellIdx)
|
||||
.find(".nc-cell-hover-show")
|
||||
.should(records2.Done ? "not.exist" : "exist");
|
||||
|
||||
// date
|
||||
|
||||
// duration
|
||||
mainPage.getCell("Duration", cellIdx).contains(records2.Duration).should("exist");
|
||||
|
||||
// rating
|
||||
mainPage
|
||||
.getCell("Rating", cellIdx)
|
||||
.find(".ant-rate-star-full")
|
||||
.should("have.length", records2.Rating);
|
||||
|
||||
// verifying only one instance as its different for PG & SQLite
|
||||
// for PG: its Actor1, Actor1
|
||||
// for SQLite: its Actor1, Actor2
|
||||
// LinkToAnotherRecord
|
||||
mainPage.getCell("Actor", cellIdx).scrollIntoView();
|
||||
cy.get(`:nth-child(${cellIdx}) > [data-title="Actor"]`)
|
||||
.find('.chip')
|
||||
.eq(0)
|
||||
.contains(records2.Actor[0])
|
||||
.should("exist");
|
||||
|
||||
// lookup
|
||||
mainPage.getCell("Status (from Actor)", cellIdx).scrollIntoView();
|
||||
cy.get(`:nth-child(${cellIdx}) > [data-title="Status (from Actor)"]`)
|
||||
.find('.nc-cell')
|
||||
.eq(0)
|
||||
.contains(records2["Status (from Actor)"][0])
|
||||
.should("exist");
|
||||
|
||||
// rollup
|
||||
if( testMode === 'CY_QUICK') {
|
||||
|
||||
mainPage.getCell("RollUp", cellIdx).scrollIntoView();
|
||||
mainPage.getCell("RollUp", cellIdx).contains(records2.RollUp).should("exist");
|
||||
|
||||
// formula
|
||||
mainPage.getCell("Computation", cellIdx).scrollIntoView();
|
||||
mainPage.getCell("Computation", cellIdx).contains(records2.Computation).should("exist");
|
||||
|
||||
// ltar hm relation
|
||||
mainPage.getCell("Producer", cellIdx).scrollIntoView();
|
||||
mainPage.getCell("Producer", cellIdx).find('.chip').eq(0).contains(records2.Producer[0]).should('exist')
|
||||
mainPage.getCell("Producer", cellIdx).find('.chip').eq(1).contains(records2.Producer[1]).should('exist')
|
||||
}
|
||||
|
||||
cy.closeTableTab("Film");
|
||||
});
|
||||
|
||||
it("Verify Views & Shared base", () => {
|
||||
cy.openTableTab("Film", 3);
|
||||
mainPage.toggleRightSidebar();
|
||||
cy.get('.nc-form-view-item:visible')
|
||||
.should('exist')
|
||||
.eq(0)
|
||||
.click({ force: true })
|
||||
|
||||
// Header & description should exist
|
||||
// cy.get(".nc-form")
|
||||
// .find('[placeholder="Form Title"]')
|
||||
// .contains("FormTitle")
|
||||
// .should("exist");
|
||||
// cy.get(".nc-form")
|
||||
// .find('[placeholder="Add form description"]')
|
||||
// .contains("FormDescription")
|
||||
// .should("exist");
|
||||
|
||||
cy.get(".nc-form").should("exist");
|
||||
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Form Title"]')
|
||||
.should("exist").then(($el) => {
|
||||
cy.log($el)
|
||||
expect($el.val()).to.equal("FormTitle");
|
||||
})
|
||||
cy.get(".nc-form")
|
||||
.find('[placeholder="Add form description"]')
|
||||
.should("exist").then(($el) => {
|
||||
cy.log($el)
|
||||
expect($el.val()).to.equal("FormDescription");
|
||||
})
|
||||
|
||||
// modified column name & help text
|
||||
cy.get(".nc-editable").eq(0)
|
||||
.find('.name')
|
||||
.contains("DisplayName")
|
||||
.should('exist')
|
||||
cy.get(".nc-editable").eq(0)
|
||||
.find('.text-gray-500')
|
||||
.contains('HelpText')
|
||||
.should('exist')
|
||||
|
||||
cy.get(".nc-editable").eq(1)
|
||||
.find('.name')
|
||||
.contains("Email")
|
||||
.should('exist')
|
||||
|
||||
// add message
|
||||
cy.get("textarea.nc-form-after-submit-msg").then(($element) => {
|
||||
expect($element[0].value).to.have.string("Thank you for submitting the form!")
|
||||
})
|
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find("textarea").then(($element) => {
|
||||
// expect($element[0].value).to.have.string("Thank you for submitting the form!")
|
||||
// })
|
||||
|
||||
cy.get("button.nc-form-checkbox-submit-another-form.ant-switch-checked").should('exist')
|
||||
cy.get("button.nc-form-checkbox-show-blank-form.ant-switch-checked").should('exist')
|
||||
cy.get("button.nc-form-checkbox-send-email.ant-switch-checked").should('not.exist')
|
||||
|
||||
// // submit another form button
|
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find('[type="checkbox"]')
|
||||
// .eq(0)
|
||||
// .should('be.checked')
|
||||
// // "New form after 5 seconds" button
|
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find('[type="checkbox"]')
|
||||
// .eq(1)
|
||||
// .should('be.checked')
|
||||
// // email me
|
||||
// cy.get(".nc-form > .mx-auto")
|
||||
// .find('[type="checkbox"]')
|
||||
// .eq(2)
|
||||
// .should('not.be.checked')
|
||||
|
||||
cy.closeTableTab("Film");
|
||||
});
|
||||
|
||||
it("Verify Webhooks", () => {
|
||||
if( testMode === 'CY_QUICK') {
|
||||
cy.openTableTab("Actor", 25);
|
||||
openWebhook(0)
|
||||
verifyWebhook({
|
||||
title: "Webhook-1",
|
||||
event: "After Insert",
|
||||
notification: "URL",
|
||||
type: "POST",
|
||||
url: "http://localhost:9090/hook",
|
||||
condition: false
|
||||
})
|
||||
cy.get("body").type("{esc}");
|
||||
|
||||
openWebhook(1)
|
||||
verifyWebhook({
|
||||
title: "Webhook-2",
|
||||
event: "After Update",
|
||||
notification: "URL",
|
||||
type: "POST",
|
||||
url: "http://localhost:9090/hook",
|
||||
condition: false
|
||||
})
|
||||
cy.get("body").type("{esc}");
|
||||
|
||||
openWebhook(2)
|
||||
verifyWebhook({
|
||||
title: "Webhook-3",
|
||||
event: "After Delete",
|
||||
notification: "URL",
|
||||
type: "POST",
|
||||
url: "http://localhost:9090/hook",
|
||||
condition: false
|
||||
})
|
||||
cy.get("body").type("{esc}");
|
||||
|
||||
cy.closeTableTab("Actor");
|
||||
}
|
||||
});
|
||||
|
||||
it("Pagination", () => {
|
||||
cy.openTableTab("Actor", 25);
|
||||
|
||||
cy.get(".nc-pagination").should("exist");
|
||||
|
||||
// verify > pagination option
|
||||
mainPage.getPagination(">").click();
|
||||
mainPage
|
||||
.getPagination(2)
|
||||
.should("have.class", "ant-pagination-item-active");
|
||||
|
||||
// verify < pagination option
|
||||
mainPage.getPagination("<").click();
|
||||
mainPage
|
||||
.getPagination(1)
|
||||
.should("have.class", "ant-pagination-item-active");
|
||||
|
||||
cy.closeTableTab("Actor");
|
||||
});
|
||||
|
||||
it("Verify Fields, Filter & Sort", () => {
|
||||
cy.openTableTab("Actor", 25);
|
||||
mainPage.toggleRightSidebar();
|
||||
|
||||
cy.get(".nc-grid-view-item").eq(1).click()
|
||||
|
||||
cy.wait(3000)
|
||||
|
||||
cy.get(".nc-grid-header").find(`th[data-title="Name"]`).should("be.visible");
|
||||
cy.get(".nc-grid-header").find(`th[data-title="Notes"]`).should("be.visible");
|
||||
cy.get(".nc-grid-header").find(`th[data-title="Attachments"]`).should("not.exist");
|
||||
cy.get(".nc-grid-header").find(`th[data-title="Status"]`).should("be.visible");
|
||||
cy.get(".nc-grid-header").find(`th[data-title="Film"]`).should("be.visible");
|
||||
|
||||
cy.wait(2000);
|
||||
cy.get(".nc-fields-menu-btn").click()
|
||||
|
||||
cy.getActiveMenu().find(`[type="checkbox"]`).eq(0).should('be.checked')
|
||||
cy.getActiveMenu().find(`[type="checkbox"]`).eq(1).should('be.checked')
|
||||
cy.getActiveMenu().find(`[type="checkbox"]`).eq(2).should('not.be.checked')
|
||||
cy.getActiveMenu().find(`[type="checkbox"]`).eq(3).should('be.checked')
|
||||
cy.getActiveMenu().find(`[type="checkbox"]`).eq(4).should('be.checked')
|
||||
cy.get(".nc-fields-menu-btn").click();
|
||||
|
||||
cy.get(".nc-sort-menu-btn").click();
|
||||
cy.get(".nc-sort-field-select").eq(0)
|
||||
.contains('Name')
|
||||
.should("exist");
|
||||
cy.get(".nc-sort-dir-select").eq(0)
|
||||
.contains('A → Z')
|
||||
.should("exist");
|
||||
cy.get(".nc-sort-menu-btn").click();
|
||||
|
||||
cy.get(".nc-filter-menu-btn").click();
|
||||
cy.get(".nc-filter-field-select").eq(0)
|
||||
.contains('Name')
|
||||
.should("exist");
|
||||
cy.get(".nc-filter-operation-select").eq(0)
|
||||
.contains('is like')
|
||||
.should("exist");
|
||||
|
||||
cy.get(".nc-filter-field-select").eq(1)
|
||||
.contains('Name')
|
||||
.should("exist");
|
||||
cy.get(".nc-filter-operation-select").eq(1)
|
||||
.contains('is like')
|
||||
.should("exist");
|
||||
cy.get(".nc-filter-menu-btn").click();
|
||||
|
||||
cy.closeTableTab("Actor");
|
||||
});
|
||||
|
||||
it("Views, bt relation", () => {
|
||||
if( testMode === 'CY_QUICK') {
|
||||
|
||||
cy.openTableTab("Producer", 3)
|
||||
mainPage.toggleRightSidebar();
|
||||
|
||||
cy.get('.nc-grid-view-item').should('have.length', 4)
|
||||
cy.get('.nc-form-view-item').should('have.length', 4)
|
||||
cy.get('.nc-gallery-view-item').should('have.length', 3)
|
||||
|
||||
// LinkToAnotherRecord hm relation
|
||||
mainPage.getCell("FilmRead", 1).scrollIntoView();
|
||||
cy.get('[data-title="FilmRead"] > .h-full > .nc-virtual-cell > .w-full > .chips > .chip > .name')
|
||||
// cy.get(
|
||||
// ':nth-child(1) > [data-col="FilmRead"] > .nc-virtual-cell > .v-lazy > .d-100 > .chips > :nth-child(1) > .v-chip__content > .name'
|
||||
// )
|
||||
.contains('Movie-1')
|
||||
.should("exist");
|
||||
|
||||
cy.closeTableTab("Producer")
|
||||
}
|
||||
})
|
||||
|
||||
it.skip("Delete Project", () => {
|
||||
if( testMode === 'AT_IMPORT') {
|
||||
mainPage.toolBarTopLeft(mainPage.HOME).click({force:true})
|
||||
cy.get(`.mdi-delete-outline`, {
|
||||
timeout: 10000,
|
||||
})
|
||||
.should("exist")
|
||||
.last()
|
||||
.click();
|
||||
|
||||
cy.getActiveModal()
|
||||
.find("button")
|
||||
.contains("Submit")
|
||||
.should("exist")
|
||||
.click();
|
||||
cy.toastWait("deleted successfully");
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// genTest("rest", "xcdb");
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||||
*
|
||||
* @author Raju Udava <sivadstala@gmail.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
Reference in New Issue
Block a user