diff --git a/scripts/cypress/integration/common/1a_table_operations.js b/scripts/cypress/integration/common/1a_table_operations.js index f7c48a9d10..c3931312a7 100644 --- a/scripts/cypress/integration/common/1a_table_operations.js +++ b/scripts/cypress/integration/common/1a_table_operations.js @@ -1,98 +1,100 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; import { mainPage } from "../../support/page_objects/mainPage"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; - - describe(`${xcdb ? 'Meta - ' : ''}${type.toUpperCase()} api - Table`, () => { + if (!isTestSuiteActive(type, xcdb)) return; + describe(`${xcdb ? "Meta - " : ""}${type.toUpperCase()} api - Table`, () => { before(() => { - cy.get('.mdi-close').click({ multiple: true }) - }) - + cy.get(".mdi-close").click({ multiple: true }); + }); + after(() => { - cy.get('.mdi-close').click({ multiple: true }) - }) + cy.get(".mdi-close").click({ multiple: true }); + }); - const name = 'tablex' + const name = "tablex"; // create a new random table - it('Create Table', () => { - cy.createTable(name) - }) - + it("Create Table", () => { + cy.createTable(name); + }); // delete newly created table - it('Delete Table', () => { - cy.deleteTable(name) - }) + it("Delete Table", () => { + cy.deleteTable(name); + }); const getAuditCell = (row, col) => { - return cy.get('table > tbody > tr').eq(row).find('td').eq(col) - } + return cy.get("table > tbody > tr").eq(row).find("td").eq(col); + }; - it('Open Audit tab', ()=> { - mainPage.navigationDraw(mainPage.AUDIT).click() + it("Open Audit tab", () => { + mainPage.navigationDraw(mainPage.AUDIT).click(); // wait for column headers to appear // - cy.get('thead > tr > th.caption').should('have.length', 5) + cy.get("thead > tr > th.caption").should("have.length", 5); - // 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, ... + // 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(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') - }) - - it('Table Rename operation', () => { + getAuditCell(1, 0).contains("TABLE").should("exist"); + getAuditCell(1, 1).contains("CREATED").should("exist"); + getAuditCell(1, 3).contains("user@nocodb.com").should("exist"); + }); - cy.renameTable('City', 'CityX') + it("Table Rename operation", () => { + cy.renameTable("City", "CityX"); // verify // 1. Table name in project tree has changed - cy.get('.nc-project-tree') - .contains('CityX') - .should('exist') - + cy.get(".nc-project-tree").contains("CityX").should("exist"); + // 2. Table tab name has changed - cy.get(`.project-tab:contains('CityX'):visible`) - .should('exist') - + cy.get(`.project-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') + mainPage + .getCell(`City`, 1) + .contains("A Corua (La Corua)") + .should("exist"); + + cy.closeTableTab("CityX"); // 4. verify linked contents in other table // 4a. Address table, has many field - cy.openTableTab('Address', 25) + cy.openTableTab("Address", 25); - mainPage.getCell('City <= Address', 1).scrollIntoView() - mainPage.getCell('City <= Address', 1).find('.name').contains('Lethbridge').should('exist') - cy.closeTableTab('Address') + mainPage.getCell("City <= Address", 1).scrollIntoView(); + mainPage + .getCell("City <= Address", 1) + .find(".name") + .contains("Lethbridge") + .should("exist"); + cy.closeTableTab("Address"); // 4b. Country table, belongs to field - cy.openTableTab('Country', 25) - - mainPage.getCell('Country => City', 1).find('.name').contains('Kabul').should('exist') - cy.closeTableTab('Country') - + cy.openTableTab("Country", 25); + + mainPage + .getCell("Country => City", 1) + .find(".name") + .contains("Kabul") + .should("exist"); + cy.closeTableTab("Country"); + // revert re-name operation to not impact rest of test suite - cy.renameTable('CityX', 'City') - }) - }) -} + cy.renameTable("CityX", "City"); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -115,4 +117,4 @@ export const genTest = (type, xcdb) => { * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - */ \ No newline at end of file + */ diff --git a/scripts/cypress/integration/common/1b_table_column_operations.js b/scripts/cypress/integration/common/1b_table_column_operations.js index 0919fa6927..08a89dc714 100644 --- a/scripts/cypress/integration/common/1b_table_column_operations.js +++ b/scripts/cypress/integration/common/1b_table_column_operations.js @@ -1,121 +1,135 @@ - -import { mainPage } from "../../support/page_objects/mainPage" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { mainPage } from "../../support/page_objects/mainPage"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.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' + 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.createTable(name) + cy.createTable(name); }); // delete table after(() => { - cy.deleteTable(name) + cy.deleteTable(name); }); - it('Create Table Column', () => { - cy.get(`.project-tab:contains(${name}):visible`).should('exist') - mainPage.addColumn(colName, name) + it("Create Table Column", () => { + cy.get(`.project-tab:contains(${name}):visible`).should("exist"); + mainPage.addColumn(colName, name); - cy.get(`th:contains(${colName})`).should('exist'); - }) + cy.get(`th:contains(${colName})`).should("exist"); + }); // edit the newly created column - it('Edit table column - change datatype', () => { + it("Edit table column - change datatype", () => { cy.get(`th:contains(${colName}) .mdi-menu-down`) - .trigger('mouseover', {force: true}) - .click({force: true}) + .trigger("mouseover", { force: true }) + .click({ force: true }); - cy.get('.nc-column-edit').click() + cy.get(".nc-column-edit").click(); // change column type and verify - cy.get('.nc-ui-dt-dropdown').click() - cy.contains('LongText').click() - cy.get('.nc-col-create-or-edit-card').contains('Save').click() + cy.get(".nc-ui-dt-dropdown").click(); + cy.contains("LongText").click(); + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); - cy.toastWait('Update table.tablex successful') + cy.toastWait("Update table.tablex successful"); - cy.get(`th[data-col="${colName}"] .mdi-text-subject`).should('exist') + cy.get(`th[data-col="${colName}"] .mdi-text-subject`).should("exist"); cy.get(`th:contains(${colName}) .mdi-menu-down`) - .trigger('mouseover', {force: true}) - .click({force: true}) + .trigger("mouseover", { force: true }) + .click({ force: true }); - cy.get('.nc-column-edit').click() - }) + cy.get(".nc-column-edit").click(); + }); // edit the newly created column - it('Edit table column - rename', () => { + it("Edit table column - rename", () => { cy.get(`th:contains(${colName}) .mdi-menu-down`) - .trigger('mouseover', {force: true}) - .click({force: true}) + .trigger("mouseover", { force: true }) + .click({ force: true }); - cy.get('.nc-column-edit').click() + cy.get(".nc-column-edit").click(); // rename column and verify - cy.get('.nc-column-name-input input').clear().type(updatedColName) - cy.get('.nc-col-create-or-edit-card').contains('Save').click() + cy.get(".nc-column-name-input input").clear().type(updatedColName); + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); - cy.toastWait('Update table.tablex successful') + cy.toastWait("Update table.tablex successful"); - cy.get(`th:contains(${colName})`).should('not.exist') - cy.get(`th:contains(${updatedColName})`).should('exist') - }) + cy.get(`th:contains(${colName})`).should("not.exist"); + cy.get(`th:contains(${updatedColName})`).should("exist"); + }); // delete the newly created column - it('Delete table column', () => { - cy.get(`th:contains(${updatedColName})`).should('exist'); + it("Delete table column", () => { + cy.get(`th:contains(${updatedColName})`).should("exist"); cy.get(`th:contains(${updatedColName}) .mdi-menu-down`) - .trigger('mouseover') - .click() - - cy.get('.nc-column-delete').click() - cy.get('button:contains(Confirm)').click() - cy.toastWait('Update table.tablex successful') - - cy.get(`th:contains(${updatedColName})`).should('not.exist'); - }) + .trigger("mouseover") + .click(); - it('Add new row', () => { - cy.get('.nc-add-new-row-btn:visible').should('exist') - cy.get('.nc-add-new-row-btn').click({force: true}); - cy.get('#data-table-form-Title > input').first().type(randVal); - cy.getActiveModal().find('button').contains('Save Row').click({ force: true }) + cy.get(".nc-column-delete").click(); + cy.get("button:contains(Confirm)").click(); + cy.toastWait("Update table.tablex successful"); - cy.toastWait('updated successfully') - mainPage.getCell('Title', 1).contains(randVal).should('exist') - }) + cy.get(`th:contains(${updatedColName})`).should("not.exist"); + }); - it('Update row', () => { - mainPage.getRow(1).find('.nc-row-expand-icon').click({force: true}) - cy.get('#data-table-form-Title > input').first().clear().type(updatedRandVal); - cy.getActiveModal().find('button').contains('Save Row').click({force: true}) + it("Add new row", () => { + cy.get(".nc-add-new-row-btn:visible").should("exist"); + cy.get(".nc-add-new-row-btn").click({ force: true }); + cy.get("#data-table-form-Title > input").first().type(randVal); + cy.getActiveModal() + .find("button") + .contains("Save Row") + .click({ force: true }); + + cy.toastWait("updated successfully"); + mainPage.getCell("Title", 1).contains(randVal).should("exist"); + }); - cy.toastWait('updated successfully') - - mainPage.getCell('Title', 1).contains(randVal).should('not.exist') - mainPage.getCell('Title', 1).contains(updatedRandVal).should('exist') - }) + it("Update row", () => { + mainPage.getRow(1).find(".nc-row-expand-icon").click({ force: true }); + cy.get("#data-table-form-Title > input") + .first() + .clear() + .type(updatedRandVal); + cy.getActiveModal() + .find("button") + .contains("Save Row") + .click({ force: true }); + + cy.toastWait("updated successfully"); + + 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 }) + it("Delete row", () => { + mainPage + .getCell("Title", 1) + .contains(updatedRandVal) + .rightclick({ force: true }); // delete row - cy.getActiveMenu().find('.v-list-item:contains("Delete Row")').first().click({force: true}) + cy.getActiveMenu() + .find('.v-list-item:contains("Delete Row")') + .first() + .click({ force: true }); // cy.toastWait('Deleted row successfully') - cy.get('td').contains(randVal).should('not.exist'); - }) - }) -} + cy.get("td").contains(randVal).should("not.exist"); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -139,4 +153,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/2a_table_with_belongs_to_colulmn.js b/scripts/cypress/integration/common/2a_table_with_belongs_to_colulmn.js index 5080a67f15..99d202fc5d 100644 --- a/scripts/cypress/integration/common/2a_table_with_belongs_to_colulmn.js +++ b/scripts/cypress/integration/common/2a_table_with_belongs_to_colulmn.js @@ -1,49 +1,61 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.toUpperCase()} api - Table: belongs to, link record`, () => { - before(() => { - cy.openTableTab('Country', 25) - - }) + cy.openTableTab("Country", 25); + }); after(() => { - cy.closeTableTab('Country') - }) + cy.closeTableTab("Country"); + }); - it('Table column header, URL validation', () => { + it("Table column header, URL validation", () => { // column name validation - cy.get(`.project-tab:contains(Country):visible`).should('exist') + cy.get(`.project-tab:contains(Country):visible`).should("exist"); // URL validation - cy.url().should('contain', `name=Country`) - }) + cy.url().should("contain", `name=Country`); + }); - it('Expand belongs-to column', () => { + it("Expand belongs-to column", () => { // expand first row - cy.get('td[data-col="Country => City"] div:visible', {timeout: 12000}).first().click() - cy.get('td[data-col="Country => City"] div .mdi-arrow-expand:visible').first().click() - }) + cy.get('td[data-col="Country => City"] div:visible', { timeout: 12000 }) + .first() + .click(); + cy.get('td[data-col="Country => City"] div .mdi-arrow-expand:visible') + .first() + .click(); + }); - it('Expand Link record, validate', () => { - cy.getActiveModal().find('button:contains(Link to \'City\')').click() + 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('button.mdi-reload').should('exist') - cy.getActiveModal().find('button:contains("New Record")').should('exist') - cy.getActiveModal().find('.child-card').eq(0).contains('A Corua (La Corua)').should('exist') + cy.getActiveModal().contains("Link Record").should("exist"); + cy.getActiveModal().find("button.mdi-reload").should("exist"); + cy.getActiveModal() + .find('button:contains("New Record")') + .should("exist"); + cy.getActiveModal() + .find(".child-card") + .eq(0) + .contains("A Corua (La Corua)") + .should("exist"); - cy.getActiveModal().find('button.mdi-close').click().then(() => { - cy.getActiveModal().find('button.mdi-close').click() - }) - }) - }) - }) -} + cy.getActiveModal() + .find("button.mdi-close") + .click() + .then(() => { + cy.getActiveModal().find("button.mdi-close").click(); + }); + }); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd diff --git a/scripts/cypress/integration/common/2b_table_with_m2m_column.js b/scripts/cypress/integration/common/2b_table_with_m2m_column.js index b109a6cbbe..f41aa8cab0 100644 --- a/scripts/cypress/integration/common/2b_table_with_m2m_column.js +++ b/scripts/cypress/integration/common/2b_table_with_m2m_column.js @@ -1,66 +1,89 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.toUpperCase()} api - M2M Column validation`, () => { before(() => { - cy.openTableTab('Actor', 25) - - }) + cy.openTableTab("Actor", 25); + }); after(() => { - cy.closeTableTab('Actor') - }) - - it('Table column header, URL validation', () => { + cy.closeTableTab("Actor"); + }); + it("Table column header, URL validation", () => { // column name validation - cy.get(`.project-tab:contains(Actor):visible`).should('exist') + cy.get(`.project-tab:contains(Actor):visible`).should("exist"); // URL validation - cy.url().should('contain', `name=Actor`) - }) - - it('Expand m2m column', () => { + cy.url().should("contain", `name=Actor`); + }); + it("Expand m2m column", () => { // expand first row - cy.get('td[data-col="Actor <=> Film"] div', {timeout: 12000}).first().click({force: true}) - cy.get('td[data-col="Actor <=> Film"] div .mdi-arrow-expand').first().click({force: true}) + cy.get('td[data-col="Actor <=> Film"] div', { timeout: 12000 }) + .first() + .click({ force: true }); + cy.get('td[data-col="Actor <=> Film"] div .mdi-arrow-expand') + .first() + .click({ force: true }); // 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('.child-card').eq(0).contains('ACADEMY DINOSAUR').should('exist') - }) + 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(".child-card") + .eq(0) + .contains("ACADEMY DINOSAUR") + .should("exist"); + }); it('Expand "Link to" record, validate', () => { - cy.getActiveModal().find('button:contains(Link to \'Film\')').click() + cy.getActiveModal() + .find("button:contains(Link to 'Film')") + .click() .then(() => { // Link record form validation - cy.getActiveModal().contains('Link Record').should('exist') - cy.getActiveModal().find('button.mdi-reload').should('exist') - cy.getActiveModal().find('button:contains("New Record")').should('exist') - cy.getActiveModal().find('.child-card').eq(0).contains('ACE GOLDFINGER').should('exist') - cy.get('body').type('{esc}') - }) - }) + cy.getActiveModal().contains("Link Record").should("exist"); + cy.getActiveModal().find("button.mdi-reload").should("exist"); + cy.getActiveModal() + .find('button:contains("New Record")') + .should("exist"); + cy.getActiveModal() + .find(".child-card") + .eq(0) + .contains("ACE GOLDFINGER") + .should("exist"); + cy.get("body").type("{esc}"); + }); + }); - it('Expand first linked card, validate', () => { - cy.getActiveModal().find('.child-card').eq(0).contains('ACADEMY DINOSAUR', {timeout: 2000}).click() + it("Expand first linked card, validate", () => { + cy.getActiveModal() + .find(".child-card") + .eq(0) + .contains("ACADEMY DINOSAUR", { timeout: 2000 }) + .click() .then(() => { // Link card validation - cy.getActiveModal().find('h5').contains("ACADEMY DINOSAUR").should('exist') - cy.getActiveModal().find('button:contains("Save Row")').should('exist') - cy.getActiveModal().find('button:contains("Cancel")').should('exist') + cy.getActiveModal() + .find("h5") + .contains("ACADEMY DINOSAUR") + .should("exist"); + cy.getActiveModal() + .find('button:contains("Save Row")') + .should("exist"); + cy.getActiveModal().find('button:contains("Cancel")').should("exist"); - cy.getActiveModal().find('button:contains("Cancel")').click() - cy.getActiveModal().find('button.mdi-close').click() - }) - }) - }) -} + cy.getActiveModal().find('button:contains("Cancel")').click(); + cy.getActiveModal().find("button.mdi-close").click(); + }); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -84,4 +107,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/3a_filter_sort_fields_operations.js b/scripts/cypress/integration/common/3a_filter_sort_fields_operations.js index 801a26ab9e..fed1f055f5 100644 --- a/scripts/cypress/integration/common/3a_filter_sort_fields_operations.js +++ b/scripts/cypress/integration/common/3a_filter_sort_fields_operations.js @@ -1,176 +1,205 @@ - -import { mainPage } from "../../support/page_objects/mainPage" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { mainPage } from "../../support/page_objects/mainPage"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.toUpperCase()} api - Filter, Fields, Sort`, () => { before(() => { // open country table - cy.openTableTab('Country', 25); - }) + cy.openTableTab("Country", 25); + }); after(() => { - cy.closeTableTab('Country') - }) + cy.closeTableTab("Country"); + }); describe(`Pagination`, () => { // check pagination - it('Check country table - Pagination', () => { - cy.get('.nc-pagination').should('exist') + it("Check country table - Pagination", () => { + cy.get(".nc-pagination").should("exist"); // verify > pagination option - mainPage.getPagination('>').click() - mainPage.getPagination(2).should('have.class', 'v-pagination__item--active') + mainPage.getPagination(">").click(); + mainPage + .getPagination(2) + .should("have.class", "v-pagination__item--active"); // verify < pagination option - mainPage.getPagination('<').click() - mainPage.getPagination(1).should('have.class', 'v-pagination__item--active') - }) - }) - + mainPage.getPagination("<").click(); + mainPage + .getPagination(1) + .should("have.class", "v-pagination__item--active"); + }); + }); describe(`Row operations`, () => { // create new row using + button in header // - it('Add row using tool header button', () => { - + it("Add row using tool header button", () => { // add a row to end of Country table - cy.get('.nc-add-new-row-btn').click(); - cy.get('#data-table-form-Country > input').first().type('Test Country'); - cy.contains('Save Row').filter('button').click() + cy.get(".nc-add-new-row-btn").click(); + cy.get("#data-table-form-Country > input").first().type("Test Country"); + cy.contains("Save Row").filter("button").click(); - cy.toastWait('updated successfully') + cy.toastWait("updated successfully"); // verify - mainPage.getPagination(5).click() - mainPage.getCell("Country", 10).contains("Test Country").should('exist') - }) + mainPage.getPagination(5).click(); + mainPage + .getCell("Country", 10) + .contains("Test Country") + .should("exist"); + }); // delete slingle row // - it('Delete row', () => { + it("Delete row", () => { // delete row added in previous step - mainPage.getCell("Country", 10).rightclick() - cy.getActiveMenu().contains('Delete Row').click() + mainPage.getCell("Country", 10).rightclick(); + cy.getActiveMenu().contains("Delete Row").click(); // cy.toastWait('Deleted row successfully') // verify - mainPage.getCell("Country", 10).should('not.exist') - }) + mainPage.getCell("Country", 10).should("not.exist"); + }); // create new row using right click menu option // - it('Add row using rightclick menu option', () => { - 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}') + it("Add row using rightclick menu option", () => { + 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}"); // cy.toastWait('saved successfully') - 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}') + 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}"); // cy.toastWait('saved successfully') // verify - mainPage.getCell("Country", 10).contains("Test Country-1").should('exist') - mainPage.getCell("Country", 11).contains("Test Country-2").should('exist') - }) + 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('Delete Selected', () => { - mainPage.getRow(10).find('.mdi-checkbox-blank-outline').click({force: true}) - mainPage.getRow(11).find('.mdi-checkbox-blank-outline').click({force: true}) - - mainPage.getCell("Country", 10).rightclick({force: true}) - cy.getActiveMenu().contains('Delete Selected Row').click({force: true}) + it("Delete Selected", () => { + mainPage + .getRow(10) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + mainPage + .getRow(11) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + + mainPage.getCell("Country", 10).rightclick({ force: true }); + cy.getActiveMenu() + .contains("Delete Selected Row") + .click({ force: true }); // cy.toastWait('Deleted 2 selected rows successfully') // verify - mainPage.getCell("Country", 10).should('not.exist') - mainPage.getCell("Country", 11).should('not.exist') + mainPage.getCell("Country", 10).should("not.exist"); + mainPage.getCell("Country", 11).should("not.exist"); - mainPage.getPagination(1).click() - }) + mainPage.getPagination(1).click(); + }); + }); - }) - - describe(`Sort operations`, () => { - it('Enable sort', () => { + it("Enable sort", () => { // Sort menu operations (Country Column, Z->A) - cy.get('.nc-sort-menu-btn').click() - cy.contains('Add Sort Option').click(); - cy.get('.nc-sort-field-select div').first().click() - cy.get('.menuable__content__active .v-list-item:contains(Country)').click() - cy.get('.nc-sort-dir-select div').first().click() - cy.get('.menuable__content__active .v-list-item:contains("Z -> A")').click() - - cy.contains('Zambia').should('exist') - }) - - it('Disable sort', () => { + cy.get(".nc-sort-menu-btn").click(); + cy.contains("Add Sort Option").click(); + cy.get(".nc-sort-field-select div").first().click(); + cy.get( + ".menuable__content__active .v-list-item:contains(Country)" + ).click(); + cy.get(".nc-sort-dir-select div").first().click(); + cy.get( + '.menuable__content__active .v-list-item:contains("Z -> A")' + ).click(); + + cy.contains("Zambia").should("exist"); + }); + + it("Disable sort", () => { // remove sort and validate - cy.get('.nc-sort-item-remove-btn').click() - cy.contains('Zambia').should('not.exist') - }) - - }) - - - describe('Field Operation', () => { + cy.get(".nc-sort-item-remove-btn").click(); + cy.contains("Zambia").should("not.exist"); + }); + }); - it('Hide field', () => { - cy.get('th:contains(LastUpdate)').should('be.visible') + describe("Field Operation", () => { + it("Hide field", () => { + cy.get("th:contains(LastUpdate)").should("be.visible"); // toggle and confirm it's hidden - cy.get('.nc-fields-menu-btn').click() - cy.get('.menuable__content__active .v-list-item label:contains(LastUpdate)').click() - cy.get('.nc-fields-menu-btn').click() - cy.get('th:contains(LastUpdate)').should('not.be.visible') - }) - - it('Show field', () => { - cy.get('.nc-fields-menu-btn').click() - cy.get('.menuable__content__active .v-list-item label:contains(LastUpdate)').click() - cy.get('.nc-fields-menu-btn').click() - cy.get('th:contains(LastUpdate)').should('be.visible') - }) - }) - - - describe('Filter operations', () => { - it('Create Filter', () => { - cy.get('.nc-filter-menu-btn').click() - cy.contains('Add Filter').click(); - - cy.get('.nc-filter-field-select').last().click(); - cy.getActiveMenu().find('.v-list-item:contains(Country)').click() - cy.get('.nc-filter-operation-select').last().click(); - cy.getActiveMenu().find('.v-list-item:contains("is equal")').click() - cy.get('.nc-filter-value-select input:text').last().type('India'); - cy.get('.nc-filter-menu-btn').click() + cy.get(".nc-fields-menu-btn").click(); + cy.get( + ".menuable__content__active .v-list-item label:contains(LastUpdate)" + ).click(); + cy.get(".nc-fields-menu-btn").click(); + cy.get("th:contains(LastUpdate)").should("not.be.visible"); + }); + + it("Show field", () => { + cy.get(".nc-fields-menu-btn").click(); + cy.get( + ".menuable__content__active .v-list-item label:contains(LastUpdate)" + ).click(); + cy.get(".nc-fields-menu-btn").click(); + cy.get("th:contains(LastUpdate)").should("be.visible"); + }); + }); + + describe("Filter operations", () => { + it("Create Filter", () => { + cy.get(".nc-filter-menu-btn").click(); + cy.contains("Add Filter").click(); + + cy.get(".nc-filter-field-select").last().click(); + cy.getActiveMenu().find(".v-list-item:contains(Country)").click(); + cy.get(".nc-filter-operation-select").last().click(); + cy.getActiveMenu().find('.v-list-item:contains("is equal")').click(); + cy.get(".nc-filter-value-select input:text").last().type("India"); + cy.get(".nc-filter-menu-btn") + .click() .then(() => { - cy.get('td:contains(India)').should('exist') - }) - }) + cy.get("td:contains(India)").should("exist"); + }); + }); - it('Delete Filter', () => { + it("Delete Filter", () => { // remove sort and check - cy.get('.nc-filter-menu-btn').click() - cy.get('.nc-filter-item-remove-btn').click() - cy.get('.nc-filter-menu-btn').click() - cy.contains('td:contains(India)').should('not.exist') - }) - }) - }) -} + cy.get(".nc-filter-menu-btn").click(); + cy.get(".nc-filter-item-remove-btn").click(); + cy.get(".nc-filter-menu-btn").click(); + cy.contains("td:contains(India)").should("not.exist"); + }); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -192,4 +221,4 @@ export const genTest = (type, xcdb) => { * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - */ \ No newline at end of file + */ diff --git a/scripts/cypress/integration/common/3b_formula_column.js b/scripts/cypress/integration/common/3b_formula_column.js index 6ba33e4a4d..7a4f146db6 100644 --- a/scripts/cypress/integration/common/3b_formula_column.js +++ b/scripts/cypress/integration/common/3b_formula_column.js @@ -1,190 +1,214 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; - - describe(`${type.toUpperCase()} api - FORMULA`, () => { - - // Run once before test- create project (rest/graphql) - // - before(() => { - // open a table to work on views - // - cy.openTableTab('City', 25); - }) - - 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 < 6; i++) - 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) => { - - // (+) icon at end of column header (to add a new column) - // opens up a pop up window - // - cy.get('.new-column-header').click() - - // Column name - cy.get('.nc-column-name-input input').clear().type(`${columnName}{enter}`) - - // Column data type: to be set to formula in this context - cy.get('.nc-ui-dt-dropdown').click().type('Formula') - cy.getActiveMenu().contains('Formula').click({ force: true }) - - // Configure formula - cy.get('label').contains('Formula').parent().click().type(formula) - - // click on Save - cy.get('.nc-col-create-or-edit-card').contains('Save').click() - - cy.toastWait('Formula column saved successfully') - - // Verify if column exists. - // - cy.get(`th:contains(${columnName})`) - .should('exist'); - } - - // routine to delete column - // - const deleteColumnByName = (columnName) => { - - // verify if column exists before delete - cy.get(`th:contains(${columnName})`) - .should('exist'); - - // delete opiton visible on mouse-over - cy.get(`th:contains(${columnName}) .mdi-menu-down`) - .trigger('mouseover') - .click() - - // delete/ confirm on pop-up - cy.get('.nc-column-delete').click() - cy.getActiveModal().find('button:contains(Confirm)').click() - - // validate if deleted (column shouldnt exist) - cy.get(`th:contains(${columnName})`) - .should('not.exist'); - } - - - // routine to edit column - // - const editColumnByName = (oldName, newName, newFormula) => { - - // 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('label') - .contains('Formula').parent().find('input').clear().type(newFormula) - - cy.get('.nc-col-create-or-edit-card').contains('Save').click() - - cy.toastWait('Formula column updated successfully') - - // validate if deleted (column shouldnt exist) - cy.get(`th:contains(${oldName})`) - .should('not.exist'); - cy.get(`th:contains(${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 = [] - - 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])) - } - - it('Formula: CONCAT, LOWER, UPPER, TRIM', () => { - addFormulaBasedColumn('NC_MATH_0', 'ADD(CityId, CountryId) + AVG(CityId, CountryId) + LEN(City)') - rowValidation('NC_MATH_0', RESULT_MATH_0) - }) - - it('Formula: ADD, AVG, LEN', () => { - editColumnByName('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', () => { - 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', () => { - editColumnByName('NC_MATH_2', 'NC_NOW', `NOW()`) - deleteColumnByName('NC_NOW') - }) - }) -} + if (!isTestSuiteActive(type, xcdb)) return; + + describe(`${type.toUpperCase()} api - FORMULA`, () => { + // Run once before test- create project (rest/graphql) + // + before(() => { + // open a table to work on views + // + cy.openTableTab("City", 25); + }); + + 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 < 6; i++) + 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) => { + // (+) icon at end of column header (to add a new column) + // opens up a pop up window + // + cy.get(".new-column-header").click(); + + // Column name + cy.get(".nc-column-name-input input") + .clear() + .type(`${columnName}{enter}`); + + // Column data type: to be set to formula in this context + cy.get(".nc-ui-dt-dropdown").click().type("Formula"); + cy.getActiveMenu().contains("Formula").click({ force: true }); + + // Configure formula + cy.get("label").contains("Formula").parent().click().type(formula); + + // click on Save + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); + + cy.toastWait("Formula column saved successfully"); + + // Verify if column exists. + // + cy.get(`th:contains(${columnName})`).should("exist"); + }; + + // routine to delete column + // + const deleteColumnByName = (columnName) => { + // verify if column exists before delete + cy.get(`th:contains(${columnName})`).should("exist"); + + // delete opiton visible on mouse-over + cy.get(`th:contains(${columnName}) .mdi-menu-down`) + .trigger("mouseover") + .click(); + + // delete/ confirm on pop-up + cy.get(".nc-column-delete").click(); + cy.getActiveModal().find("button:contains(Confirm)").click(); + + // validate if deleted (column shouldnt exist) + cy.get(`th:contains(${columnName})`).should("not.exist"); + }; + + // routine to edit column + // + const editColumnByName = (oldName, newName, newFormula) => { + // 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("label") + .contains("Formula") + .parent() + .find("input") + .clear() + .type(newFormula); + + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); + + cy.toastWait("Formula column updated successfully"); + + // validate if deleted (column shouldnt exist) + cy.get(`th:contains(${oldName})`).should("not.exist"); + cy.get(`th:contains(${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 = []; + + 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]) + ); + } + + it("Formula: CONCAT, LOWER, UPPER, TRIM", () => { + addFormulaBasedColumn( + "NC_MATH_0", + "ADD(CityId, CountryId) + AVG(CityId, CountryId) + LEN(City)" + ); + rowValidation("NC_MATH_0", RESULT_MATH_0); + }); + + it("Formula: ADD, AVG, LEN", () => { + editColumnByName( + "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", () => { + 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", () => { + editColumnByName("NC_MATH_2", "NC_NOW", `NOW()`); + deleteColumnByName("NC_NOW"); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -208,4 +232,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/3c_lookup_column.js b/scripts/cypress/integration/common/3c_lookup_column.js index 49e00dbda1..7b88529c79 100644 --- a/scripts/cypress/integration/common/3c_lookup_column.js +++ b/scripts/cypress/integration/common/3c_lookup_column.js @@ -1,117 +1,102 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; - - describe(`${type.toUpperCase()} api - LookUp column`, () => { - - // to retrieve few v-input nodes from their label - // - const fetchParentFromLabel = (label) => { - cy.get('label') - .contains(label) - .parents('.v-input') - .click() - } - - // Run once before test- create project (rest/graphql) - // - before(() => { - // open a table to work on views - // - cy.openTableTab('City', 25); - }) - - after(() => { - cy.closeTableTab('City') - }) - - // Routine to create a new look up column - // - const addLookUpColumn = (childTable, childCol) => { - - // (+) icon at end of column header (to add a new column) - // opens up a pop up window - // - cy.get('.new-column-header').click() - - // Redundant to feed column name. as alias is displayed & referred for - cy.get('.nc-column-name-input input').clear().type(childCol) - - // Column data type: to be set to lookup in this context - cy.get('.nc-ui-dt-dropdown').click() - cy.getActiveMenu().contains('Lookup').click() - - // Configure Child table & column names - fetchParentFromLabel('Child Table') - cy.getActiveMenu().contains(childTable).click() + if (!isTestSuiteActive(type, xcdb)) return; + + describe(`${type.toUpperCase()} api - LookUp column`, () => { + // to retrieve few v-input nodes from their label + // + const fetchParentFromLabel = (label) => { + cy.get("label").contains(label).parents(".v-input").click(); + }; + + // Run once before test- create project (rest/graphql) + // + before(() => { + // open a table to work on views + // + cy.openTableTab("City", 25); + }); - fetchParentFromLabel('Child column') - cy.getActiveMenu().contains(childCol).click() + after(() => { + cy.closeTableTab("City"); + }); - // click on Save - cy.get('.nc-col-create-or-edit-card').contains('Save').click() + // Routine to create a new look up column + // + const addLookUpColumn = (childTable, childCol) => { + // (+) icon at end of column header (to add a new column) + // opens up a pop up window + // + cy.get(".new-column-header").click(); - // Verify if column exists. - // - cy.get(`th:contains(${childCol})`) - .should('exist'); - } + // Redundant to feed column name. as alias is displayed & referred for + cy.get(".nc-column-name-input input").clear().type(childCol); - // routine to delete column - // - const deleteColumnByName = (childCol) => { + // Column data type: to be set to lookup in this context + cy.get(".nc-ui-dt-dropdown").click(); + cy.getActiveMenu().contains("Lookup").click(); - // verify if column exists before delete - cy.get(`th:contains(${childCol})`) - .should('exist'); + // Configure Child table & column names + fetchParentFromLabel("Child Table"); + cy.getActiveMenu().contains(childTable).click(); - // delete opiton visible on mouse-over - cy.get(`th:contains(${childCol}) .mdi-menu-down`) - .trigger('mouseover') - .click() + fetchParentFromLabel("Child column"); + cy.getActiveMenu().contains(childCol).click(); - // delete/ confirm on pop-up - cy.get('.nc-column-delete').click() - cy.getActiveModal().find('button:contains(Confirm)').click() + // click on Save + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); - // validate if deleted (column shouldnt exist) - cy.get(`th:contains(${childCol})`) - .should('not.exist'); + // Verify if column exists. + // + cy.get(`th:contains(${childCol})`).should("exist"); + }; - } + // routine to delete column + // + const deleteColumnByName = (childCol) => { + // verify if column exists before delete + cy.get(`th:contains(${childCol})`).should("exist"); - /////////////////////////////////////////////////// - // Test case + // delete opiton visible on mouse-over + cy.get(`th:contains(${childCol}) .mdi-menu-down`) + .trigger("mouseover") + .click(); - it('Add Lookup column (Address, District) & Delete', () => { + // delete/ confirm on pop-up + cy.get(".nc-column-delete").click(); + cy.getActiveModal().find("button:contains(Confirm)").click(); - addLookUpColumn('Address', 'District') + // validate if deleted (column shouldnt exist) + cy.get(`th:contains(${childCol})`).should("not.exist"); + }; - // Verify first entry, will be displayed as alias here 'childColumn (from childTable)' - cy.get(`tbody > :nth-child(1) > [data-col="District"]`) - .contains('Galicia') - .should('exist') + /////////////////////////////////////////////////// + // Test case - deleteColumnByName('District') + it("Add Lookup column (Address, District) & Delete", () => { + addLookUpColumn("Address", "District"); - }) + // Verify first entry, will be displayed as alias here 'childColumn (from childTable)' + cy.get(`tbody > :nth-child(1) > [data-col="District"]`) + .contains("Galicia") + .should("exist"); - it.skip('Add Lookup column (Country, CountryId) & Delete', () => { + deleteColumnByName("District"); + }); - addLookUpColumn('Country', 'CountryId') + 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') + // 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') - }) + deleteColumnByName("CountryId"); }); -} - + }); +}; // genTest('rest', false) // genTest('graphql', false) @@ -137,4 +122,4 @@ export const genTest = (type, xcdb) => { * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - */ \ No newline at end of file + */ diff --git a/scripts/cypress/integration/common/3d_rollup_column.js b/scripts/cypress/integration/common/3d_rollup_column.js index 59c2b74399..e55fc5f968 100644 --- a/scripts/cypress/integration/common/3d_rollup_column.js +++ b/scripts/cypress/integration/common/3d_rollup_column.js @@ -1,154 +1,141 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.toUpperCase()} api - RollUp column`, () => { - // to retrieve few v-input nodes from their label // const fetchParentFromLabel = (label) => { - cy.get('label') - .contains(label) - .parents('.v-input') - .click() - } + cy.get("label").contains(label).parents(".v-input").click(); + }; // Run once before test- create project (rest/graphql) // before(() => { // open a table to work on views // - cy.openTableTab('Country', 25); - }) + cy.openTableTab("Country", 25); + }); after(() => { - cy.closeTableTab('Country'); - }) + cy.closeTableTab("Country"); + }); // Routine to create a new look up column // - const addLookUpColumn = (columnName, childTable, childCol, aggregateFunc) => { - + const addLookUpColumn = ( + columnName, + childTable, + childCol, + aggregateFunc + ) => { // (+) icon at end of column header (to add a new column) // opens up a pop up window // - cy.get('.new-column-header').click() + cy.get(".new-column-header").click(); // Column name - cy.get('.nc-column-name-input input').clear().type(`${columnName}{enter}`) + cy.get(".nc-column-name-input input") + .clear() + .type(`${columnName}{enter}`); // Column data type: to be set to rollup in this context // Type 'Rollup' ensures item outside view is also listed (note, rollup is at bottom of scroll list) - cy.get('.nc-ui-dt-dropdown').click().type('Rollup') - cy.getActiveMenu().contains('Rollup').click({ force: true }) + cy.get(".nc-ui-dt-dropdown").click().type("Rollup"); + cy.getActiveMenu().contains("Rollup").click({ force: true }); // Configure Child table & column names - fetchParentFromLabel('Child Table') - cy.getActiveMenu().contains(childTable).click() + fetchParentFromLabel("Child Table"); + cy.getActiveMenu().contains(childTable).click(); - fetchParentFromLabel('Child column') - cy.getActiveMenu().contains(childCol).click() + fetchParentFromLabel("Child column"); + cy.getActiveMenu().contains(childCol).click(); - fetchParentFromLabel('Aggregate function') - cy.getActiveMenu().contains(aggregateFunc).click() + fetchParentFromLabel("Aggregate function"); + cy.getActiveMenu().contains(aggregateFunc).click(); // click on Save - cy.get('.nc-col-create-or-edit-card').contains('Save').click() + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); - // Verify if column exists. + // Verify if column exists. // - cy.get(`th:contains(${columnName})`) - .should('exist'); - } + cy.get(`th:contains(${columnName})`).should("exist"); + }; // routine to delete column // const deleteColumnByName = (columnName) => { - // verify if column exists before delete - cy.get(`th:contains(${columnName})`) - .should('exist'); + cy.get(`th:contains(${columnName})`).should("exist"); // delete opiton visible on mouse-over cy.get(`th:contains(${columnName}) .mdi-menu-down`) - .trigger('mouseover') - .click() + .trigger("mouseover") + .click(); // delete/ confirm on pop-up - cy.get('.nc-column-delete').click() - cy.getActiveModal().find('button:contains(Confirm)').click() + cy.get(".nc-column-delete").click(); + cy.getActiveModal().find("button:contains(Confirm)").click(); // validate if deleted (column shouldnt exist) - cy.get(`th:contains(${columnName})`) - .should('not.exist'); - } - + cy.get(`th:contains(${columnName})`).should("not.exist"); + }; // routine to edit column // const editColumnByName = (oldName, newName) => { - // verify if column exists before delete - cy.get(`th:contains(${oldName})`) - .should('exist'); + cy.get(`th:contains(${oldName})`).should("exist"); // delete opiton visible on mouse-over cy.get(`th:contains(${oldName}) .mdi-menu-down`) - .trigger('mouseover') - .click() + .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.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') + 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'); - } + cy.get(`th:contains(${oldName})`).should("not.exist"); + cy.get(`th:contains(${newName})`).should("exist"); + }; /////////////////////////////////////////////////// // Test case - it('Add Rollup column (City, CityId, sum) & Delete', () => { - - addLookUpColumn('RollUpCol_2', 'City', 'CityId', 'sum') + it("Add Rollup column (City, CityId, sum) & Delete", () => { + addLookUpColumn("RollUpCol_2", "City", "CityId", "sum"); // 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 // to be fixed // cy.get(`tbody > :nth-child(4) > [data-col="RollUpCol_2"]`) - .contains('427') - .should('exist') - - editColumnByName('RollUpCol_2', 'RollUpCol_New') - deleteColumnByName('RollUpCol_New') - - }) + .contains("427") + .should("exist"); - it.skip('Add Rollup column (City, CountryId, count) & Delete', () => { + editColumnByName("RollUpCol_2", "RollUpCol_New"); + deleteColumnByName("RollUpCol_New"); + }); - addLookUpColumn('RollUpCol_1', 'City', 'CountryId', 'count') + it.skip("Add Rollup column (City, CountryId, count) & Delete", () => { + addLookUpColumn("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') + .contains("2") + .should("exist"); - editColumnByName('RollUpCol_1', 'RollUpCol_New') - deleteColumnByName('RollUpCol_New') - - }) + editColumnByName("RollUpCol_1", "RollUpCol_New"); + deleteColumnByName("RollUpCol_New"); + }); }); -} - +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -172,4 +159,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/4a_table_view_grid_gallery_form.js b/scripts/cypress/integration/common/4a_table_view_grid_gallery_form.js index 4ed9be2549..ec4e9f2091 100644 --- a/scripts/cypress/integration/common/4a_table_view_grid_gallery_form.js +++ b/scripts/cypress/integration/common/4a_table_view_grid_gallery_form.js @@ -1,81 +1,76 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.toUpperCase()} api - Table views: Create/Edit/Delete`, () => { - - const name = 'Test' + Date.now(); + const name = "Test" + Date.now(); // Run once before test- create project (rest/graphql) // before(() => { // open a table to work on views // - cy.openTableTab('Country', 25); - }) + cy.openTableTab("Country", 25); + }); after(() => { - cy.closeTableTab('Country') - }) + 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') + 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('Country1').should('exist') - }) - + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .should("exist"); + }); it(`Edit ${viewType} view name`, () => { - // click on edit-icon (becomes visible on hovering mouse) - cy.get('.nc-view-edit-icon').click({ force: true, timeout: 1000 }) + cy.get(".nc-view-edit-icon").click({ force: true, timeout: 1000 }); // feed new name - cy.get(`.nc-${viewType}-view-item input`).type(`${viewType}View-1{enter}`) - cy.toastWait('View renamed successfully') + cy.get(`.nc-${viewType}-view-item input`).type( + `${viewType}View-1{enter}` + ); + cy.toastWait("View renamed successfully"); // validate - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains(`${viewType}View-1`).should('exist') - }) - + cy.get(`.nc-view-item.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) + 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.toastWait('View deleted successfully') + cy.get(".nc-view-delete-icon").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) - }) - - } + cy.get(".nc-view-item").its("length").should("eq", 1); + }); + }; // below two scenario's will be invoked twice, once for rest & then for graphql - viewTest('grid') - viewTest('gallery') - viewTest('form') - - }) -} - + viewTest("grid"); + viewTest("gallery"); + viewTest("form"); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -99,4 +94,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/4b_table_view_share.js b/scripts/cypress/integration/common/4b_table_view_share.js index 49ade215f7..a5fb76d01d 100644 --- a/scripts/cypress/integration/common/4b_table_view_share.js +++ b/scripts/cypress/integration/common/4b_table_view_share.js @@ -1,99 +1,99 @@ -import { mainPage } from "../../support/page_objects/mainPage" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { mainPage } from "../../support/page_objects/mainPage"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; -let storedURL = '' -let linkText = '' +let storedURL = ""; +let linkText = ""; const generateLinkWithPwd = () => { - - cy.get('.v-navigation-drawer__content > .container') - .find('.v-list > .v-list-item') - .contains('Share View') - .click() - - // enable checkbox & feed pwd, save - cy.getActiveModal().find('[role="switch"][type="checkbox"]').click( {force: true} ) - cy.getActiveModal().find('input[type="password"]').type('1') - cy.getActiveModal().find('button:contains("Save password")').click() - - cy.toastWait('Successfully updated') - - // copy link text, visit URL - cy.getActiveModal().find('.share-link-box') - .then(($obj) => { - - linkText = $obj.text().trim() - cy.log(linkText) - }) -} + cy.get(".v-navigation-drawer__content > .container") + .find(".v-list > .v-list-item") + .contains("Share View") + .click(); + + // enable checkbox & feed pwd, save + cy.getActiveModal() + .find('[role="switch"][type="checkbox"]') + .click({ force: true }); + cy.getActiveModal().find('input[type="password"]').type("1"); + cy.getActiveModal().find('button:contains("Save password")').click(); + + cy.toastWait("Successfully updated"); + + // copy link text, visit URL + cy.getActiveModal() + .find(".share-link-box") + .then(($obj) => { + linkText = $obj.text().trim(); + cy.log(linkText); + }); +}; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; - - describe(`${type.toUpperCase()} api - Shared VIEWs (GRID)`, () => { - - // Run once before test- create project (rest/graphql) - // - before(() => { - cy.openTableTab('City', 25) - - // store base URL- to re-visit and delete form view later - cy.url().then((url) => { - storedURL = url - }) - - generateLinkWithPwd() - }) - - beforeEach(() => { - cy.restoreLocalStorage(); - }) - - afterEach(() => { - cy.saveLocalStorage(); - }) - - it('Share view with incorrect password', () => { - cy.visit(linkText, { - baseUrl: null - }) - - cy.getActiveModal().should('exist') - - // feed password - cy.getActiveModal().find('input[type="password"]').type('a') - cy.getActiveModal().find('button:contains("Unlock")').click() - - // if pwd is incorrect, active modal requesting to feed in password again will persist - cy.get('body').find('.v-dialog.v-dialog--active').should('exist') - }) - - // fallover test- use previously opened view & continue verification instead of opening again - it('Share view with correct password', () => { - // cy.visit(linkText, { - // baseUrl: null - // }) - - // 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.get('body').find('.v-dialog.v-dialog--active').should('not.exist') - }) - - it('Delete view', () => { - cy.visit(storedURL, { - baseUrl: null - }) - mainPage.deleteCreatedViews() - }) - - after(() => { - cy.closeTableTab('City') - }) - }) -} + if (!isTestSuiteActive(type, xcdb)) return; + + describe(`${type.toUpperCase()} api - Shared VIEWs (GRID)`, () => { + // Run once before test- create project (rest/graphql) + // + before(() => { + cy.openTableTab("City", 25); + + // store base URL- to re-visit and delete form view later + cy.url().then((url) => { + storedURL = url; + }); + + generateLinkWithPwd(); + }); + + beforeEach(() => { + cy.restoreLocalStorage(); + }); + + afterEach(() => { + cy.saveLocalStorage(); + }); + + it("Share view with incorrect password", () => { + cy.visit(linkText, { + baseUrl: null, + }); + + cy.getActiveModal().should("exist"); + + // feed password + cy.getActiveModal().find('input[type="password"]').type("a"); + cy.getActiveModal().find('button:contains("Unlock")').click(); + + // if pwd is incorrect, active modal requesting to feed in password again will persist + cy.get("body").find(".v-dialog.v-dialog--active").should("exist"); + }); + + // fallover test- use previously opened view & continue verification instead of opening again + it("Share view with correct password", () => { + // cy.visit(linkText, { + // baseUrl: null + // }) + + // 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.get("body").find(".v-dialog.v-dialog--active").should("not.exist"); + }); + + it("Delete view", () => { + cy.visit(storedURL, { + baseUrl: null, + }); + mainPage.deleteCreatedViews(); + }); + + after(() => { + cy.closeTableTab("City"); + }); + }); +}; // genTest('rest', false) // genTest('graphql', false) @@ -119,4 +119,4 @@ export const genTest = (type, xcdb) => { * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - */ \ No newline at end of file + */ diff --git a/scripts/cypress/integration/common/4c_form_view_detailed.js b/scripts/cypress/integration/common/4c_form_view_detailed.js index 78c098b566..1451099f7a 100644 --- a/scripts/cypress/integration/common/4c_form_view_detailed.js +++ b/scripts/cypress/integration/common/4c_form_view_detailed.js @@ -1,333 +1,438 @@ -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" -import { mainPage } from "../../support/page_objects/mainPage" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; +import { mainPage } from "../../support/page_objects/mainPage"; -let formViewURL +let formViewURL; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.toUpperCase()} api - FORM view`, () => { - - const name = 'Test' + Date.now(); + const name = "Test" + Date.now(); // Run once before test- create project (rest/graphql) // before(() => { - // open a table to work on views - // - cy.openTableTab('Country', 25); - }) + // open a table to work on views + // + cy.openTableTab("Country", 25); + }); beforeEach(() => { - cy.restoreLocalStorage(); - }) + cy.restoreLocalStorage(); + }); afterEach(() => { - cy.saveLocalStorage(); - }) + cy.saveLocalStorage(); + }); after(() => { - cy.closeTableTab('Country') - }) + 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 'Country1' - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').should('exist') - }) - - it(`Validate ${viewType} view: Drag & drop for re-order items`, () => { - // default order: Country, LastUpdate, Country => City - cy.get('.nc-field-wrapper').eq(0).contains('Country').should('exist') - cy.get('.nc-field-wrapper').eq(1).contains('LastUpdate').should('exist') - - // move Country field down (drag, drop) - cy.get('#data-table-form-Country').drag('#data-table-form-LastUpdate') - - // Verify if order is: LastUpdate, Country, Country => City - cy.get('.nc-field-wrapper').eq(0).contains('LastUpdate').should('exist') - cy.get('.nc-field-wrapper').eq(1).contains('Country').should('exist') - }) - - 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 - cy.get('.col-md-4').find('.pointer.item').should('not.exist') - cy.get('.nc-field-wrapper').eq(0).contains('LastUpdate').should('exist') - - // drag 'LastUpdate' & drop into menu bar drag-drop box - cy.get('#data-table-form-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 - cy.get('.nc-field-wrapper').eq(0).contains('Country').should('exist') - cy.get('.col-md-4').find('.pointer.item').its('length').should('eq', 1) - }) - - it(`Validate ${viewType} view: Inverted order field member addition from menu`, () => { - cy.get('.col-md-4').find('.pointer.caption').contains('remove all').click() - - // click fields in inverted order: LastUpdate, Country => City - cy.get('.col-md-4').find('.pointer.item').eq(1).click() - cy.get('.col-md-4').find('.pointer.item').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 - cy.get('.nc-field-wrapper').eq(0).contains('Country').should('exist') - cy.get('.nc-field-wrapper').eq(1).contains('Country => City').should('exist') - cy.get('.nc-field-wrapper').eq(2).contains('LastUpdate').should('exist') - }) - - 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"]').type('A B C D') - cy.get('.nc-form').find('[placeholder="Add form description"]').type('Some description about form comes here') - - // validate new contents - cy.get('.nc-form').find('[placeholder="Form Title"]').contains('A B C D').should('exist') - cy.get('.nc-form').find('[placeholder="Add form description"]').contains('Some description about form comes here').should('exist') - }) - - it(`Validate ${viewType}: Add all, Remove all validation`, () => { - // .col-md-4 : left hand menu - // .nc-form : form view (right hand side) - - // ensure buttons exist on left hand menu - cy.get('.col-md-4').find('.pointer.caption').contains('add all').should('not.exist') - cy.get('.col-md-4').find('.pointer.caption').contains('remove all').should('exist') - - // click: remove-all - cy.get('.col-md-4').find('.pointer.caption').contains('remove all').click() - // form should not contain any "field remove icons" -- except for mandatory field (Country) - cy.get('.nc-form').find('.nc-field-remove-icon').its('length').should('eq', 1) - // menu bar should contain 3 .pointer.item (LastUpdate, County->City) - cy.get('.col-md-4').find('.pointer.item').its('length').should('eq', 2) - - // click: add all - // cy.get('.col-md-4').find('.pointer.caption').contains('remove all').should('not.exist') - cy.get('.col-md-4').find('.pointer.caption').contains('add all').click() - cy.get('.col-md-4').find('.pointer.caption').contains('remove all').should('exist') - // form should contain "field remove icons" - cy.get('.nc-form').find('.nc-field-remove-icon').should('exist') - // Fix me: a dummy remove icon is left over on screen - cy.get('.nc-form').find('.nc-field-remove-icon').its('length').should('eq', 3) - // menu bar should not contain .pointer.item (column name/ field name add options) - cy.get('.col-md-4').find('.pointer.item').should('not.exist') - }) - - it(`Validate ${viewType}: Submit default, empty show this message textbox`, () => { - // fill up mandatory fields - cy.get('#data-table-form-Country').type('_abc') - cy.get('#data-table-form-LastUpdate').click() - cy.getActiveModal().find('button').contains('19').click() - cy.getActiveModal().find('button').contains('OK').click() - - // default message, no update - - // submit button & validate - cy.get('.nc-form').find('button').contains('Submit').click() - cy.toastWait('Saved successfully') - cy.get('.v-alert').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('Country').click() - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() - - // fill up mandatory fields - cy.get('#data-table-form-Country').type('_abc') - cy.get('#data-table-form-LastUpdate').click() - cy.getActiveModal().find('button').contains('19').click() - cy.getActiveModal().find('button').contains('OK').click() - - // add message - cy.get('.nc-form > .mx-auto').find('textarea').type('Congratulations!') - - // submit button & validate - cy.get('.nc-form').find('button').contains('Submit').click() - cy.toastWait('Congratulations') - cy.get('.v-alert').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('Country').click() - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() - - // fill up mandatory fields - cy.get('#data-table-form-Country').type('_abc') - cy.get('#data-table-form-LastUpdate').click() - cy.getActiveModal().find('button').contains('19').click() - cy.getActiveModal().find('button').contains('OK').click() - - // enable "Submit another form" check box - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(0).click() - - // submit button & validate - cy.get('.nc-form').find('button').contains('Submit').click() - cy.toastWait('Congratulations') - cy.get('.v-alert').contains('Congratulations').should('exist') - cy.get('button').contains('Submit Another Form').should('exist') - - cy.get('button').contains('Submit Another Form').click() - cy.get('.nc-form').should('exist') - // New form appeared? Header & description should exist - cy.get('.nc-form').find('[placeholder="Form Title"]').contains('A B C D').should('exist') - cy.get('.nc-form').find('[placeholder="Add form description"]').contains('Some description about form comes here').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 "blank form after 5 seconds"`, () => { - // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() - // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() - - cy.get('#data-table-form-Country').type('_abc') - cy.get('#data-table-form-LastUpdate').click() - cy.getActiveModal().find('button').contains('19').click() - cy.getActiveModal().find('button').contains('OK').click() - - // enable "New form after 5 seconds" button - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(0).click( {force: true} ) - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(1).click() - - // submit button & validate - cy.get('.nc-form').find('button').contains('Submit').click() - cy.toastWait('Congratulations') - cy.get('.v-alert').contains('Congratulations').should('exist').then(() => { - // wait for 5 seconds - cy.get('.nc-form').should('exist') - - // validate if form has appeared again - cy.get('.nc-form').find('[placeholder="Form Title"]').contains('A B C D').should('exist') - cy.get('.nc-form').find('[placeholder="Add form description"]').contains('Some description about form comes here').should('exist') - }) - - // 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('Country1').click() - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(2).click({ force: true }) - // 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 - mainPage.navigationDraw(mainPage.APPSTORE).click() - mainPage.configureSMTP('admin@ex.com', 'smtp.ex.com', '8080', 'TLS') - - // open form view & enable "email me" option - cy.openTableTab('Country', 25); - - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(2).click({ force: true }) - // validate if toaster pops up informing installation of email notification - // cy.get('.toasted:visible', { timout: 6000 }) - // .contains('Successfully installed and email notification will use SMTP configuration') - // .should('exist') - // reset SMPT config's - mainPage.navigationDraw(mainPage.APPSTORE).click() - mainPage.resetSMTP() - cy.openTableTab('Country', 25); - }) - - it(`Validate ${viewType}: Add/ remove field verification"`, () => { - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() - - cy.get('#data-table-form-LastUpdate').should('exist') - // remove "LastUpdate field" - cy.get('.nc-form').find('.nc-field-remove-icon').eq(1).click() - cy.get('#data-table-form-lastUpdate').should('not.exist') - cy.get('.col-md-4').find('.pointer.item').contains('LastUpdate').should('exist') - - // add it back - cy.get('.col-md-4').find('.pointer.item').contains('LastUpdate').click() - cy.get('#data-table-form-LastUpdate').should('exist') - }) - - it(`Validate ${viewType}: URL verification`, () => { - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() - // verify URL & copy it for subsequent test - cy.url().should('contain', `&view=Country1`) - cy.url().then((url) => { - cy.log(url) - formViewURL = url - }) - }) - - it(`Validate ${viewType}: URL validation after re-access`, () => { - // visit URL - cy.log(formViewURL) - cy.visit(formViewURL, { - baseUrl: null - }) - - // New form appeared? Header & description should exist - cy.get('.nc-form', { timeout: 10000 }) - .find('[placeholder="Form Title"]') - .contains('A B C D') - .should('exist') - cy.get('.nc-form', { timeout: 10000 }) - .find('[placeholder="Add form description"]') - .contains('Some description about form comes here') - .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.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) - mainPage.getRow(10).find('.mdi-checkbox-blank-outline').click({ force: true }) - mainPage.getRow(11).find('.mdi-checkbox-blank-outline').click({ force: true }) - mainPage.getRow(12).find('.mdi-checkbox-blank-outline').click({ force: true }) - mainPage.getRow(13).find('.mdi-checkbox-blank-outline').click({ force: true }) - - mainPage.getCell("Country", 10).rightclick() - cy.getActiveMenu().contains('Delete Selected Row').click() - // cy.toastWait('Deleted selected rows successfully') - }) - } + 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 'Country1' + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .should("exist"); + }); + + it(`Validate ${viewType} view: Drag & drop for re-order items`, () => { + // default order: Country, LastUpdate, Country => City + cy.get(".nc-field-wrapper").eq(0).contains("Country").should("exist"); + cy.get(".nc-field-wrapper") + .eq(1) + .contains("LastUpdate") + .should("exist"); + + // move Country field down (drag, drop) + cy.get("#data-table-form-Country").drag("#data-table-form-LastUpdate"); + + // Verify if order is: LastUpdate, Country, Country => City + cy.get(".nc-field-wrapper") + .eq(0) + .contains("LastUpdate") + .should("exist"); + cy.get(".nc-field-wrapper").eq(1).contains("Country").should("exist"); + }); + + 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 + cy.get(".col-md-4").find(".pointer.item").should("not.exist"); + cy.get(".nc-field-wrapper") + .eq(0) + .contains("LastUpdate") + .should("exist"); + + // drag 'LastUpdate' & drop into menu bar drag-drop box + cy.get("#data-table-form-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 + cy.get(".nc-field-wrapper").eq(0).contains("Country").should("exist"); + cy.get(".col-md-4").find(".pointer.item").its("length").should("eq", 1); + }); + + it(`Validate ${viewType} view: Inverted order field member addition from menu`, () => { + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("remove all") + .click(); + + // click fields in inverted order: LastUpdate, Country => City + cy.get(".col-md-4").find(".pointer.item").eq(1).click(); + cy.get(".col-md-4").find(".pointer.item").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 + cy.get(".nc-field-wrapper").eq(0).contains("Country").should("exist"); + cy.get(".nc-field-wrapper") + .eq(1) + .contains("Country => City") + .should("exist"); + cy.get(".nc-field-wrapper") + .eq(2) + .contains("LastUpdate") + .should("exist"); + }); + + 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"]').type("A B C D"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .type("Some description about form comes here"); + + // validate new contents + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .should("exist"); + }); + + it(`Validate ${viewType}: Add all, Remove all validation`, () => { + // .col-md-4 : left hand menu + // .nc-form : form view (right hand side) + + // ensure buttons exist on left hand menu + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("add all") + .should("not.exist"); + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("remove all") + .should("exist"); + + // click: remove-all + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("remove all") + .click(); + // form should not contain any "field remove icons" -- except for mandatory field (Country) + cy.get(".nc-form") + .find(".nc-field-remove-icon") + .its("length") + .should("eq", 1); + // menu bar should contain 3 .pointer.item (LastUpdate, County->City) + cy.get(".col-md-4").find(".pointer.item").its("length").should("eq", 2); + + // click: add all + // cy.get('.col-md-4').find('.pointer.caption').contains('remove all').should('not.exist') + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("add all") + .click(); + cy.get(".col-md-4") + .find(".pointer.caption") + .contains("remove all") + .should("exist"); + // form should contain "field remove icons" + cy.get(".nc-form").find(".nc-field-remove-icon").should("exist"); + // Fix me: a dummy remove icon is left over on screen + cy.get(".nc-form") + .find(".nc-field-remove-icon") + .its("length") + .should("eq", 3); + // menu bar should not contain .pointer.item (column name/ field name add options) + cy.get(".col-md-4").find(".pointer.item").should("not.exist"); + }); + + it(`Validate ${viewType}: Submit default, empty show this message textbox`, () => { + // fill up mandatory fields + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // default message, no update + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Saved successfully"); + cy.get(".v-alert") + .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('Country').click() + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + + // fill up mandatory fields + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // add message + cy.get(".nc-form > .mx-auto").find("textarea").type("Congratulations!"); + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Congratulations"); + cy.get(".v-alert").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('Country').click() + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + + // fill up mandatory fields + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // enable "Submit another form" check box + cy.get(".nc-form > .mx-auto").find('[type="checkbox"]').eq(0).click(); + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Congratulations"); + cy.get(".v-alert").contains("Congratulations").should("exist"); + cy.get("button").contains("Submit Another Form").should("exist"); + + cy.get("button").contains("Submit Another Form").click(); + cy.get(".nc-form").should("exist"); + // New form appeared? Header & description should exist + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .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 "blank form after 5 seconds"`, () => { + // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country').click() + // cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('Country1').click() + + cy.get("#data-table-form-Country").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + + // enable "New form after 5 seconds" button + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(0) + .click({ force: true }); + cy.get(".nc-form > .mx-auto").find('[type="checkbox"]').eq(1).click(); + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Congratulations"); + cy.get(".v-alert") + .contains("Congratulations") + .should("exist") + .then(() => { + // wait for 5 seconds + cy.get(".nc-form").should("exist"); + + // validate if form has appeared again + cy.get(".nc-form") + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form") + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .should("exist"); + }); + + // 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("Country1") + .click(); + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(2) + .click({ force: true }); + // 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 + mainPage.navigationDraw(mainPage.APPSTORE).click(); + mainPage.configureSMTP("admin@ex.com", "smtp.ex.com", "8080", "TLS"); + + // open form view & enable "email me" option + cy.openTableTab("Country", 25); + + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(2) + .click({ force: true }); + // validate if toaster pops up informing installation of email notification + // cy.get('.toasted:visible', { timout: 6000 }) + // .contains('Successfully installed and email notification will use SMTP configuration') + // .should('exist') + // reset SMPT config's + mainPage.navigationDraw(mainPage.APPSTORE).click(); + mainPage.resetSMTP(); + cy.openTableTab("Country", 25); + }); + + it(`Validate ${viewType}: Add/ remove field verification"`, () => { + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + + cy.get("#data-table-form-LastUpdate").should("exist"); + // remove "LastUpdate field" + cy.get(".nc-form").find(".nc-field-remove-icon").eq(1).click(); + cy.get("#data-table-form-lastUpdate").should("not.exist"); + cy.get(".col-md-4") + .find(".pointer.item") + .contains("LastUpdate") + .should("exist"); + + // add it back + cy.get(".col-md-4") + .find(".pointer.item") + .contains("LastUpdate") + .click(); + cy.get("#data-table-form-LastUpdate").should("exist"); + }); + + it(`Validate ${viewType}: URL verification`, () => { + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("Country1") + .click(); + // verify URL & copy it for subsequent test + cy.url().should("contain", `&view=Country1`); + cy.url().then((url) => { + cy.log(url); + formViewURL = url; + }); + }); + + it(`Validate ${viewType}: URL validation after re-access`, () => { + // visit URL + cy.log(formViewURL); + cy.visit(formViewURL, { + baseUrl: null, + }); + + // New form appeared? Header & description should exist + cy.get(".nc-form", { timeout: 10000 }) + .find('[placeholder="Form Title"]') + .contains("A B C D") + .should("exist"); + cy.get(".nc-form", { timeout: 10000 }) + .find('[placeholder="Add form description"]') + .contains("Some description about form comes here") + .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.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); + mainPage + .getRow(10) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + mainPage + .getRow(11) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + mainPage + .getRow(12) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + mainPage + .getRow(13) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + + mainPage.getCell("Country", 10).rightclick(); + cy.getActiveMenu().contains("Delete Selected Row").click(); + // cy.toastWait('Deleted selected rows successfully') + }); + }; // below scenario's will be invoked twice, once for rest & then for graphql - viewTest('form') - - }) -} - + viewTest("form"); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -351,4 +456,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/4d_table_view_grid_locked.js b/scripts/cypress/integration/common/4d_table_view_grid_locked.js index 6f7b642f3b..1710177de7 100644 --- a/scripts/cypress/integration/common/4d_table_view_grid_locked.js +++ b/scripts/cypress/integration/common/4d_table_view_grid_locked.js @@ -1,71 +1,93 @@ - -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" -import { mainPage } from "../../support/page_objects/mainPage" +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; +import { mainPage } from "../../support/page_objects/mainPage"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; - describe(`${type.toUpperCase()} api - Lock view`, () => { - // Run once before test- create project (rest/graphql) - // - before(() => { - // open a table to work on views - // - cy.openTableTab('Country', 25); - }) + describe(`${type.toUpperCase()} api - Lock view`, () => { + // Run once before test- create project (rest/graphql) + // + before(() => { + // open a table to work on views + // + cy.openTableTab("Country", 25); + }); - after(() => { - cy.closeTableTab('Country') - }) + after(() => { + cy.closeTableTab("Country"); + }); - const lockViewTest = (enabled) => { - it(`Grid: lock view set to ${enabled}: validation`, () => { - let vString = enabled ? 'not.' : '' - let menuOption = enabled ? 1 : 0 - - // on menu, collaboration view appears first (at index 0) - // followed by Locked view (at index 1) - cy.get('.xc-toolbar').find('.nc-view-lock-menu:enabled').click() - cy.getActiveMenu().find('[role="menuitem"]').eq(menuOption).click() + const lockViewTest = (enabled) => { + it(`Grid: lock view set to ${enabled}: validation`, () => { + let vString = enabled ? "not." : ""; + let menuOption = enabled ? 1 : 0; - // expected toolbar for Lock view: Only lock-view menu, reload, toggle-nav-drawer to be enabled - // - cy.get('.xc-toolbar').find('.nc-view-lock-menu:enabled') .should('exist') - cy.get('.xc-toolbar').find('.nc-table-reload-btn:enabled') .should('exist') - cy.get('.xc-toolbar').find('.nc-add-new-row-btn:enabled') .should(`${vString}exist`) - // cy.get('.xc-toolbar').find('.nc-save-new-row-btn:disabled') .should('exist') - cy.get('.xc-toolbar').find('.nc-fields-menu-btn:enabled') .should(`${vString}exist`) - cy.get('.xc-toolbar').find('.nc-sort-menu-btn:enabled') .should(`${vString}exist`) - cy.get('.xc-toolbar').find('.nc-filter-menu-btn:enabled') .should(`${vString}exist`) - cy.get('.xc-toolbar').find('.nc-table-delete-btn:enabled') .should(`${vString}exist`) - cy.get('.xc-toolbar').find('.nc-toggle-nav-drawer:enabled') .should('exist') - - // dblClick on a cell & see if we can edit - mainPage.getCell('Country', 1).dblclick() - mainPage.getCell('Country', 1).find('input').should(`${vString}exist`) + // on menu, collaboration view appears first (at index 0) + // followed by Locked view (at index 1) + cy.get(".xc-toolbar").find(".nc-view-lock-menu:enabled").click(); + cy.getActiveMenu().find('[role="menuitem"]').eq(menuOption).click(); - // check if expand row option is available? - cy.get('td').find('.nc-row-expand-icon').should(`${vString}exist`) - // alt validation: mainPage.getRow(1).find('.nc-row-expand-icon').should(`${vString}exist`) + // expected toolbar for Lock view: Only lock-view menu, reload, toggle-nav-drawer to be enabled + // + cy.get(".xc-toolbar") + .find(".nc-view-lock-menu:enabled") + .should("exist"); + cy.get(".xc-toolbar") + .find(".nc-table-reload-btn:enabled") + .should("exist"); + cy.get(".xc-toolbar") + .find(".nc-add-new-row-btn:enabled") + .should(`${vString}exist`); + // cy.get('.xc-toolbar').find('.nc-save-new-row-btn:disabled') .should('exist') + cy.get(".xc-toolbar") + .find(".nc-fields-menu-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-sort-menu-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-filter-menu-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-table-delete-btn:enabled") + .should(`${vString}exist`); + cy.get(".xc-toolbar") + .find(".nc-toggle-nav-drawer:enabled") + .should("exist"); - // check if add/ expand options available for 'has many' column type - mainPage.getCell('Country => City', 1).click().find('button.mdi-plus').should(`${vString}exist`) - mainPage.getCell('Country => City', 1).click().find('button.mdi-arrow-expand').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`); - // update row option (right click) - should not be available for Lock view - mainPage.getCell('Country => City', 1).rightclick() - cy.get('.menuable__content__active').should(`${vString}be.visible`) - }) - } + // check if expand row option is available? + cy.get("td").find(".nc-row-expand-icon").should(`${vString}exist`); + // alt validation: mainPage.getRow(1).find('.nc-row-expand-icon').should(`${vString}exist`) - // Locked view - lockViewTest(true) + // check if add/ expand options available for 'has many' column type + mainPage + .getCell("Country => City", 1) + .click() + .find("button.mdi-plus") + .should(`${vString}exist`); + mainPage + .getCell("Country => City", 1) + .click() + .find("button.mdi-arrow-expand") + .should(`${vString}exist`); - // collaboration view - lockViewTest(false) - }) -} + // update row option (right click) - should not be available for Lock view + mainPage.getCell("Country => City", 1).rightclick(); + cy.get(".menuable__content__active").should(`${vString}be.visible`); + }); + }; + // Locked view + lockViewTest(true); + + // collaboration view + lockViewTest(false); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -89,4 +111,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/4e_form_view_share.js b/scripts/cypress/integration/common/4e_form_view_share.js index 0fe2238d0e..399a9fadbb 100644 --- a/scripts/cypress/integration/common/4e_form_view_share.js +++ b/scripts/cypress/integration/common/4e_form_view_share.js @@ -1,176 +1,196 @@ +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; +import { mainPage } from "../../support/page_objects/mainPage"; -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" -import { mainPage } from "../../support/page_objects/mainPage" - -let storedURL = '' +let storedURL = ""; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; - - describe(`${type.toUpperCase()} api - FORM view (Share)`, () => { - - const name = 'Test' + Date.now(); - - // Run once before test- create project (rest/graphql) - // - before(() => { - // open a table to work on views - // - cy.openTableTab('City', 25) - }) - - beforeEach(() => { - cy.restoreLocalStorage(); - }) - - afterEach(() => { - cy.saveLocalStorage(); - }) - - after(() => { - cy.closeTableTab('City') - }) - - - // 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') - - // Prepare form - // add header, description - // add post submission message - // swap position for City, LastUpdate fields - // remove City=>Address field - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(1).click() - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(1).should('be.checked') - - cy.get('.nc-form').find('[placeholder="Form Title"]').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 > .mx-auto').find('textarea').type('Congratulations!') - - cy.get('#data-table-form-City').drag('#data-table-form-LastUpdate') - cy.get('[title="City => Address"]').drag('.nc-drag-n-drop-to-hide') - - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(1).should('be.checked') - - // store base URL- to re-visit and delete form view later - cy.url().then((url) => { - storedURL = url - }) - }) - - it(`Share form view`, () => { - cy.get('.nc-form > .mx-auto').find('[type="checkbox"]').eq(1).should('be.checked') - cy.get(`.nc-view-item.nc-${viewType}-view-item`).contains('City1').click() - cy.get('.v-navigation-drawer__content > .container') - .find('.v-list > .v-list-item') - .contains('Share View') - .click() - - // copy link text, visit URL - cy.getActiveModal().find('.share-link-box') - .contains('/nc/form/', {timeout: 10000}) - .then(($obj) => { - - let linkText = $obj.text().trim() - cy.log(linkText) - cy.visit(linkText, { - baseUrl: null - }) - - // wait for share view page to load! - cy.get('.nc-form').should('exist') - - // New form appeared? Header & description should exist - cy.get('.nc-form', { timeout: 10000 }) - .find('h2') - .contains('A B C D') - .should('exist') - cy.get('.nc-form', { timeout: 10000 }) - .find('.body-1') - .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 <= City"]').should('exist') - cy.get('[title="City => Address"]').should('not.exist') - - // order of LastUpdate & City field is retained - cy.get('.nc-field-wrapper').eq(0).contains('LastUpdate').should('exist') - cy.get('.nc-field-wrapper').eq(1).contains('City').should('exist') - - // submit form, to read message - cy.get('#data-table-form-City').type('_abc') - cy.get('#data-table-form-LastUpdate').click() - cy.getActiveModal().find('button').contains('19').click() - cy.getActiveModal().find('button').contains('OK').click() - cy.get('button').contains("Link to 'Country'").click() - cy.getActiveModal().find('.child-card').contains('Afghanistan').click() - - // submit button & validate - cy.get('.nc-form').find('button').contains('Submit').click() - cy.toastWait('Congratulations') - cy.get('.v-alert').contains('Congratulations').should('exist').then(() => { - cy.get('.nc-form').should('exist') - - // validate if form has appeared again - cy.get('.nc-form', { timeout: 10000 }) - .find('h2') - .contains('A B C D') - .should('exist') - cy.get('.nc-form', { timeout: 10000 }) - .find('.body-1') - .contains('Some description about form comes here') - .should('exist') - }) - }) - }) - - it(`Delete ${viewType} view`, () => { - // go back to base page - cy.visit(storedURL, { - baseUrl: null - }) - - // 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.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() - cy.get('.nc-grid-row').should('have.length', 1) - mainPage.getRow(1).find('.mdi-checkbox-blank-outline').click({ force: true }) - - mainPage.getCell("City", 1).rightclick() - cy.getActiveMenu().contains('Delete Selected Row').click() - // cy.toastWait('Deleted selected rows successfully') - }) - } - - // below scenario's will be invoked twice, once for rest & then for graphql - viewTest('form') - }) -} - + if (!isTestSuiteActive(type, xcdb)) return; + + describe(`${type.toUpperCase()} api - FORM view (Share)`, () => { + const name = "Test" + Date.now(); + + // Run once before test- create project (rest/graphql) + // + before(() => { + // open a table to work on views + // + cy.openTableTab("City", 25); + }); + + beforeEach(() => { + cy.restoreLocalStorage(); + }); + + afterEach(() => { + cy.saveLocalStorage(); + }); + + after(() => { + cy.closeTableTab("City"); + }); + + // 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"); + + // Prepare form + // add header, description + // add post submission message + // swap position for City, LastUpdate fields + // remove City=>Address field + cy.get(".nc-form > .mx-auto").find('[type="checkbox"]').eq(1).click(); + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(1) + .should("be.checked"); + + cy.get(".nc-form").find('[placeholder="Form Title"]').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 > .mx-auto").find("textarea").type("Congratulations!"); + + cy.get("#data-table-form-City").drag("#data-table-form-LastUpdate"); + cy.get('[title="City => Address"]').drag(".nc-drag-n-drop-to-hide"); + + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(1) + .should("be.checked"); + + // store base URL- to re-visit and delete form view later + cy.url().then((url) => { + storedURL = url; + }); + }); + + it(`Share form view`, () => { + cy.get(".nc-form > .mx-auto") + .find('[type="checkbox"]') + .eq(1) + .should("be.checked"); + cy.get(`.nc-view-item.nc-${viewType}-view-item`) + .contains("City1") + .click(); + cy.get(".v-navigation-drawer__content > .container") + .find(".v-list > .v-list-item") + .contains("Share View") + .click(); + + // copy link text, visit URL + cy.getActiveModal() + .find(".share-link-box") + .contains("/nc/form/", { timeout: 10000 }) + .then(($obj) => { + let linkText = $obj.text().trim(); + cy.log(linkText); + cy.visit(linkText, { + baseUrl: null, + }); + + // wait for share view page to load! + cy.get(".nc-form").should("exist"); + + // New form appeared? Header & description should exist + cy.get(".nc-form", { timeout: 10000 }) + .find("h2") + .contains("A B C D") + .should("exist"); + cy.get(".nc-form", { timeout: 10000 }) + .find(".body-1") + .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 <= City"]').should("exist"); + cy.get('[title="City => Address"]').should("not.exist"); + + // order of LastUpdate & City field is retained + cy.get(".nc-field-wrapper") + .eq(0) + .contains("LastUpdate") + .should("exist"); + cy.get(".nc-field-wrapper").eq(1).contains("City").should("exist"); + + // submit form, to read message + cy.get("#data-table-form-City").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); + cy.get("button").contains("Link to 'Country'").click(); + cy.getActiveModal() + .find(".child-card") + .contains("Afghanistan") + .click(); + + // submit button & validate + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Congratulations"); + cy.get(".v-alert") + .contains("Congratulations") + .should("exist") + .then(() => { + cy.get(".nc-form").should("exist"); + + // validate if form has appeared again + cy.get(".nc-form", { timeout: 10000 }) + .find("h2") + .contains("A B C D") + .should("exist"); + cy.get(".nc-form", { timeout: 10000 }) + .find(".body-1") + .contains("Some description about form comes here") + .should("exist"); + }); + }); + }); + + it(`Delete ${viewType} view`, () => { + // go back to base page + cy.visit(storedURL, { + baseUrl: null, + }); + + // 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.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(); + cy.get(".nc-grid-row").should("have.length", 1); + mainPage + .getRow(1) + .find(".mdi-checkbox-blank-outline") + .click({ force: true }); + + mainPage.getCell("City", 1).rightclick(); + cy.getActiveMenu().contains("Delete Selected Row").click(); + // cy.toastWait('Deleted selected rows successfully') + }); + }; + + // below scenario's will be invoked twice, once for rest & then for graphql + viewTest("form"); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -194,4 +214,3 @@ export const genTest = (type, xcdb) => { * along with this program. If not, see . * */ - diff --git a/scripts/cypress/integration/common/4f_grid_view_share.js b/scripts/cypress/integration/common/4f_grid_view_share.js index b9dc5401e8..bf93fc7393 100644 --- a/scripts/cypress/integration/common/4f_grid_view_share.js +++ b/scripts/cypress/integration/common/4f_grid_view_share.js @@ -1,8 +1,7 @@ +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; +import { mainPage } from "../../support/page_objects/mainPage"; -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" -import { mainPage } from "../../support/page_objects/mainPage" - -let storedURL = '' +let storedURL = ""; // 0: all enabled // 1: field hide @@ -10,348 +9,418 @@ let storedURL = '' // 3: field filter // 4: default (address table): for view operation validation // 5: default (country table): for update row/column validation -let viewURL = {} +let viewURL = {}; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) 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() - - // 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(`${type.toUpperCase()} api - GRID view (Share)`, () => { - // Run once before test- create project (rest/graphql) - // - before(() => { - // 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('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`, () => { - // 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() - - 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() - }) - }) - - it(`Share ${viewType.toUpperCase()} view : Visit URL, Verify title`, () => { - // visit public view - cy.visit(viewURL['combined'], { - baseUrl: null - }) - - // 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("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,Address => Customer,Address => Staff,City <= Address,Address <=> Staff`, - `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]) - } - // 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("District", 1).contains("Southern Mindanao").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,Address => Customer,Address => Staff,City <= Address,Address <=> Staff`, - `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]) - // } - - 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.downloadAndVerifyCsv(`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-col="Address => Customer"]').should('exist') - cy.get('[data-col="Address => Staff"]').should('exist') - cy.get('[data-col="City <= Address"]').should('exist') - cy.get('[data-col="Address <=> Staff"]').should('exist') - - // has many field validation - mainPage.getCell("Address => Customer", 3).click().find('button.mdi-close-thick').should('not.exist') - mainPage.getCell("Address => Customer", 3).click().find('button.mdi-plus').should('not.exist') - mainPage.getCell("Address => Customer", 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 <= Address", 1).click().find('button.mdi-close-thick').should('not.exist') - mainPage.getCell("City <= Address", 1).click().find('button.mdi-arrow-expand').should('not.exist') - mainPage.getCell("City <= Address", 1).find('.v-chip').contains('Kanchrapara').should('exist') - }) - - it(`Share GRID view : Virtual column validation > many to many`, () => { - // many-to-many field validation - mainPage.getCell("Address <=> Staff", 1).click().find('button.mdi-close-thick').should('not.exist') - mainPage.getCell("Address <=> Staff", 1).click().find('button.mdi-plus').should('not.exist') - mainPage.getCell("Address <=> Staff", 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 - }) - - // 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(`${type.toUpperCase()} api - Grid view/ row-column update verification`, () => { - before(() => { - // 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 - }) - - // delete row - mainPage.getPagination(5).click() - // 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.Country 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({force: true}) - 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 - }) //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') - }) - }) -} - + if (!isTestSuiteActive(type, xcdb)) 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(); + + // 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(`${type.toUpperCase()} api - GRID view (Share)`, () => { + // Run once before test- create project (rest/graphql) + // + before(() => { + // 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("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`, () => { + // 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(); + + 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(); + }); + }); + + it(`Share ${viewType.toUpperCase()} view : Visit URL, Verify title`, () => { + // visit public view + cy.visit(viewURL["combined"], { + baseUrl: null, + }); + + // 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("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,Address => Customer,Address => Staff,City <= Address,Address <=> Staff`, + `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]); + } + // 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("District", 1) + .contains("Southern Mindanao") + .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,Address => Customer,Address => Staff,City <= Address,Address <=> Staff`, + `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]) + // } + + 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.downloadAndVerifyCsv(`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-col="Address => Customer"]').should("exist"); + cy.get('[data-col="Address => Staff"]').should("exist"); + cy.get('[data-col="City <= Address"]').should("exist"); + cy.get('[data-col="Address <=> Staff"]').should("exist"); + + // has many field validation + mainPage + .getCell("Address => Customer", 3) + .click() + .find("button.mdi-close-thick") + .should("not.exist"); + mainPage + .getCell("Address => Customer", 3) + .click() + .find("button.mdi-plus") + .should("not.exist"); + mainPage + .getCell("Address => Customer", 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 <= Address", 1) + .click() + .find("button.mdi-close-thick") + .should("not.exist"); + mainPage + .getCell("City <= Address", 1) + .click() + .find("button.mdi-arrow-expand") + .should("not.exist"); + mainPage + .getCell("City <= Address", 1) + .find(".v-chip") + .contains("Kanchrapara") + .should("exist"); + }); + + it(`Share GRID view : Virtual column validation > many to many`, () => { + // many-to-many field validation + mainPage + .getCell("Address <=> Staff", 1) + .click() + .find("button.mdi-close-thick") + .should("not.exist"); + mainPage + .getCell("Address <=> Staff", 1) + .click() + .find("button.mdi-plus") + .should("not.exist"); + mainPage + .getCell("Address <=> Staff", 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, + }); + + // 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(`${type.toUpperCase()} api - Grid view/ row-column update verification`, () => { + before(() => { + // 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, + }); + + // delete row + mainPage.getPagination(5).click(); + // 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.Country 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({ force: true }); + 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, + }); //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 diff --git a/scripts/cypress/integration/common/5a_user_role.js b/scripts/cypress/integration/common/5a_user_role.js index 817eb0c467..fed228dcb3 100644 --- a/scripts/cypress/integration/common/5a_user_role.js +++ b/scripts/cypress/integration/common/5a_user_role.js @@ -1,155 +1,168 @@ -import { loginPage, projectsPage } from "../../support/page_objects/navigation" -import { mainPage } from "../../support/page_objects/mainPage" -import { roles, staticProjects } from "../../support/page_objects/projectConstants" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" -import { _advSettings, _editSchema, _editData, _editComment, _viewMenu, _topRightMenu } from "../spec/roleValidation.spec" +import { loginPage, projectsPage } from "../../support/page_objects/navigation"; +import { mainPage } from "../../support/page_objects/mainPage"; +import { + roles, + staticProjects, +} from "../../support/page_objects/projectConstants"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; +import { + _advSettings, + _editSchema, + _editData, + _editComment, + _viewMenu, + _topRightMenu, +} from "../spec/roleValidation.spec"; export const genTest = (type, xcdb) => { - if (!isTestSuiteActive(type, xcdb)) return; - - describe('Static user creations (different roles)', () => { - // beforeEach(() => { - // loginPage.signIn(roles.owner.credentials) - // projectsPage.openProject(getPrimarySuite().basic.name) - // }) - before(() => { - mainPage.navigationDraw(mainPage.TEAM_N_AUTH).click() - }) - - 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) + row header = 6 - cy.get(`tr`).then((obj) => { - cy.log(obj.length) - if (obj.length == 6) { - mainPage.addExistingUserToProject(user.credentials.username, user.name) - } else { - mainPage.addNewUserToProject(user.credentials, user.name) - } - }) - }) - } - - addUser(roles.creator) - addUser(roles.editor) - addUser(roles.commenter) - addUser(roles.viewer) - }) - - const roleValidation = (roleType) => { - describe(`User role validation`, () => { - - if (roleType != 'owner') { - it(`[${roles[roleType].name}] SignIn, Open project`, () => { - cy.log(mainPage.roleURL[roleType]) - cy.visit(mainPage.roleURL[roleType], { - baseUrl: null - }) - - // Redirected to new URL, feed details - // - cy.get('input[type="text"]').should('exist').type(roles[roleType].credentials.username) - cy.get('input[type="password"]').type(roles[roleType].credentials.password) - cy.get('button:contains("SIGN")').click() - - cy.url({ timeout: 6000 }).should('contain', '#/project') - - if('rest' == type) - projectsPage.openProject(staticProjects.externalREST.basic.name) - else - projectsPage.openProject(staticProjects.externalGQL.basic.name) - - if (roleType != 'creator') { - cy.closeTableTab('Actor') - } - }) - } - - /////////////////////////////////////////////////////// - // Test suite - - it(`[${roles[roleType].name}] Left navigation menu, New User add`, () => { - // project configuration settings - // - _advSettings(roleType, false) - }) - - it(`[${roles[roleType].name}] Schema: create table, add/modify/delete column`, () => { - // Schema related validations - // - Add/delete table - // - Add/Update/delete column - // - _editSchema(roleType, false) - }) - - it(`[${roles[roleType].name}] Data: add/modify/delete row, update cell contents`, () => { - // Table data related validations - // - Add/delete/modify row - // - _editData(roleType, false) - }) - - it(`[${roles[roleType].name}] Comments: view/add`, () => { - // read &/ update comment - // Viewer: only allowed to read - // Everyone else: read &/ update - // - if (roleType != 'viewer') - _editComment(roleType, false) - }) - - 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, false) - }) - - it(`[${roles[roleType].name}] Top Right Menu bar`, () => { - // Share button is conditional - // Rest are static/ mandatory - // - _topRightMenu(roleType, false) - }) - - it(`[${roles[roleType].name}] Download files`, () => { - // #ID, City, LastUpdate, City => Address, Country <= City, + - mainPage.hideField('LastUpdate') - - const verifyCsv = (retrievedRecords) => { - // expected output, statically configured - let storedRecords = [ - `City,City => Address,Country <= City`, - `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` - ] - - 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) - 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') -} - + if (!isTestSuiteActive(type, xcdb)) return; + + describe("Static user creations (different roles)", () => { + // beforeEach(() => { + // loginPage.signIn(roles.owner.credentials) + // projectsPage.openProject(getPrimarySuite().basic.name) + // }) + before(() => { + mainPage.navigationDraw(mainPage.TEAM_N_AUTH).click(); + }); + + 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) + row header = 6 + cy.get(`tr`).then((obj) => { + cy.log(obj.length); + if (obj.length == 6) { + mainPage.addExistingUserToProject( + user.credentials.username, + user.name + ); + } else { + mainPage.addNewUserToProject(user.credentials, user.name); + } + }); + }); + }; + + addUser(roles.creator); + addUser(roles.editor); + addUser(roles.commenter); + addUser(roles.viewer); + }); + + const roleValidation = (roleType) => { + describe(`User role validation`, () => { + if (roleType != "owner") { + it(`[${roles[roleType].name}] SignIn, Open project`, () => { + cy.log(mainPage.roleURL[roleType]); + cy.visit(mainPage.roleURL[roleType], { + baseUrl: null, + }); + + // Redirected to new URL, feed details + // + cy.get('input[type="text"]') + .should("exist") + .type(roles[roleType].credentials.username); + cy.get('input[type="password"]').type( + roles[roleType].credentials.password + ); + cy.get('button:contains("SIGN")').click(); + + cy.url({ timeout: 6000 }).should("contain", "#/project"); + + if ("rest" == type) + projectsPage.openProject(staticProjects.externalREST.basic.name); + else projectsPage.openProject(staticProjects.externalGQL.basic.name); + + if (roleType != "creator") { + cy.closeTableTab("Actor"); + } + }); + } + + /////////////////////////////////////////////////////// + // Test suite + + it(`[${roles[roleType].name}] Left navigation menu, New User add`, () => { + // project configuration settings + // + _advSettings(roleType, false); + }); + + it(`[${roles[roleType].name}] Schema: create table, add/modify/delete column`, () => { + // Schema related validations + // - Add/delete table + // - Add/Update/delete column + // + _editSchema(roleType, false); + }); + + it(`[${roles[roleType].name}] Data: add/modify/delete row, update cell contents`, () => { + // Table data related validations + // - Add/delete/modify row + // + _editData(roleType, false); + }); + + it(`[${roles[roleType].name}] Comments: view/add`, () => { + // read &/ update comment + // Viewer: only allowed to read + // Everyone else: read &/ update + // + if (roleType != "viewer") _editComment(roleType, false); + }); + + 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, false); + }); + + it(`[${roles[roleType].name}] Top Right Menu bar`, () => { + // Share button is conditional + // Rest are static/ mandatory + // + _topRightMenu(roleType, false); + }); + + it(`[${roles[roleType].name}] Download files`, () => { + // #ID, City, LastUpdate, City => Address, Country <= City, + + mainPage.hideField("LastUpdate"); + + const verifyCsv = (retrievedRecords) => { + // expected output, statically configured + let storedRecords = [ + `City,City => Address,Country <= City`, + `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`, + ]; + + 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); + 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 diff --git a/scripts/cypress/integration/common/5b_preview_role.js b/scripts/cypress/integration/common/5b_preview_role.js index 10b5ea05d7..30a84ead4f 100644 --- a/scripts/cypress/integration/common/5b_preview_role.js +++ b/scripts/cypress/integration/common/5b_preview_role.js @@ -1,98 +1,101 @@ - -// pre-requisite: +// pre-requisite: // user@nocodb.com signed up as admin -// sakilaDb database created already - -import { loginPage, projectsPage } from "../../support/page_objects/navigation" -import { mainPage } from "../../support/page_objects/mainPage" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" -import { _advSettings, _editSchema, _editData, _editComment, _viewMenu, _topRightMenu } from "../spec/roleValidation.spec" - +// sakilaDb database created already + +import { loginPage, projectsPage } from "../../support/page_objects/navigation"; +import { mainPage } from "../../support/page_objects/mainPage"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; +import { + _advSettings, + _editSchema, + _editData, + _editComment, + _viewMenu, + _topRightMenu, +} from "../spec/roleValidation.spec"; export const genTest = (type, xcdb, roleType) => { - if(!isTestSuiteActive(type, xcdb)) return; - - /////////////////////////////////////////////////////////// - //// Test Suite - - describe('Role preview validations', () => { - // Sign in/ open project - before(() => { - loginPage.loginAndOpenProject(type, xcdb) - }) - - after(() => { - cy.get('.nc-preview-reset').click({ force: true }) - // 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') - }) - - const genTestSub = (roleType) => { - - it(`Role preview: ${roleType}: Enable preview`, () => { - cy.get(`.nc-preview-${roleType}`).click() - - cy.openTableTab('City', 25) - }) - - it(`Role preview: ${roleType}: Advance settings`, () => { - // project configuration settings - // - _advSettings(roleType, true) - }) - - it(`Role preview: ${roleType}: Edit data`, () => { - // Table data related validations - // - Add/delete/modify row - // - _editData(roleType, true) - }) - - it(`Role preview: ${roleType}: Edit comment`, () => { - // read &/ update comment - // Viewer: not allowed to read - // Everyone else: read &/ update - // - _editComment(roleType, true) - }) - - it(`Role preview: ${roleType}: Preview menu`, () => { - // right navigation menu bar - // Editor/Viewer/Commenter : can only view 'existing' views - // Rest: can create/edit - _viewMenu(roleType, true) - }) - - it(`Role preview: ${roleType}: Top Right Menu bar`, () => { - // Share button is conditional - // Rest are static/ mandatory - // - _topRightMenu(roleType, false) - }) - - it(`Role preview: ${roleType}: Edit Schema`, () => { - // Schema related validations - // - Add/delete table - // - Add/Update/delete column - // - _editSchema(roleType, true) - }) - } - - genTestSub('editor') - genTestSub('commenter') - genTestSub('viewer') - }) -} - + if (!isTestSuiteActive(type, xcdb)) return; + + /////////////////////////////////////////////////////////// + //// Test Suite + + describe("Role preview validations", () => { + // Sign in/ open project + before(() => { + loginPage.loginAndOpenProject(type, xcdb); + }); + + after(() => { + cy.get(".nc-preview-reset").click({ force: true }); + // 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"); + }); + + const genTestSub = (roleType) => { + it(`Role preview: ${roleType}: Enable preview`, () => { + cy.get(`.nc-preview-${roleType}`).click(); + + cy.openTableTab("City", 25); + }); + + it(`Role preview: ${roleType}: Advance settings`, () => { + // project configuration settings + // + _advSettings(roleType, true); + }); + + it(`Role preview: ${roleType}: Edit data`, () => { + // Table data related validations + // - Add/delete/modify row + // + _editData(roleType, true); + }); + + it(`Role preview: ${roleType}: Edit comment`, () => { + // read &/ update comment + // Viewer: not allowed to read + // Everyone else: read &/ update + // + _editComment(roleType, true); + }); + + it(`Role preview: ${roleType}: Preview menu`, () => { + // right navigation menu bar + // Editor/Viewer/Commenter : can only view 'existing' views + // Rest: can create/edit + _viewMenu(roleType, true); + }); + + it(`Role preview: ${roleType}: Top Right Menu bar`, () => { + // Share button is conditional + // Rest are static/ mandatory + // + _topRightMenu(roleType, false); + }); + + it(`Role preview: ${roleType}: Edit Schema`, () => { + // Schema related validations + // - Add/delete table + // - Add/Update/delete column + // + _editSchema(roleType, true); + }); + }; + + genTestSub("editor"); + genTestSub("commenter"); + genTestSub("viewer"); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -115,4 +118,4 @@ export const genTest = (type, xcdb, roleType) => { * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - */ \ No newline at end of file + */ diff --git a/scripts/cypress/integration/common/6b_downloadCsv.js b/scripts/cypress/integration/common/6b_downloadCsv.js index 2a64b77b56..af6dc6faef 100644 --- a/scripts/cypress/integration/common/6b_downloadCsv.js +++ b/scripts/cypress/integration/common/6b_downloadCsv.js @@ -1,45 +1,44 @@ - -import { mainPage } from "../../support/page_objects/mainPage" -import { loginPage } from "../../support/page_objects/navigation" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { mainPage } from "../../support/page_objects/mainPage"; +import { loginPage } from "../../support/page_objects/navigation"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; + + describe(`${type.toUpperCase()} Upload/ Download CSV`, () => { + before(() => { + // loginPage.loginAndOpenProject(type) + cy.openTableTab("Country", 25); + }); - describe(`${type.toUpperCase()} Upload/ Download CSV`, () => { - before(() => { - // loginPage.loginAndOpenProject(type) - cy.openTableTab('Country', 25); - }) + after(() => { + cy.closeTableTab("Country"); + }); - after(() => { - cy.closeTableTab('Country') - }) + it("Download verification- base view, default columns", () => { + mainPage.hideField("LastUpdate"); + const verifyCsv = (retrievedRecords) => { + // expected output, statically configured + let storedRecords = [ + `Country,Country => City`, + `Afghanistan,Kabul`, + `Algeria,"Batna,Bchar,Skikda"`, + `American Samoa,Tafuna`, + `Angola,"Benguela,Namibe"`, + ]; - it('Download verification- base view, default columns', () => { - mainPage.hideField('LastUpdate') - const verifyCsv = (retrievedRecords) => { - // expected output, statically configured - let storedRecords = [ - `Country,Country => City`, - `Afghanistan,Kabul`, - `Algeria,"Batna,Bchar,Skikda"`, - `American Samoa,Tafuna`, - `Angola,"Benguela,Namibe"` - ] - - for (let i = 0; i < storedRecords.length; i++) { - cy.log(retrievedRecords[i]) - expect(retrievedRecords[i]).to.be.equal(storedRecords[i]) - } - } + for (let i = 0; i < storedRecords.length; i++) { + cy.log(retrievedRecords[i]); + expect(retrievedRecords[i]).to.be.equal(storedRecords[i]); + } + }; - // download & verify - mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv) - mainPage.unhideField('LastUpdate') - }) - }) -} + // download & verify + mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv); + mainPage.unhideField("LastUpdate"); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd diff --git a/scripts/cypress/integration/common/6c_swagger_api.js b/scripts/cypress/integration/common/6c_swagger_api.js index 381ad35c29..63a3abeee1 100644 --- a/scripts/cypress/integration/common/6c_swagger_api.js +++ b/scripts/cypress/integration/common/6c_swagger_api.js @@ -1,188 +1,228 @@ - -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" +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 = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; - - describe(`${type.toUpperCase()} : API List - Test preparation`, () => { - before(()=> { - loginPage.loginAndOpenProject(type, false) - }) - - 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' == type) { - 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' == type) { - - describe(`Swagger page, base verification`, () => { - - // 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) - - // 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!") - // }) - // }) - }) - } -} - + if (!isTestSuiteActive(type, xcdb)) return; + + describe(`${type.toUpperCase()} : API List - Test preparation`, () => { + before(() => { + loginPage.loginAndOpenProject(type, false); + }); + + 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" == type) { + 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" == type) { + describe(`Swagger page, base verification`, () => { + // 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); + + // 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 diff --git a/scripts/cypress/integration/common/6d_language_validation.js b/scripts/cypress/integration/common/6d_language_validation.js index e26eb33e9b..5917ea0ab5 100644 --- a/scripts/cypress/integration/common/6d_language_validation.js +++ b/scripts/cypress/integration/common/6d_language_validation.js @@ -1,68 +1,66 @@ -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" +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 = (type, xcdb) => { - if(!isTestSuiteActive(type, xcdb)) return; - describe(`Language support`, () => { + if (!isTestSuiteActive(type, xcdb)) return; + describe(`Language support`, () => { + before(() => { + //loginPage.signIn(roles.owner.credentials) + mainPage.toolBarTopLeft(mainPage.HOME).click(); + }); - before(() => { - //loginPage.signIn(roles.owner.credentials) - mainPage.toolBarTopLeft(mainPage.HOME).click() - }) + const langVerification = (idx, lang) => { + // pick json from the file specified + it(`Language verification: ${lang} > Projects page`, () => { + let json = require(`../../../../packages/nc-gui/lang/${lang}`); - const langVerification = (idx, lang) => { - // pick json from the file specified - it(`Language verification: ${lang} > Projects page`, () => { - let json = require(`../../../../packages/nc-gui/lang/${lang}`); - - // toggle menu as per index - cy.get('.nc-menu-translate').click() - cy.getActiveMenu().find('.v-list-item').eq(idx).click() + // toggle menu as per index + cy.get(".nc-menu-translate").click(); + cy.getActiveMenu().find(".v-list-item").eq(idx).click(); - // basic validations - // 1. Page title: "My Projects" - // 2. Button: "New Project" - // 3. Search box palceholder text: "Search Projects" - cy.get('b') - .contains(json.projects.my_projects) - .should('exist') - cy.get('button.v-btn') - .contains(json.projects.create_new_project_button.text) - .should('exist') - cy.get(`[placeholder="${json.projects.search_project}"]`) - .should('exist') - }) - } + // basic validations + // 1. Page title: "My Projects" + // 2. Button: "New Project" + // 3. Search box palceholder text: "Search Projects" + cy.get("b").contains(json.projects.my_projects).should("exist"); + cy.get("button.v-btn") + .contains(json.projects.create_new_project_button.text) + .should("exist"); + cy.get(`[placeholder="${json.projects.search_project}"]`).should( + "exist" + ); + }); + }; - // Index is the order in which menu options appear - langVerification(0, 'da.json') - langVerification(1, 'de.json') - langVerification(2, 'en.json') - langVerification(3, 'es.json') - langVerification(4, 'fi.json') - langVerification(5, 'fr.json') - langVerification(6, 'hr.json') - langVerification(7, 'id.json') - langVerification(8, 'it_IT.json') - langVerification(9, 'iw.json') - langVerification(10, 'ja.json') - langVerification(11, 'ko.json') - langVerification(12, 'nl.json') - langVerification(13, 'no.json') - langVerification(14, 'pt_BR.json') - langVerification(15, 'ru.json') - langVerification(16, 'sl.json') - langVerification(17, 'sv.json') - langVerification(18, 'th.json') - langVerification(19, 'uk.json') - langVerification(20, 'vi.json') - langVerification(21, 'zh_CN.json') - langVerification(22, 'zh_HK.json') - langVerification(23, 'zh_TW.json') - }) -} + // Index is the order in which menu options appear + langVerification(0, "da.json"); + langVerification(1, "de.json"); + langVerification(2, "en.json"); + langVerification(3, "es.json"); + langVerification(4, "fi.json"); + langVerification(5, "fr.json"); + langVerification(6, "hr.json"); + langVerification(7, "id.json"); + langVerification(8, "it_IT.json"); + langVerification(9, "iw.json"); + langVerification(10, "ja.json"); + langVerification(11, "ko.json"); + langVerification(12, "nl.json"); + langVerification(13, "no.json"); + langVerification(14, "pt_BR.json"); + langVerification(15, "ru.json"); + langVerification(16, "sl.json"); + langVerification(17, "sv.json"); + langVerification(18, "th.json"); + langVerification(19, "uk.json"); + langVerification(20, "vi.json"); + langVerification(21, "zh_CN.json"); + langVerification(22, "zh_HK.json"); + langVerification(23, "zh_TW.json"); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -84,4 +82,4 @@ export const genTest = (type, xcdb) => { * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - */ \ No newline at end of file + */ diff --git a/scripts/cypress/integration/common/6e_project_operations.js b/scripts/cypress/integration/common/6e_project_operations.js index 06068cdf77..8eb2f6771d 100644 --- a/scripts/cypress/integration/common/6e_project_operations.js +++ b/scripts/cypress/integration/common/6e_project_operations.js @@ -1,71 +1,70 @@ -import { loginPage } from "../../support/page_objects/navigation" -import { roles } from "../../support/page_objects/projectConstants" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { loginPage } from "../../support/page_objects/navigation"; +import { roles } from "../../support/page_objects/projectConstants"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - describe(`${type.toUpperCase()} Project operations`, () => { - if(!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; before(() => { - loginPage.signIn(roles.owner.credentials) - }) + loginPage.signIn(roles.owner.credentials); + }); - it('Stop Project', () => { + it("Stop Project", () => { //cy.visit('./#/projects') - cy.get(`.nc-${type}-project-row .mdi-stop-circle-outline`, { timeout: 10000 }) - .should('exist') + cy.get(`.nc-${type}-project-row .mdi-stop-circle-outline`, { + timeout: 10000, + }) + .should("exist") .last() - .invoke('show') - .click(); - cy.contains('Submit') - .closest('button') + .invoke("show") .click(); + cy.contains("Submit").closest("button").click(); - cy.toastWait('stopped successfully') - }) + cy.toastWait("stopped successfully"); + }); - it('Start Project', () => { + it("Start Project", () => { //cy.visit('./#/projects') - cy.get(`.nc-${type}-project-row .mdi-play-circle-outline`, { timeout: 10000 }) - .should('exist') + cy.get(`.nc-${type}-project-row .mdi-play-circle-outline`, { + timeout: 10000, + }) + .should("exist") .last() - .invoke('show') + .invoke("show") .click(); - cy.contains('Submit').closest('button').click(); + cy.contains("Submit").closest("button").click(); - cy.toastWait('started successfully') - }) + cy.toastWait("started successfully"); + }); - it('Restart Project', () => { + it("Restart Project", () => { //cy.visit('./#/projects') cy.get(`.nc-${type}-project-row .mdi-restart`, { timeout: 10000 }) - .should('exist') + .should("exist") .last() - .invoke('show') - .click(); - cy.contains('Submit') - .closest('button') + .invoke("show") .click(); - - cy.toastWait('restarted successfully') - }) + cy.contains("Submit").closest("button").click(); - it('Delete Project', () => { + cy.toastWait("restarted successfully"); + }); + + it("Delete Project", () => { //cy.visit('./#/projects') - cy.get(`.nc-${type}-project-row .mdi-delete-circle-outline`, { timeout: 10000 }) - .should('exist') + cy.get(`.nc-${type}-project-row .mdi-delete-circle-outline`, { + timeout: 10000, + }) + .should("exist") .last() - .invoke('show') - .click(); - cy.contains('Submit') - .closest('button') + .invoke("show") .click(); - - cy.toastWait('deleted successfully') - }) - }) -} + cy.contains("Submit").closest("button").click(); + + cy.toastWait("deleted successfully"); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -87,4 +86,4 @@ export const genTest = (type, xcdb) => { * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * - */ \ No newline at end of file + */ diff --git a/scripts/cypress/integration/common/6f_attachments.js b/scripts/cypress/integration/common/6f_attachments.js index a2c8faaed7..779a7bdda7 100644 --- a/scripts/cypress/integration/common/6f_attachments.js +++ b/scripts/cypress/integration/common/6f_attachments.js @@ -1,117 +1,126 @@ -import {mainPage} from "../../support/page_objects/mainPage" -import {loginPage} from "../../support/page_objects/navigation" -import {isTestSuiteActive} from "../../support/page_objects/projectConstants" +import { mainPage } from "../../support/page_objects/mainPage"; +import { loginPage } from "../../support/page_objects/navigation"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { if (!isTestSuiteActive(type, xcdb)) return; describe(`${type.toUpperCase()} Columns of type attachment`, () => { before(() => { - loginPage.loginAndOpenProject(type) - cy.openTableTab('Country', 25); - }) + loginPage.loginAndOpenProject(type); + cy.openTableTab("Country", 25); + }); after(() => { - mainPage.deleteColumn('testAttach') + 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() + mainPage.getPagination(5).click(); // 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}) + 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() + mainPage.getCell("Country", 10).rightclick(); + cy.getActiveMenu().contains("Delete Selected Row").click(); - cy.closeTableTab('Country') - }) + cy.closeTableTab("Country"); + }); it(`Add column of type attachments`, () => { - mainPage.addColumnWithType('testAttach', 'Attachment', 'Country') + mainPage.addColumnWithType("testAttach", "Attachment", "Country"); for (let i = 1; i <= 2; i++) { - let filepath = `sampleFiles/${i}.json` - mainPage.getCell('testAttach', i).click().find('input[type="file"]').attachFile(filepath) - mainPage.getCell('testAttach', i).find('.mdi-file').should('exist') + let filepath = `sampleFiles/${i}.json`; + mainPage + .getCell("testAttach", i) + .click() + .find('input[type="file"]') + .attachFile(filepath); + mainPage.getCell("testAttach", i).find(".mdi-file").should("exist"); } - }) + }); it(`Form view with Attachment field- Submit & verify`, () => { // create form-view cy.get(`.nc-create-form-view`).click(); - cy.getActiveModal().find('button:contains(Submit)').click() + cy.getActiveModal().find("button:contains(Submit)").click(); - cy.toastWait('View created successfully') + cy.toastWait("View created successfully"); - cy.get(`.nc-view-item.nc-form-view-item`).contains('Country1').click() + cy.get(`.nc-view-item.nc-form-view-item`).contains("Country1").click(); - cy.get('.v-navigation-drawer__content > .container') - .should('exist') - .find('.v-list > .v-list-item') - .contains('Share View') - .click() + cy.get(".v-navigation-drawer__content > .container") + .should("exist") + .find(".v-list > .v-list-item") + .contains("Share View") + .click(); // copy link text, visit URL - cy.getActiveModal().find('.share-link-box') - .contains('/nc/form/', {timeout: 10000}) + cy.getActiveModal() + .find(".share-link-box") + .contains("/nc/form/", { timeout: 10000 }) .then(($obj) => { - - let linkText = $obj.text().trim() - cy.log(linkText) + let linkText = $obj.text().trim(); + cy.log(linkText); cy.visit(linkText, { - baseUrl: null - }) + baseUrl: null, + }); // wait for share view page to load! - cy.get('#data-table-form-Country').should('exist').type('_abc') - cy.get('#data-table-form-LastUpdate').click() - cy.getActiveModal().find('button').contains('19').click() - cy.getActiveModal().find('button').contains('OK').click() + cy.get("#data-table-form-Country").should("exist").type("_abc"); + cy.get("#data-table-form-LastUpdate").click(); + cy.getActiveModal().find("button").contains("19").click(); + cy.getActiveModal().find("button").contains("OK").click(); - cy.get('.nc-field-editables') + cy.get(".nc-field-editables") .last() .find('input[type="file"]') - .attachFile(`sampleFiles/1.json`) + .attachFile(`sampleFiles/1.json`); // submit button & validate - cy.get('.nc-form').find('button').contains('Submit').click() - cy.toastWait('Saved successfully') - }) - }) + cy.get(".nc-form").find("button").contains("Submit").click(); + cy.toastWait("Saved successfully"); + }); + }); it(`Filter column which contain only attachments, download CSV`, () => { // come back to main window - loginPage.loginAndOpenProject(type) - cy.openTableTab('Country', 25); + loginPage.loginAndOpenProject(type); + cy.openTableTab("Country", 25); - mainPage.filterField('testAttach', 'is not null', null) - mainPage.hideField('LastUpdate') + mainPage.filterField("testAttach", "is not null", null); + mainPage.hideField("LastUpdate"); const verifyCsv = (retrievedRecords) => { let storedRecords = [ `Country,Country => City,testAttach`, - `Afghanistan,Kabul,1.json(http://localhost:8080/dl/externalrest_5agd/db/country/testAttach_VWk3fz_1.json)` - ] + `Afghanistan,Kabul,1.json(http://localhost:8080/dl/externalrest_5agd/db/country/testAttach_VWk3fz_1.json)`, + ]; - expect(retrievedRecords[0]).to.be.equal(storedRecords[0]) + 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/dl/external') + const columns = retrievedRecords[i].split(","); + expect(columns[2]).to.contain( + ".json(http://localhost:8080/dl/external" + ); } - cy.log(retrievedRecords[109]) - cy.log(retrievedRecords[110]) - cy.log(retrievedRecords[111]) - } - - mainPage.downloadAndVerifyCsv(`Country_exported_1.csv`, verifyCsv) - mainPage.unhideField('LastUpdate') - mainPage.filterReset() - }) - }) -} + 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 diff --git a/scripts/cypress/integration/common/6g_base_share.js b/scripts/cypress/integration/common/6g_base_share.js index 81771c1d95..a5957fb342 100644 --- a/scripts/cypress/integration/common/6g_base_share.js +++ b/scripts/cypress/integration/common/6g_base_share.js @@ -1,77 +1,77 @@ - -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" - -let linkText = '' +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"; + +let linkText = ""; export const genTest = (type, xcdb) => { - if (!isTestSuiteActive(type, xcdb)) 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 - }) - projectsPage.waitHomePageLoad() - - cy.closeTableTab('Actor') - }) - - it(`${roleType}: Validate access permissions: advance menu`, () => { - _advSettings(roleType, false) - }) - - it(`${roleType}: Validate access permissions: edit schema`, () => { - _editSchema(roleType, false) - }) - - it(`${roleType}: Validate access permissions: edit data`, () => { - _editData(roleType, false) - }) - - it(`${roleType}: Validate access permissions: edit comments`, () => { - _editComment(roleType, false) - }) - - it(`${roleType}: Validate access permissions: view's menu`, () => { - _viewMenu(roleType, false) - }) - } - - describe(`${type.toUpperCase()} Base VIEW share`, () => { - - it(`Generate base share URL`, () => { - // click SHARE - cy.get('.nc-topright-menu') - .find('.nc-menu-share') - .click() - - // Click on readonly base text - cy.getActiveModal() - .find('.nc-disable-shared-base') - .click() - - // Select 'Readonly link' - cy.getActiveMenu() - .find('.caption') - .contains('Anyone with the link') - .click() - - // Copy URL - cy.getActiveModal() - .find('.nc-url') - .then(($obj) => { - cy.log($obj[0]) - linkText = $obj[0].innerText.trim() - - const htmlFile = ` + if (!isTestSuiteActive(type, xcdb)) 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, + }); + projectsPage.waitHomePageLoad(); + + cy.closeTableTab("Actor"); + }); + + it(`${roleType}: Validate access permissions: advance menu`, () => { + _advSettings(roleType, false); + }); + + it(`${roleType}: Validate access permissions: edit schema`, () => { + _editSchema(roleType, false); + }); + + it(`${roleType}: Validate access permissions: edit data`, () => { + _editData(roleType, false); + }); + + it(`${roleType}: Validate access permissions: edit comments`, () => { + _editComment(roleType, false); + }); + + it(`${roleType}: Validate access permissions: view's menu`, () => { + _viewMenu(roleType, false); + }); + }; + + describe(`${type.toUpperCase()} Base VIEW share`, () => { + it(`Generate base share URL`, () => { + // click SHARE + cy.get(".nc-topright-menu").find(".nc-menu-share").click(); + + // Click on readonly base text + cy.getActiveModal().find(".nc-disable-shared-base").click(); + + // Select 'Readonly link' + cy.getActiveMenu() + .find(".caption") + .contains("Anyone with the link") + .click(); + + // Copy URL + cy.getActiveModal() + .find(".nc-url") + .then(($obj) => { + cy.log($obj[0]); + linkText = $obj[0].innerText.trim(); + + const htmlFile = ` @@ -86,58 +86,57 @@ style="background: transparent; "> - ` - cy.writeFile("scripts/cypress/fixtures/sampleFiles/iFrame.html", htmlFile) - }) - }) - - permissionValidation('viewer') - - it('Update to EDITOR base share link', () => { - loginPage.loginAndOpenProject(type) - - // click SHARE - cy.get('.nc-topright-menu') - .find('.nc-menu-share') - .click() - - cy.getActiveModal() - .find('.nc-shared-base-role') - .click() - - cy.getActiveMenu() - .find('[role="menuitem"]') - .contains('Editor') - .click() - }) - - permissionValidation('editor') - - it('Generate & verify embed HTML IFrame', { baseUrl: null }, () => { - // open iFrame html - cy.visit('scripts/cypress/fixtures/sampleFiles/iFrame.html') - - // wait for iFrame to load - cy.frameLoaded('.nc-embed') - - // for GQL- additionally close GQL Client window - if (type === 'graphql') { - cy.iframe().find(`[title="Graphql Client"] > button.mdi-close`).click() - } - - // 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) - mainPage.getIFrameCell('FirstName', 1).contains("PENELOPE").should('exist') - mainPage.getIFrameCell('LastName', 1).contains("GUINESS").should('exist') - }) - }) -} + `; + cy.writeFile( + "scripts/cypress/fixtures/sampleFiles/iFrame.html", + htmlFile + ); + }); + }); + + permissionValidation("viewer"); + + it("Update to EDITOR base share link", () => { + loginPage.loginAndOpenProject(type); + + // click SHARE + cy.get(".nc-topright-menu").find(".nc-menu-share").click(); + + cy.getActiveModal().find(".nc-shared-base-role").click(); + + cy.getActiveMenu().find('[role="menuitem"]').contains("Editor").click(); + }); + + permissionValidation("editor"); + + it("Generate & verify embed HTML IFrame", { baseUrl: null }, () => { + // open iFrame html + cy.visit("scripts/cypress/fixtures/sampleFiles/iFrame.html"); + + // wait for iFrame to load + cy.frameLoaded(".nc-embed"); + + // for GQL- additionally close GQL Client window + if (type === "graphql") { + cy.iframe().find(`[title="Graphql Client"] > button.mdi-close`).click(); + } + + // 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) + mainPage + .getIFrameCell("FirstName", 1) + .contains("PENELOPE") + .should("exist"); + mainPage.getIFrameCell("LastName", 1).contains("GUINESS").should("exist"); + }); + }); +}; /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd diff --git a/scripts/cypress/integration/common/7a_create_project_from_excel.js b/scripts/cypress/integration/common/7a_create_project_from_excel.js index d729a9e5fb..1650928ec7 100644 --- a/scripts/cypress/integration/common/7a_create_project_from_excel.js +++ b/scripts/cypress/integration/common/7a_create_project_from_excel.js @@ -1,47 +1,49 @@ - // Cypress test suite: Project creation using EXCEL // -import { projectsPage } from "../../support/page_objects/navigation" -import { mainPage } from "../../support/page_objects/mainPage" -import { roles, isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { 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 +let sheetList; // stores table data (read from excel) -let sheetData +let sheetData; //let UrlSheetData -let URL = 'https://go.microsoft.com/fwlink/?LinkID=521962' +let URL = "https://go.microsoft.com/fwlink/?LinkID=521962"; -let filepath = `sampleFiles/simple.xlsx` +let filepath = `sampleFiles/simple.xlsx`; // let UrlFilePath = `sampleFiles/Financial Sample.xlsx` let expectedData = { - 0: ['number', 'Number'], - 1: ['float', 'Decimal'], - 2: ['text', 'SingleLineText'] -} + 0: ["number", "Number"], + 1: ["float", "Decimal"], + 2: ["text", "SingleLineText"], +}; 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]] -} + 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 = { @@ -61,231 +63,260 @@ let UrlFileExpectedData = { // } export const genTest = (type, xcdb) => { - if (!isTestSuiteActive(type, xcdb)) return; - - describe(`Import from excel`, () => { - - before(() => { - - cy.task('readSheetList', { file: `./scripts/cypress/fixtures/${filepath}` }) - .then((rows) => { - cy.log(rows) - sheetList = rows - }) - - cy.task('readXlsx', { file: `./scripts/cypress/fixtures/${filepath}`, sheet: "Sheet2" }) - .then((rows) => { - cy.log(rows) - sheetData = rows - }) - - // cy.task('readXlsx', { file: `./scripts/cypress/fixtures/${UrlFilePath}`, sheet: "Sheet1" }) - // .then((rows) => { - // cy.log(rows) - // UrlSheetData = rows - // }) - }) - - it('File Upload: Upload excel as template', () => { - - mainPage.toolBarTopLeft(mainPage.HOME).click() - - // click on "New Project" - cy.get(':nth-child(5) > .v-btn', { timeout: 20000 }).click() - - // Subsequent form, select (+ Create) option - cy.get('.nc-create-project-from-excel', { timeout: 20000 }).click({ force: true }) - - cy.get('.nc-excel-import-input').attachFile(filepath) - cy.get('.nc-btn-use-template', { timeout: 120000 }).should('exist') - }) - - it('File Upload: Verify pre-load template page', () => { - - cy.getActiveContentModal().find('.v-expansion-panel').then((sheets) => { - - for (let i = 0; i < sheets.length; i++) { - - // verify if all sheet names are correct - // cy.wrap(sheets[i]).find('.title').then((blk) => { - // cy.log(blk.text().trim()) - // expect(blk.text().trim()).to.equal(sheetList[i]) - // }) - - cy.wrap(sheets[i]).contains(sheetList[i]).should('exist') - - // for each sheet, expand to verify table names & their data types - cy.wrap(sheets[i]).find('.mdi-chevron-down').click() - - // wait for 4 DOM rows to become visible, corresponding to 4 column names in excel - // change to avoid static wait - cy.get('.v-data-table').find('tr:visible').should('have.length', 4) - - cy.get('.v-data-table').find('tr:visible').then((row) => { - - for (let j = 1; j < row.length; j++) { - - // column name to match input in excel - cy.wrap(row[j]).find('[placeholder="Column name"]').then((obj) => { - cy.log(obj[0].value) - expect(obj[0].value).to.equal(expectedData[j-1][0]) - }) - - // datatype to match expected output - cy.wrap(row[j]).find('span.caption').then((obj) => { - cy.log(obj[0].innerText) - expect(obj[0].innerText).to.equal(expectedData[j-1][1]) - }) - } - }) - - // unwind - cy.wrap(sheets[i]).find('.mdi-chevron-down').click() - } - }) - }) - - it('File Upload: Verify loaded data', () => { - - // create rest/ gql project - cy.get('.nc-btn-use-template', { timeout: 120000 }).click() - // if (type == 'rest') { - // cy.getActiveMenu().find('[role="menuitem"]').contains('REST').click() - // } else { - // cy.getActiveMenu().find('[role="menuitem"]').contains('GQL').click() - // } - - // 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('Sheet2', 2) - for (const [key, value] of Object.entries(expectedData)) { - mainPage.getCell(value[0], 1).contains(sheetData[0][value[0]]).should('exist') - mainPage.getCell(value[0], 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[0], 1).contains(sheetData[0][value[0]]).should('exist') - mainPage.getCell(value[0], 2).contains(sheetData[1][value[0]]).should('exist') - } - cy.closeTableTab('Sheet3') - - // delete project once all operations are completed - mainPage.toolBarTopLeft(mainPage.HOME).click() - cy.get(`.nc-${type}-project-row .mdi-delete-circle-outline`, { timeout: 10000 }) - .should('exist') - .last() - .invoke('show') - .click(); - cy.contains('Submit') - .closest('button') - .click(); - }) - - - it('URL: Upload excel as template', () => { - - // click on "New Project" - cy.get(':nth-child(5) > .v-btn', { timeout: 20000 }).click() - - // Subsequent form, select (+ Create) option - cy.get('.nc-create-project-from-excel', { timeout: 20000 }).click({ force: true }) - - cy.getActiveModal().find('.caption').contains('URL').click() - cy.get('.nc-excel-import-tab-item').find('input[type="url"]').click().type(URL) - cy.get('.nc-excel-import-tab-item').find('button').contains('Load').click() - - cy.get('.nc-btn-use-template', { timeout: 120000 }).should('exist') - }) - - it('URL: Verify pre-load template page', () => { - - cy.getActiveContentModal().find('.v-expansion-panel').then((sheets) => { - - for (let i = 0; i < sheets.length; i++) { - - // verify if all sheet names are correct - // cy.wrap(sheets[i]).find('.title').then((blk) => { - // cy.log(blk.text().trim()) - // expect(blk.text().trim()).to.equal('Sheet1') - // }) - - cy.wrap(sheets[i]).contains('Sheet1').should('exist') - - // for each sheet, expand to verify table names & their data types - cy.wrap(sheets[i]).find('.mdi-chevron-down').click() - cy.wait(3000).then(() => { - cy.get('.v-data-table').find('tr:visible').then((row) => { - - // verification restricting to 10, as others need to be scrolled back into view - for (let j = 1; j <= 10/*row.length*/; j++) { - - // column name to match input in excel - cy.wrap(row[j]).find('[placeholder="Column name"]').then((obj) => { - cy.log(obj[0].value) - expect(obj[0].value).to.equal(UrlFileExpectedData[j-1][0]) - }) - - // datatype to match expected output - cy.wrap(row[j]).find('span.caption').then((obj) => { - cy.log(obj[0].innerText) - expect(obj[0].innerText).to.equal(UrlFileExpectedData[j-1][1]) - }) - } - }) - }) - - // unwind - cy.wrap(sheets[i]).find('.mdi-chevron-down').click() + if (!isTestSuiteActive(type, xcdb)) return; + + describe(`Import from excel`, () => { + before(() => { + cy.task("readSheetList", { + file: `./scripts/cypress/fixtures/${filepath}`, + }).then((rows) => { + cy.log(rows); + sheetList = rows; + }); + + cy.task("readXlsx", { + file: `./scripts/cypress/fixtures/${filepath}`, + sheet: "Sheet2", + }).then((rows) => { + cy.log(rows); + sheetData = rows; + }); + + // cy.task('readXlsx', { file: `./scripts/cypress/fixtures/${UrlFilePath}`, sheet: "Sheet1" }) + // .then((rows) => { + // cy.log(rows) + // UrlSheetData = rows + // }) + }); + + it("File Upload: Upload excel as template", () => { + mainPage.toolBarTopLeft(mainPage.HOME).click(); + + // click on "New Project" + cy.get(":nth-child(5) > .v-btn", { timeout: 20000 }).click(); + + // Subsequent form, select (+ Create) option + cy.get(".nc-create-project-from-excel", { timeout: 20000 }).click({ + force: true, + }); + + cy.get(".nc-excel-import-input").attachFile(filepath); + cy.get(".nc-btn-use-template", { timeout: 120000 }).should("exist"); + }); + + it("File Upload: Verify pre-load template page", () => { + cy.getActiveContentModal() + .find(".v-expansion-panel") + .then((sheets) => { + for (let i = 0; i < sheets.length; i++) { + // verify if all sheet names are correct + // cy.wrap(sheets[i]).find('.title').then((blk) => { + // cy.log(blk.text().trim()) + // expect(blk.text().trim()).to.equal(sheetList[i]) + // }) + + cy.wrap(sheets[i]).contains(sheetList[i]).should("exist"); + + // for each sheet, expand to verify table names & their data types + cy.wrap(sheets[i]).find(".mdi-chevron-down").click(); + + // wait for 4 DOM rows to become visible, corresponding to 4 column names in excel + // change to avoid static wait + cy.get(".v-data-table").find("tr:visible").should("have.length", 4); + + cy.get(".v-data-table") + .find("tr:visible") + .then((row) => { + for (let j = 1; j < row.length; j++) { + // column name to match input in excel + cy.wrap(row[j]) + .find('[placeholder="Column name"]') + .then((obj) => { + cy.log(obj[0].value); + expect(obj[0].value).to.equal(expectedData[j - 1][0]); + }); + + // datatype to match expected output + cy.wrap(row[j]) + .find("span.caption") + .then((obj) => { + cy.log(obj[0].innerText); + expect(obj[0].innerText).to.equal(expectedData[j - 1][1]); + }); } - }) - }) - - it('URL: Verify loaded data', () => { - - // create rest/ gql project - cy.get('.nc-btn-use-template', { timeout: 120000 }).click() - - // 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() - cy.get(`.nc-${type}-project-row .mdi-delete-circle-outline`, { timeout: 10000 }) - .should('exist') - .last() - .invoke('show') - .click(); - cy.contains('Submit') - .closest('button') - .click(); - }) - }) -} - + }); + + // unwind + cy.wrap(sheets[i]).find(".mdi-chevron-down").click(); + } + }); + }); + + it("File Upload: Verify loaded data", () => { + // create rest/ gql project + cy.get(".nc-btn-use-template", { timeout: 120000 }).click(); + // if (type == 'rest') { + // cy.getActiveMenu().find('[role="menuitem"]').contains('REST').click() + // } else { + // cy.getActiveMenu().find('[role="menuitem"]').contains('GQL').click() + // } + + // 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("Sheet2", 2); + for (const [key, value] of Object.entries(expectedData)) { + mainPage + .getCell(value[0], 1) + .contains(sheetData[0][value[0]]) + .should("exist"); + mainPage + .getCell(value[0], 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[0], 1) + .contains(sheetData[0][value[0]]) + .should("exist"); + mainPage + .getCell(value[0], 2) + .contains(sheetData[1][value[0]]) + .should("exist"); + } + cy.closeTableTab("Sheet3"); + + // delete project once all operations are completed + mainPage.toolBarTopLeft(mainPage.HOME).click(); + cy.get(`.nc-${type}-project-row .mdi-delete-circle-outline`, { + timeout: 10000, + }) + .should("exist") + .last() + .invoke("show") + .click(); + cy.contains("Submit").closest("button").click(); + }); + + it("URL: Upload excel as template", () => { + // click on "New Project" + cy.get(":nth-child(5) > .v-btn", { timeout: 20000 }).click(); + + // Subsequent form, select (+ Create) option + cy.get(".nc-create-project-from-excel", { timeout: 20000 }).click({ + force: true, + }); + + cy.getActiveModal().find(".caption").contains("URL").click(); + cy.get(".nc-excel-import-tab-item") + .find('input[type="url"]') + .click() + .type(URL); + cy.get(".nc-excel-import-tab-item") + .find("button") + .contains("Load") + .click(); + + cy.get(".nc-btn-use-template", { timeout: 120000 }).should("exist"); + }); + + it("URL: Verify pre-load template page", () => { + cy.getActiveContentModal() + .find(".v-expansion-panel") + .then((sheets) => { + for (let i = 0; i < sheets.length; i++) { + // verify if all sheet names are correct + // cy.wrap(sheets[i]).find('.title').then((blk) => { + // cy.log(blk.text().trim()) + // expect(blk.text().trim()).to.equal('Sheet1') + // }) + + cy.wrap(sheets[i]).contains("Sheet1").should("exist"); + + // for each sheet, expand to verify table names & their data types + cy.wrap(sheets[i]).find(".mdi-chevron-down").click(); + cy.wait(3000).then(() => { + cy.get(".v-data-table") + .find("tr:visible") + .then((row) => { + // verification restricting to 10, as others need to be scrolled back into view + for (let j = 1; j <= 10 /*row.length*/; j++) { + // column name to match input in excel + cy.wrap(row[j]) + .find('[placeholder="Column name"]') + .then((obj) => { + cy.log(obj[0].value); + expect(obj[0].value).to.equal( + UrlFileExpectedData[j - 1][0] + ); + }); + + // datatype to match expected output + cy.wrap(row[j]) + .find("span.caption") + .then((obj) => { + cy.log(obj[0].innerText); + expect(obj[0].innerText).to.equal( + UrlFileExpectedData[j - 1][1] + ); + }); + } + }); + }); + + // unwind + cy.wrap(sheets[i]).find(".mdi-chevron-down").click(); + } + }); + }); + + it("URL: Verify loaded data", () => { + // create rest/ gql project + cy.get(".nc-btn-use-template", { timeout: 120000 }).click(); + + // 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(); + cy.get(`.nc-${type}-project-row .mdi-delete-circle-outline`, { + timeout: 10000, + }) + .should("exist") + .last() + .invoke("show") + .click(); + cy.contains("Submit").closest("button").click(); + }); + }); +}; // if (typeof require !== 'undefined') XLSX = require('xlsx'); @@ -313,7 +344,7 @@ export const genTest = (type, xcdb) => { // columnA.push(worksheet[z].v); // } // } -// return columnA +// return columnA // } // const getCell = (sheet, cellIdx) => { diff --git a/scripts/cypress/integration/spec/roleValidation.spec.js b/scripts/cypress/integration/spec/roleValidation.spec.js index 7812f2a490..684a6c88fb 100644 --- a/scripts/cypress/integration/spec/roleValidation.spec.js +++ b/scripts/cypress/integration/spec/roleValidation.spec.js @@ -1,5 +1,5 @@ -import { mainPage } from "../../support/page_objects/mainPage" -import { roles } from "../../support/page_objects/projectConstants" +import { mainPage } from "../../support/page_objects/mainPage"; +import { roles } from "../../support/page_objects/projectConstants"; // Left hand navigation bar, validation for // 1. Audit menu @@ -7,107 +7,115 @@ import { roles } from "../../support/page_objects/projectConstants" // 3. Preview mode menu // export function _advSettings(roleType, previewMode) { - let validationString = (true == roles[roleType].validations.advSettings) ? 'exist' : 'not.exist' - - // audit/advance settings menu visible only for owner/ creator - mainPage.navigationDraw(mainPage.AUDIT).should(validationString) - mainPage.navigationDraw(mainPage.APPSTORE).should(validationString) - mainPage.navigationDraw(mainPage.TEAM_N_AUTH).should(validationString) - mainPage.navigationDraw(mainPage.PROJ_METADATA).should(validationString) - - // option to add new user conditionally visible only to owner/ creator - cy.get('button:contains("New User")').should(validationString) - - if (true == previewMode) { - // preview mode, role toggle menubar is visible - mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should('exist') - mainPage.navigationDraw(mainPage.ROLE_VIEW_COMMENTER).should('exist') - mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should('exist') - mainPage.navigationDraw(mainPage.ROLE_VIEW_RESET).should('exist') - - } else { - // normal mode, role toggle menubar is visible only for owner/ creator - mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should(validationString) - mainPage.navigationDraw(mainPage.ROLE_VIEW_COMMENTER).should(validationString) - mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should(validationString) - } + let validationString = + true == roles[roleType].validations.advSettings ? "exist" : "not.exist"; + + // audit/advance settings menu visible only for owner/ creator + mainPage.navigationDraw(mainPage.AUDIT).should(validationString); + mainPage.navigationDraw(mainPage.APPSTORE).should(validationString); + mainPage.navigationDraw(mainPage.TEAM_N_AUTH).should(validationString); + mainPage.navigationDraw(mainPage.PROJ_METADATA).should(validationString); + + // option to add new user conditionally visible only to owner/ creator + cy.get('button:contains("New User")').should(validationString); + + if (true == previewMode) { + // preview mode, role toggle menubar is visible + mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should("exist"); + mainPage.navigationDraw(mainPage.ROLE_VIEW_COMMENTER).should("exist"); + mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should("exist"); + mainPage.navigationDraw(mainPage.ROLE_VIEW_RESET).should("exist"); + } else { + // normal mode, role toggle menubar is visible only for owner/ creator + mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should(validationString); + mainPage + .navigationDraw(mainPage.ROLE_VIEW_COMMENTER) + .should(validationString); + mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should(validationString); + } } - export function _editSchema(roleType, previewMode) { - - let columnName = 'City' - let validationString = (true == roles[roleType].validations.editSchema) ? 'exist' : 'not.exist' - - if (false == previewMode) { - cy.openTableTab(columnName, 25) - } - - // create table options - // - cy.get('.add-btn').should(validationString) - cy.get('.v-tabs-bar').eq(0).find('button.mdi-plus-box').should(validationString) - - // delete table option - // - cy.get('.nc-table-delete-btn').should(validationString) - - // add new column option - // - cy.get('.new-column-header').should(validationString) - - // update column (edit/ delete menu) - // - cy.get(`th:contains(${columnName}) .mdi-menu-down`).should(validationString) + let columnName = "City"; + let validationString = + true == roles[roleType].validations.editSchema ? "exist" : "not.exist"; + + if (false == previewMode) { + cy.openTableTab(columnName, 25); + } + + // create table options + // + cy.get(".add-btn").should(validationString); + cy.get(".v-tabs-bar") + .eq(0) + .find("button.mdi-plus-box") + .should(validationString); + + // delete table option + // + cy.get(".nc-table-delete-btn").should(validationString); + + // add new column option + // + cy.get(".new-column-header").should(validationString); + + // update column (edit/ delete menu) + // + cy.get(`th:contains(${columnName}) .mdi-menu-down`).should(validationString); } - export function _editData(roleType, previewMode) { + let columnName = "City"; + let validationString = + true == roles[roleType].validations.editData ? "exist" : "not.exist"; - let columnName = 'City' - let validationString = (true == roles[roleType].validations.editData) ? 'exist' : 'not.exist' + cy.openTableTab(columnName, 25); - cy.openTableTab(columnName, 25) + // add new row option (from menu header) + // + cy.get(".nc-add-new-row-btn").should(validationString); - // add new row option (from menu header) - // - cy.get('.nc-add-new-row-btn').should(validationString) + // update row option (right click) + // + cy.get(`tbody > :nth-child(4) > [data-col="City"]`).rightclick(); + cy.get(".menuable__content__active").should(validationString); - // update row option (right click) + if (validationString == "exist") { + // right click options will exist (only for 'exist' case) + // + cy.getActiveMenu().contains("Insert New Row").should(validationString); + cy.getActiveMenu().contains("Delete Row").should(validationString); + cy.getActiveMenu() + .contains("Delete Selected Rows") + .should(validationString); + cy.get("body").type("{esc}"); + + // update cell contents option using row expander should be enabled // - cy.get(`tbody > :nth-child(4) > [data-col="City"]`).rightclick() - cy.get('.menuable__content__active').should(validationString) - - if (validationString == 'exist') { - - // right click options will exist (only for 'exist' case) - // - cy.getActiveMenu().contains('Insert New Row').should(validationString) - cy.getActiveMenu().contains('Delete Row').should(validationString) - cy.getActiveMenu().contains('Delete Selected Rows').should(validationString) - cy.get('body').type('{esc}') - - // update cell contents option using row expander should be enabled - // - //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) - cy.get('.v-input.row-checkbox').eq(4).next().next().click({ force: true }) - cy.getActiveModal().find('button').contains('Save Row').should('exist') - cy.get('body').type('{esc}') - - } - else { - // update cell contents option using row expander should be disabled - // - //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) - cy.get('.v-input.row-checkbox').eq(4).next().next().click({ force: true }) - cy.getActiveModal().find('button:disabled').contains('Save Row').should('exist') - cy.getActiveModal().find('button').contains('Cancel').click() - cy.get('body').type('{esc}') - } - - // double click cell entries to edit + //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) + cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true }); + cy.getActiveModal().find("button").contains("Save Row").should("exist"); + cy.get("body").type("{esc}"); + } else { + // update cell contents option using row expander should be disabled // - cy.get(`tbody > :nth-child(4) > [data-col="City"]`).dblclick().find('input').should(validationString) + //cy.get('.nc-row-expand-icon').eq(4).click({ force: true }) + cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true }); + cy.getActiveModal() + .find("button:disabled") + .contains("Save Row") + .should("exist"); + cy.getActiveModal().find("button").contains("Cancel").click(); + cy.get("body").type("{esc}"); + } + + // double click cell entries to edit + // + cy.get(`tbody > :nth-child(4) > [data-col="City"]`) + .dblclick() + .find("input") + .should(validationString); } // read &/ update comment @@ -115,81 +123,95 @@ export function _editData(roleType, previewMode) { // Everyone else: read &/ update // export function _editComment(roleType, previewMode) { - - let columnName = 'City' - let validationString = (true == roles[roleType].validations.editComment) ? 'Comment added successfully' : 'Not allowed' - - cy.openTableTab(columnName, 25) - - // click on comment icon & type comment - // - - cy.get('.v-input.row-checkbox').eq(4).next().next().click({ force: true }) - - // Expected response: - // Viewer: Not able to see comment option - // Everyone else: Comment added/read successfully - // - - if ('viewer' == roleType) { - cy.getActiveModal().find('.mdi-comment-multiple-outline').should('not.exist') - } - else { - cy.getActiveModal().find('.mdi-comment-multiple-outline').should('exist').click() - cy.getActiveModal().find('.comment-box').type('Comment-1{enter}') - // cy.toastWait('Comment added successfully') - cy.getActiveModal().find('.mdi-door-open').click() - - cy.get('body').contains(validationString, { timeout: 2000 }).should('exist') - } - - cy.getActiveModal().find('button').contains('Cancel').should('exist').click() - cy.get('body').type('{esc}') + let columnName = "City"; + let validationString = + true == roles[roleType].validations.editComment + ? "Comment added successfully" + : "Not allowed"; + + cy.openTableTab(columnName, 25); + + // click on comment icon & type comment + // + + cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true }); + + // Expected response: + // Viewer: Not able to see comment option + // Everyone else: Comment added/read successfully + // + + if ("viewer" == roleType) { + cy.getActiveModal() + .find(".mdi-comment-multiple-outline") + .should("not.exist"); + } else { + cy.getActiveModal() + .find(".mdi-comment-multiple-outline") + .should("exist") + .click(); + cy.getActiveModal().find(".comment-box").type("Comment-1{enter}"); + // cy.toastWait('Comment added successfully') + cy.getActiveModal().find(".mdi-door-open").click(); + + cy.get("body") + .contains(validationString, { timeout: 2000 }) + .should("exist"); + } + + cy.getActiveModal().find("button").contains("Cancel").should("exist").click(); + cy.get("body").type("{esc}"); } // right navigation menu bar // Editor/Viewer/Commenter : can only view 'existing' views // Rest: can create/edit export function _viewMenu(roleType, previewMode) { + let columnName = "City"; + let navDrawListCnt = 2; - let columnName = 'City' - let navDrawListCnt = 2 + cy.openTableTab(columnName, 25); - cy.openTableTab(columnName, 25) - - let validationString = (true == roles[roleType].validations.shareView) ? 'exist' : 'not.exist' + let validationString = + true == roles[roleType].validations.shareView ? "exist" : "not.exist"; - // validate if Share button is visible at header tool bar - cy.get('header.v-toolbar').eq(0).find('button:contains("Share")').should(validationString) + // validate if Share button is visible at header tool bar + cy.get("header.v-toolbar") + .eq(0) + .find('button:contains("Share")') + .should(validationString); - // Owner, Creator will have two navigation drawer (on each side of center panel) - if (roleType == 'owner' || roleType == 'creator') { - navDrawListCnt = 4 - } + // Owner, Creator will have two navigation drawer (on each side of center panel) + if (roleType == "owner" || roleType == "creator") { + navDrawListCnt = 4; + } - cy.get('.v-navigation-drawer__content').eq(1).find('[role="list"]').should('have.length', navDrawListCnt) + cy.get(".v-navigation-drawer__content") + .eq(1) + .find('[role="list"]') + .should("have.length", navDrawListCnt); - // view list field (default GRID view) - cy.get(`.nc-view-item`).should('exist') + // view list field (default GRID view) + cy.get(`.nc-view-item`).should("exist"); - // view create option, exists only for owner/ creator - cy.get(`.nc-create-gallery-view`).should(validationString) - cy.get(`.nc-create-grid-view`).should(validationString) - cy.get(`.nc-create-form-view`).should(validationString) + // view create option, exists only for owner/ creator + cy.get(`.nc-create-gallery-view`).should(validationString); + cy.get(`.nc-create-grid-view`).should(validationString); + cy.get(`.nc-create-form-view`).should(validationString); - // share view & automations, exists only for owner/creator - cy.get(`.nc-share-view`).should(validationString) - cy.get(`.nc-automations`).should(validationString) + // share view & automations, exists only for owner/creator + cy.get(`.nc-share-view`).should(validationString); + cy.get(`.nc-automations`).should(validationString); } export function _topRightMenu(roleType, previewMode) { - let validationString = (true == roles[roleType].validations.shareView) ? 'exist' : 'not.exist' - cy.get('.nc-topright-menu').find('.nc-menu-share').should(validationString) - - cy.get('.nc-topright-menu').find('.nc-menu-theme').should('exist') - cy.get('.nc-topright-menu').find('.nc-menu-dark-theme').should('exist') - cy.get('.nc-topright-menu').find('.nc-menu-translate').should('exist') - cy.get('.nc-topright-menu').find('.nc-menu-account').should('exist') - cy.get('.nc-topright-menu').find('.nc-menu-alert').should('exist') - + let validationString = + true == roles[roleType].validations.shareView ? "exist" : "not.exist"; + cy.get(".nc-topright-menu").find(".nc-menu-share").should(validationString); + + cy.get(".nc-topright-menu").find(".nc-menu-theme").should("exist"); + cy.get(".nc-topright-menu").find(".nc-menu-dark-theme").should("exist"); + cy.get(".nc-topright-menu").find(".nc-menu-translate").should("exist"); + cy.get(".nc-topright-menu").find(".nc-menu-account").should("exist"); + cy.get(".nc-topright-menu").find(".nc-menu-alert").should("exist"); } diff --git a/scripts/cypress/integration/test/explicitLogin.js b/scripts/cypress/integration/test/explicitLogin.js index 51e429e690..d5da6305a7 100644 --- a/scripts/cypress/integration/test/explicitLogin.js +++ b/scripts/cypress/integration/test/explicitLogin.js @@ -1,26 +1,25 @@ -import { loginPage } from "../../support/page_objects/navigation" -import { isTestSuiteActive } from "../../support/page_objects/projectConstants" +import { loginPage } from "../../support/page_objects/navigation"; +import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; export const genTest = (type, xcdb) => { - if (!isTestSuiteActive(type, xcdb)) return; + if (!isTestSuiteActive(type, xcdb)) return; - describe(`${type.toUpperCase()} api - Login & Open project`, () => { + describe(`${type.toUpperCase()} api - Login & Open project`, () => { + // Run once before test- create project (rest/graphql) + // + before(() => { + loginPage.loginAndOpenProject(type); - // Run once before test- create project (rest/graphql) - // - before(() => { - loginPage.loginAndOpenProject(type) + // open a table to work on views + // + // cy.openTableTab('City'); + }); - // open a table to work on views - // - // cy.openTableTab('City'); - }) - - it(``, () => { - cy.log('Test-1') - }) - }) -} + it(``, () => { + cy.log("Test-1"); + }); + }); +}; // genTest('rest', false) diff --git a/scripts/cypress/integration/test/gqlMisc.js b/scripts/cypress/integration/test/gqlMisc.js index 2cfd0f1b0f..486ce8c8b1 100644 --- a/scripts/cypress/integration/test/gqlMisc.js +++ b/scripts/cypress/integration/test/gqlMisc.js @@ -1,35 +1,33 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t6b = require('../common/6b_downloadCsv') -let t6c = require('../common/6c_swagger_api') -let t6d = require('../common/6d_language_validation') -let t6e = require('../common/6e_project_operations') -let t6f = require('../common/6f_attachments') -let t6g = require('../common/6g_base_share') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t6b = require("../common/6b_downloadCsv"); +let t6c = require("../common/6c_swagger_api"); +let t6d = require("../common/6d_language_validation"); +let t6e = require("../common/6e_project_operations"); +let t6f = require("../common/6f_attachments"); +let t6g = require("../common/6g_base_share"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { - - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t6b.genTest(type, xcdb) - t6c.genTest(type, xcdb) - t6d.genTest(type, xcdb) - t6f.genTest(type, xcdb) - t6g.genTest(type, xcdb) - // **deletes created project, hence place it @ end - t6e.genTest(type, xcdb) -} - -nocoTestSuite('graphql', false) + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } + + t6b.genTest(type, xcdb); + t6c.genTest(type, xcdb); + t6d.genTest(type, xcdb); + t6f.genTest(type, xcdb); + t6g.genTest(type, xcdb); + // **deletes created project, hence place it @ end + t6e.genTest(type, xcdb); +}; + +nocoTestSuite("graphql", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -52,7 +50,3 @@ nocoTestSuite('graphql', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/gqlRoles.js b/scripts/cypress/integration/test/gqlRoles.js index 5395d51d5b..c334ab9605 100644 --- a/scripts/cypress/integration/test/gqlRoles.js +++ b/scripts/cypress/integration/test/gqlRoles.js @@ -1,26 +1,24 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t5a = require('../common/5a_user_role') -let t5b = require('../common/5b_preview_role') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t5a = require("../common/5a_user_role"); +let t5b = require("../common/5b_preview_role"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t5a.genTest(type, xcdb) - t5b.genTest(type, xcdb) -} + t5a.genTest(type, xcdb); + t5b.genTest(type, xcdb); +}; -nocoTestSuite('graphql', false) +nocoTestSuite("graphql", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -43,7 +41,3 @@ nocoTestSuite('graphql', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/gqlTableOps.js b/scripts/cypress/integration/test/gqlTableOps.js index d383464843..986e4a4e5e 100644 --- a/scripts/cypress/integration/test/gqlTableOps.js +++ b/scripts/cypress/integration/test/gqlTableOps.js @@ -1,38 +1,36 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t1a = require('../common/1a_table_operations') -let t1b = require('../common/1b_table_column_operations') -let t2a = require('../common/2a_table_with_belongs_to_colulmn') -let t2b = require('../common/2b_table_with_m2m_column') -let t3a = require('../common/3a_filter_sort_fields_operations') -let t3b = require('../common/3b_formula_column') -let t3c = require('../common/3c_lookup_column') -let t3d = require('../common/3d_rollup_column') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t1a = require("../common/1a_table_operations"); +let t1b = require("../common/1b_table_column_operations"); +let t2a = require("../common/2a_table_with_belongs_to_colulmn"); +let t2b = require("../common/2b_table_with_m2m_column"); +let t3a = require("../common/3a_filter_sort_fields_operations"); +let t3b = require("../common/3b_formula_column"); +let t3c = require("../common/3c_lookup_column"); +let t3d = require("../common/3d_rollup_column"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { - - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t1a.genTest(type, xcdb) - t1b.genTest(type, xcdb) - t2a.genTest(type, xcdb) - t2b.genTest(type, xcdb) - t3a.genTest(type, xcdb) - t3b.genTest(type, xcdb) - t3c.genTest(type, xcdb) - t3d.genTest(type, xcdb) -} - -nocoTestSuite('graphql', false) + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } + + t1a.genTest(type, xcdb); + t1b.genTest(type, xcdb); + t2a.genTest(type, xcdb); + t2b.genTest(type, xcdb); + t3a.genTest(type, xcdb); + t3b.genTest(type, xcdb); + t3c.genTest(type, xcdb); + t3d.genTest(type, xcdb); +}; + +nocoTestSuite("graphql", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -55,7 +53,3 @@ nocoTestSuite('graphql', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/gqlViews.js b/scripts/cypress/integration/test/gqlViews.js index 754b8a81a3..fb79a9231b 100644 --- a/scripts/cypress/integration/test/gqlViews.js +++ b/scripts/cypress/integration/test/gqlViews.js @@ -1,34 +1,32 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t4a = require('../common/4a_table_view_grid_gallery_form') -let t4b = require('../common/4b_table_view_share') -let t4c = require('../common/4c_form_view_detailed') -let t4d = require('../common/4d_table_view_grid_locked') -let t4e = require('../common/4e_form_view_share') -let t4f = require('../common/4f_grid_view_share') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t4a = require("../common/4a_table_view_grid_gallery_form"); +let t4b = require("../common/4b_table_view_share"); +let t4c = require("../common/4c_form_view_detailed"); +let t4d = require("../common/4d_table_view_grid_locked"); +let t4e = require("../common/4e_form_view_share"); +let t4f = require("../common/4f_grid_view_share"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { - - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t4a.genTest(type, xcdb) - t4b.genTest(type, xcdb) - t4c.genTest(type, xcdb) - t4d.genTest(type, xcdb) - t4e.genTest(type, xcdb) - t4f.genTest(type, xcdb) -} - -nocoTestSuite('graphql', false) + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } + + t4a.genTest(type, xcdb); + t4b.genTest(type, xcdb); + t4c.genTest(type, xcdb); + t4d.genTest(type, xcdb); + t4e.genTest(type, xcdb); + t4f.genTest(type, xcdb); +}; + +nocoTestSuite("graphql", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -51,7 +49,3 @@ nocoTestSuite('graphql', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/masterSuiteGql.js b/scripts/cypress/integration/test/masterSuiteGql.js index 6a8df8549f..765b687b33 100644 --- a/scripts/cypress/integration/test/masterSuiteGql.js +++ b/scripts/cypress/integration/test/masterSuiteGql.js @@ -1,66 +1,64 @@ - -let t0 = require('./explicitLogin') -let t00 = require('../common/00_pre_configurations') -let t1a = require('../common/1a_table_operations') -let t1b = require('../common/1b_table_column_operations') -let t1c = require('../common/1c_table_row_operations') -let t2a = require('../common/2a_table_with_belongs_to_colulmn') -let t2b = require('../common/2b_table_with_m2m_column') -let t3a = require('../common/3a_filter_sort_fields_operations') -let t3b = require('../common/3b_formula_column') -let t3c = require('../common/3c_lookup_column') -let t3d = require('../common/3d_rollup_column') -let t4a = require('../common/4a_table_view_grid_gallery_form') -let t4b = require('../common/4b_table_view_share') -let t4c = require('../common/4c_form_view_detailed') -let t4d = require('../common/4d_table_view_grid_locked') -let t4e = require('../common/4e_form_view_share') -let t4f = require('../common/4f_grid_view_share') -let t5a = require('../common/5a_user_role') -let t5b = require('../common/5b_preview_role') +let t0 = require("./explicitLogin"); +let t00 = require("../common/00_pre_configurations"); +let t1a = require("../common/1a_table_operations"); +let t1b = require("../common/1b_table_column_operations"); +let t1c = require("../common/1c_table_row_operations"); +let t2a = require("../common/2a_table_with_belongs_to_colulmn"); +let t2b = require("../common/2b_table_with_m2m_column"); +let t3a = require("../common/3a_filter_sort_fields_operations"); +let t3b = require("../common/3b_formula_column"); +let t3c = require("../common/3c_lookup_column"); +let t3d = require("../common/3d_rollup_column"); +let t4a = require("../common/4a_table_view_grid_gallery_form"); +let t4b = require("../common/4b_table_view_share"); +let t4c = require("../common/4c_form_view_detailed"); +let t4d = require("../common/4d_table_view_grid_locked"); +let t4e = require("../common/4e_form_view_share"); +let t4f = require("../common/4f_grid_view_share"); +let t5a = require("../common/5a_user_role"); +let t5b = require("../common/5b_preview_role"); // merged with t1a: let t6a = require('../common/6a_audit') -let t6c = require('../common/6c_swagger_api') -let t6d = require('../common/6d_language_validation') -let t6e = require('../common/6e_project_operations') +let t6c = require("../common/6c_swagger_api"); +let t6d = require("../common/6d_language_validation"); +let t6e = require("../common/6e_project_operations"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t00.genTest(type, xcdb); + } - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t00.genTest(type, xcdb) - } - - t1a.genTest(type, xcdb) - t1b.genTest(type, xcdb) - // merged with t1b: t1c.genTest(type, xcdb) - t2a.genTest(type, xcdb) - t2b.genTest(type, xcdb) - t3a.genTest(type, xcdb) - t3b.genTest(type, xcdb) - t3c.genTest(type, xcdb) - t3d.genTest(type, xcdb) - t4a.genTest(type, xcdb) - t4b.genTest(type, xcdb) - t4c.genTest(type, xcdb) - t4d.genTest(type, xcdb) - t4e.genTest(type, xcdb) - t4f.genTest(type, xcdb) - t5a.genTest(type, xcdb) - t5b.genTest(type, xcdb) - // merged with t1a: t6a.genTest(type, xcdb) - t6c.genTest(type, xcdb) - t6d.genTest(type, xcdb) - // **deletes created project, hence place it @ end - t6e.genTest(type, xcdb) -} + t1a.genTest(type, xcdb); + t1b.genTest(type, xcdb); + // merged with t1b: t1c.genTest(type, xcdb) + t2a.genTest(type, xcdb); + t2b.genTest(type, xcdb); + t3a.genTest(type, xcdb); + t3b.genTest(type, xcdb); + t3c.genTest(type, xcdb); + t3d.genTest(type, xcdb); + t4a.genTest(type, xcdb); + t4b.genTest(type, xcdb); + t4c.genTest(type, xcdb); + t4d.genTest(type, xcdb); + t4e.genTest(type, xcdb); + t4f.genTest(type, xcdb); + t5a.genTest(type, xcdb); + t5b.genTest(type, xcdb); + // merged with t1a: t6a.genTest(type, xcdb) + t6c.genTest(type, xcdb); + t6d.genTest(type, xcdb); + // **deletes created project, hence place it @ end + t6e.genTest(type, xcdb); +}; // nocoTestSuite('rest', false) -nocoTestSuite('graphql', false) +nocoTestSuite("graphql", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -83,7 +81,3 @@ nocoTestSuite('graphql', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/masterSuiteRest.js b/scripts/cypress/integration/test/masterSuiteRest.js index 5a311985e9..3c9e9e0435 100644 --- a/scripts/cypress/integration/test/masterSuiteRest.js +++ b/scripts/cypress/integration/test/masterSuiteRest.js @@ -1,65 +1,63 @@ - -let t0 = require('./explicitLogin') -let t00 = require('../common/00_pre_configurations') -let t1a = require('../common/1a_table_operations') -let t1b = require('../common/1b_table_column_operations') -let t1c = require('../common/1c_table_row_operations') -let t2a = require('../common/2a_table_with_belongs_to_colulmn') -let t2b = require('../common/2b_table_with_m2m_column') -let t3a = require('../common/3a_filter_sort_fields_operations') -let t3b = require('../common/3b_formula_column') -let t3c = require('../common/3c_lookup_column') -let t3d = require('../common/3d_rollup_column') -let t4a = require('../common/4a_table_view_grid_gallery_form') -let t4b = require('../common/4b_table_view_share') -let t4c = require('../common/4c_form_view_detailed') -let t4d = require('../common/4d_table_view_grid_locked') -let t4e = require('../common/4e_form_view_share') -let t4f = require('../common/4f_grid_view_share') -let t5a = require('../common/5a_user_role') -let t5b = require('../common/5b_preview_role') +let t0 = require("./explicitLogin"); +let t00 = require("../common/00_pre_configurations"); +let t1a = require("../common/1a_table_operations"); +let t1b = require("../common/1b_table_column_operations"); +let t1c = require("../common/1c_table_row_operations"); +let t2a = require("../common/2a_table_with_belongs_to_colulmn"); +let t2b = require("../common/2b_table_with_m2m_column"); +let t3a = require("../common/3a_filter_sort_fields_operations"); +let t3b = require("../common/3b_formula_column"); +let t3c = require("../common/3c_lookup_column"); +let t3d = require("../common/3d_rollup_column"); +let t4a = require("../common/4a_table_view_grid_gallery_form"); +let t4b = require("../common/4b_table_view_share"); +let t4c = require("../common/4c_form_view_detailed"); +let t4d = require("../common/4d_table_view_grid_locked"); +let t4e = require("../common/4e_form_view_share"); +let t4f = require("../common/4f_grid_view_share"); +let t5a = require("../common/5a_user_role"); +let t5b = require("../common/5b_preview_role"); // merged with t1a: let t6a = require('../common/6a_audit') -let t6c = require('../common/6c_swagger_api') -let t6d = require('../common/6d_language_validation') -let t6e = require('../common/6e_project_operations') +let t6c = require("../common/6c_swagger_api"); +let t6d = require("../common/6d_language_validation"); +let t6e = require("../common/6e_project_operations"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t00.genTest(type, xcdb); + } - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t00.genTest(type, xcdb) - } - - t1a.genTest(type, xcdb) - t1b.genTest(type, xcdb) - // merged with t1b: t1c.genTest(type, xcdb) - t2a.genTest(type, xcdb) - t2b.genTest(type, xcdb) - t3a.genTest(type, xcdb) - t3b.genTest(type, xcdb) - t3c.genTest(type, xcdb) - t3d.genTest(type, xcdb) - t4a.genTest(type, xcdb) - t4b.genTest(type, xcdb) - t4c.genTest(type, xcdb) - t4d.genTest(type, xcdb) - t4e.genTest(type, xcdb) - t4f.genTest(type, xcdb) - t5a.genTest(type, xcdb) - t5b.genTest(type, xcdb) - // merged with t1a: t6a.genTest(type, xcdb) - t6c.genTest(type, xcdb) - t6d.genTest(type, xcdb) - // **deletes created project, hence place it @ end - t6e.genTest(type, xcdb) -} + t1a.genTest(type, xcdb); + t1b.genTest(type, xcdb); + // merged with t1b: t1c.genTest(type, xcdb) + t2a.genTest(type, xcdb); + t2b.genTest(type, xcdb); + t3a.genTest(type, xcdb); + t3b.genTest(type, xcdb); + t3c.genTest(type, xcdb); + t3d.genTest(type, xcdb); + t4a.genTest(type, xcdb); + t4b.genTest(type, xcdb); + t4c.genTest(type, xcdb); + t4d.genTest(type, xcdb); + t4e.genTest(type, xcdb); + t4f.genTest(type, xcdb); + t5a.genTest(type, xcdb); + t5b.genTest(type, xcdb); + // merged with t1a: t6a.genTest(type, xcdb) + t6c.genTest(type, xcdb); + t6d.genTest(type, xcdb); + // **deletes created project, hence place it @ end + t6e.genTest(type, xcdb); +}; -nocoTestSuite('rest', false) +nocoTestSuite("rest", false); // nocoTestSuite('graphql', false) /** @@ -83,7 +81,3 @@ nocoTestSuite('rest', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/restMisc.js b/scripts/cypress/integration/test/restMisc.js index eb07893353..27aa12bfe6 100644 --- a/scripts/cypress/integration/test/restMisc.js +++ b/scripts/cypress/integration/test/restMisc.js @@ -1,40 +1,38 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t6b = require('../common/6b_downloadCsv') -let t6c = require('../common/6c_swagger_api') -let t6d = require('../common/6d_language_validation') -let t6e = require('../common/6e_project_operations') -let t6f = require('../common/6f_attachments') -let t6g = require('../common/6g_base_share') -let t7a = require('../common/7a_create_project_from_excel') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t6b = require("../common/6b_downloadCsv"); +let t6c = require("../common/6c_swagger_api"); +let t6d = require("../common/6d_language_validation"); +let t6e = require("../common/6e_project_operations"); +let t6f = require("../common/6f_attachments"); +let t6g = require("../common/6g_base_share"); +let t7a = require("../common/7a_create_project_from_excel"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { - - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t6b.genTest(type, xcdb) - t6d.genTest(type, xcdb) - t6c.genTest(type, xcdb) - t6f.genTest(type, xcdb) - t6g.genTest(type, xcdb) - // **deletes created project, hence place it @ end - t6e.genTest(type, xcdb) - - // intended to keep this after earlier project deletion - // creates project using excel & deletes it - t7a.genTest(type, xcdb) -} - -nocoTestSuite('rest', false) + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } + + t6b.genTest(type, xcdb); + t6d.genTest(type, xcdb); + t6c.genTest(type, xcdb); + t6f.genTest(type, xcdb); + t6g.genTest(type, xcdb); + // **deletes created project, hence place it @ end + t6e.genTest(type, xcdb); + + // intended to keep this after earlier project deletion + // creates project using excel & deletes it + t7a.genTest(type, xcdb); +}; + +nocoTestSuite("rest", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -57,7 +55,3 @@ nocoTestSuite('rest', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/restRoles.js b/scripts/cypress/integration/test/restRoles.js index b2ed1a9bf7..cd6883ed1f 100644 --- a/scripts/cypress/integration/test/restRoles.js +++ b/scripts/cypress/integration/test/restRoles.js @@ -1,26 +1,24 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t5a = require('../common/5a_user_role') -let t5b = require('../common/5b_preview_role') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t5a = require("../common/5a_user_role"); +let t5b = require("../common/5b_preview_role"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t5a.genTest(type, xcdb) - t5b.genTest(type, xcdb) -} + t5a.genTest(type, xcdb); + t5b.genTest(type, xcdb); +}; -nocoTestSuite('rest', false) +nocoTestSuite("rest", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -43,7 +41,3 @@ nocoTestSuite('rest', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/restTableOps.js b/scripts/cypress/integration/test/restTableOps.js index ca34b0281c..8dca1dd522 100644 --- a/scripts/cypress/integration/test/restTableOps.js +++ b/scripts/cypress/integration/test/restTableOps.js @@ -1,38 +1,36 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t1a = require('../common/1a_table_operations') -let t1b = require('../common/1b_table_column_operations') -let t2a = require('../common/2a_table_with_belongs_to_colulmn') -let t2b = require('../common/2b_table_with_m2m_column') -let t3a = require('../common/3a_filter_sort_fields_operations') -let t3b = require('../common/3b_formula_column') -let t3c = require('../common/3c_lookup_column') -let t3d = require('../common/3d_rollup_column') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t1a = require("../common/1a_table_operations"); +let t1b = require("../common/1b_table_column_operations"); +let t2a = require("../common/2a_table_with_belongs_to_colulmn"); +let t2b = require("../common/2b_table_with_m2m_column"); +let t3a = require("../common/3a_filter_sort_fields_operations"); +let t3b = require("../common/3b_formula_column"); +let t3c = require("../common/3c_lookup_column"); +let t3d = require("../common/3d_rollup_column"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { - - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t1a.genTest(type, xcdb) - t1b.genTest(type, xcdb) - t2a.genTest(type, xcdb) - t2b.genTest(type, xcdb) - t3a.genTest(type, xcdb) - t3b.genTest(type, xcdb) - t3c.genTest(type, xcdb) - t3d.genTest(type, xcdb) -} - -nocoTestSuite('rest', false) + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } + + t1a.genTest(type, xcdb); + t1b.genTest(type, xcdb); + t2a.genTest(type, xcdb); + t2b.genTest(type, xcdb); + t3a.genTest(type, xcdb); + t3b.genTest(type, xcdb); + t3c.genTest(type, xcdb); + t3d.genTest(type, xcdb); +}; + +nocoTestSuite("rest", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -55,7 +53,3 @@ nocoTestSuite('rest', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/integration/test/restViews.js b/scripts/cypress/integration/test/restViews.js index ce226de41d..972d94e975 100644 --- a/scripts/cypress/integration/test/restViews.js +++ b/scripts/cypress/integration/test/restViews.js @@ -1,34 +1,32 @@ - -let t0 = require('./explicitLogin') -let t01 = require('../common/00_pre_configurations') -let t4a = require('../common/4a_table_view_grid_gallery_form') -let t4b = require('../common/4b_table_view_share') -let t4c = require('../common/4c_form_view_detailed') -let t4d = require('../common/4d_table_view_grid_locked') -let t4e = require('../common/4e_form_view_share') -let t4f = require('../common/4f_grid_view_share') +let t0 = require("./explicitLogin"); +let t01 = require("../common/00_pre_configurations"); +let t4a = require("../common/4a_table_view_grid_gallery_form"); +let t4b = require("../common/4b_table_view_share"); +let t4c = require("../common/4c_form_view_detailed"); +let t4d = require("../common/4d_table_view_grid_locked"); +let t4e = require("../common/4e_form_view_share"); +let t4f = require("../common/4f_grid_view_share"); // use 0 as mode to execute individual files (debug mode, skip pre-configs) // use 1 mode if noco.db doesnt contain user credentials (full run over GIT) -const executionMode = 1 +const executionMode = 1; const nocoTestSuite = (type, xcdb) => { - - if (0 == executionMode) { - t0.genTest(type, xcdb) - } else { - t01.genTest(type, xcdb) - } - - t4a.genTest(type, xcdb) - t4b.genTest(type, xcdb) - t4c.genTest(type, xcdb) - t4d.genTest(type, xcdb) - t4e.genTest(type, xcdb) - t4f.genTest(type, xcdb) -} - -nocoTestSuite('rest', false) + if (0 == executionMode) { + t0.genTest(type, xcdb); + } else { + t01.genTest(type, xcdb); + } + + t4a.genTest(type, xcdb); + t4b.genTest(type, xcdb); + t4c.genTest(type, xcdb); + t4d.genTest(type, xcdb); + t4e.genTest(type, xcdb); + t4f.genTest(type, xcdb); +}; + +nocoTestSuite("rest", false); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd @@ -51,7 +49,3 @@ nocoTestSuite('rest', false) * along with this program. If not, see . * */ - - - - diff --git a/scripts/cypress/plugins/index.js b/scripts/cypress/plugins/index.js index 2eb87c974d..f4e21e378a 100644 --- a/scripts/cypress/plugins/index.js +++ b/scripts/cypress/plugins/index.js @@ -11,10 +11,10 @@ // This function is called when a project is opened or re-opened (e.g. due to // the project's config changing) -const { rmdir } = require('fs') +const { rmdir } = require("fs"); // https://stackoverflow.com/questions/61934443/read-excel-files-in-cypress -const readXlsx = require('./read-xlsx') +const readXlsx = require("./read-xlsx"); /** * @type {Cypress.PluginConfig} @@ -25,28 +25,27 @@ module.exports = (on, config) => { // `config` is the resolved Cypress config // register utility tasks to read and parse Excel files - on('task', { - deleteFolder (folderName) { - console.log('deleting folder %s', folderName) + on("task", { + deleteFolder(folderName) { + console.log("deleting folder %s", folderName); return new Promise((resolve, reject) => { rmdir(folderName, { maxRetries: 10, recursive: true }, (err) => { if (err) { - console.error(err) + console.error(err); - return reject(err) + return reject(err); } - resolve(null) - }) - }) + resolve(null); + }); + }); }, - 'readXlsx': readXlsx.read, - 'readSheetList': readXlsx.sheetList, + readXlsx: readXlsx.read, + readSheetList: readXlsx.sheetList, log(message) { - console.log(message) - return null - } - }) -} - + console.log(message); + return null; + }, + }); +}; diff --git a/scripts/cypress/plugins/read-xlsx.js b/scripts/cypress/plugins/read-xlsx.js index 7ed5aa4648..acce4611ba 100644 --- a/scripts/cypress/plugins/read-xlsx.js +++ b/scripts/cypress/plugins/read-xlsx.js @@ -1,14 +1,14 @@ // https://stackoverflow.com/questions/61934443/read-excel-files-in-cypress -const fs = require('fs'); -const XLSX = require('xlsx'); +const fs = require("fs"); +const XLSX = require("xlsx"); -const read = ({file, sheet}) => { - const buf = fs.readFileSync(file); - const workbook = XLSX.read(buf, { type: 'buffer' }); - const rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]); - return rows -} +const read = ({ file, sheet }) => { + const buf = fs.readFileSync(file); + const workbook = XLSX.read(buf, { type: "buffer" }); + const rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]); + return rows; +}; // const read = ({file, sheet}) => { // const buf = fs.readFileSync(file); @@ -20,14 +20,14 @@ const read = ({file, sheet}) => { // return rows // } -const sheetList = ({file}) => { - const buf = fs.readFileSync(file); - const workbook = XLSX.read(buf, { type: 'buffer' }); - const rows = workbook.SheetNames - return rows -} +const sheetList = ({ file }) => { + const buf = fs.readFileSync(file); + const workbook = XLSX.read(buf, { type: "buffer" }); + const rows = workbook.SheetNames; + return rows; +}; module.exports = { - read, - sheetList, -} \ No newline at end of file + read, + sheetList, +}; diff --git a/scripts/cypress/support/commands.js b/scripts/cypress/support/commands.js index 00b6d121ea..f0331a4246 100644 --- a/scripts/cypress/support/commands.js +++ b/scripts/cypress/support/commands.js @@ -24,259 +24,272 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -import 'cypress-file-upload'; +import "cypress-file-upload"; -require('@4tw/cypress-drag-drop') +require("@4tw/cypress-drag-drop"); // for waiting until page load -Cypress.Commands.add('waitForSpinners', () => { - cy.visit('http://localhost:3000', { +Cypress.Commands.add("waitForSpinners", () => { + cy.visit("http://localhost:3000", { retryOnNetworkFailure: true, timeout: 1200000, headers: { - "Accept-Encoding": "gzip, deflate" - } - }) - cy.get('#nuxt-loading', {timeout: 10_0000}).should('have.length', 0) -}) - + "Accept-Encoding": "gzip, deflate", + }, + }); + cy.get("#nuxt-loading", { timeout: 10_0000 }).should("have.length", 0); +}); -Cypress.Commands.add('signinOrSignup', (_args) => { - const args = Object.assign({username: 'user@nocodb.com', password: 'Password123.'}, _args) +Cypress.Commands.add("signinOrSignup", (_args) => { + const args = Object.assign( + { username: "user@nocodb.com", password: "Password123." }, + _args + ); // signin/signup - cy.get('body').then(($body) => { + cy.get("body").then(($body) => { // cy.wait(1000) - cy.url().then(url => { - if (!url.includes('/projects')) { + cy.url().then((url) => { + if (!url.includes("/projects")) { // handle initial load - if ($body.find('.welcome-page').length > 0) { + if ($body.find(".welcome-page").length > 0) { cy.wait(8000); - cy.get('body').trigger('mousemove'); - cy.contains('Let\'s Begin').click(); + cy.get("body").trigger("mousemove"); + cy.contains("Let's Begin").click(); cy.get('input[type="text"]', { timeout: 12000 }).type(args.username); cy.get('input[type="password"]').type(args.password); - cy.get('button:contains("SIGN UP")').click() + cy.get('button:contains("SIGN UP")').click(); // handle signin } else { cy.get('input[type="text"]', { timeout: 12000 }).type(args.username); cy.get('input[type="password"]').type(args.password); - cy.get('button:contains("SIGN IN")').click() + cy.get('button:contains("SIGN IN")').click(); } } - }) - }) + }); + }); // indicates page-load complete - cy.get('.nc-noco-brand-icon', { timeout: 12000 }).should('exist') + cy.get(".nc-noco-brand-icon", { timeout: 12000 }).should("exist"); }); // for opening/creating a rest project -Cypress.Commands.add('openOrCreateRestProject', (_args) => { - const args = Object.assign({new: false}, _args) - - // signin/signup - cy.signinOrSignup() - cy.get('.nc-new-project-menu').should('exist') - cy.get('body').then($body => { - const filter = args.meta ? '.nc-meta-project-row' : ':not(.nc-meta-project-row)'; - // if project exist open - if ($body.find('.nc-rest-project-row').filter(filter).length && !args.new) { - cy.get('.nc-rest-project-row').filter(filter).first().click() +Cypress.Commands.add("openOrCreateRestProject", (_args) => { + const args = Object.assign({ new: false }, _args); + + // signin/signup + cy.signinOrSignup(); + cy.get(".nc-new-project-menu").should("exist"); + cy.get("body").then(($body) => { + const filter = args.meta + ? ".nc-meta-project-row" + : ":not(.nc-meta-project-row)"; + // if project exist open + if ($body.find(".nc-rest-project-row").filter(filter).length && !args.new) { + cy.get(".nc-rest-project-row").filter(filter).first().click(); + } else { + cy.contains("New Project").trigger("onmouseover").trigger("mouseenter"); + if (args.meta) { + cy.get(".nc-create-xc-db-project").click(); + cy.url({ timeout: 6000 }).should("contain", "#/project/xcdb"); + cy.get(".nc-metadb-project-name").type("test_proj" + Date.now()); + cy.contains("button", "Create", { timeout: 3000 }).click(); } else { - cy.contains('New Project').trigger('onmouseover').trigger('mouseenter'); - if (args.meta) { - cy.get('.nc-create-xc-db-project').click() - cy.url({timeout: 6000}).should('contain', '#/project/xcdb') - cy.get('.nc-metadb-project-name').type('test_proj' + Date.now()) - cy.contains('button','Create', {timeout: 3000}).click() - } else { - cy.get('.nc-create-external-db-project').click() - cy.url({timeout: 6000}).should('contain', '#/project') - cy.get('.database-field input').click().clear().type('sakila') - cy.contains('Test Database Connection').click() - cy.contains('Ok & Save Project', {timeout: 3000}).click() - } + cy.get(".nc-create-external-db-project").click(); + cy.url({ timeout: 6000 }).should("contain", "#/project"); + cy.get(".database-field input").click().clear().type("sakila"); + cy.contains("Test Database Connection").click(); + cy.contains("Ok & Save Project", { timeout: 3000 }).click(); } - }) - cy.url({timeout: 20000}).should('contain', '#/nc/') - - } -) + } + }); + cy.url({ timeout: 20000 }).should("contain", "#/nc/"); +}); // tn: table name // rc: row count. validate row count if rc!=0 -Cypress.Commands.add('openTableTab', (tn, rc) => { - cy.get('.nc-project-tree') - .find('.v-list-item__title:contains(Tables)', { timeout: 10000 }) - .should('exist') - .first().click() +Cypress.Commands.add("openTableTab", (tn, rc) => { + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) + .should("exist") + .first() + .click(); - cy.get('.nc-project-tree') + cy.get(".nc-project-tree") .contains(tn, { timeout: 6000 }) .first() .click({ force: true }); - cy.get(`.project-tab:contains(${tn}):visible`) - .should('exist') + cy.get(`.project-tab:contains(${tn}):visible`).should("exist"); + + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) + .first() + .click(); - cy.get('.nc-project-tree') - .find('.v-list-item__title:contains(Tables)', { timeout: 10000 }) - .first().click() - // wait for page rendering to complete if (rc != 0) { - cy.get('.nc-grid-row').should('have.length', rc) + cy.get(".nc-grid-row").should("have.length", rc); } -}) +}); -Cypress.Commands.add('closeTableTab', (tn) => { - cy.get(`[href="#table||db||${tn}"]`).find('button.mdi-close').click() -}) +Cypress.Commands.add("closeTableTab", (tn) => { + cy.get(`[href="#table||db||${tn}"]`).find("button.mdi-close").click(); +}); -Cypress.Commands.add('openOrCreateGqlProject', (_args) => { - const args = Object.assign({new: false, meta: false}, _args) +Cypress.Commands.add("openOrCreateGqlProject", (_args) => { + const args = Object.assign({ new: false, meta: false }, _args); - cy.signinOrSignup() + cy.signinOrSignup(); - cy.get('.nc-new-project-menu').should('exist') - cy.get('body').then($body => { - const filter = args.meta ? '.nc-meta-project-row' : ':not(.nc-meta-project-row)'; + cy.get(".nc-new-project-menu").should("exist"); + cy.get("body").then(($body) => { + const filter = args.meta + ? ".nc-meta-project-row" + : ":not(.nc-meta-project-row)"; // if project exist open - if ($body.find('.nc-graphql-project-row').filter(filter).length && !args.new) { - cy.get('.nc-graphql-project-row').filter(filter).first().click() + if ( + $body.find(".nc-graphql-project-row").filter(filter).length && + !args.new + ) { + cy.get(".nc-graphql-project-row").filter(filter).first().click(); } else { - cy.contains('New Project').trigger('onmouseover').trigger('mouseenter'); + cy.contains("New Project").trigger("onmouseover").trigger("mouseenter"); if (args.meta) { - cy.get('.nc-create-xc-db-project').click() - cy.url({timeout: 6000}).should('contain', '#/project/xcdb') - cy.contains('GRAPHQL APIs').closest('label').click(); - cy.get('.nc-metadb-project-name').type('test_proj' + Date.now()) - cy.contains('button','Create', {timeout: 3000}).click() + cy.get(".nc-create-xc-db-project").click(); + cy.url({ timeout: 6000 }).should("contain", "#/project/xcdb"); + cy.contains("GRAPHQL APIs").closest("label").click(); + cy.get(".nc-metadb-project-name").type("test_proj" + Date.now()); + cy.contains("button", "Create", { timeout: 3000 }).click(); } else { - cy.get('.nc-create-external-db-project').click() - cy.url({timeout: 6000}).should('contain', '#/project') - cy.contains('GRAPHQL APIs').closest('label').click() - cy.get('.database-field input').click().clear().type('sakila') - cy.contains('Test Database Connection').click() - cy.contains('Ok & Save Project', {timeout: 3000}).click() + cy.get(".nc-create-external-db-project").click(); + cy.url({ timeout: 6000 }).should("contain", "#/project"); + cy.contains("GRAPHQL APIs").closest("label").click(); + cy.get(".database-field input").click().clear().type("sakila"); + cy.contains("Test Database Connection").click(); + cy.contains("Ok & Save Project", { timeout: 3000 }).click(); } } - }) - cy.url({timeout: 20000}).should('contain', '#/nc/') - -}) + }); + cy.url({ timeout: 20000 }).should("contain", "#/nc/"); +}); let LOCAL_STORAGE_MEMORY = {}; Cypress.Commands.add("saveLocalStorage", () => { - Object.keys(localStorage).forEach(key => { + Object.keys(localStorage).forEach((key) => { LOCAL_STORAGE_MEMORY[key] = localStorage[key]; }); }); Cypress.Commands.add("restoreLocalStorage", () => { - Object.keys(LOCAL_STORAGE_MEMORY).forEach(key => { + Object.keys(LOCAL_STORAGE_MEMORY).forEach((key) => { localStorage.setItem(key, LOCAL_STORAGE_MEMORY[key]); }); }); Cypress.Commands.add("getActiveModal", () => { - return cy.get('.v-dialog.v-dialog--active').last() + return cy.get(".v-dialog.v-dialog--active").last(); }); Cypress.Commands.add("getActiveMenu", () => { - return cy.get('.menuable__content__active').last() + return cy.get(".menuable__content__active").last(); }); Cypress.Commands.add("getActiveContentModal", () => { - return cy.get('.v-dialog__content--active').last() + return cy.get(".v-dialog__content--active").last(); }); +Cypress.Commands.add("createTable", (name) => { + cy.get(".add-btn").click(); + cy.get('.nc-create-table-card .nc-table-name input[type="text"]') + .first() + .click() + .clear() + .type(name); + cy.get('.nc-create-table-card .nc-table-name-alias input[type="text"]') + .first() + .should("have.value", name.toLowerCase()); + cy.get(".nc-create-table-card .nc-create-table-submit").first().click(); + cy.toastWait(`Create table.${name} successful`); + cy.get(`.project-tab:contains(${name})`).should("exist"); + cy.url().should("contain", `name=${name}`); +}); -Cypress.Commands.add('createTable', (name) => { - cy.get('.add-btn').click(); - cy.get('.nc-create-table-card .nc-table-name input[type="text"]').first().click().clear().type(name) - cy.get('.nc-create-table-card .nc-table-name-alias input[type="text"]').first().should('have.value', name.toLowerCase()) - cy.get('.nc-create-table-card .nc-create-table-submit').first().click() - cy.toastWait(`Create table.${name} successful`) - cy.get(`.project-tab:contains(${name})`).should('exist') - cy.url().should('contain', `name=${name}`) -}) - -Cypress.Commands.add('deleteTable', (name) => { - cy.get('.nc-project-tree').find('.v-list-item__title:contains(Tables)', {timeout: 10000}) - .first().click() - cy.get('.nc-project-tree').contains(name, {timeout: 6000}).first().click({force: true}); - cy.get(`.project-tab:contains(${name}):visible`).should('exist') - cy.get('.nc-table-delete-btn:visible').click() - cy.get('button:contains(Submit)').click() - cy.toastWait(`Delete table.${name} successful`) -}) - -Cypress.Commands.add('renameTable', (oldName, newName) => { +Cypress.Commands.add("deleteTable", (name) => { + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) + .first() + .click(); + cy.get(".nc-project-tree") + .contains(name, { timeout: 6000 }) + .first() + .click({ force: true }); + cy.get(`.project-tab:contains(${name}):visible`).should("exist"); + cy.get(".nc-table-delete-btn:visible").click(); + cy.get("button:contains(Submit)").click(); + cy.toastWait(`Delete table.${name} successful`); +}); + +Cypress.Commands.add("renameTable", (oldName, newName) => { // expand project tree - cy.get('.nc-project-tree') - .find('.v-list-item__title:contains(Tables)', { timeout: 10000 }) + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) .first() - .click() + .click(); // right click on project table name - cy.get('.nc-project-tree') + cy.get(".nc-project-tree") .contains(oldName, { timeout: 6000 }) .first() - .rightclick() + .rightclick(); // choose rename option from menu cy.getActiveMenu() .find('[role="menuitem"]') - .contains('Table Rename') - .click({ force: true }) - + .contains("Table Rename") + .click({ force: true }); + // feed new name - cy.getActiveContentModal() - .find('input') - .clear() - .type(newName) + cy.getActiveContentModal().find("input").clear().type(newName); // submit - cy.getActiveContentModal() - .find('button') - .contains('Submit') - .click() - - cy.toastWait('Table renamed successfully') + cy.getActiveContentModal().find("button").contains("Submit").click(); - // close expanded project tree - cy.get('.nc-project-tree') - .find('.v-list-item__title:contains(Tables)', { timeout: 10000 }) + cy.toastWait("Table renamed successfully"); + + // close expanded project tree + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) .first() - .click() - }) + .click(); +}); -Cypress.Commands.add('createColumn', (table, columnName) => { - cy.get('.nc-project-tree').find('.v-list-item__title:contains(Tables)', {timeout: 10000}) - .first().click() - cy.get('.nc-project-tree').contains(table, {timeout: 6000}).first().click({force: true}); - cy.get(`.project-tab:contains(${table}):visible`).should('exist') - cy.get('.v-window-item--active .nc-grid tr > th:last button').click({force: true}); - cy.get('.nc-column-name-input input').clear().type(columnName) - cy.get('.nc-col-create-or-edit-card').contains('Save').click() - cy - .get('th:contains(new_column)') - .should('exist'); -}) - -Cypress.Commands.add('toastWait', (msg) => { - cy.get('.toasted:visible', { timout: 6000 }) - .contains(msg) - .should('exist') - cy.get('.toasted:visible', { timout: 6000 }) - .contains(msg) - .should('not.exist') -}) +Cypress.Commands.add("createColumn", (table, columnName) => { + cy.get(".nc-project-tree") + .find(".v-list-item__title:contains(Tables)", { timeout: 10000 }) + .first() + .click(); + cy.get(".nc-project-tree") + .contains(table, { timeout: 6000 }) + .first() + .click({ force: true }); + cy.get(`.project-tab:contains(${table}):visible`).should("exist"); + cy.get(".v-window-item--active .nc-grid tr > th:last button").click({ + force: true, + }); + cy.get(".nc-column-name-input input").clear().type(columnName); + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); + cy.get("th:contains(new_column)").should("exist"); +}); +Cypress.Commands.add("toastWait", (msg) => { + cy.get(".toasted:visible", { timout: 6000 }).contains(msg).should("exist"); + cy.get(".toasted:visible", { timout: 6000 }) + .contains(msg) + .should("not.exist"); +}); // Drag n Drop // refer: https://stackoverflow.com/a/55409853 @@ -388,5 +401,3 @@ Cypress.Commands.addAll( } ) */ - - diff --git a/scripts/cypress/support/index.js b/scripts/cypress/support/index.js index 8fa679ba69..87f8976576 100644 --- a/scripts/cypress/support/index.js +++ b/scripts/cypress/support/index.js @@ -14,20 +14,19 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands' +import "./commands"; // https://www.cypress.io/blog/2020/02/12/working-with-iframes-in-cypress/ -import 'cypress-iframe' +import "cypress-iframe"; // Alternatively you can use CommonJS syntax: // require('./commands') - -Cypress.on('uncaught:exception', (err, runnable) => { +Cypress.on("uncaught:exception", (err, runnable) => { // returning false here prevents Cypress from // failing the test - console.log('uncaught:exception') - console.log(err) - console.log(runnable) - return false -}) + console.log("uncaught:exception"); + console.log(err); + console.log(runnable); + return false; +}); diff --git a/scripts/cypress/support/page_objects/mainPage.js b/scripts/cypress/support/page_objects/mainPage.js index 9ccad6a306..91c7efa232 100644 --- a/scripts/cypress/support/page_objects/mainPage.js +++ b/scripts/cypress/support/page_objects/mainPage.js @@ -1,4 +1,3 @@ - const path = require("path"); /** @@ -6,334 +5,384 @@ const path = require("path"); * slate before starting. */ export const deleteDownloadsFolder = () => { - const downloadsFolder = Cypress.config('downloadsFolder') + const downloadsFolder = Cypress.config("downloadsFolder"); - cy.task('deleteFolder', downloadsFolder) -} + cy.task("deleteFolder", downloadsFolder); +}; // main page export class _mainPage { - - constructor() { - - // Top Right items - this.SHARE = 0 - this.THEME_BODY = 1 - this.THEME_HEADER = 2 - this.ALERT = 3 - this.LANGUAGE = 4 - this.USER = 5 - - // Top Left items - this.HOME = 0 - this.GIT_HOME = 1 - this.GIT_STAR = 2 - this.GIT_DOCS = 3 - - this.AUDIT = 0 - this.APPSTORE = 2 - this.TEAM_N_AUTH = 3 - this.PROJ_METADATA = 4 - this.ROLE_VIEW = 5 - this.ROLE_VIEW_EDITOR = 6 - this.ROLE_VIEW_COMMENTER = 7 - this.ROLE_VIEW_VIEWER = 8 - this.ROLE_VIEW_RESET = 9 - - this.roleURL = {} - } - - toolBarTopLeft(toolBarItem) { - return cy.get('header.v-toolbar', {timeout: 20000}).eq(0).find('a').eq(toolBarItem) + constructor() { + // Top Right items + this.SHARE = 0; + this.THEME_BODY = 1; + this.THEME_HEADER = 2; + this.ALERT = 3; + this.LANGUAGE = 4; + this.USER = 5; + + // Top Left items + this.HOME = 0; + this.GIT_HOME = 1; + this.GIT_STAR = 2; + this.GIT_DOCS = 3; + + this.AUDIT = 0; + this.APPSTORE = 2; + this.TEAM_N_AUTH = 3; + this.PROJ_METADATA = 4; + this.ROLE_VIEW = 5; + this.ROLE_VIEW_EDITOR = 6; + this.ROLE_VIEW_COMMENTER = 7; + this.ROLE_VIEW_VIEWER = 8; + this.ROLE_VIEW_RESET = 9; + + this.roleURL = {}; + } + + toolBarTopLeft(toolBarItem) { + return cy + .get("header.v-toolbar", { timeout: 20000 }) + .eq(0) + .find("a") + .eq(toolBarItem); + } + + toolBarTopRight(toolBarItem) { + return cy + .get("header.v-toolbar", { timeout: 20000 }) + .eq(0) + .find("button") + .eq(toolBarItem); + } + + navigationDraw(item) { + // if (item == this.ROLE_VIEW) + // return cy.get('.nc-nav-drawer').find('.v-list').last() + // else + // return cy.get('.nc-nav-drawer').find('.v-list > .v-list-item').eq(item) + + switch (item) { + case this.AUDIT: + return cy.get(".nc-treeview-item-Audit"); + case this.APPSTORE: + return cy.get(".nc-settings-appstore"); + case this.TEAM_N_AUTH: + return cy.get(".nc-settings-teamauth"); + case this.PROJ_METADATA: + return cy.get(".nc-settings-projmeta"); + case this.ROLE_VIEW_EDITOR: + return cy.get(".nc-preview-editor"); + case this.ROLE_VIEW_COMMENTER: + return cy.get(".nc-preview-commenter"); + case this.ROLE_VIEW_VIEWER: + return cy.get(".nc-preview-viewer"); + case this.ROLE_VIEW_RESET: + return cy.get(".nc-preview-reset"); } - - toolBarTopRight(toolBarItem) { - return cy.get('header.v-toolbar', {timeout: 20000}).eq(0).find('button').eq(toolBarItem) - } - - navigationDraw(item) { - // if (item == this.ROLE_VIEW) - // return cy.get('.nc-nav-drawer').find('.v-list').last() - // else - // return cy.get('.nc-nav-drawer').find('.v-list > .v-list-item').eq(item) - - switch (item) { - case this.AUDIT: - return cy.get('.nc-treeview-item-Audit') - case this.APPSTORE: - return cy.get('.nc-settings-appstore') - case this.TEAM_N_AUTH: - return cy.get('.nc-settings-teamauth') - case this.PROJ_METADATA: - return cy.get('.nc-settings-projmeta') - case this.ROLE_VIEW_EDITOR: - return cy.get('.nc-preview-editor') - case this.ROLE_VIEW_COMMENTER: - return cy.get('.nc-preview-commenter') - case this.ROLE_VIEW_VIEWER: - return cy.get('.nc-preview-viewer') - case this.ROLE_VIEW_RESET: - return cy.get('.nc-preview-reset') - } - } - - - // add new user to specified role + } + + // add new user to specified role + // + addNewUserToProject = (userCred, roleType) => { + let linkText; + + // click on New User button, feed details + cy.get('button:contains("New User")').first().click(); + cy.get('label:contains("Email")') + .next("input") + .type(userCred.username) + .trigger("input"); + cy.get('label:contains("Select User roles")').click(); + + // opt-in requested role & submit + cy.getActiveMenu().contains(roleType).click(); + cy.get(".nc-invite-or-save-btn").click(); + + cy.toastWait("Successfully updated the user details"); + + // get URL, invoke + cy.getActiveModal() + .find(".v-alert") + .then(($obj) => { + linkText = $obj.text().trim(); + cy.log(linkText); + this.roleURL[roleType] = linkText; + + cy.get("body").click("right"); + }); + }; + + addExistingUserToProject = (emailId, role) => { + cy.get('.v-list-item:contains("Team & Auth")').click(); + cy.get(`tr:contains(${emailId})`) + .find(".mdi-plus", { timeout: 2000 }) + .click(); + cy.get(`tr:contains(${emailId})`) + .find(".mdi-pencil-outline", { timeout: 2000 }) + .click(); + + cy.get("label:contains(Select User roles)").click(); + + // opt-in requested role & submit // - addNewUserToProject = (userCred, roleType) => { - - let linkText - - // click on New User button, feed details - cy.get('button:contains("New User")').first().click() - cy.get('label:contains("Email")').next('input').type(userCred.username).trigger('input') - cy.get('label:contains("Select User roles")').click() - - // opt-in requested role & submit - cy.getActiveMenu().contains(roleType).click() - cy.get('.nc-invite-or-save-btn').click() - - cy.toastWait('Successfully updated the user details') - - // get URL, invoke - cy.getActiveModal().find('.v-alert').then(($obj) => { - linkText = $obj.text().trim() - cy.log(linkText) - this.roleURL[roleType] = linkText - - cy.get('body').click('right') - }) - } - - addExistingUserToProject = (emailId, role) => { - - cy.get('.v-list-item:contains("Team & Auth")').click() - cy.get(`tr:contains(${emailId})`).find('.mdi-plus', { timeout: 2000 }).click() - cy.get(`tr:contains(${emailId})`).find('.mdi-pencil-outline', { timeout: 2000 }).click() - - cy.get('label:contains(Select User roles)').click() - - // opt-in requested role & submit - // - cy.getActiveMenu().contains(role).click() - cy.get('.nc-invite-or-save-btn').click() - cy.toastWait('Successfully updated the user details') - - this.roleURL[role] = "http://localhost:3000/#/user/authentication/signin" - } - - getCell = (columnHeader, cellNumber) => { - return cy.get(`tbody > :nth-child(${cellNumber}) > [data-col="${columnHeader}"]`) - } - - getPagination = (pageNumber) => { - if (pageNumber == '<') - return cy.get('.nc-pagination .v-pagination > li:first-child') - if (pageNumber == '>') - return cy.get('.nc-pagination .v-pagination > li:last-child') - - return cy.get(`.nc-pagination .v-pagination > li:contains(${pageNumber}) button`) - } - - getRow = (rowIndex) => { - return cy.get('.xc-row-table').find('tr').eq(rowIndex) - } - - addColumn = (colName, tableName) => { - cy.get('.v-window-item--active .nc-grid tr > th:last button').click({ force: true }); - cy.get('.nc-column-name-input input', { timeout: 3000 }).clear().type(colName) - cy.get('.nc-col-create-or-edit-card').contains('Save').click() - cy.toastWait(`Update table.${tableName} successful`) - } - - addColumnWithType = (colName, colType, tableName) => { - cy.get('.v-window-item--active .nc-grid tr > th:last button').click({ force: true }); - cy.get('.nc-column-name-input input', { timeout: 3000 }).clear().type(colName) - - // Column data type: to be set to lookup in this context - cy.get('.nc-ui-dt-dropdown').click() - cy.getActiveMenu().contains(colType).click() - - cy.get('.nc-col-create-or-edit-card').contains('Save').click() - cy.toastWait(`Update table.${tableName} successful`) - } - - deleteColumn = (colName) => { - cy.get(`th:contains(${colName}) .mdi-menu-down`) - .trigger('mouseover') - .click() - - cy.get('.nc-column-delete', {timeout: 5000}).click() - cy.get('button:contains(Confirm)').click() - } - - getAuthToken = () => { - let obj = JSON.parse(localStorage['vuex']) - return obj["users"]["token"] - } - - configureSMTP = (from, host, port, secure) => { - cy.get('.v-card__title.title') - .contains('SMTP') - .parents('.elevatio') - .find('button') - .contains(" Install ") - .click({ force: true }) - cy.getActiveModal().find('[placeholder="eg: admin@example.com"]').click().type(from) - cy.getActiveModal().find('[placeholder="eg: smtp.example.com"]').click().type(host) - cy.getActiveModal().find('[placeholder="Port"]').click().type(port) - cy.getActiveModal().find('[placeholder="Secure"]').click().type(secure) - cy.getActiveModal().find('button').contains('Save').click() - cy.toastWait('Successfully installed and email notification will use SMTP configuration') - } - - resetSMTP = () => { - cy.get('.v-card__title.title') - .contains('SMTP') - .parents('.elevatio') - .find('button') - .contains(" Reset ") - .click({ force: true }) - cy.getActiveModal().find('button').contains('Submit').click() - cy.toastWait('Plugin uninstalled successfully') - } - - hideField = (field) => { - cy.get('.nc-grid-header-cell').contains(field).should('be.visible') - cy.get('.nc-fields-menu-btn').click() - cy.get(`.menuable__content__active .v-list-item label:contains(${field})`).click() - cy.get('.nc-fields-menu-btn').click() - cy.get('.nc-grid-header-cell').contains(field).should('not.be.visible') - } - - unhideField = (field) => { - cy.get('.nc-grid-header-cell').contains(field).should('not.be.visible') - cy.get('.nc-fields-menu-btn').click() - cy.get(`.menuable__content__active .v-list-item label:contains(${field})`).click() - cy.get('.nc-fields-menu-btn').click() - cy.get('.nc-grid-header-cell').contains(field).should('be.visible') - } - - sortField = (field, criteria) => { - cy.get('.nc-sort-menu-btn').click() - cy.contains('Add Sort Option').click(); - cy.get('.nc-sort-field-select div').first().click() - cy.get(`.menuable__content__active .v-list-item:contains(${field})`).click() - cy.get('.nc-sort-dir-select div').first().click() - cy.get(`.menuable__content__active .v-list-item:contains(${criteria})`).click() - cy.get('.nc-sort-menu-btn').click() - } - - clearSort = () => { - cy.get('.nc-sort-menu-btn').click() - cy.get('.nc-sort-item-remove-btn').click() - cy.get('.nc-sort-menu-btn').click() + cy.getActiveMenu().contains(role).click(); + cy.get(".nc-invite-or-save-btn").click(); + cy.toastWait("Successfully updated the user details"); + + this.roleURL[role] = "http://localhost:3000/#/user/authentication/signin"; + }; + + getCell = (columnHeader, cellNumber) => { + return cy.get( + `tbody > :nth-child(${cellNumber}) > [data-col="${columnHeader}"]` + ); + }; + + getPagination = (pageNumber) => { + if (pageNumber == "<") + return cy.get(".nc-pagination .v-pagination > li:first-child"); + if (pageNumber == ">") + return cy.get(".nc-pagination .v-pagination > li:last-child"); + + return cy.get( + `.nc-pagination .v-pagination > li:contains(${pageNumber}) button` + ); + }; + + getRow = (rowIndex) => { + return cy.get(".xc-row-table").find("tr").eq(rowIndex); + }; + + addColumn = (colName, tableName) => { + cy.get(".v-window-item--active .nc-grid tr > th:last button").click({ + force: true, + }); + cy.get(".nc-column-name-input input", { timeout: 3000 }) + .clear() + .type(colName); + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); + cy.toastWait(`Update table.${tableName} successful`); + }; + + addColumnWithType = (colName, colType, tableName) => { + cy.get(".v-window-item--active .nc-grid tr > th:last button").click({ + force: true, + }); + cy.get(".nc-column-name-input input", { timeout: 3000 }) + .clear() + .type(colName); + + // Column data type: to be set to lookup in this context + cy.get(".nc-ui-dt-dropdown").click(); + cy.getActiveMenu().contains(colType).click(); + + cy.get(".nc-col-create-or-edit-card").contains("Save").click(); + cy.toastWait(`Update table.${tableName} successful`); + }; + + deleteColumn = (colName) => { + cy.get(`th:contains(${colName}) .mdi-menu-down`) + .trigger("mouseover") + .click(); + + cy.get(".nc-column-delete", { timeout: 5000 }).click(); + cy.get("button:contains(Confirm)").click(); + }; + + getAuthToken = () => { + let obj = JSON.parse(localStorage["vuex"]); + return obj["users"]["token"]; + }; + + configureSMTP = (from, host, port, secure) => { + cy.get(".v-card__title.title") + .contains("SMTP") + .parents(".elevatio") + .find("button") + .contains(" Install ") + .click({ force: true }); + cy.getActiveModal() + .find('[placeholder="eg: admin@example.com"]') + .click() + .type(from); + cy.getActiveModal() + .find('[placeholder="eg: smtp.example.com"]') + .click() + .type(host); + cy.getActiveModal().find('[placeholder="Port"]').click().type(port); + cy.getActiveModal().find('[placeholder="Secure"]').click().type(secure); + cy.getActiveModal().find("button").contains("Save").click(); + cy.toastWait( + "Successfully installed and email notification will use SMTP configuration" + ); + }; + + resetSMTP = () => { + cy.get(".v-card__title.title") + .contains("SMTP") + .parents(".elevatio") + .find("button") + .contains(" Reset ") + .click({ force: true }); + cy.getActiveModal().find("button").contains("Submit").click(); + cy.toastWait("Plugin uninstalled successfully"); + }; + + hideField = (field) => { + cy.get(".nc-grid-header-cell").contains(field).should("be.visible"); + cy.get(".nc-fields-menu-btn").click(); + cy.get( + `.menuable__content__active .v-list-item label:contains(${field})` + ).click(); + cy.get(".nc-fields-menu-btn").click(); + cy.get(".nc-grid-header-cell").contains(field).should("not.be.visible"); + }; + + unhideField = (field) => { + cy.get(".nc-grid-header-cell").contains(field).should("not.be.visible"); + cy.get(".nc-fields-menu-btn").click(); + cy.get( + `.menuable__content__active .v-list-item label:contains(${field})` + ).click(); + cy.get(".nc-fields-menu-btn").click(); + cy.get(".nc-grid-header-cell").contains(field).should("be.visible"); + }; + + sortField = (field, criteria) => { + cy.get(".nc-sort-menu-btn").click(); + cy.contains("Add Sort Option").click(); + cy.get(".nc-sort-field-select div").first().click(); + cy.get( + `.menuable__content__active .v-list-item:contains(${field})` + ).click(); + cy.get(".nc-sort-dir-select div").first().click(); + cy.get( + `.menuable__content__active .v-list-item:contains(${criteria})` + ).click(); + cy.get(".nc-sort-menu-btn").click(); + }; + + clearSort = () => { + cy.get(".nc-sort-menu-btn").click(); + cy.get(".nc-sort-item-remove-btn").click(); + cy.get(".nc-sort-menu-btn").click(); + }; + + filterField = (field, operation, value) => { + cy.get(".nc-filter-menu-btn").click(); + cy.contains("Add Filter").click(); + + cy.get(".nc-filter-field-select").last().click(); + cy.getActiveMenu().find(`.v-list-item:contains(${field})`).first().click(); + cy.get(".nc-filter-operation-select").last().click(); + cy.getActiveMenu().find(`.v-list-item:contains(${operation})`).click(); + if (operation != "is null" && operation != "is not null") { + cy.get(".nc-filter-value-select input:text").last().type(`${value}`); } - filterField = (field, operation, value) => { - cy.get('.nc-filter-menu-btn').click() - cy.contains('Add Filter').click(); - - cy.get('.nc-filter-field-select').last().click(); - cy.getActiveMenu().find(`.v-list-item:contains(${field})`).first().click() - cy.get('.nc-filter-operation-select').last().click(); - cy.getActiveMenu().find(`.v-list-item:contains(${operation})`).click() - if ((operation != 'is null') && (operation != 'is not null')) { - cy.get('.nc-filter-value-select input:text').last().type(`${value}`); + cy.get(".nc-filter-field-select") + .find(".v-select__slot") + .contains(field) + .should("exist"); + cy.get(".nc-filter-operation-select") + .find(".v-select__slot") + .contains(operation) + .should("exist"); + + cy.get(".nc-filter-menu-btn").click(); + }; + + filterReset = () => { + cy.get(".nc-filter-menu-btn").click(); + cy.get(".nc-filter-item-remove-btn").click(); + cy.get(".nc-filter-menu-btn").click(); + }; + + // delete created views + // + deleteCreatedViews = () => { + cy.get(".v-navigation-drawer__content > .container") + .find(".v-list > .v-list-item") + .contains("Share View") + .parent() + .find("button.mdi-dots-vertical") + .click(); + + cy.getActiveMenu().find(".v-list-item").contains("Views List").click(); + + cy.wait(1000); + + // cy.get('.container').find('button.mdi-delete-outline') + + cy.get('th:contains("View Link")') + .should("exist") + .parent() + .parent() + .next() + .find("tr") + .each(($tableRow) => { + cy.log($tableRow[0].childElementCount); + + // one of the row would contain seggregation header ('other views) + if (4 == $tableRow[0].childElementCount) { + cy.wrap($tableRow).find("button").last().click(); + cy.wait(1000); } - - cy.get('.nc-filter-field-select').find('.v-select__slot').contains(field).should('exist') - cy.get('.nc-filter-operation-select').find('.v-select__slot').contains(operation).should('exist') - - cy.get('.nc-filter-menu-btn').click() - } - - filterReset = () => { - cy.get('.nc-filter-menu-btn').click() - cy.get('.nc-filter-item-remove-btn').click() - cy.get('.nc-filter-menu-btn').click() - } - - // delete created views - // - deleteCreatedViews = () => { - cy.get('.v-navigation-drawer__content > .container') - .find('.v-list > .v-list-item') - .contains('Share View') - .parent().find('button.mdi-dots-vertical').click() - - cy.getActiveMenu().find('.v-list-item').contains('Views List').click() - - cy.wait(1000) - - // cy.get('.container').find('button.mdi-delete-outline') - - cy.get('th:contains("View Link")').should('exist').parent().parent() - .next().find('tr').each(($tableRow) => { - cy.log($tableRow[0].childElementCount) - - // one of the row would contain seggregation header ('other views) - if (4 == $tableRow[0].childElementCount) { - cy.wrap($tableRow).find('button').last().click() - cy.wait(1000) - } - }) - .then(() => { - cy.get('.v-overlay__content > .d-flex > .v-icon').click() - cy.toastWait('Deleted shared view successfully') - }) - } - - // download CSV & verify - // download folder is configurable in cypress. - // trigger download - // wait for a while & check in configured download folder for the intended file - // if it exists, verify it against 'expectedRecords' passed in as parameter - // - downloadAndVerifyCsv = (filename, verifyCsv) => { - cy.get('.nc-actions-menu-btn').click() - cy.get(`.menuable__content__active .v-list-item span:contains("Download as CSV")`).click() - - cy.toastWait('Successfully exported all table data') - .then(() => { - - // download folder path, read from config file - const downloadsFolder = Cypress.config("downloadsFolder") - let filePath = path.join(downloadsFolder, filename) - - // append download folder path with filename to generate full file path, retrieve file - cy.readFile(filePath) - .then((fileData) => { - - // from CSV, split into records (rows) - const rows = fileData.replace(/\r\n/g, '\n').split('\n'); - verifyCsv(rows) - deleteDownloadsFolder() - }) - }) - } - - getIFrameCell = (columnHeader, cellNumber) => { - return cy.iframe().find(`tbody > :nth-child(${cellNumber}) > [data-col="${columnHeader}"]`) - } - - // https://docs.cypress.io/guides/core-concepts/variables-and-aliases#Sharing-Context - getDatatype = (tableName, columnName) => { - cy.window().then(win => { - const col = win.$nuxt.$store.state.meta.metas[tableName].columns - let dataType = '' - col.forEach(element => { - if(element.cn == columnName) - dataType = element.uidt - }) - cy.wrap(dataType).as('ncDatatype') - }) - } + }) + .then(() => { + cy.get(".v-overlay__content > .d-flex > .v-icon").click(); + cy.toastWait("Deleted shared view successfully"); + }); + }; + + // download CSV & verify + // download folder is configurable in cypress. + // trigger download + // wait for a while & check in configured download folder for the intended file + // if it exists, verify it against 'expectedRecords' passed in as parameter + // + downloadAndVerifyCsv = (filename, verifyCsv) => { + cy.get(".nc-actions-menu-btn").click(); + cy.get( + `.menuable__content__active .v-list-item span:contains("Download as CSV")` + ).click(); + + cy.toastWait("Successfully exported all table data").then(() => { + // download folder path, read from config file + const downloadsFolder = Cypress.config("downloadsFolder"); + let filePath = path.join(downloadsFolder, filename); + + // append download folder path with filename to generate full file path, retrieve file + cy.readFile(filePath).then((fileData) => { + // from CSV, split into records (rows) + const rows = fileData.replace(/\r\n/g, "\n").split("\n"); + verifyCsv(rows); + deleteDownloadsFolder(); + }); + }); + }; + + getIFrameCell = (columnHeader, cellNumber) => { + return cy + .iframe() + .find(`tbody > :nth-child(${cellNumber}) > [data-col="${columnHeader}"]`); + }; + + // https://docs.cypress.io/guides/core-concepts/variables-and-aliases#Sharing-Context + getDatatype = (tableName, columnName) => { + cy.window().then((win) => { + const col = win.$nuxt.$store.state.meta.metas[tableName].columns; + let dataType = ""; + col.forEach((element) => { + if (element.cn == columnName) dataType = element.uidt; + }); + cy.wrap(dataType).as("ncDatatype"); + }); + }; } - -export const mainPage = new _mainPage; - +export const mainPage = new _mainPage(); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd diff --git a/scripts/cypress/support/page_objects/navigation.js b/scripts/cypress/support/page_objects/navigation.js index 55875a6f79..5b7771e704 100644 --- a/scripts/cypress/support/page_objects/navigation.js +++ b/scripts/cypress/support/page_objects/navigation.js @@ -1,269 +1,305 @@ - -import { roles, staticProjects, defaultDbParams } from "./projectConstants" +import { roles, staticProjects, defaultDbParams } from "./projectConstants"; /////////////////////////////////////////////////////////// // Sign in/ Sign up page - // list of hard-wired URL that can be used by nocodb // suffix to baseUrl needs to be defined here // const urlPool = { - ncUrlBase: "/", - ncUrlSignUp: "#/user/authentication/signup", - ncUrlSignIn: "#/user/authentication/signin" -} + ncUrlBase: "/", + ncUrlSignUp: "#/user/authentication/signup", + ncUrlSignIn: "#/user/authentication/signin", +}; export class _loginPage { - - // prefix: baseUrl - go(urlKey) { - cy.visit(urlKey) - } - - // visit SignIn URL, enter credentials passed as parameters - // - signIn(userCredentials) { - this.go(urlPool.ncUrlSignIn) - - cy.get('input[type="text"]', {timeout: 20000}).type(userCredentials.username) - cy.get('input[type="password"]').type(userCredentials.password) - cy.get('button:contains("SIGN IN")').click() - - this.waitProjectPageLoad() + // prefix: baseUrl + go(urlKey) { + cy.visit(urlKey); + } + + // visit SignIn URL, enter credentials passed as parameters + // + signIn(userCredentials) { + this.go(urlPool.ncUrlSignIn); + + cy.get('input[type="text"]', { timeout: 20000 }).type( + userCredentials.username + ); + cy.get('input[type="password"]').type(userCredentials.password); + cy.get('button:contains("SIGN IN")').click(); + + this.waitProjectPageLoad(); + } + + // visit SignUp URL, enter credentials passed as parameters + // + signUp(userCredentials) { + this.go(urlPool.ncUrlSignUp); + + cy.get('input[type="text"]', { timeout: 20000 }).type( + userCredentials.username + ); + cy.get('input[type="password"]').type(userCredentials.password); + cy.get('button:contains("SIGN UP")').click(); + + this.waitProjectPageLoad(); + } + + // delay/ wait utility routines + // + waitProjectPageLoad() { + cy.url({ timeout: 6000 }).should("contain", "#/project"); + cy.get(".nc-new-project-menu").should("exist"); + } + + // standard pre-project activity + // + loginAndOpenProject(apiType, xcdb) { + loginPage.signIn(roles.owner.credentials); + + if (!xcdb) { + if ("rest" == apiType) + projectsPage.openProject(staticProjects.externalREST.basic.name); + else projectsPage.openProject(staticProjects.externalGQL.basic.name); + } else { + if ("rest" == apiType) + projectsPage.openProject(staticProjects.sampleREST.basic.name); + else projectsPage.openProject(staticProjects.sampleGQL.basic.name); } - - // visit SignUp URL, enter credentials passed as parameters - // - signUp(userCredentials) { - this.go(urlPool.ncUrlSignUp) - - cy.get('input[type="text"]', {timeout: 20000}).type(userCredentials.username) - cy.get('input[type="password"]').type(userCredentials.password) - cy.get('button:contains("SIGN UP")').click() - - this.waitProjectPageLoad() - } - - // delay/ wait utility routines - // - waitProjectPageLoad() { - cy.url({ timeout: 6000 }).should('contain', '#/project') - cy.get('.nc-new-project-menu').should('exist') - } - - // standard pre-project activity - // - loginAndOpenProject(apiType, xcdb) { - loginPage.signIn(roles.owner.credentials) - - if(!xcdb) { - if ('rest' == apiType) - projectsPage.openProject(staticProjects.externalREST.basic.name) - else - projectsPage.openProject(staticProjects.externalGQL.basic.name) - } - else { - if ('rest' == apiType) - projectsPage.openProject(staticProjects.sampleREST.basic.name) - else - projectsPage.openProject(staticProjects.sampleGQL.basic.name) - } - } + } } - /////////////////////////////////////////////////////////// // Projects page export class _projectsPage { - - // Project creation options - // - - // {dbType, apiType, name} - // for external database, {databaseType, hostAddress, portNumber, username, password, databaseName} - - // Open existing project - // TODO: add projectName validation - // - openProject(projectName) { - cy.get('tbody').contains('tr', projectName).should('exist').click() - - // takes a while to load project - this.waitHomePageLoad() - } - - // Create new project - // Input: - // projectData {dbType, apiType, name} - // dbCredentials {databaseType, hostAddress, portNumber, username, password, databaseName} - // Returns: projectName - // - // To configure - // SSL & advanced parameters - // Database type selection - // - createProject(projectData, cred) { - - cy.get('body', { timeout: 2000 }) - - let projectName = projectData.name - - if (projectData.name == '') - projectName = 'test_proj' + Date.now() - - // click on "New Project" - cy.get(':nth-child(5) > .v-btn', {timeout: 20000}).click() - - if ('none' == projectData.dbType) { - - // Subsequent form, select (+ Create) option - cy.get('.nc-create-xc-db-project', {timeout: 20000}).click({ force: true }) - - // feed project name - cy.get('.nc-metadb-project-name', {timeout: 20000}).type(projectName) - - // Radio button: defaults to NC_REST - if ('GQL' == projectData.apiType) { - cy.contains('GRAPHQL APIs').closest('label').click(); - } - - // Submit - cy.contains('button', 'Create', { timeout: 20000 }).click() - - // takes a while to load project - this.waitHomePageLoad() - - return projectName - } - - // dbType == 'external' - else { - - // Subsequent form, select (+ Create by connection to external database) option - cy.get('.nc-create-external-db-project', {timeout: 20000}).click({ force: true }) - - // feed project name - //cy.get('.nc-metadb-project-name').type(projectName) - cy.contains('Enter Project Name', {timeout: 20000}).parent().find('input').clear().type(projectName) - - // Radio button: defaults to NC_REST - if ('GQL' == projectData.apiType) { - cy.contains('GRAPHQL APIs').closest('label').click(); - } - - if (cred.hostAddress != '') cy.contains('Host Address').parent().find('input').clear().type(cred.hostAddress) - if (cred.portNumber != '') cy.contains('Port Number').parent().find('input').clear().type(cred.portNumber) - if (cred.username != '') cy.contains('Username').parent().find('input').clear().type(cred.username) - if (cred.password != '') cy.contains('Password').parent().find('input').clear().type(cred.password) - if (cred.databaseName != '') cy.contains('Database : create if not exists').parent().find('input').clear().type(cred.databaseName) - - // Test database connection - cy.contains('Test Database Connection', {timeout: 20000}).click() - - // Create project - cy.contains('Ok & Save Project', { timeout: 20000 }).click() - - // takes a while to load project - this.waitHomePageLoad() - - return projectName - } - } - - // create REST default project (sakila DB) - // - createDefaulRestProject() { - return this.createProject({ dbType: 1, apiType: 0, name: '' }, defaultDbParams ) - } - - // create GraphQL default project (sakila DB) - // - createDefaultGraphQlProject() { - return this.createProject({ dbType: 1, apiType: 1, name: '' }, defaultDbParams ) - } - - // Click on refresh key on projects page - // - refreshProject() { - cy.contains('My Projects').parent().find('button').click(); - } - - // search project with given key - // return project-name array - // - searchProject(projectNameKey) { - cy.get('input[placeholder="Search Project"]').type(projectNameKey) - - const projectName = [] - - cy.get('table tr').each((tableRow) => { - - cy.wrap(tableRow).find('td').eq(0).find('.title').then((input) => { - projectName.push(input.text()) - }) - }) - .then(() => { - - // TBD: validate project name to contain search key - console.log(projectName) - return projectName - }) - } - - // remove specified project entry - // TODO: error handling - // - deleteProject(name) { - - // delete icon - cy.get('tbody').contains('tr', name).find('.mdi-delete-circle-outline').click() - cy.toastWait('deleted successfully') - // this.waitDeletePageLoad() - - // pop-up, submit - cy.get('body').then((body) => { - cy.wrap(body).find('button').contains('Submit').click() - }) + // Project creation options + // + + // {dbType, apiType, name} + // for external database, {databaseType, hostAddress, portNumber, username, password, databaseName} + + // Open existing project + // TODO: add projectName validation + // + openProject(projectName) { + cy.get("tbody").contains("tr", projectName).should("exist").click(); + + // takes a while to load project + this.waitHomePageLoad(); + } + + // Create new project + // Input: + // projectData {dbType, apiType, name} + // dbCredentials {databaseType, hostAddress, portNumber, username, password, databaseName} + // Returns: projectName + // + // To configure + // SSL & advanced parameters + // Database type selection + // + createProject(projectData, cred) { + cy.get("body", { timeout: 2000 }); + + let projectName = projectData.name; + + if (projectData.name == "") projectName = "test_proj" + Date.now(); + + // click on "New Project" + cy.get(":nth-child(5) > .v-btn", { timeout: 20000 }).click(); + + if ("none" == projectData.dbType) { + // Subsequent form, select (+ Create) option + cy.get(".nc-create-xc-db-project", { timeout: 20000 }).click({ + force: true, + }); + + // feed project name + cy.get(".nc-metadb-project-name", { timeout: 20000 }).type(projectName); + + // Radio button: defaults to NC_REST + if ("GQL" == projectData.apiType) { + cy.contains("GRAPHQL APIs").closest("label").click(); + } + + // Submit + cy.contains("button", "Create", { timeout: 20000 }).click(); + + // takes a while to load project + this.waitHomePageLoad(); + + return projectName; } - // remove all projects created - // - // 1. read all project names to be deleted, store in array - // 2. invoke delete project for each entry in array - // - // deleteAllProject() { - - // const projectName = [] - - // cy.get('table tr').each((tableRow) => { - - // cy.wrap(tableRow).find('td').eq(0).find('.title').then((input) => { - // projectName.push(input.text()) - // }) - // }) - // .then(() => { - // console.log(projectName) - // projectName.forEach(element => { - - // // bring back the DOM to normalcy - // cy.get('div').parentsUntil('body') - // this.deleteProject(element) - - // // wait needed for pop up to disapper - // this.waitDeletePageLoad() - // }) - // }) - // } - - waitHomePageLoad() { - cy.url({ timeout: 50000 }).should('contain', '&dbalias=') + // dbType == 'external' + else { + // Subsequent form, select (+ Create by connection to external database) option + cy.get(".nc-create-external-db-project", { timeout: 20000 }).click({ + force: true, + }); + + // feed project name + //cy.get('.nc-metadb-project-name').type(projectName) + cy.contains("Enter Project Name", { timeout: 20000 }) + .parent() + .find("input") + .clear() + .type(projectName); + + // Radio button: defaults to NC_REST + if ("GQL" == projectData.apiType) { + cy.contains("GRAPHQL APIs").closest("label").click(); + } + + if (cred.hostAddress != "") + cy.contains("Host Address") + .parent() + .find("input") + .clear() + .type(cred.hostAddress); + if (cred.portNumber != "") + cy.contains("Port Number") + .parent() + .find("input") + .clear() + .type(cred.portNumber); + if (cred.username != "") + cy.contains("Username") + .parent() + .find("input") + .clear() + .type(cred.username); + if (cred.password != "") + cy.contains("Password") + .parent() + .find("input") + .clear() + .type(cred.password); + if (cred.databaseName != "") + cy.contains("Database : create if not exists") + .parent() + .find("input") + .clear() + .type(cred.databaseName); + + // Test database connection + cy.contains("Test Database Connection", { timeout: 20000 }).click(); + + // Create project + cy.contains("Ok & Save Project", { timeout: 20000 }).click(); + + // takes a while to load project + this.waitHomePageLoad(); + + return projectName; } + } + + // create REST default project (sakila DB) + // + createDefaulRestProject() { + return this.createProject( + { dbType: 1, apiType: 0, name: "" }, + defaultDbParams + ); + } + + // create GraphQL default project (sakila DB) + // + createDefaultGraphQlProject() { + return this.createProject( + { dbType: 1, apiType: 1, name: "" }, + defaultDbParams + ); + } + + // Click on refresh key on projects page + // + refreshProject() { + cy.contains("My Projects").parent().find("button").click(); + } + + // search project with given key + // return project-name array + // + searchProject(projectNameKey) { + cy.get('input[placeholder="Search Project"]').type(projectNameKey); + + const projectName = []; + + cy.get("table tr") + .each((tableRow) => { + cy.wrap(tableRow) + .find("td") + .eq(0) + .find(".title") + .then((input) => { + projectName.push(input.text()); + }); + }) + .then(() => { + // TBD: validate project name to contain search key + console.log(projectName); + return projectName; + }); + } + + // remove specified project entry + // TODO: error handling + // + deleteProject(name) { + // delete icon + cy.get("tbody") + .contains("tr", name) + .find(".mdi-delete-circle-outline") + .click(); + cy.toastWait("deleted successfully"); + // this.waitDeletePageLoad() + + // pop-up, submit + cy.get("body").then((body) => { + cy.wrap(body).find("button").contains("Submit").click(); + }); + } + + // remove all projects created + // + // 1. read all project names to be deleted, store in array + // 2. invoke delete project for each entry in array + // + // deleteAllProject() { + + // const projectName = [] + + // cy.get('table tr').each((tableRow) => { + + // cy.wrap(tableRow).find('td').eq(0).find('.title').then((input) => { + // projectName.push(input.text()) + // }) + // }) + // .then(() => { + // console.log(projectName) + // projectName.forEach(element => { + + // // bring back the DOM to normalcy + // cy.get('div').parentsUntil('body') + // this.deleteProject(element) + + // // wait needed for pop up to disapper + // this.waitDeletePageLoad() + // }) + // }) + // } + + waitHomePageLoad() { + cy.url({ timeout: 50000 }).should("contain", "&dbalias="); + } } -export const loginPage = new _loginPage; -export const projectsPage = new _projectsPage; +export const loginPage = new _loginPage(); +export const projectsPage = new _projectsPage(); /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd diff --git a/scripts/cypress/support/page_objects/projectConstants.js b/scripts/cypress/support/page_objects/projectConstants.js index 68bbebd5a5..786132d331 100644 --- a/scripts/cypress/support/page_objects/projectConstants.js +++ b/scripts/cypress/support/page_objects/projectConstants.js @@ -1,12 +1,11 @@ - export const defaultDbParams = { - databaseType: 0, // MySQL - hostAddress: 'localhost', - portNumber: '3306', - username: 'root', - password: 'password', - databaseName: 'sakila' -} + databaseType: 0, // MySQL + hostAddress: "localhost", + portNumber: "3306", + username: "root", + password: "password", + databaseName: "sakila", +}; // database // validation details @@ -16,92 +15,133 @@ export const defaultDbParams = { // editComment: add comment // shareView: right navigation bar (share options) export const roles = { - owner: { - name: 'owner', - credentials: { username: 'user@nocodb.com', password: 'Password123.' }, - validations: { advSettings: true, editSchema: true, editData: true, editComment: true, shareView: true } + owner: { + name: "owner", + credentials: { username: "user@nocodb.com", password: "Password123." }, + validations: { + advSettings: true, + editSchema: true, + editData: true, + editComment: true, + shareView: true, }, - creator: { - name: 'creator', - credentials: { username: 'creator@nocodb.com', password: 'Password123.' }, - validations: { advSettings: true, editSchema: true, editData: true, editComment: true, shareView: true } + }, + creator: { + name: "creator", + credentials: { username: "creator@nocodb.com", password: "Password123." }, + validations: { + advSettings: true, + editSchema: true, + editData: true, + editComment: true, + shareView: true, }, - editor: { - name: 'editor', - credentials: { username: 'editor@nocodb.com', password: 'Password123.' }, - validations: { advSettings: false, editSchema: false, editData: true, editComment: true, shareView: false } + }, + editor: { + name: "editor", + credentials: { username: "editor@nocodb.com", password: "Password123." }, + validations: { + advSettings: false, + editSchema: false, + editData: true, + editComment: true, + shareView: false, }, - commenter: { - name: 'commenter', - credentials: { username: 'commenter@nocodb.com', password: 'Password123.' }, - validations: { advSettings: false, editSchema: false, editData: false, editComment: true, shareView: false } + }, + commenter: { + name: "commenter", + credentials: { username: "commenter@nocodb.com", password: "Password123." }, + validations: { + advSettings: false, + editSchema: false, + editData: false, + editComment: true, + shareView: false, }, - viewer: { - name: 'viewer', - credentials: { username: 'viewer@nocodb.com', password: 'Password123.' }, - validations: { advSettings: false, editSchema: false, editData: false, editComment: false, shareView: false } - } -} + }, + viewer: { + name: "viewer", + credentials: { username: "viewer@nocodb.com", password: "Password123." }, + validations: { + advSettings: false, + editSchema: false, + editData: false, + editComment: false, + shareView: false, + }, + }, +}; // default projects // export const staticProjects = { - sampleREST: { - basic: { dbType: 'none', apiType: 'REST', name: 'sampleREST' }, - config: {} - }, - sampleGQL: { - basic: { dbType: 'none', apiType: 'GQL', name: 'sampleGQL' }, - config: {} - }, - externalREST: { - basic: { dbType: 'external', apiType: 'REST', name: 'externalREST' }, - config: defaultDbParams - }, - externalGQL: { - basic: { dbType: 'external', apiType: 'GQL', name: 'externalGQL' }, - config: defaultDbParams - } -} + sampleREST: { + basic: { dbType: "none", apiType: "REST", name: "sampleREST" }, + config: {}, + }, + sampleGQL: { + basic: { dbType: "none", apiType: "GQL", name: "sampleGQL" }, + config: {}, + }, + externalREST: { + basic: { dbType: "external", apiType: "REST", name: "externalREST" }, + config: defaultDbParams, + }, + externalGQL: { + basic: { dbType: "external", apiType: "GQL", name: "externalGQL" }, + config: defaultDbParams, + }, +}; // return TRUE if test suite specified is activated from env-variables // export const isTestSuiteActive = (type, xcdb) => { - const env = Cypress.env('testMode') - if( !xcdb ) { - switch( type ) { - case 'rest': return env.includes('extREST')?true:false; - case 'graphql': return env.includes('extGQL')?true:false; - } - } else { - switch( type ) { - case 'rest': return env.includes('xcdbREST')?true:false; - case 'graphql': return env.includes('xcdbGQL')?true:false; - } + const env = Cypress.env("testMode"); + if (!xcdb) { + switch (type) { + case "rest": + return env.includes("extREST") ? true : false; + case "graphql": + return env.includes("extGQL") ? true : false; + } + } else { + switch (type) { + case "rest": + return env.includes("xcdbREST") ? true : false; + case "graphql": + return env.includes("xcdbGQL") ? true : false; } -} + } +}; // expecting different modes to be seperated by a . export const getPrimarySuite = () => { - const env = Cypress.env('testMode').split('.') - switch(env[0]) { - case 'extREST': return staticProjects.externalREST; - case 'extGQL': return staticProjects.externalGQL; - case 'xcdbREST': return staticProjects.sampleREST; - case 'xcdbGQL': return staticProjects.sampleGQL; - } -} + const env = Cypress.env("testMode").split("."); + switch (env[0]) { + case "extREST": + return staticProjects.externalREST; + case "extGQL": + return staticProjects.externalGQL; + case "xcdbREST": + return staticProjects.sampleREST; + case "xcdbGQL": + return staticProjects.sampleGQL; + } +}; export const isSecondarySuite = (proj, xcdb) => { - if(!isTestSuiteActive(proj, xcdb)) - return false; - - const env = Cypress.env('testMode').split('.') - - switch(env[0]) { - case 'extREST': return (proj=='rest' && !xcdb)?false:true; - case 'extGQL': return (proj=='graphql' && !xcdb)?false:true; - case 'xcdbREST': return (proj=='rest' && xcdb)?false:true; - case 'xcdbGQL': return (proj=='graphql' && xcdb)?false:true; - } -} \ No newline at end of file + if (!isTestSuiteActive(proj, xcdb)) return false; + + const env = Cypress.env("testMode").split("."); + + switch (env[0]) { + case "extREST": + return proj == "rest" && !xcdb ? false : true; + case "extGQL": + return proj == "graphql" && !xcdb ? false : true; + case "xcdbREST": + return proj == "rest" && xcdb ? false : true; + case "xcdbGQL": + return proj == "graphql" && xcdb ? false : true; + } +};