From 8cad7732518c26a8a2e709afe4be1de169b3aab0 Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Fri, 26 Aug 2022 21:19:02 +0530 Subject: [PATCH 01/42] test: v2 corrections for view/ phase-1 Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- .../common/4a_table_view_grid_gallery_form.js | 28 +--- .../integration/common/4b_table_view_share.js | 28 ++-- .../common/4c_form_view_detailed.js | 129 ++++++++---------- .../cypress-v2/integration/test/restViews.js | 3 +- scripts/cypress-v2/support/commands.js | 15 +- .../support/page_objects/mainPage.js | 6 +- .../support/page_objects/navigation.js | 9 ++ 7 files changed, 99 insertions(+), 119 deletions(-) diff --git a/scripts/cypress-v2/integration/common/4a_table_view_grid_gallery_form.js b/scripts/cypress-v2/integration/common/4a_table_view_grid_gallery_form.js index d8b8b95d8e..cc37704c5c 100644 --- a/scripts/cypress-v2/integration/common/4a_table_view_grid_gallery_form.js +++ b/scripts/cypress-v2/integration/common/4a_table_view_grid_gallery_form.js @@ -1,8 +1,6 @@ import { mainPage } from "../../support/page_objects/mainPage"; import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; -// let viewTypeString = ["", "Form", "Gallery", "Grid"]; - function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } @@ -16,24 +14,17 @@ export const genTest = (apiType, dbType) => { // Run once before test- create project (rest/graphql) // before(() => { - cy.fileHook(); mainPage.tabReset(); - // // kludge: wait for page load to finish - // cy.wait(1000); - // // close team & auth tab - // cy.get('button.ant-tabs-tab-remove').should('exist').click(); - // cy.wait(1000); - // open a table to work on views // cy.openTableTab("Country", 25); + // toggle right navbar (open) cy.get('.nc-toggle-right-navbar').should('exist').click(); }); beforeEach(() => { - cy.fileHook(); }); after(() => { @@ -49,7 +40,6 @@ export const genTest = (apiType, dbType) => { 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.getActiveModal().find(".ant-btn-primary").click(); cy.toastWait("View created successfully"); @@ -64,10 +54,6 @@ export const genTest = (apiType, dbType) => { it(`Edit ${viewType} view name`, () => { // click on edit-icon (becomes visible on hovering mouse) - // cy.get(".nc-view-edit-icon").last().click({ - // force: true, - // timeout: 1000, - // }); cy.get(`.nc-${viewType}-view-item`).last().dblclick(); // feed new name @@ -89,15 +75,11 @@ export const genTest = (apiType, dbType) => { // number of view entries should be 2 before we delete cy.get(".nc-view-item").its("length").should("eq", 2); - cy.get(`.nc-${viewType}-view-item`).last().click(); - cy.wait(3000); - // click on delete icon (becomes visible on hovering mouse) - cy.get(`.nc-${viewType}-view-item`).last().trigger("mouseover").then(() => { - cy.get(".nc-view-delete-icon").should('exist').click({force: true}); - cy.getActiveModal().find(".ant-btn-dangerous").click(); - cy.toastWait("View deleted successfully"); - }) + cy.get(".nc-view-delete-icon").click({ force: true }); + cy.wait(300) + cy.getActiveModal().find('.ant-btn-dangerous').click(); + cy.toastWait("View deleted successfully"); // kludge: right navbar closes abruptly. force it open again window.localStorage.setItem('nc-right-sidebar', '{"isOpen":true,"hasSidebar":true}') diff --git a/scripts/cypress-v2/integration/common/4b_table_view_share.js b/scripts/cypress-v2/integration/common/4b_table_view_share.js index 441f1effc8..dd2ea6d7b9 100644 --- a/scripts/cypress-v2/integration/common/4b_table_view_share.js +++ b/scripts/cypress-v2/integration/common/4b_table_view_share.js @@ -1,5 +1,6 @@ import { mainPage } from "../../support/page_objects/mainPage"; import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; +import {loginPage} from "../../support/page_objects/navigation"; let storedURL = ""; let linkText = ""; @@ -35,32 +36,20 @@ export const genTest = (apiType, dbType) => { // Run once before test- create project (rest/graphql) // before(() => { - cy.fileHook(); mainPage.tabReset(); - - // // kludge: wait for page load to finish - // cy.wait(1000); - // // close team & auth tab - // cy.get('button.ant-tabs-tab-remove').should('exist').click(); - // cy.wait(1000); - cy.openTableTab("City", 25); // store base URL- to re-visit and delete form view later cy.url().then((url) => { storedURL = url; }); - generateLinkWithPwd(); }); beforeEach(() => { - cy.fileHook(); - cy.restoreLocalStorage(); }); afterEach(() => { - cy.saveLocalStorage(); }); it("Share view with incorrect password", () => { @@ -89,17 +78,22 @@ export const genTest = (apiType, dbType) => { cy.getActiveModal().find('button:contains("Unlock")').click(); // if pwd is incorrect, active modal requesting to feed in password again will persist - cy.getActiveModal().find('button:contains("Unlock")').should('not.exist'); + // cy.getActiveModal().find('button:contains("Unlock")').should('not.exist'); + cy.get(".ant-modal-content:visible").should("not.exist") // Verify Download as CSV is here mainPage.downloadCsv().should("exist"); mainPage.downloadExcel().should("exist"); }); - it("Delete view", () => { - cy.visit(storedURL, { - baseUrl: null, - }); + it("Delete view", () => { + // issue with restore local storage- need to refresh page to get new URL + + loginPage.loginAndOpenProject(apiType, dbType); + // cy.restoreLocalStorage(); + // cy.visit(storedURL, { baseUrl: null }); + + cy.openTableTab("City", 25); // wait for page load to complete cy.get(".nc-grid-row").should("have.length", 25); diff --git a/scripts/cypress-v2/integration/common/4c_form_view_detailed.js b/scripts/cypress-v2/integration/common/4c_form_view_detailed.js index 2a0ac81859..2d43e53154 100644 --- a/scripts/cypress-v2/integration/common/4c_form_view_detailed.js +++ b/scripts/cypress-v2/integration/common/4c_form_view_detailed.js @@ -1,5 +1,6 @@ import { isTestSuiteActive } from "../../support/page_objects/projectConstants"; import { mainPage, settingsPage } from "../../support/page_objects/mainPage"; +import {loginPage} from "../../support/page_objects/navigation"; let formViewURL; @@ -11,14 +12,24 @@ function verifyFormDrawerFieldLocation(fieldName, position) { } function verifyFormDrawerHideObjectCount(count) { - cy.get(".nc-form") - .find(".nc-field-remove-icon") - .its("length") - .should("eq", count); + if(count) { + cy.get(".nc-form") + .find(".nc-field-remove-icon") + .its("length") + .should("eq", count); + } else { + cy.get(".nc-form") + .find(".nc-field-remove-icon") + .should("not.exist"); + } } function verifyFormMenuDrawerCardCount(cardCount) { - cy.get('.nc-form-left-drawer').find('.ant-card').should('have.length', cardCount); + if(cardCount) { + cy.get('.nc-form-left-drawer').find('.ant-card').should('have.length', cardCount); + } else { + cy.get('.nc-form-left-drawer').find('.ant-card').should('not.exist'); + } } function validateFormHeader() { @@ -47,14 +58,14 @@ export const genTest = (apiType, dbType) => { // Run once before test- create project (rest/graphql) // before(() => { - cy.fileHook(); mainPage.tabReset(); + // loginPage.loginAndOpenProject(apiType, dbType); - // // kludge: wait for page load to finish - // cy.wait(1000); - // // close team & auth tab - // cy.get('button.ant-tabs-tab-remove').should('exist').click(); - // cy.wait(1000); + // kludge: wait for page load to finish + cy.wait(2000); + // close team & auth tab + cy.get('button.ant-tabs-tab-remove').should('exist').click(); + cy.wait(1000); // open a table to work on views // @@ -63,12 +74,11 @@ export const genTest = (apiType, dbType) => { }); beforeEach(() => { - cy.fileHook(); - cy.restoreLocalStorage(); + // fix me! + window.localStorage.setItem('nc-right-sidebar', '{"isOpen":true,"hasSidebar":true}') }); afterEach(() => { - cy.saveLocalStorage(); }); after(() => { @@ -103,6 +113,7 @@ export const genTest = (apiType, dbType) => { cy.get(".nc-form-drag-LastUpdate").drag( ".nc-form-drag-Country" ); + cy.wait(1000); // Verify if order is: LastUpdate, Country, Country => City verifyFormDrawerFieldLocation("LastUpdate", 0); @@ -197,8 +208,8 @@ export const genTest = (apiType, dbType) => { // fill up mandatory fields cy.get(".nc-form-input-Country").type("_abc"); cy.get(".nc-form-input-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); + cy.get(".ant-picker-now-btn:visible").contains("Now").click(); + cy.get(".ant-btn-primary:visible").contains("Ok").click(); // default message, no update @@ -214,18 +225,15 @@ export const genTest = (apiType, dbType) => { 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-grid-view-item`) - // .contains("Country") - // .click(); cy.get(`.nc-view-item.nc-${viewType}-view-item`) .contains("Form-1") .click(); // fill up mandatory fields - cy.get(".nc-form-input-Country").type("_abc"); + cy.get(".nc-form-input-Country").should('exist').type("_abc"); cy.get(".nc-form-input-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); + cy.get(".ant-picker-now-btn:visible").contains("Now").click(); + cy.get(".ant-btn-primary:visible").contains("Ok").click(); // add message cy.get("textarea.nc-form-after-submit-msg") @@ -240,9 +248,6 @@ export const genTest = (apiType, dbType) => { 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-grid-view-item`) - // .contains("Country") - // .click(); cy.get(`.nc-view-item.nc-${viewType}-view-item`) .contains("Form-1") .click(); @@ -250,8 +255,8 @@ export const genTest = (apiType, dbType) => { // fill up mandatory fields cy.get(".nc-form-input-Country").type("_abc"); cy.get(".nc-form-input-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); + cy.get(".ant-picker-now-btn:visible").contains("Now").click(); + cy.get(".ant-btn-primary:visible").contains("Ok").click(); // enable "Submit another form" check box cy.get("button.nc-form-checkbox-submit-another-form").click(); @@ -274,8 +279,8 @@ export const genTest = (apiType, dbType) => { cy.get(".nc-form-input-Country").type("_abc"); cy.get(".nc-form-input-LastUpdate").click(); - cy.getActiveModal().find("button").contains("19").click(); - cy.getActiveModal().find("button").contains("OK").click(); + cy.get(".ant-picker-now-btn:visible").contains("Now").click(); + cy.get(".ant-btn-primary:visible").contains("Ok").click(); // enable "New form after 5 seconds" button cy.get("button.nc-form-checkbox-submit-another-form") @@ -303,10 +308,11 @@ export const genTest = (apiType, dbType) => { .click(); // validate if form has appeared again + cy.wait(1000); validateFormHeader(); + cy.get(".nc-form-remove-all").click(); - cy.get("button.nc-form-checkbox-send-email") - .click(); + cy.get(".nc-form-checkbox-send-email").click(); // validate if toaster pops up requesting to activate SMTP cy.toastWait( "Please activate SMTP plugin in App store for enabling email notification" @@ -335,13 +341,17 @@ export const genTest = (apiType, dbType) => { // validate if form has appeared again validateFormHeader(); - cy.get("button.nc-form-checkbox-send-email") + cy.get(".nc-form-checkbox-send-email") .click(); + cy.toastWait( + "Please activate SMTP plugin in App store for enabling email notification" + ); + settingsPage.openMenu(settingsPage.APPSTORE) mainPage.resetSMTP(); - cy.wait(3000); + cy.wait(300); cy.openTableTab("Country", 25); }); @@ -350,30 +360,22 @@ export const genTest = (apiType, dbType) => { cy.get(`.nc-view-item.nc-${viewType}-view-item`) .contains("Form-1") .click(); + cy.get(".nc-form-add-all").click(); - cy.wait(3000); + cy.wait(300); // validate if form has appeared again validateFormHeader(); cy.get(".nc-form-input-LastUpdate").should("exist"); // remove "LastUpdate field" - cy.get(".nc-form").find(".nc-field-remove-icon").eq(2).click(); + cy.get(".nc-form").find(".nc-field-remove-icon").eq(1).click(); cy.get(".nc-form-input-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('.nc-form-left-drawer').find('.ant-card').contains('LastUpdate').should('exist').click(); cy.get(".nc-form-input-LastUpdate").should("exist"); - cy.wait(3000); + cy.wait(300); }); it(`Validate ${viewType}: URL verification`, () => { @@ -391,27 +393,33 @@ export const genTest = (apiType, dbType) => { formViewURL = url; }); - cy.wait(3000); + // cy.saveLocalStorage(); + cy.wait(300); }); - it(`Validate ${viewType}: URL validation after re-access`, () => { + it.skip(`Validate ${viewType}: URL validation after re-access`, () => { // visit URL cy.log(formViewURL); + // cy.restoreLocalStorage(); + cy.visit(formViewURL, { baseUrl: null, }); - cy.wait(5000); // New form appeared? Header & description should exist validateFormHeader(); }); it(`Delete ${viewType} view`, () => { + // cy.restoreLocalStorage(); + // number of view entries should be 2 before we delete cy.get(".nc-view-item").its("length").should("eq", 2); // click on delete icon (becomes visible on hovering mouse) cy.get(".nc-view-delete-icon").click({ force: true }); + cy.wait(1000) + cy.getActiveModal().find('.ant-btn-dangerous').click(); cy.toastWait("View deleted successfully"); // confirm if the number of veiw entries is reduced by 1 @@ -420,8 +428,6 @@ export const genTest = (apiType, dbType) => { // clean up newly added rows into Country table operations // this auto verifies successfull addition of rows to table as well mainPage.getPagination(5).click(); - // kludge: flicker on load - // cy.wait(3000) cy.get(".nc-grid-row").should("have.length", 13); cy.get(".ant-checkbox").should('exist').eq(10).click({ force: true }); @@ -433,27 +439,6 @@ export const genTest = (apiType, dbType) => { cy.getActiveMenu() .contains("Delete Selected Rows") .click({ force: true }); - - // 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') }); }; diff --git a/scripts/cypress-v2/integration/test/restViews.js b/scripts/cypress-v2/integration/test/restViews.js index 6d31b224ba..a96ea487a1 100644 --- a/scripts/cypress-v2/integration/test/restViews.js +++ b/scripts/cypress-v2/integration/test/restViews.js @@ -14,9 +14,10 @@ const nocoTestSuite = (apiType, dbType) => { setCurrentMode(apiType, dbType); t01.genTest(apiType, dbType); + // place plugin related activities at top + t4c.genTest(apiType, dbType); t4a.genTest(apiType, dbType); t4b.genTest(apiType, dbType); - t4c.genTest(apiType, dbType); t4d.genTest(apiType, dbType); t4e.genTest(apiType, dbType); t4f.genTest(apiType, dbType); diff --git a/scripts/cypress-v2/support/commands.js b/scripts/cypress-v2/support/commands.js index 45373b9d02..71402e0825 100644 --- a/scripts/cypress-v2/support/commands.js +++ b/scripts/cypress-v2/support/commands.js @@ -154,15 +154,18 @@ Cypress.Commands.add("refreshTableTab", () => { // rc: row count. validate row count if rc!=0 Cypress.Commands.add("openTableTab", (tn, rc) => { cy.task("log", `[openTableTab] ${tn} ${rc}`); - cy.get(`.nc-project-tree-tbl-${tn}`, { timeout: 10000 }).should("exist") + + cy.get(`.nc-project-tree-tbl-${tn}`) + .should("exist") .first() - .click({ force: true }); + .click(); // kludge to make new tab active cy.get('.ant-tabs-tab-btn') .contains(tn) .should('exist') - .click({ force: true }); + .click(); + cy.get('.xc-row-table.nc-grid').should('exist'); // wait for page rendering to complete @@ -264,7 +267,11 @@ Cypress.Commands.add("getActiveSelection", () => { Cypress.Commands.add("getActiveDrawer", () => { return cy.get(".ant-drawer-content:visible").last(); -}); +}); + +Cypress.Commands.add("getActivePicker", () => { + return cy.get(".ant-picker-dropdown :visible").last(); +}); Cypress.Commands.add("createTable", (name) => { // cy.get(".nc-btn-tbl-add").click(); diff --git a/scripts/cypress-v2/support/page_objects/mainPage.js b/scripts/cypress-v2/support/page_objects/mainPage.js index dd9c3f6fae..b7f4248aaa 100644 --- a/scripts/cypress-v2/support/page_objects/mainPage.js +++ b/scripts/cypress-v2/support/page_objects/mainPage.js @@ -238,10 +238,11 @@ export class _mainPage { cy.getActiveModal().find('#form_item_from').should('exist').clear().type(from) cy.getActiveModal().find('#form_item_host').should('exist').clear().type(host) cy.getActiveModal().find('#form_item_port').should('exist').clear().type(port) - cy.getActiveModal().find('#form_item_secure').should('exist').clear().type(secure) + // cy.getActiveModal().find('#form_item_secure').should('exist').clear().type(secure) cy.getActiveModal().find("button").contains("Save").click(); cy.toastWait('Successfully installed and email notification will use SMTP configuration'); + settingsPage.closeMenu() }; resetSMTP = () => { @@ -251,6 +252,7 @@ export class _mainPage { cy.getActiveModal().find("button").contains("Confirm").click(); cy.toastWait("Plugin uninstalled successfully"); + settingsPage.closeMenu() }; shareView = () => { @@ -365,7 +367,7 @@ export class _mainPage { // one of the row would contain seggregation header ('other views) if (5 == $tableRow[0].childElementCount) { cy.wrap($tableRow).find(".nc-icon").last().click(); - cy.wait(1000); + cy.wait(100); } }) .then(() => { diff --git a/scripts/cypress-v2/support/page_objects/navigation.js b/scripts/cypress-v2/support/page_objects/navigation.js index 2e60061475..18772f56c8 100644 --- a/scripts/cypress-v2/support/page_objects/navigation.js +++ b/scripts/cypress-v2/support/page_objects/navigation.js @@ -68,6 +68,9 @@ export class _loginPage { // standard pre-project activity // loginAndOpenProject(apiType, dbType) { + cy.restoreLocalStorage(); + cy.wait(1000); + loginPage.signIn(roles.owner.credentials); if (dbType === "mysql") { @@ -77,6 +80,12 @@ export class _loginPage { } else if (dbType === "postgres") { projectsPage.openProject(staticProjects.pgExternalREST.basic.name); } + + // kludge: wait for page load to finish + cy.wait(2000); + // close team & auth tab + cy.get('button.ant-tabs-tab-remove').should('exist').click(); + cy.wait(1000); } } From 33d28c5c50f7e061e9cec950de981287ba6c0faa Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Fri, 26 Aug 2022 22:52:10 +0530 Subject: [PATCH 02/42] test: cypress updates for view/ phase2 Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- .../common/4d_table_view_grid_locked.js | 8 - .../integration/common/4e_form_view_share.js | 12 +- .../integration/common/4f_grid_view_share.js | 144 ++++++------------ .../cypress-v2/integration/test/restViews.js | 2 +- 4 files changed, 55 insertions(+), 111 deletions(-) diff --git a/scripts/cypress-v2/integration/common/4d_table_view_grid_locked.js b/scripts/cypress-v2/integration/common/4d_table_view_grid_locked.js index 0ab0b5e649..dcd6e0fe85 100644 --- a/scripts/cypress-v2/integration/common/4d_table_view_grid_locked.js +++ b/scripts/cypress-v2/integration/common/4d_table_view_grid_locked.js @@ -8,22 +8,14 @@ export const genTest = (apiType, dbType) => { // Run once before test- create project (rest/graphql) // before(() => { - cy.fileHook(); mainPage.tabReset(); - // // kludge: wait for page load to finish - // cy.wait(1000); - // // close team & auth tab - // cy.get('button.ant-tabs-tab-remove').should('exist').click(); - // cy.wait(1000); - // open a table to work on views // cy.openTableTab("Country", 25); }); beforeEach(() => { - cy.fileHook(); }); after(() => { diff --git a/scripts/cypress-v2/integration/common/4e_form_view_share.js b/scripts/cypress-v2/integration/common/4e_form_view_share.js index 5995d041f6..bcf2b6c71e 100644 --- a/scripts/cypress-v2/integration/common/4e_form_view_share.js +++ b/scripts/cypress-v2/integration/common/4e_form_view_share.js @@ -12,7 +12,6 @@ export const genTest = (apiType, dbType) => { // Run once before test- create project (rest/graphql) // before(() => { - cy.fileHook(); mainPage.tabReset(); // open a table to work on views // @@ -29,7 +28,6 @@ export const genTest = (apiType, dbType) => { }); beforeEach(() => { - cy.fileHook(); cy.restoreLocalStorage(); }); @@ -107,12 +105,12 @@ export const genTest = (apiType, dbType) => { .contains("Form-1") .click(); - mainPage.shareView().click({ force: true }); - - cy.wait(5000); + cy.wait(2000); + mainPage.shareView().click(); // copy link text, visit URL cy.getActiveModal() + .should('exist') .find(".share-link-box") .contains("/nc/form/", { timeout: 10000 }) .should("exist") @@ -199,13 +197,15 @@ export const genTest = (apiType, dbType) => { cy.visit(storedURL, { baseUrl: null, }); - cy.wait(5000); + cy.wait(2000); // number of view entries should be 2 before we delete cy.get(".nc-view-item").its("length").should("eq", 2); // click on delete icon (becomes visible on hovering mouse) cy.get(".nc-view-delete-icon").click({ force: true }); + cy.wait(1000); + cy.getActiveModal().find('.ant-btn-dangerous').should('exist').click(); cy.toastWait("View deleted successfully"); // confirm if the number of veiw entries is reduced by 1 diff --git a/scripts/cypress-v2/integration/common/4f_grid_view_share.js b/scripts/cypress-v2/integration/common/4f_grid_view_share.js index 77a9799b4e..fc79e171ed 100644 --- a/scripts/cypress-v2/integration/common/4f_grid_view_share.js +++ b/scripts/cypress-v2/integration/common/4f_grid_view_share.js @@ -15,11 +15,6 @@ export const genTest = (apiType, dbType) => { if (!isTestSuiteActive(apiType, dbType)) return; const generateViewLink = (viewName) => { - // click on share view - // cy.get(".v-navigation-drawer__content > .container") - // .find(".v-list > .v-list-item") - // .contains("Share View") - // .click(); mainPage.shareView().click(); cy.wait(1000); @@ -45,7 +40,6 @@ export const genTest = (apiType, dbType) => { // Run once before test- create project (rest/graphql) // before(() => { - cy.fileHook(); mainPage.tabReset(); // // kludge: wait for page load to finish @@ -63,7 +57,6 @@ export const genTest = (apiType, dbType) => { }); beforeEach(() => { - cy.fileHook(); cy.restoreLocalStorage(); }); @@ -90,6 +83,7 @@ export const genTest = (apiType, dbType) => { // store base URL- to re-visit and delete form view later cy.url().then((url) => { storedURL = url; + cy.saveLocalStorage(); }); }); @@ -110,16 +104,8 @@ export const genTest = (apiType, dbType) => { generateViewLink("combined"); // verify if only one link exists in table - // cy.get(".v-navigation-drawer__content > .container") - // .find(".v-list > .v-list-item") - // .contains("Share View") - // .parent() - // .find("button.mdi-dots-vertical") - // .click(); mainPage.shareViewList().click(); - // cy.getActiveMenu().find(".v-list-item").contains("Views List").click(); - cy.get('th:contains("View Link")').should("exist"); cy.get('th:contains("View Link")') @@ -131,9 +117,6 @@ export const genTest = (apiType, dbType) => { .should("eq", 1) .then(() => { cy.get('button.ant-modal-close:visible').click(); - // cy.get(".v-overlay--active > .v-overlay__scrim").click({ - // force: true, - // }); }); }); @@ -192,7 +175,6 @@ export const genTest = (apiType, dbType) => { for (let j = 0; j < 4; j++) { expect(strCol[j]).to.be.equal(retCol[j]); } - // expect(retrievedRecords[i]).to.be.equal(storedRecords[i]) } }; @@ -291,27 +273,27 @@ export const genTest = (apiType, dbType) => { .find(".nc-icon.nc-action-icon.nc-plus") .should("not.exist"); - // to be fixed - // mainPage - // .getCell("Customer List", 3) - // .click() - // .find(".nc-icon.nc-action-icon.nc-arrow-expand") - // .click(); - - // cy.getActiveModal().find(".nc-icon.nc-reload").should("exist"); - // cy.getActiveModal() - // .find("button") - // .contains("Link to") - // .should("not.exist"); - // cy.getActiveModal() - // .find(".ant-card") - // .contains("2") - // .should("exist"); - // cy.getActiveModal() - // .find(".ant-card") - // .find("button") - // .should("not.exist"); - // cy.get('button.ant-modal-close').click(); + mainPage + .getCell("Customer List", 3) + .click() + .find(".nc-icon.nc-action-icon.nc-arrow-expand") + .click({ force: true }); + + // reload button + cy.getActiveModal().find(".nc-icon").should("exist"); + cy.getActiveModal() + .find("button") + .contains("Link to") + .should("not.exist"); + cy.getActiveModal() + .find(".ant-card") + .contains("2") + .should("exist"); + cy.getActiveModal() + .find(".ant-card") + .find("button") + .should("not.exist"); + cy.get('button.ant-modal-close').click(); }); it(`Share GRID view : Virtual column validation > belongs to`, () => { @@ -322,17 +304,16 @@ export const genTest = (apiType, dbType) => { .find(".nc-icon.nc-unlink-icon") .should("not.exist"); - // to be fixed - // mainPage - // .getCell("City", 1) - // .click() - // .find(".nc-icon.nc-action-icon.nc-arrow-expand") - // .should("not.exist"); - // mainPage - // .getCell("City", 1) - // .find(".chips") - // .contains("Kanchrapara") - // .should("exist"); + mainPage + .getCell("City", 1) + .click() + .find(".nc-icon.nc-action-icon.nc-arrow-expand") + .should("not.exist"); + mainPage + .getCell("City", 1) + .find(".chips") + .contains("Kanchrapara") + .should("exist"); }); it(`Share GRID view : Virtual column validation > many to many`, () => { @@ -348,23 +329,24 @@ export const genTest = (apiType, dbType) => { .find(".nc-icon.nc-action-icon.nc-plus") .should("not.exist"); - // to be fixed - // mainPage - // .getCell("Staff List", 1) - // .click() - // .find(".nc-icon.nc-action-icon.nc-arrow-expand") - // .click(); - - // cy.getActiveModal().find(".nc-icon.nc-reload").should("exist"); - // cy.getActiveModal() - // .find("button") - // .contains("Link to") - // .should("not.exist"); - // cy.get("body").type("{esc}"); + mainPage + .getCell("Staff List", 1) + .click() + .find(".nc-icon.nc-action-icon.nc-arrow-expand") + .click({ force: true }); + + // reload button + cy.getActiveModal().find(".nc-icon").should("exist"); + cy.getActiveModal() + .find("button") + .contains("Link to") + .should("not.exist"); + cy.get('button.ant-modal-close:visible').last().click(); }); it(`Delete ${viewType.toUpperCase()} view`, () => { // go back to base page + cy.restoreLocalStorage(); cy.visit(storedURL, { baseUrl: null, }); @@ -389,23 +371,15 @@ export const genTest = (apiType, dbType) => { describe(`${apiType.toUpperCase()} api - Grid view/ row-column update verification`, () => { before(() => { - cy.fileHook(); - - // // kludge: wait for page load to finish - // cy.wait(1000); - // // close team & auth tab - // cy.get('button.ant-tabs-tab-remove').should('exist').click(); - // cy.wait(1000); + cy.restoreLocalStorage(); // Address table has belongs to, has many & many-to-many cy.openTableTab("Country", 25); - mainPage.toggleRightSidebar(); - - cy.saveLocalStorage(); // store base URL- to re-visit and delete form view later cy.url().then((url) => { storedURL = url; + cy.saveLocalStorage(); generateViewLink("rowColUpdate"); }); }); @@ -425,13 +399,6 @@ export const genTest = (apiType, dbType) => { // 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(); - mainPage.getCell("Country", 10).rightclick(); cy.getActiveMenu() .find('.ant-dropdown-menu-item:contains("Delete Row")') @@ -440,14 +407,6 @@ export const genTest = (apiType, dbType) => { // delete column mainPage.deleteColumn("dummy"); - // cy.get(`th:contains('dummy') .nc-ui-dt-dropdown`) - // .trigger("mouseover") - // .click(); - // cy.get(".nc-column-delete").click(); - // cy.get("button:contains(Confirm)").click(); - // - // cy.toastWait("Update table successful"); - mainPage.deleteCreatedViews(); // close table @@ -457,12 +416,6 @@ export const genTest = (apiType, dbType) => { it(`Generate default Shared GRID view URL`, () => { // add row cy.get(".nc-add-new-row-btn").click(); - // cy.get("#data-table-form-Country > input") - // .first() - // .click() - // .type("a"); - // cy.contains("Save row").filter("button").click({ force: true }); - // cy.toastWait("updated successfully"); cy.get(".nc-expand-col-Country").find(".nc-cell > input") .should("exist") .first() @@ -488,7 +441,6 @@ export const genTest = (apiType, dbType) => { }); cy.wait(5000); - //5 // wait for public view page to load! // wait for page rendering to complete cy.get(".nc-grid-row").should("have.length", 25); diff --git a/scripts/cypress-v2/integration/test/restViews.js b/scripts/cypress-v2/integration/test/restViews.js index a96ea487a1..df738386cf 100644 --- a/scripts/cypress-v2/integration/test/restViews.js +++ b/scripts/cypress-v2/integration/test/restViews.js @@ -19,7 +19,7 @@ const nocoTestSuite = (apiType, dbType) => { t4a.genTest(apiType, dbType); t4b.genTest(apiType, dbType); t4d.genTest(apiType, dbType); - t4e.genTest(apiType, dbType); + // to be fixed t4e.genTest(apiType, dbType); t4f.genTest(apiType, dbType); }; From e1c503eafb50c302097602bc2563d045ab742efb Mon Sep 17 00:00:00 2001 From: Raju Udava <86527202+dstala@users.noreply.github.com> Date: Fri, 26 Aug 2022 22:57:08 +0530 Subject: [PATCH 03/42] test: cy save local storage before signup Signed-off-by: Raju Udava <86527202+dstala@users.noreply.github.com> --- scripts/cypress-v2/integration/common/00_pre_configurations.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/cypress-v2/integration/common/00_pre_configurations.js b/scripts/cypress-v2/integration/common/00_pre_configurations.js index abaa9f133d..4f7a98d5ce 100644 --- a/scripts/cypress-v2/integration/common/00_pre_configurations.js +++ b/scripts/cypress-v2/integration/common/00_pre_configurations.js @@ -164,6 +164,7 @@ export const genTest = (apiType, dbType) => { it("Admin SignUp", () => { cy.task("log", "This will be output to the terminal"); + cy.saveLocalStorage(); loginPage.signUp(roles.owner.credentials); }); From 7e298cce9f44d85c246ce858ecddf5474ce8e939 Mon Sep 17 00:00:00 2001 From: Muhammed Mustafa Date: Thu, 25 Aug 2022 15:15:40 +0530 Subject: [PATCH 04/42] fix/Forced meta loading when tab changes --- packages/nc-gui-v2/components/tabs/Smartsheet.vue | 14 +------------- .../[projectType]/[projectId]/index/index.vue | 9 +++++++++ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/nc-gui-v2/components/tabs/Smartsheet.vue b/packages/nc-gui-v2/components/tabs/Smartsheet.vue index ca045fc415..06b8314a9d 100644 --- a/packages/nc-gui-v2/components/tabs/Smartsheet.vue +++ b/packages/nc-gui-v2/components/tabs/Smartsheet.vue @@ -10,7 +10,6 @@ import { MetaInj, OpenNewRecordFormHookInj, ReloadViewDataHookInj, - TabMetaInj, computed, inject, provide, @@ -18,12 +17,11 @@ import { useMetas, useProvideSmartsheetStore, watch, - watchEffect, } from '#imports' import type { TabItem } from '~/composables' -const { getMeta, metas } = useMetas() +const { metas } = useMetas() const activeView = ref() @@ -35,13 +33,8 @@ const tabMeta = inject( TabMetaInj, computed(() => ({} as TabItem)), ) - const meta = computed(() => metas.value?.[tabMeta?.value?.id as string]) -watchEffect(async () => { - await getMeta(tabMeta?.value?.id as string) -}) - const reloadEventHook = createEventHook() const openNewRecordFormHook = createEventHook() @@ -52,7 +45,6 @@ provideSidebar({ storageKey: 'nc-right-sidebar' }) // todo: move to store provide(MetaInj, meta) -provide(TabMetaInj, tabMeta) provide(ActiveViewInj, activeView) provide(IsLockedInj, isLocked) provide(ReloadViewDataHookInj, reloadEventHook) @@ -62,10 +54,6 @@ provide(IsFormInj, isForm) const treeViewIsLockedInj = inject('TreeViewIsLockedInj', ref(false)) -watch(tabMeta, async (newTabMeta, oldTabMeta) => { - if (newTabMeta !== oldTabMeta && newTabMeta?.id) await getMeta(newTabMeta.id) -}) - watch(isLocked, (nextValue) => (treeViewIsLockedInj.value = nextValue), { immediate: true }) diff --git a/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue b/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue index 8471d52a37..68df7a0e3e 100644 --- a/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue +++ b/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue @@ -7,11 +7,20 @@ import MdiView from '~icons/mdi/eye-circle-outline' import MdiAccountGroup from '~icons/mdi/account-group' const { tabs, activeTabIndex, activeTab, closeTab } = useTabs() +const { getMeta } = useMetas() const { isLoading } = useGlobal() provide(TabMetaInj, activeTab) +watch( + () => activeTab?.value?.id, + async () => { + await getMeta(activeTab?.value?.id as string, true) + }, + { immediate: true }, +) + const icon = (tab: TabItem) => { switch (tab.type) { case TabType.TABLE: From 096ea7289b8b519a47dc83e43701d89d1b12e017 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 26 Aug 2022 01:19:32 +0530 Subject: [PATCH 05/42] fix: avoid multiple meta api request Signed-off-by: Pranav C --- .../pages/[projectType]/[projectId]/index/index.vue | 9 +-------- .../index/index/[type]/[title]/[[viewTitle]].vue | 9 +++++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue b/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue index 68df7a0e3e..8df091dd61 100644 --- a/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue +++ b/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index.vue @@ -7,19 +7,11 @@ import MdiView from '~icons/mdi/eye-circle-outline' import MdiAccountGroup from '~icons/mdi/account-group' const { tabs, activeTabIndex, activeTab, closeTab } = useTabs() -const { getMeta } = useMetas() const { isLoading } = useGlobal() provide(TabMetaInj, activeTab) -watch( - () => activeTab?.value?.id, - async () => { - await getMeta(activeTab?.value?.id as string, true) - }, - { immediate: true }, -) const icon = (tab: TabItem) => { switch (tab.type) { @@ -101,6 +93,7 @@ function onEdit(targetKey: number, action: 'add' | 'remove' | string) { .ant-tabs-nav-add { @apply !hidden; } + .ant-tabs-nav-more { @apply text-white; } diff --git a/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index/[type]/[title]/[[viewTitle]].vue b/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index/[type]/[title]/[[viewTitle]].vue index ec671406ea..d5f4f4375b 100644 --- a/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index/[type]/[title]/[[viewTitle]].vue +++ b/packages/nc-gui-v2/pages/[projectType]/[projectId]/index/index/[type]/[title]/[[viewTitle]].vue @@ -1,7 +1,8 @@ -