diff --git a/cypress-tests/cypress-platform.config.js b/cypress-tests/cypress-platform.config.js index 2ae3bec971..44a3e510d3 100644 --- a/cypress-tests/cypress-platform.config.js +++ b/cypress-tests/cypress-platform.config.js @@ -98,6 +98,7 @@ module.exports = defineConfig({ configFile: environment.configFile, specPattern: [ "cypress/e2e/happyPath/platform/ceTestcases/userFlow/firstUserOnboarding.cy.js", + "cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js" "cypress/e2e/happyPath/platform/ceTestcases/!(userFlow)/**/*.cy.js", "cypress/e2e/happyPath/platform/commonTestcases/**/*.cy.js", ], diff --git a/cypress-tests/cypress.config.js b/cypress-tests/cypress.config.js index 319063995e..f44a6c9c72 100644 --- a/cypress-tests/cypress.config.js +++ b/cypress-tests/cypress.config.js @@ -92,11 +92,7 @@ module.exports = defineConfig({ experimentalModfyObstructiveThirdPartyCode: true, experimentalRunAllSpecs: true, baseUrl: "http://localhost:8082", - specPattern: [ - "cypress/e2e/happyPath/platform/ceTestcases/userFlow/firstUserOnboarding.cy.js", - "cypress/e2e/happyPath/platform/ceTestcases/!(userFlow)/**/*.cy.js", - "cypress/e2e/happyPath/platform/commonTestcases/**/*.cy.js", - ], + specPattern: "cypress/e2e/happyPath/**/*.cy.js", downloadsFolder: "cypress/downloads", numTestsKeptInMemory: 0, redirectionLimit: 10, diff --git a/cypress-tests/cypress/commands/apiCommands.js b/cypress-tests/cypress/commands/apiCommands.js index 18e66a84b6..dabaf1edb2 100644 --- a/cypress-tests/cypress/commands/apiCommands.js +++ b/cypress-tests/cypress/commands/apiCommands.js @@ -627,10 +627,11 @@ Cypress.Commands.add("apiAddDataToTable", (tableName, data) => { }); Cypress.Commands.add("apiGetDataSourceIdByName", (dataSourceName) => { + const workspaceId = Cypress.env("workspaceId"); cy.getAuthHeaders().then((headers) => { cy.request({ method: "GET", - url: `${Cypress.env("server_host")}/api/data-sources`, + url: `${Cypress.env("server_host")}/api/data-sources/${workspaceId}`, headers: headers, }).then((response) => { expect(response.status).to.equal(200); @@ -665,7 +666,7 @@ Cypress.Commands.add( name: dataSourceName, options: [ { key: "connection_type", value: "manual", encrypted: false }, - { key: "host", value: "35.202.183.199" }, + { key: "host", value: "35.238.9.114" }, { key: "port", value: 5432 }, { key: "database", value: "student" }, { key: "username", value: "postgres" }, diff --git a/cypress-tests/cypress/commands/commands.js b/cypress-tests/cypress/commands/commands.js index 1bf26407c7..10c849d807 100644 --- a/cypress-tests/cypress/commands/commands.js +++ b/cypress-tests/cypress/commands/commands.js @@ -15,15 +15,11 @@ const API_ENDPOINT = Cypress.Commands.add( "appUILogin", (email = "dev@tooljet.io", password = "password") => { - cy.visit("/"); - cy.wait(1000); cy.clearAndType(onboardingSelectors.loginEmailInput, email); cy.clearAndType(onboardingSelectors.loginPasswordInput, password); cy.get(onboardingSelectors.signInButton).click(); - - cy.intercept("GET", API_ENDPOINT).as("library_apps"); - cy.get(commonSelectors.homePageLogo, { timeout: 10000 }); - cy.wait("@library_apps"); + cy.wait(2000); + cy.get('[data-cy="main-wrapper"]', { timeout: 10000 }).should("be.visible"); } ); @@ -400,36 +396,39 @@ Cypress.Commands.add("getPosition", (componentName) => { Cypress.Commands.add("defaultWorkspaceLogin", () => { cy.apiLogin(); + // cy.intercept("GET", API_ENDPOINT).as("library_apps"); cy.visit("/my-workspace"); - cy.intercept("GET", API_ENDPOINT).as("library_apps"); + cy.wait(2000) cy.get(commonSelectors.homePageLogo, { timeout: 10000 }); - cy.wait("@library_apps"); - // }); + // cy.wait("@library_apps"); }); Cypress.Commands.add( "visitSlug", ({ actualUrl, - currentUrl = `${Cypress.config("baseUrl")}/error/unknown`, + errorUrls = [ + `${Cypress.config("baseUrl")}/error/unknown`, + `${Cypress.config("baseUrl")}/error/restricted`, + ], }) => { - // Ensure actualUrl is provided if (!actualUrl) { throw new Error("actualUrl is required for visitSlug command."); } cy.visit(actualUrl); - // Dynamically wait for the correct URL or handle navigation errors cy.url().then((url) => { - if (url === currentUrl) { - cy.log(`Navigation resulted in unexpected URL: ${url}. Retrying...`); + if (errorUrls.includes(url)) { + cy.log(`Navigation resulted in error URL: ${url}. Retrying...`); cy.visit(actualUrl); + cy.wait(1000); } }); } ); + Cypress.Commands.add("releaseApp", () => { if (Cypress.env("environment") !== "Community") { cy.get(commonEeSelectors.promoteButton).click(); @@ -520,16 +519,6 @@ Cypress.Commands.add("verifyElement", (selector, text, eqValue) => { element.should("be.visible").and("have.text", text); }); -Cypress.Commands.add("loginWithCredentials", (email, password) => { - cy.get(onboardingSelectors.loginEmailInput, { timeout: 20000 }).should( - "be.visible" - ); - cy.clearAndType(onboardingSelectors.loginEmailInput, email); - cy.clearAndType(onboardingSelectors.loginPasswordInput, password); - cy.get(onboardingSelectors.signInButton).click(); - cy.wait(3000); - cy.get(commonSelectors.pageLogo).should("be.visible"); -}); Cypress.Commands.add("getAppId", (appName) => { cy.task("dbConnection", { diff --git a/cypress-tests/cypress/constants/selectors/common.js b/cypress-tests/cypress/constants/selectors/common.js index 547928ab33..42e3378825 100644 --- a/cypress-tests/cypress/constants/selectors/common.js +++ b/cypress-tests/cypress/constants/selectors/common.js @@ -259,7 +259,7 @@ export const commonSelectors = { cloneAppTitle: '[data-cy="clone-app-title"]', cloneAppButton: '[data-cy="clone-app"]', appNameErrorLabel: '[data-cy="app-name-error-label"]', - importAppTitle: '[data-cy="import-app-title"]', + importAppTitle: '[data-cy="import-an-app"]', importAppButton: '[data-cy="import-app"]', chooseFromTemplateButton: '[data-cy="choose-from-template-button"]', CreateAppFromTemplateButton: '[data-cy="create-new-app-from-template-title"]', diff --git a/cypress-tests/cypress/constants/texts/dataSource.js b/cypress-tests/cypress/constants/texts/dataSource.js index 063d87d469..ab1f8702d2 100644 --- a/cypress-tests/cypress/constants/texts/dataSource.js +++ b/cypress-tests/cypress/constants/texts/dataSource.js @@ -13,7 +13,7 @@ export const dataSourceText = { ? "Databases (20)" : "Databases (18)"; }, - allApis: "APIs (20)", + allApis: "APIs (21)", allCloudStorage: "Cloud Storages (4)", pluginsLabelAndCount: "Plugins (0)", diff --git a/cypress-tests/cypress/constants/texts/workspaceConstants.js b/cypress-tests/cypress/constants/texts/workspaceConstants.js index a8abc75bf9..8073482d93 100644 --- a/cypress-tests/cypress/constants/texts/workspaceConstants.js +++ b/cypress-tests/cypress/constants/texts/workspaceConstants.js @@ -4,7 +4,7 @@ export const workspaceConstantsText = { secretsConstantInfo: "To resolve a secret workspace constant use {{secrets.access_token}}Read documentation", emptyStateHeader: "No Workspace constants yet", emptyStateText: - "Use workspace constants seamlessly in both the app builder and data source connections across ToolJet.", + "Use workspace constants seamlessly within both the app builder and data source connections across the platform.", addNewConstantButton: "+ Create new constant", addConstatntText: "Add new constant in production ", constantCreatedToast: (type) => { return `${type} constant created successfully!` }, diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appExport.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appExport.cy.js new file mode 100644 index 0000000000..e97269cf39 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appExport.cy.js @@ -0,0 +1,219 @@ +import { fake } from "Fixtures/fake"; +import { commonSelectors } from "Selectors/common"; +import { importSelectors } from "Selectors/exportImport"; +import { commonText } from "Texts/common"; + +import { exportAppModalText } from "Texts/exportImport"; +import { + clickOnExportButtonAndVerify, + exportAllVersionsAndVerify, + verifyElementsOfExportModal, +} from "Support/utils/exportImport"; +import { selectAppCardOption, closeModal } from "Support/utils/common"; + +describe("App Export", () => { + const TEST_DATA = { + appFiles: { + multiVersion: "cypress/fixtures/templates/three-versions.json", + singleVersion: "cypress/fixtures/templates/one_version.json", + }, + }; + + let data; + + data = { + workspaceName: fake.firstName, + workspaceSlug: fake.firstName.toLowerCase().replace(/\s+/g, "-"), + appName: `${fake.companyName}-IE-App`, + appReName: `${fake.companyName}-${fake.companyName}-IE-App`, + dsName: fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""), + }; + + beforeEach(() => { + data = { + workspaceName: fake.firstName, + workspaceSlug: fake.firstName.toLowerCase().replace(/\s+/g, "-"), + appName: `${fake.companyName}-IE-App`, + appReName: `${fake.companyName}-${fake.companyName}-IE-App`, + dsName: fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""), + }; + cy.exec("mkdir -p ./cypress/downloads/"); + cy.wait(3000); + + cy.apiLogin(); + cy.apiCreateWorkspace(data.workspaceName, data.workspaceSlug); + cy.apiLogout(); + }); + + it("Verify the elements of export dialog box", () => { + cy.window({ log: false }).then((win) => { + win.localStorage.setItem("walkthroughCompleted", "true"); + }); + + cy.apiLogin(); + cy.visit(`${data.workspaceSlug}`); + cy.get(importSelectors.importOptionInput) + .eq(0) + .selectFile(TEST_DATA.appFiles.multiVersion, { + force: true, + }); + cy.wait(1500); + cy.clearAndType(commonSelectors.appNameInput, data.appName); + cy.get(importSelectors.importAppButton).click(); + cy.wait(3000); + cy.backToApps(); + + // Select the app card option to export the app + selectAppCardOption( + data.appName, + commonSelectors.appCardOptions(commonText.exportAppOption) + ); + + // Verify the elements of the export modal + verifyElementsOfExportModal("v3", ["v2", "v1"], [true, false, false]); + + // Close the modal + closeModal(exportAppModalText.modalCloseButton); + + // Ensure the modal title is no longer visible + cy.get( + commonSelectors.modalTitle(exportAppModalText.selectVersionTitle) + ).should("not.exist"); + + // Re-open the export modal and click the export button + selectAppCardOption( + data.appName, + commonSelectors.appCardOptions(commonText.exportAppOption) + ); + clickOnExportButtonAndVerify(exportAppModalText.exportAll, data.appName); + + cy.exec("ls ./cypress/downloads/").then((result) => { + const downloadedAppExportFileName = result.stdout.split("\n")[0]; + const filePath = `./cypress/downloads/${downloadedAppExportFileName}`; + + // Ensure the file name contains the expected app export name + expect(downloadedAppExportFileName).to.contain( + data.appName.toLowerCase() + ); + + // Read and validate the exported JSON file + cy.readFile(filePath).then((appData) => { + // Validate the app name + const appNameFromFile = appData.app[0].definition.appV2.name; + expect(appNameFromFile).to.equal(data.appName); + + // Validate the schema for the student table in tooljetdb + const tooljetDatabase = appData.tooljet_database.find( + (db) => db.table_name === "student" + ); + expect(tooljetDatabase).to.exist; + expect(tooljetDatabase.schema).to.exist; + + // Validate components and queries + const components = appData.app[0].definition.appV2.components; + + const text2Component = components.find( + (component) => component.name === "text2" + ); + expect(text2Component).to.exist; + expect(text2Component.properties.text.value).to.equal( + "{{constants.pageHeader}}" + ); + + const textinput1 = components.find( + (component) => component.name === "textinput1" + ); + expect(textinput1).to.exist; + expect(textinput1.properties.value.value).to.include("queries"); + + const textinput2 = components.find( + (component) => component.name === "textinput2" + ); + expect(textinput2).to.exist; + expect(textinput2.properties.value.value).to.include("queries"); + + const textinput3 = components.find( + (component) => component.name === "textinput3" + ); + expect(textinput3).to.exist; + expect(textinput3.properties.value.value).to.include("queries"); + + // Validate the data queries + const dataQueries = appData.app[0].definition.appV2.dataQueries; + + const postgresqlQuery = dataQueries.find( + (query) => query.name === "postgresql1" + ); + expect(postgresqlQuery).to.exist; + expect(postgresqlQuery.options.query).to.include( + "Select * from {{secrets.db_name}}" + ); + + const restapiQuery = dataQueries.find( + (query) => query.name === "restapi1" + ); + expect(restapiQuery).to.exist; + expect(restapiQuery.options.url).to.equal( + "https://jsonplaceholder.typicode.com/users/1" + ); + + const tooljetdbQuery = dataQueries.find( + (query) => query.name === "tooljetdb1" + ); + expect(tooljetdbQuery).to.exist; + expect(tooljetdbQuery.options.operation).to.equal("list_rows"); + + // Ensure appVersions exists + const appVersions = appData.app[0].definition.appV2.appVersions; + expect(appVersions).to.exist; + + // Map and verify app version names + const versionNames = appVersions.map((version) => version.name); + expect(versionNames).to.include.members(["v1", "v2", "v3"]); + }); + }); + + cy.exec("cd ./cypress/downloads/ && rm -rf *"); + + selectAppCardOption( + data.appName, + commonSelectors.appCardOptions(commonText.exportAppOption) + ); + cy.get(`[data-cy="v1-radio-button"]`).check(); + cy.get( + commonSelectors.buttonSelector(exportAppModalText.exportSelectedVersion) + ).click(); + + cy.exec("ls ./cypress/downloads/").then((result) => { + const downloadedAppExportFileName = result.stdout.split("\n")[0]; + const filePath = `./cypress/downloads/${downloadedAppExportFileName}`; + + // Ensure the file name contains the expected app export name + expect(downloadedAppExportFileName).to.contain( + data.appName.toLowerCase() + ); + + // Read and validate the exported JSON file + cy.readFile(filePath).then((appData) => { + // Validate the app name + const appNameFromFile = appData.app[0].definition.appV2.name; + expect(appNameFromFile).to.equal(data.appName); + }); + }); + }); + + it.skip("Verify 'Export app' functionality of an application inside app editor", () => { + data.appName2 = `${fake.companyName}-App`; + cy.apiCreateApp(data.appName2); + cy.openApp(data.appName2); + + cy.dragAndDropWidget("Text Input", 50, 50); + + cy.get('[data-cy="left-sidebar-settings-button"]').click(); + cy.get('[data-cy="button-user-status-change"]').click(); + + verifyElementsOfExportModal("v1"); + + exportAllVersionsAndVerify(data.appName1, "v1"); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appImport.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appImport.cy.js new file mode 100644 index 0000000000..a6b068d137 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appImport.cy.js @@ -0,0 +1,230 @@ +import { fake } from "Fixtures/fake"; +import { commonSelectors, commonWidgetSelector } from "Selectors/common"; +import { appVersionSelectors, importSelectors } from "Selectors/exportImport"; +import { dashboardSelector } from "Selectors/dashboard"; +import { buttonText } from "Texts/button"; + +import { importText } from "Texts/exportImport"; +import { importAndVerifyApp } from "Support/utils/exportImport"; +import { switchVersionAndVerify } from "Support/utils/version"; + +describe("App Import Functionality", () => { + const TEST_DATA = { + toolJetImage: "cypress/fixtures/Image/tooljet.png", + invalidApp: "cypress/fixtures/templates/invalid_app.json", + invalidFile: "cypress/fixtures/templates/invalid_file.json", + appFiles: { + multiVersion: "cypress/fixtures/templates/three-versions.json", + singleVersion: "cypress/fixtures/templates/one_version.json", + }, + }; + + let data; + + beforeEach(() => { + cy.viewport(1200, 1300); + data = { + workspaceName: fake.firstName, + workspaceSlug: fake.firstName.toLowerCase().replace(/\s+/g, "-"), + appName: `${fake.companyName}-IE-App`, + appReName: `${fake.companyName}-${fake.companyName}-IE-App`, + dsName: fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""), + }; + + cy.apiLogin(); + cy.apiCreateWorkspace(data.workspaceName, data.workspaceSlug); + cy.apiLogout(); + }); + + it("should verify app import functionality", () => { + cy.apiLogin(); + cy.visit(`${data.workspaceSlug}`); + + // Test invalid file import + cy.get(dashboardSelector.importAppButton).click(); + importAndVerifyApp( + TEST_DATA.toolJetImage, + importText.couldNotImportAppToastMessage + ); + + cy.wait(500); + cy.get(dashboardSelector.importAppButton).click(); + importAndVerifyApp( + TEST_DATA.invalidApp, + "Could not import: SyntaxError: Expected ',' or '}' after property value in JSON at position 246 (line 11 column 13)" + ); + + cy.wait(500); + + // Test valid app import + cy.get(importSelectors.dropDownMenu).should("be.visible").click(); + cy.get(importSelectors.importOptionLabel).verifyVisibleElement( + "have.text", + importText.importOption + ); + + cy.intercept("POST", "/api/v2/resources/import").as("importApp"); + cy.get(importSelectors.importOptionInput) + .eq(0) + .selectFile(TEST_DATA.appFiles.multiVersion, { + force: true, + }); + cy.wait(1500); + + cy.get(importSelectors.importAppTitle).verifyVisibleElement( + "have.text", + "Import app" + ); + cy.get(commonSelectors.appNameLabel).verifyVisibleElement( + "have.text", + "App name" + ); + cy.get(commonSelectors.appNameInput) + .should("be.visible") + .and("have.value", "three-versions"); + cy.get(commonSelectors.appNameInfoLabel).verifyVisibleElement( + "have.text", + "App name must be unique and max 50 characters" + ); + cy.get(commonSelectors.cancelButton) + .should("be.visible") + .and("have.text", "Cancel"); + cy.get(commonSelectors.importAppButton).verifyVisibleElement( + "have.text", + "Import app" + ); + + cy.get(importSelectors.importAppButton).click(); + cy.get(".go3958317564") + .should("be.visible") + .and("have.text", importText.appImportedToastMessage); + + // Verify imported app + cy.get(".driver-close-btn").click(); + cy.wait(500); + cy.get(commonSelectors.appNameInput).verifyVisibleElement( + "contain.value", + "three-versions" + ); + + // Configure app + cy.skipEditorPopover(); + cy.dragAndDropWidget(buttonText.defaultWidgetText); + cy.get(appVersionSelectors.appVersionLabel).should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("button1")).should( + "be.visible" + ); + + cy.renameApp(data.appName); + cy.get(commonSelectors.appNameInput).verifyVisibleElement( + "contain.value", + data.appName + ); + cy.waitForAutoSave(); + + // Verify initial widget states + + verifyCommonData({ + text2: "", + textInput1: "", + textInput2: "Leanne Graham", + }); + + // cy.get( + // commonWidgetSelector.draggableWidget("textInput3") + // ).verifyVisibleElement("have.value", ""); + + // Setup database and data sources + cy.visit(`${data.workspaceSlug}/database`); + cy.get('[data-cy="student-table"]').verifyVisibleElement( + "have.text", + "student" + ); + + // cy.apiAddDataToTable("student", { + // name: "Paramu", + // country: "India", + // state: "Kerala", + // }); + + cy.visit(`${data.workspaceSlug}/data-sources`); + cy.get('[data-cy="postgresql-button"]').should("be.visible"); + cy.apiUpdateDataSource("postgresql", "production", { + options: [ + { + key: "password", + value: `${Cypress.env("pg_password")}`, + encrypted: true, + }, + ], + }); + + cy.apiCreateWsConstant( + "pageHeader", + "Import and Export", + ["Global"], + ["production"] + ); + cy.apiCreateWsConstant("db_name", "persons", ["Secret"], ["production"]); + + // Verify app after setup + cy.wait("@importApp").then((interception) => { + const appId = interception.response.body.imports.app[0].id; + cy.openApp( + "", + Cypress.env("workspaceId"), + appId, + commonWidgetSelector.draggableWidget("text2") + ); + }); + + verifyCommonData({ + text2: "Import and Export", + textInput1: "John", + textInput2: "Leanne Graham", + }); + // cy.get( + // commonWidgetSelector.draggableWidget("textInput3") + // ).verifyVisibleElement("have.value", "India"); + + switchVersionAndVerify("v3", "v1"); + + verifyCommonData({ + text2: "Import and Export", + textInput1: "John", + textInput2: "Leanne Graham", + }); + + cy.wait(1000); + cy.backToApps(); + + // Test single version import + cy.get(importSelectors.dropDownMenu).click(); + importAndVerifyApp(TEST_DATA.appFiles.singleVersion); + + // Verify final state + cy.get(commonSelectors.appNameInput).verifyVisibleElement( + "contain.value", + "one_version" + ); + + verifyCommonData({ + text2: "Import and Export", + textInput1: "John", + textInput2: "Leanne Graham", + }); + }); +}); + +const verifyCommonData = (values) => { + cy.get(commonWidgetSelector.draggableWidget("text2")).verifyVisibleElement( + "have.text", + values.text2 + ); + cy.get( + commonWidgetSelector.draggableWidget("textInput1") + ).verifyVisibleElement("have.value", values.textInput1); + cy.get( + commonWidgetSelector.draggableWidget("textInput2") + ).verifyVisibleElement("have.value", values.textInput2); +}; diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appImportAndExport.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appImportAndExport.cy.js deleted file mode 100644 index b5271aa8d7..0000000000 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appImportAndExport.cy.js +++ /dev/null @@ -1,419 +0,0 @@ -import { fake } from "Fixtures/fake"; -import { commonSelectors, commonWidgetSelector } from "Selectors/common"; -import { appVersionSelectors, importSelectors } from "Selectors/exportImport"; -import { commonText } from "Texts/common"; -import { dashboardSelector } from "Selectors/dashboard"; -import { buttonText } from "Texts/button"; - -import { exportAppModalText, importText } from "Texts/exportImport"; -import { - clickOnExportButtonAndVerify, - exportAllVersionsAndVerify, - verifyElementsOfExportModal, - importAndVerifyApp, -} from "Support/utils/exportImport"; -import { selectAppCardOption, closeModal } from "Support/utils/common"; -import { switchVersionAndVerify } from "Support/utils/version"; - -describe("App Import Functionality", () => { - const TEST_DATA = { - toolJetImage: "cypress/fixtures/Image/tooljet.png", - invalidApp: "cypress/fixtures/templates/invalid_app.json", - invalidFile: "cypress/fixtures/templates/invalid_file.json", - appFiles: { - multiVersion: "cypress/fixtures/templates/three-versions.json", - singleVersion: "cypress/fixtures/templates/one_version.json", - }, - }; - - let data; - - const initializeData = () => { - const firstName = fake.firstName; - return { - workspaceName: firstName, - workspaceSlug: firstName.toLowerCase().replace(/\s+/g, "-"), - appName: `${fake.companyName}-IE-App`, - appReName: `${fake.companyName}-${fake.companyName}-IE-App`, - dsName: fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""), - }; - }; - - data = initializeData(); - - before(() => { - cy.exec("mkdir -p ./cypress/downloads/"); - cy.wait(3000); - }); - - beforeEach(() => { - cy.viewport(1200, 1300); - cy.apiLogin(); - }); - - it("should verify app import functionality", () => { - cy.apiCreateWorkspace(data.workspaceName, data.workspaceSlug); - cy.apiLogout(); - cy.apiLogin(); - cy.visit(`${data.workspaceSlug}`); - - // Test invalid file import - cy.get(dashboardSelector.importAppButton).click(); - importAndVerifyApp( - TEST_DATA.toolJetImage, - importText.couldNotImportAppToastMessage - ); - - cy.wait(500); - cy.get(dashboardSelector.importAppButton).click(); - importAndVerifyApp( - TEST_DATA.invalidApp, - "Could not import: SyntaxError: Expected ',' or '}' after property value in JSON at position 246 (line 11 column 13)" - ); - - cy.wait(500); - cy.get(dashboardSelector.importAppButton).click(); - cy.get(importSelectors.importOptionInput) - .eq(0) - .selectFile(TEST_DATA.invalidFile, { - force: true, - }); - cy.get(importSelectors.importAppTitle).should("be.visible"); - cy.get(importSelectors.importAppButton).click(); - cy.verifyToastMessage( - commonSelectors.toastMessage, - "tooljet_version must be a string" - ); - cy.wait(500); - - // Test valid app import - cy.get(importSelectors.dropDownMenu).should("be.visible").click(); - cy.get(importSelectors.importOptionLabel).verifyVisibleElement( - "have.text", - importText.importOption - ); - - cy.intercept("POST", "/api/v2/resources/import").as("importApp"); - cy.get(importSelectors.importOptionInput) - .eq(0) - .selectFile(TEST_DATA.appFiles.multiVersion, { - force: true, - }); - cy.wait(1500); - - cy.get(importSelectors.importAppTitle).verifyVisibleElement( - "have.text", - "Import app" - ); - cy.get(commonSelectors.appNameLabel).verifyVisibleElement( - "have.text", - "App name" - ); - cy.get(commonSelectors.appNameInput) - .should("be.visible") - .and("have.value", "three-versions"); - cy.get(commonSelectors.appNameInfoLabel).verifyVisibleElement( - "have.text", - "App name must be unique and max 50 characters" - ); - cy.get(commonSelectors.cancelButton) - .should("be.visible") - .and("have.text", "Cancel"); - cy.get(commonSelectors.importAppButton).verifyVisibleElement( - "have.text", - "Import app" - ); - - cy.get(importSelectors.importAppButton).click(); - cy.get(".go3958317564") - .should("be.visible") - .and("have.text", importText.appImportedToastMessage); - - // Verify imported app - cy.get(".driver-close-btn").click(); - cy.wait(500); - cy.get(commonSelectors.appNameInput).verifyVisibleElement( - "contain.value", - "three-versions" - ); - - // Configure app - cy.skipEditorPopover(); - cy.dragAndDropWidget(buttonText.defaultWidgetText); - cy.get(appVersionSelectors.appVersionLabel).should("be.visible"); - cy.get(commonWidgetSelector.draggableWidget("button1")).should( - "be.visible" - ); - - cy.renameApp(data.appName); - cy.get(commonSelectors.appNameInput).verifyVisibleElement( - "contain.value", - data.appName - ); - cy.waitForAutoSave(); - - // Verify initial widget states - - verifyCommonData({ - text2: "", - textInput1: "", - textInput2: "Leanne Graham", - }); - - cy.get( - commonWidgetSelector.draggableWidget("textInput3") - ).verifyVisibleElement("have.value", ""); - - // Setup database and data sources - cy.visit(`${data.workspaceSlug}/database`); - cy.get('[data-cy="student-table"]').verifyVisibleElement( - "have.text", - "student" - ); - - cy.apiAddDataToTable("student", { - name: "Paramu", - country: "India", - state: "Kerala", - }); - - cy.visit(`${data.workspaceSlug}/data-sources`); - cy.get('[data-cy="postgresql-button"]').should("be.visible"); - cy.apiUpdateDataSource("postgresql", "production", { - options: [ - { - key: "password", - value: `${Cypress.env("pg_password")}`, - encrypted: true, - }, - ], - }); - - cy.apiCreateWsConstant( - "pageHeader", - "Import and Export", - ["Global"], - ["production"] - ); - cy.apiCreateWsConstant("db_name", "persons", ["Secret"], ["production"]); - - // Verify app after setup - cy.wait("@importApp").then((interception) => { - const appId = interception.response.body.imports.app[0].id; - cy.openApp( - "", - Cypress.env("workspaceId"), - appId, - commonWidgetSelector.draggableWidget("text2") - ); - }); - - verifyCommonData({ - text2: "Import and Export", - textInput1: "John", - textInput2: "Leanne Graham", - }); - cy.get( - commonWidgetSelector.draggableWidget("textInput3") - ).verifyVisibleElement("have.value", "India"); - - switchVersionAndVerify("v3", "v1"); - - verifyCommonData({ - text2: "Import and Export", - textInput1: "John", - textInput2: "Leanne Graham", - }); - - cy.wait(1000); - cy.backToApps(); - - // Test single version import - cy.get(importSelectors.dropDownMenu).click(); - importAndVerifyApp(TEST_DATA.appFiles.singleVersion); - - // Verify final state - cy.get(commonSelectors.appNameInput).verifyVisibleElement( - "contain.value", - "one_version" - ); - - verifyCommonData({ - text2: "Import and Export", - textInput1: "John", - textInput2: "Leanne Graham", - }); - }); - - it("Verify the elements of export dialog box", () => { - cy.exec("cd ./cypress/downloads/ && rm -rf *"); - - cy.visit(`${data.workspaceSlug}`); - - // Select the app card option to export the app - selectAppCardOption( - data.appName, - commonSelectors.appCardOptions(commonText.exportAppOption) - ); - - // Verify the elements of the export modal - verifyElementsOfExportModal("v3", ["v2", "v1"], [true, false, false]); - - // Close the modal - closeModal(exportAppModalText.modalCloseButton); - - // Ensure the modal title is no longer visible - cy.get( - commonSelectors.modalTitle(exportAppModalText.selectVersionTitle) - ).should("not.exist"); - - // Re-open the export modal and click the export button - selectAppCardOption( - data.appName, - commonSelectors.appCardOptions(commonText.exportAppOption) - ); - clickOnExportButtonAndVerify(exportAppModalText.exportAll, data.appName); - - cy.exec("ls ./cypress/downloads/").then((result) => { - const downloadedAppExportFileName = result.stdout.split("\n")[0]; - const filePath = `./cypress/downloads/${downloadedAppExportFileName}`; - - // Ensure the file name contains the expected app export name - expect(downloadedAppExportFileName).to.contain( - data.appName.toLowerCase() - ); - - // Read and validate the exported JSON file - cy.readFile(filePath).then((appData) => { - // Validate the app name - const appNameFromFile = appData.app[0].definition.appV2.name; - expect(appNameFromFile).to.equal(data.appName); - - // Validate the schema for the student table in tooljetdb - const tooljetDatabase = appData.tooljet_database.find( - (db) => db.table_name === "student" - ); - expect(tooljetDatabase).to.exist; - expect(tooljetDatabase.schema).to.exist; - - // Validate components and queries - const components = appData.app[0].definition.appV2.components; - - const text2Component = components.find( - (component) => component.name === "text2" - ); - expect(text2Component).to.exist; - expect(text2Component.properties.text.value).to.equal( - "{{constants.pageHeader}}" - ); - - const textinput1 = components.find( - (component) => component.name === "textinput1" - ); - expect(textinput1).to.exist; - expect(textinput1.properties.value.value).to.include("queries"); - - const textinput2 = components.find( - (component) => component.name === "textinput2" - ); - expect(textinput2).to.exist; - expect(textinput2.properties.value.value).to.include("queries"); - - const textinput3 = components.find( - (component) => component.name === "textinput3" - ); - expect(textinput3).to.exist; - expect(textinput3.properties.value.value).to.include("queries"); - - // Validate the data queries - const dataQueries = appData.app[0].definition.appV2.dataQueries; - - const postgresqlQuery = dataQueries.find( - (query) => query.name === "postgresql1" - ); - expect(postgresqlQuery).to.exist; - expect(postgresqlQuery.options.query).to.include( - "Select * from {{secrets.db_name}}" - ); - - const restapiQuery = dataQueries.find( - (query) => query.name === "restapi1" - ); - expect(restapiQuery).to.exist; - expect(restapiQuery.options.url).to.equal( - "https://jsonplaceholder.typicode.com/users/1" - ); - - const tooljetdbQuery = dataQueries.find( - (query) => query.name === "tooljetdb1" - ); - expect(tooljetdbQuery).to.exist; - expect(tooljetdbQuery.options.operation).to.equal("list_rows"); - - // Ensure appVersions exists - const appVersions = appData.app[0].definition.appV2.appVersions; - expect(appVersions).to.exist; - - // Map and verify app version names - const versionNames = appVersions.map((version) => version.name); - expect(versionNames).to.include.members(["v1", "v2", "v3"]); - }); - }); - - cy.exec("cd ./cypress/downloads/ && rm -rf *"); - - selectAppCardOption( - data.appName, - commonSelectors.appCardOptions(commonText.exportAppOption) - ); - cy.get(`[data-cy="v1-radio-button"]`).check(); - cy.get( - commonSelectors.buttonSelector(exportAppModalText.exportSelectedVersion) - ).click(); - - cy.exec("ls ./cypress/downloads/").then((result) => { - const downloadedAppExportFileName = result.stdout.split("\n")[0]; - const filePath = `./cypress/downloads/${downloadedAppExportFileName}`; - - // Ensure the file name contains the expected app export name - expect(downloadedAppExportFileName).to.contain( - data.appName.toLowerCase() - ); - - // Read and validate the exported JSON file - cy.readFile(filePath).then((appData) => { - // Validate the app name - const appNameFromFile = appData.app[0].definition.appV2.name; - expect(appNameFromFile).to.equal(data.appName); - }); - }); - }); - - it.skip("Verify 'Export app' functionality of an application inside app editor", () => { - data.appName2 = `${fake.companyName}-App`; - cy.apiCreateApp(data.appName2); - cy.openApp(data.appName2); - - cy.dragAndDropWidget("Text Input", 50, 50); - - cy.get('[data-cy="left-sidebar-settings-button"]').click(); - cy.get('[data-cy="button-user-status-change"]').click(); - - verifyElementsOfExportModal("v1"); - - exportAllVersionsAndVerify(data.appName1, "v1"); - }); -}); - -const verifyCommonData = (values) => { - cy.get(commonWidgetSelector.draggableWidget("text2")).verifyVisibleElement( - "have.text", - values.text2 - ); - cy.get( - commonWidgetSelector.draggableWidget("textInput1") - ).verifyVisibleElement("have.value", values.textInput1); - cy.get( - commonWidgetSelector.draggableWidget("textInput2") - ).verifyVisibleElement("have.value", values.textInput2); -}; diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appSlug.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appSlug.cy.js index 1d6c45b516..b3e3f975dc 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appSlug.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/appSlug.cy.js @@ -15,7 +15,6 @@ describe("App Slug", () => { beforeEach(() => { data.slug = `${fake.companyName.toLowerCase()}-app`; data.appName = `${fake.companyName} App`; - cy.log(Cypress.env("workspaceId")); cy.defaultWorkspaceLogin(); }); @@ -25,133 +24,137 @@ describe("App Slug", () => { cy.apiCreateApp(data.appName); cy.wait(1000); cy.apiLogout(); - cy.log(Cypress.env("workspaceId")); - }); it("Verify app slug cases in global settings", () => { - cy.apiLogin("dev@tooljet.io", "password").then(() => { - const workspaceId = Cypress.env("workspaceId"); - const appId = Cypress.env("appId"); + cy.apiLogin(); + const workspaceId = Cypress.env("workspaceId"); + const appId = Cypress.env("appId"); - cy.openApp("my-workspace"); - cy.get(commonSelectors.leftSideBarSettingsButton).click(); + cy.visit("/my-workspace"); + cy.wait(1000); - // Verify initial state - cy.get(commonWidgetSelector.appSlugLabel).verifyVisibleElement( - "have.text", - "Unique app slug" - ); - cy.get(commonWidgetSelector.appSlugInput).verifyVisibleElement( - "have.value", - Cypress.env("appId") - ); - cy.get(commonWidgetSelector.appSlugInfoLabel).verifyVisibleElement( - "have.text", - "URL-friendly 'slug' consists of lowercase letters, numbers, and hyphens" - ); - - cy.get(commonWidgetSelector.appLinkLabel).verifyVisibleElement( - "have.text", - "App link" - ); - - cy.get(commonWidgetSelector.appLinkField).verifyVisibleElement( - "have.text", - `${host}/${workspaceId}/apps/${appId}` - ); - - // Validate all error cases - verifySlugValidations(commonWidgetSelector.appSlugInput); - - // Verify successful slug update - cy.clearAndType(commonWidgetSelector.appSlugInput, data.slug); - verifySuccessfulSlugUpdate(workspaceId, data.slug); - - // Verify persistence - cy.get('[data-cy="left-sidebar-debugger-button"]').click(); - cy.get(commonSelectors.leftSideBarSettingsButton).click(); - cy.get(commonWidgetSelector.appSlugInput).should("have.value", data.slug); - - // Release and verify URLs - releaseApp(); - verifyURLs(workspaceId, data.slug, false); - - // Verify duplicate slug validation - cy.visit("/my-workspace"); - cy.apiCreateApp(data.slug); - cy.openApp("my-workspace"); - cy.get(commonSelectors.leftSideBarSettingsButton).click(); - cy.get(commonWidgetSelector.appSlugInput).clear(); - cy.clearAndType(commonWidgetSelector.appSlugInput, data.slug); - cy.get(commonWidgetSelector.appSlugErrorLabel).verifyVisibleElement( - "have.text", - "This app slug is already taken." - ); + cy.window({ log: false }).then((win) => { + win.localStorage.setItem("walkthroughCompleted", "true"); }); + cy.visit(`/${Cypress.env("workspaceId")}/apps/${Cypress.env("appId")}/`); + cy.wait(1000); + + cy.get(commonSelectors.leftSideBarSettingsButton).click(); + + // Verify initial state + cy.get(commonWidgetSelector.appSlugLabel).verifyVisibleElement( + "have.text", + "Unique app slug" + ); + cy.get(commonWidgetSelector.appSlugInput).verifyVisibleElement( + "have.value", + Cypress.env("appId") + ); + cy.get(commonWidgetSelector.appSlugInfoLabel).verifyVisibleElement( + "have.text", + "URL-friendly 'slug' consists of lowercase letters, numbers, and hyphens" + ); + + cy.get(commonWidgetSelector.appLinkLabel).verifyVisibleElement( + "have.text", + "App link" + ); + + cy.get(commonWidgetSelector.appLinkField).verifyVisibleElement( + "have.text", + `${host}/${workspaceId}/apps/${appId}` + ); + + // Validate all error cases + verifySlugValidations(commonWidgetSelector.appSlugInput); + + // Verify successful slug update + cy.clearAndType(commonWidgetSelector.appSlugInput, data.slug); + verifySuccessfulSlugUpdate(workspaceId, data.slug); + + // Verify persistence + cy.get('[data-cy="left-sidebar-debugger-button"]').click(); + cy.get(commonSelectors.leftSideBarSettingsButton).click(); + cy.get(commonWidgetSelector.appSlugInput).should("have.value", data.slug); + + // Release and verify URLs + releaseApp(); + verifyURLs(workspaceId, data.slug, false); + + // Verify duplicate slug validation + cy.visit("/my-workspace"); + cy.apiCreateApp(data.slug); + cy.openApp("my-workspace"); + cy.get(commonSelectors.leftSideBarSettingsButton).click(); + cy.get(commonWidgetSelector.appSlugInput).clear(); + cy.clearAndType(commonWidgetSelector.appSlugInput, data.slug); + cy.get(commonWidgetSelector.appSlugErrorLabel).verifyVisibleElement( + "have.text", + "This app slug is already taken." + ); }); it("Verify app slug cases in share modal", () => { - cy.apiLogin("dev@tooljet.io", "password").then(() => { - const workspaceId = Cypress.env("workspaceId"); + cy.apiLogin(); + const workspaceId = Cypress.env("workspaceId"); - cy.apiCreateApp(data.appName); - cy.openApp("my-workspace"); + cy.apiCreateApp(data.appName); + cy.openApp("my-workspace"); - // Set up initial slug - cy.get(commonSelectors.leftSideBarSettingsButton).click(); - cy.get(commonWidgetSelector.appSlugInput).clear(); - cy.clearAndType(commonWidgetSelector.appSlugInput, data.slug); + // Set up initial slug + cy.get(commonSelectors.leftSideBarSettingsButton).click(); + cy.get(commonWidgetSelector.appSlugInput).clear(); + cy.clearAndType(commonWidgetSelector.appSlugInput, data.slug); - releaseApp(); + releaseApp(); - // Verify share modal - cy.get(commonWidgetSelector.shareAppButton).click(); - cy.get(commonWidgetSelector.appLink).verifyVisibleElement( - "have.text", - `${host}/applications/` - ); - cy.get(commonWidgetSelector.appNameSlugInput).should( - "have.value", - data.slug - ); + // Verify share modal + cy.get(commonWidgetSelector.shareAppButton).click(); + cy.get(commonWidgetSelector.appLink).verifyVisibleElement( + "have.text", + `${host}/applications/` + ); + cy.get(commonWidgetSelector.appNameSlugInput).should( + "have.value", + data.slug + ); - // Validate all error cases in share modal - verifySlugValidations(commonWidgetSelector.appNameSlugInput); + // Validate all error cases in share modal + verifySlugValidations(commonWidgetSelector.appNameSlugInput); - cy.wait(500); - cy.clearAndType(commonWidgetSelector.appNameSlugInput, data.slug); - cy.get('[data-cy="app-slug-info-label"]') - .invoke("text") - .then((text) => { - expect(text.trim()).to.eq( - "URL-friendly 'slug' consists of lowercase letters, numbers, and hyphens" - ); - }); + cy.wait(500); + cy.clearAndType(commonWidgetSelector.appNameSlugInput, data.slug); + cy.get('[data-cy="app-slug-info-label"]') + .invoke("text") + .then((text) => { + expect(text.trim()).to.eq( + "URL-friendly 'slug' consists of lowercase letters, numbers, and hyphens" + ); + }); - // Verify successful slug update in share modal - data.slug = `${fake.companyName.toLowerCase()}-app`; - cy.clearAndType(commonWidgetSelector.appNameSlugInput, data.slug); - cy.get('[data-cy="app-slug-accepted-label"]').verifyVisibleElement( - "have.text", - "Slug accepted!" - ); + // Verify successful slug update in share modal + data.slug = `${fake.companyName.toLowerCase()}-app`; + cy.clearAndType(commonWidgetSelector.appNameSlugInput, data.slug); + cy.get('[data-cy="app-slug-accepted-label"]').verifyVisibleElement( + "have.text", + "Slug accepted!" + ); - // Close modal and verify URLs - cy.get(commonWidgetSelector.modalCloseButton).click(); - verifyURLs(workspaceId, data.slug, true); + // Close modal and verify URLs + cy.get(commonWidgetSelector.modalCloseButton).click(); + verifyURLs(workspaceId, data.slug, true); - // Verify duplicate slug validation in share modal - cy.visit("/my-workspace"); - cy.apiCreateApp(data.slug); - cy.openApp("my-workspace"); - releaseApp(); - cy.get(commonWidgetSelector.shareAppButton).click(); - cy.clearAndType(commonWidgetSelector.appNameSlugInput, data.slug); - cy.get(commonWidgetSelector.appSlugErrorLabel).verifyVisibleElement( - "have.text", - "This app slug is already taken." - ); - }); + // Verify duplicate slug validation in share modal + cy.visit("/my-workspace"); + cy.apiCreateApp(data.slug); + cy.openApp("my-workspace"); + releaseApp(); + cy.get(commonWidgetSelector.shareAppButton).click(); + cy.clearAndType(commonWidgetSelector.appNameSlugInput, data.slug); + cy.get(commonWidgetSelector.appSlugErrorLabel).verifyVisibleElement( + "have.text", + "This app slug is already taken." + ); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/privateAndpublicApps.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/privateAndpublicApps.cy.js index 75c1cb4b0d..fdd6acfe80 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/privateAndpublicApps.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/privateAndpublicApps.cy.js @@ -20,20 +20,20 @@ import { describe("Private and Public apps", { retries: { runMode: 2 }, }, () => { - const data = {}; + let data; beforeEach(() => { - data.appName = `${fake.companyName} P P App`; - data.slug = data.appName.toLowerCase().replace(/\s+/g, "-"); - data.firstName = fake.firstName; - data.email = fake.email.toLowerCase(); - data.workspaceName = fake.firstName; - data.workspaceSlug = fake.firstName.toLowerCase().replace(/\s+/g, "-"); + data = { + appName: `${fake.companyName} P P App`, + slug: `${fake.companyName} P P App`.toLowerCase().replace(/\s+/g, "-"), + firstName: fake.firstName, + email: fake.email.toLowerCase(), + workspaceName: fake.firstName, + workspaceSlug: fake.firstName.toLowerCase().replace(/\s+/g, "-"), + } cy.defaultWorkspaceLogin(); cy.skipWalkthrough(); - cy.log(data.appName, "text1") - }); it("Verify private and public app share functionality", () => { @@ -85,9 +85,9 @@ describe("Private and Public apps", { }); cy.get(onboardingSelectors.signInButton, { timeout: 20000 }).should("be.visible"); cy.wait(2000); - cy.loginWithCredentials("dev@tooljet.io", "password"); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.appUILogin(); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + // Test public access cy.get(commonSelectors.viewerPageLogo).click(); @@ -106,8 +106,8 @@ describe("Private and Public apps", { cy.visitSlug({ actualUrl: `${Cypress.config("baseUrl")}/applications/${data.slug}`, }); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + }); @@ -123,30 +123,30 @@ describe("Private and Public apps", { }); cy.wait(2000); - cy.loginWithCredentials(data.email, "password"); + cy.appUILogin(data.email, "password"); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible", { timeout: 20000 }); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); // Test with private app valid session cy.visitSlug({ actualUrl: `${Cypress.config("baseUrl")}/applications/${data.slug}`, }); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + cy.get(commonSelectors.viewerPageLogo).click(); // Test public access cy.defaultWorkspaceLogin(); + cy.wait(1000); cy.apiMakeAppPublic(); logout(); cy.visitSlug({ actualUrl: `${Cypress.config("baseUrl")}/applications/${data.slug}`, }); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + // Test with public app with valid session @@ -154,8 +154,8 @@ describe("Private and Public apps", { cy.visitSlug({ actualUrl: `${Cypress.config("baseUrl")}/applications/${data.slug}`, }); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + }); @@ -180,8 +180,8 @@ describe("Private and Public apps", { cy.visitSlug({ actualUrl: `${Cypress.config("baseUrl")}/applications/${data.slug}`, }); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + // Verify public app with valid session @@ -189,8 +189,8 @@ describe("Private and Public apps", { cy.visitSlug({ actualUrl: `${Cypress.config("baseUrl")}/applications/${data.slug}`, }); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + }); @@ -224,8 +224,8 @@ describe("Private and Public apps", { // Process invitation onboardUserFromAppLink(data.email, data.slug); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + cy.get('[data-cy="viewer-page-logo"]').click(); logout(); @@ -269,8 +269,8 @@ describe("Private and Public apps", { }); onboardUserFromAppLink(data.email, data.slug, data.workspaceName, false); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); - cy.get('.text-widget-section > div').should("be.visible"); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible"); + }); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js index ff992d4ddc..f97962d910 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js @@ -114,7 +114,7 @@ describe("App Version", () => { cy.wait(3000); // cy.reload(); - // cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible", { timeout: 10000 }); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible", { timeout: 10000 }); // Preview and release verification cy.openInCurrentTab(commonWidgetSelector.previewButton); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/dataSources/dataSourcePermissions.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/dataSources/dataSourcePermissions.cy.js index 2c8fd53c8c..d455c311cf 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/dataSources/dataSourcePermissions.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/dataSources/dataSourcePermissions.cy.js @@ -46,7 +46,7 @@ describe("Datasource Manager", () => { data.dsName1 = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); data.dsName2 = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); - const allDataSources = host.includes("8082") ? "All data sources (42)" : "All data sources (44)"; + const allDataSources = host.includes("8082") ? "All data sources (43)" : "All data sources (45)"; const allDatabase = host.includes("8082") ? "Databases (18)" : "Databases (20)"; cy.get(commonSelectors.globalDataSourceIcon).click(); @@ -214,7 +214,7 @@ describe("Datasource Manager", () => { cy.get(commonWidgetSelector.sidebarinspector).click(); cy.get(dataSourceSelector.queryCreateAndRunButton).click(); - verifyValueOnInspector("table_preview", "7 items "); + verifyValueOnInspector("table_preview", "10 items "); cy.get('[data-cy="show-ds-popover-button"]').click(); cy.get(".p-2 > .tj-base-btn") @@ -275,7 +275,7 @@ describe("Datasource Manager", () => { pinInspector(); cy.get(dataSourceSelector.queryCreateAndRunButton).click(); - verifyValueOnInspector("table_preview", "7 items "); + verifyValueOnInspector("table_preview", "10 items "); //scope changing is pending }); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/groupDuplication.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/groupDuplication.cy.js index f8b39bea7b..ce82392019 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/groupDuplication.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/groupDuplication.cy.js @@ -18,10 +18,17 @@ import { roleBasedOnboarding } from "Support/utils/onboarding"; const data = {}; data.groupName = fake.firstName.replaceAll("[^A-Za-z]", ""); data.appName = `${fake.companyName}-App`; +const workspaceName = fake.firstName; +const workspaceSlug = fake.firstName.toLowerCase().replace(/[^A-Za-z]/g, ""); describe("Groups duplication", () => { beforeEach(() => { cy.defaultWorkspaceLogin(); + cy.apiCreateWorkspace(workspaceName, workspaceSlug); + cy.visit(`${workspaceSlug}`); + cy.apiLogout(); + cy.apiLogin(); + cy.visit(`${workspaceSlug}`); groupPermission( [ "appsCreateCheck", @@ -32,15 +39,18 @@ describe("Groups duplication", () => { "Admin" ); cy.apiCreateApp(data.appName); + }); it("Should verify the group duplication feature", () => { data.firstName = fake.firstName; data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); + cy.visit(`${workspaceSlug}`); roleBasedOnboarding(data.firstName, data.email, "builder"); cy.apiLogout(); - cy.defaultWorkspaceLogin(); + cy.apiLogin(); + cy.visit(`${workspaceSlug}`); navigateToManageGroups(); verifyGroupCardOptions("Admin"); cy.wait(3000); @@ -105,15 +115,19 @@ describe("Groups duplication", () => { cy.apiLogout(); cy.apiLogin(data.email, "password"); - cy.visit("/my-workspace"); + cy.visit(`${workspaceSlug}`); + cy.wait(2000); cy.get(commonSelectors.appCreateButton).should("be.visible"); cy.get(commonSelectors.createNewFolderButton).should("be.visible"); + cy.wait(2000); + cy.reload(); viewAppCardOptions(data.appName); cy.contains("Delete app").should("exist"); cy.get(commonSelectors.workspaceConstantsIcon).should("be.visible"); cy.apiLogout(); - cy.defaultWorkspaceLogin(); + cy.apiLogin(); + cy.visit(`${workspaceSlug}`); navigateToManageGroups(); OpenGroupCardOption(`${data.groupName}_copy`); cy.get(groupsSelector.deleteGroupOption).click(); @@ -121,7 +135,7 @@ describe("Groups duplication", () => { cy.apiLogout(); cy.apiLogin(data.email, "password"); - cy.visit("/my-workspace"); + cy.visit(`${workspaceSlug}`); cy.get(commonSelectors.appCreateButton).should("not.exist"); cy.get(commonSelectors.createNewFolderButton).should("not.exist"); cy.get(commonSelectors.workspaceConstantsIcon).should("not.exist"); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js index adb59c7aeb..4ccd01274a 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/workspace/workspaceConstants.cy.js @@ -124,7 +124,8 @@ describe("Workspace constants", () => { //verify global constant is resolved in static query url cy.get('[data-cy="list-query-restapistaticg"]').click(); - cy.get('.rest-api-methods-select-element-container .codehinter-container').click(); + cy.get('.rest-api-methods-select-element-container .codehinter-container').eq(0).click(); + cy.wait(500) cy.get('.text-secondary').should('have.text', Cypress.env("constants_host")); //Verify global constant is resolved in static query preview diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/UserInviteFlow.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/UserInviteFlow.cy.js index 4d737c64ea..5cdc6c5764 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/UserInviteFlow.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/UserInviteFlow.cy.js @@ -200,7 +200,7 @@ describe("user invite flow cases", () => { }); }); - it.skip("Should verify the user onboarding with groups", () => { + it("Should verify the user onboarding with groups", () => { data.firstName = fake.firstName; data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); data.groupName1 = fake.firstName.replaceAll("[^A-Za-z]", ""); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/userInviteFlowEdgeCases.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/userInviteFlowEdgeCases.cy.js index da491e39a9..29c521a58b 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/userInviteFlowEdgeCases.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/userManagment/userInviteFlowEdgeCases.cy.js @@ -58,7 +58,8 @@ describe("inviteflow edge cases", () => { cy.verifyToastMessage(commonSelectors.toastMessage, usersText.inviteToast); logout(); - cy.defaultWorkspaceLogin(); + cy.apiLogin(); + cy.visit(workspaceName); navigateToManageUsers(); searchUser(data.email); cy.contains("td", data.email) diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/appCreate.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/appCreate.cy.js index 4a11a1dcba..c3021b6aa8 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/appCreate.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/appCreate.cy.js @@ -8,7 +8,7 @@ import { importText } from "Texts/exportImport"; describe("App creation", () => { const data = {}; - const appFile = "cypress/fixtures/templates/test-app.json"; + const appFile = "cypress/fixtures/templates/one_version.json"; beforeEach(() => { cy.defaultWorkspaceLogin(); @@ -200,7 +200,7 @@ describe("App creation", () => { force: true, }); - cy.get(commonSelectors.importAppTitle).verifyVisibleElement( + cy.get(importSelectors.importAppTitle).verifyVisibleElement( "have.text", "Import app" ); @@ -210,7 +210,7 @@ describe("App creation", () => { ); cy.get(commonSelectors.appNameInput).verifyVisibleElement( "have.value", - "test-app" + "one_version" ); cy.get(commonSelectors.appNameInfoLabel).verifyVisibleElement( "have.text", @@ -236,7 +236,7 @@ describe("App creation", () => { }); cy.get(commonSelectors.appNameInput).verifyVisibleElement( "have.value", - "test-app" + "one_version" ); cy.clearAndType(commonSelectors.appNameInput, data.appName); cy.get(commonSelectors.cancelButton).click(); @@ -247,7 +247,7 @@ describe("App creation", () => { }); cy.get(commonSelectors.appNameInput).verifyVisibleElement( "have.value", - "test-app" + "one_version" ); cy.clearAndType(commonSelectors.appNameInput, data.appName); cy.get(commonSelectors.importAppButton).should("be.enabled").click(); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js index 101d9ffc9c..e140f0e203 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/commonTestcases/workspace/dashboard.cy.js @@ -2,7 +2,6 @@ import { fake } from "Fixtures/fake"; import { createFolder, deleteFolder, - deleteDownloadsFolder, navigateToAppEditor, viewAppCardOptions, verifyModal, @@ -14,49 +13,38 @@ import { } from "Support/utils/common"; import { modifyAndVerifyAppCardIcon, - login, verifyAppDelete, } from "Support/utils/dashboard"; -import { profileSelector } from "Selectors/profile"; -import { profileText } from "Texts/profile"; import { commonSelectors } from "Selectors/common"; import { dashboardSelector } from "Selectors/dashboard"; import { commonText } from "Texts/common"; import { dashboardText } from "Texts/dashboard"; -import { - navigateToManageUsers, - logout, - searchUser, - navigateToManageGroups, -} from "Support/utils/common"; -import { roleBasedOnboarding } from "Support/utils/onboarding"; +import { logout } from "Support/utils/common"; describe("dashboard", () => { - const data = {}; - data.appName = `${fake.companyName}-App`; - data.folderName = `${fake.companyName.toLowerCase()}-folder`; - data.cloneAppName = `cloned-${data.appName}`; - data.updatedFolderName = `new-${data.folderName}`; - data.firstName = fake.firstName; - data.email = fake.email.toLowerCase().replaceAll("[^A-Za-z]", ""); - data.workspaceName = fake.firstName; - data.workspaceSlug = fake.firstName.toLowerCase().replaceAll("[^A-Za-z]", ""); + let data = {}; beforeEach(() => { + data = { + appName: `${fake.companyName}-App`, + folderName: `${fake.companyName.toLowerCase()}-folder`, + cloneAppName: `cloned-${fake.companyName}-App`, + updatedFolderName: `new-${fake.companyName.toLowerCase()}-folder`, + workspaceName: fake.firstName, + workspaceSlug: fake.firstName.toLowerCase().replaceAll("[^A-Za-z]", ""), + }; cy.intercept("GET", "/api/library_apps").as("appLibrary"); cy.intercept("DELETE", "/api/folders/*").as("folderDeleted"); cy.skipWalkthrough(); + + cy.apiLogin(); + cy.apiCreateWorkspace(data.workspaceName, data.workspaceSlug); + cy.apiLogout(); + cy.apiLogin(); + cy.visit(`${data.workspaceSlug}`); }); it("should verify the elements on empty dashboard", () => { - cy.intercept("GET", "/api/apps?page=1&folder=&searchKey=&type=front-end", { - fixture: "intercept/emptyDashboard.json", - }).as("emptyDashboard"); - - cy.intercept("GET", "/api/folder-apps?searchKey=&type=front-end", { - body: { folders: [] }, - }).as("folders"); - cy.intercept("GET", "/api/metadata", { body: { installed_version: "2.9.2", @@ -64,15 +52,10 @@ describe("dashboard", () => { }, }).as("version"); - cy.defaultWorkspaceLogin(); - cy.wait("@emptyDashboard"); - cy.wait("@folders"); - cy.wait("@version"); - cy.get(commonSelectors.homePageLogo).should("be.visible"); cy.get(commonSelectors.workspaceName).verifyVisibleElement( "have.text", - "My workspace" + data.workspaceName ); cy.get(commonSelectors.workspaceName).click(); // cy.get(commonSelectors.editRectangleIcon).should("be.visible"); @@ -193,7 +176,7 @@ describe("dashboard", () => { desktop: { top: 100, left: 20 }, mobile: { width: 8, height: 50 }, }; - cy.apiLogin(); + cy.apiCreateApp(data.appName); cy.openApp(); cy.apiAddComponentToApp(data.appName, "text1", customLayout); @@ -276,6 +259,7 @@ describe("dashboard", () => { cancelModal(commonText.cancelButton); + cy.wait(3000); viewAppCardOptions(data.appName); cy.get( commonSelectors.appCardOptions(commonText.removeFromFolderOption) @@ -296,6 +280,7 @@ describe("dashboard", () => { cy.get(commonSelectors.allApplicationsLink).click(); + cy.wait(3000); viewAppCardOptions(data.appName); cy.get(commonSelectors.appCardOptions(commonText.cloneAppOption)).click(); cy.get('[data-cy="clone-app"]').click(); @@ -312,7 +297,10 @@ describe("dashboard", () => { cy.get(commonSelectors.appCard(data.cloneAppName)).should("be.visible"); - cy.wait(3000) + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get(commonSelectors.dashboardIcon).click(); + cy.wait(3000); + cy.reloadAppForTheElement(data.cloneAppName); viewAppCardOptions(data.cloneAppName); cy.get(commonSelectors.appCardOptions(commonText.exportAppOption)).click(); cy.get(commonSelectors.exportAllButton).click(); @@ -322,6 +310,7 @@ describe("dashboard", () => { expect(downloadedAppExportFileName).to.contain.string("app"); }); + cy.wait(3000); cy.reloadAppForTheElement(data.cloneAppName); viewAppCardOptions(data.cloneAppName); cy.get(commonSelectors.deleteAppOption).click(); @@ -337,6 +326,7 @@ describe("dashboard", () => { ).verifyVisibleElement("have.text", commonText.modalYesButton); cancelModal(commonText.cancelButton); + cy.wait(3000); cy.reloadAppForTheElement(data.cloneAppName); viewAppCardOptions(data.cloneAppName); cy.get(commonSelectors.deleteAppOption).click(); @@ -362,9 +352,6 @@ describe("dashboard", () => { mobile: { width: 8, height: 50 }, }; - cy.skipWalkthrough(); - data.appName = `${fake.companyName}-App`; - cy.defaultWorkspaceLogin(); cy.createApp(data.appName); cy.apiAddComponentToApp(data.appName, "text1", customLayout); @@ -395,12 +382,8 @@ describe("dashboard", () => { mobile: { width: 8, height: 50 }, }; - data.appName = `${fake.companyName}-App`; - cy.defaultWorkspaceLogin(); cy.createApp(data.appName); - cy.apiAddComponentToApp(data.appName, "text1", customLayout); - cy.backToApps(); cy.get(commonSelectors.createNewFolderButton).click(); @@ -517,13 +500,4 @@ describe("dashboard", () => { verifyAppDelete(data.appName); logout(); }); - - it("should verify the elements on empty dashboard for end user", () => { - cy.defaultWorkspaceLogin(); - cy.intercept("GET", "/api/apps?page=1&folder=&searchKey=&type=front-end", { - fixture: "intercept/emptyDashboard.json", - }).as("emptyDashboard") - roleBasedOnboarding(data.firstName, data.email, "end-user"); - cy.get(commonSelectors.dashboardAppCreateButton).should("be.disabled"); - }); }); diff --git a/cypress-tests/cypress/fixtures/templates/invalid_app.json b/cypress-tests/cypress/fixtures/templates/invalid_app.json index 09307af471..e2ebed4bce 100644 --- a/cypress-tests/cypress/fixtures/templates/invalid_app.json +++ b/cypress-tests/cypress/fixtures/templates/invalid_app.json @@ -2127,7 +2127,7 @@ "encrypted": false }, "host": { - "value": "35.202.183.199", + "value": "35.238.9.114", "encrypted": false }, "port": { diff --git a/cypress-tests/cypress/fixtures/templates/one_version.json b/cypress-tests/cypress/fixtures/templates/one_version.json index d5dda12b3a..08dad1d1c0 100644 --- a/cypress-tests/cypress/fixtures/templates/one_version.json +++ b/cypress-tests/cypress/fixtures/templates/one_version.json @@ -585,7 +585,7 @@ "encrypted": false }, "host": { - "value": "35.202.183.199", + "value": "35.238.9.114", "encrypted": false }, "port": { diff --git a/cypress-tests/cypress/fixtures/templates/three-versions.json b/cypress-tests/cypress/fixtures/templates/three-versions.json index e6db26b19b..bff312ac54 100644 --- a/cypress-tests/cypress/fixtures/templates/three-versions.json +++ b/cypress-tests/cypress/fixtures/templates/three-versions.json @@ -1701,7 +1701,7 @@ ] }, "list_rows": {}, - "runOnPageLoad": true + "runOnPageLoad": false }, "dataSourceId": "f4cf0089-aec2-4713-800e-3560e678220b", "appVersionId": "b74fcff1-8cf1-40f8-a13d-c2d2a0b1ebf1", @@ -1862,7 +1862,7 @@ "encrypted": false }, "host": { - "value": "35.202.183.199", + "value": "35.238.9.114", "encrypted": false }, "port": { diff --git a/cypress-tests/cypress/support/utils/apps.js b/cypress-tests/cypress/support/utils/apps.js index 49e8c841b0..0ddfd72ac7 100644 --- a/cypress-tests/cypress/support/utils/apps.js +++ b/cypress-tests/cypress/support/utils/apps.js @@ -25,7 +25,10 @@ export const verifySuccessfulSlugUpdate = (workspaceId, slug) => { "have.text", "Slug accepted!" ); - cy.get(commonWidgetSelector.appLinkSucessLabel).verifyVisibleElement( + + cy.wait(500); + // cy.get(commonWidgetSelector.appLinkSucessLabel).should('be.visible'); + cy.get(commonWidgetSelector.appLinkSucessLabel).should( "have.text", "Link updated successfully!" ); diff --git a/cypress-tests/cypress/support/utils/basicComponents.js b/cypress-tests/cypress/support/utils/basicComponents.js index e92c37d173..cae63f493d 100644 --- a/cypress-tests/cypress/support/utils/basicComponents.js +++ b/cypress-tests/cypress/support/utils/basicComponents.js @@ -32,10 +32,10 @@ export const deleteComponentAndVerify = (widgetName) => { .last() .realClick(); }); - cy.verifyToastMessage( - `[class=go3958317564]`, - "Component deleted! (Ctrl + Z to undo)" - ); + // cy.verifyToastMessage( + // `[class=go3958317564]`, + // "Component deleted! (Ctrl + Z to undo)" + // ); cy.notVisible(commonWidgetSelector.draggableWidget(widgetName)); }; diff --git a/cypress-tests/cypress/support/utils/common.js b/cypress-tests/cypress/support/utils/common.js index e7fab862cc..0f54553472 100644 --- a/cypress-tests/cypress/support/utils/common.js +++ b/cypress-tests/cypress/support/utils/common.js @@ -16,9 +16,7 @@ export const navigateToProfile = () => { export const logout = () => { cy.get(commonSelectors.settingsIcon).click(); cy.get(commonSelectors.logoutLink).click(); - cy.intercept("GET", "/api/metadata").as("publicConfig"); - cy.wait("@publicConfig"); - cy.wait(500); + cy.wait(1000); }; export const navigateToManageUsers = () => { @@ -183,10 +181,9 @@ export const manageUsersPagination = (email) => { export const searchUser = (email) => { cy.clearAndType(commonSelectors.inputUserSearch, email); - cy.wait(1000) + cy.wait(1000); }; - export const selectAppCardOption = (appName, appCardOption) => { viewAppCardOptions(appName); cy.get(appCardOption).should("be.visible").click({ force: true }); @@ -221,7 +218,6 @@ export const pinInspector = () => { } }); cy.hideTooltip(); - }; export const navigateToworkspaceConstants = () => { @@ -243,24 +239,3 @@ export const verifyTooltipDisabled = (selector, message) => { cy.get(".tooltip-inner").last().should("have.text", message); }); }; - -export const deleteAllGroupChips = () => { - cy.get('body').then(($body) => { - if ($body.find('[data-cy="group-chip"]').length > 0) { - cy.get('[data-cy="group-chip"]').then(($groupChip) => { - if ($groupChip.is(':visible')) { - cy.get('[data-cy="group-chip"]').first().click(); - cy.get('[data-cy="delete-button"]').click(); - cy.get('[data-cy="yes-button"]').click(); - - cy.wait(2000); - deleteAllGroupChips(); // Recursive call to delete next chip - } else { - cy.log("Group chip is present but not visible, skipping deletion"); - } - }); - } else { - cy.log("No group chips left to delete"); - } - }); -} \ No newline at end of file diff --git a/cypress-tests/cypress/support/utils/manageGroups.js b/cypress-tests/cypress/support/utils/manageGroups.js index b6b67ca629..dfda103d91 100644 --- a/cypress-tests/cypress/support/utils/manageGroups.js +++ b/cypress-tests/cypress/support/utils/manageGroups.js @@ -646,7 +646,7 @@ export const createGroupAddAppAndUserToGroup = (groupName, email) => { cy.request({ method: "POST", - url: `${Cypress.env("server_host")}/api/v2/group_permissions`, + url: `${Cypress.env("server_host")}/api/v2/group-permissions`, headers: headers, body: { name: groupName, @@ -658,14 +658,14 @@ export const createGroupAddAppAndUserToGroup = (groupName, email) => { cy.request({ method: "POST", - url: `${Cypress.env("server_host")}/api/v2/group_permissions/granular-permissions`, + url: `${Cypress.env("server_host")}/api/v2/group-permissions/${groupId}/granular-permissions`, headers: headers, body: { name: "Apps", type: "app", groupId: groupId, isAll: false, - createAppsPermissionsObject: { + createResourcePermissionObject: { canEdit: true, canView: false, hideFromDashboard: false, @@ -676,19 +676,22 @@ export const createGroupAddAppAndUserToGroup = (groupName, email) => { ], }, }, + }).then((response) => { expect(response.status).to.equal(201); }); + cy.wait(2000); cy.task("dbConnection", { dbconfig: Cypress.env("app_db"), sql: `select id from users where email='${email}';`, }).then((resp) => { const userId = resp.rows[0].id; + cy.log(userId); cy.request({ method: "POST", - url: `${Cypress.env("server_host")}/api/v2/group_permissions/group-user`, + url: `${Cypress.env("server_host")}/api/v2/group-permissions/${groupId}/users`, headers: headers, body: { userIds: [userId], @@ -720,7 +723,7 @@ export const OpenGroupCardOption = (groupName) => { export const duplicateMultipleGroups = (groupNames) => { groupNames.forEach((groupName) => { OpenGroupCardOption(groupName); - cy.wait(3000); + cy.wait(2000); cy.get(commonSelectors.duplicateOption).click(); // Click on the duplicate option cy.get(commonSelectors.confirmDuplicateButton).click(); // Confirm duplication if needed }); diff --git a/cypress-tests/cypress/support/utils/manageSSO.js b/cypress-tests/cypress/support/utils/manageSSO.js index 4fc76774a8..a736afacc8 100644 --- a/cypress-tests/cypress/support/utils/manageSSO.js +++ b/cypress-tests/cypress/support/utils/manageSSO.js @@ -18,7 +18,7 @@ export const generalSettings = () => { cy.get(ssoSelector.workspaceLoginPage.defaultSSO).click(); cy.get(ssoSelector.defaultGoogle).verifyVisibleElement("have.text", "Google"); - cy.get(ssoSelector.defaultGithub).verifyVisibleElement("have.text", "Github"); + cy.get(ssoSelector.defaultGithub).verifyVisibleElement("have.text", "Git"); cy.clearAndType(ssoSelector.allowedDomainInput, ssoText.allowedDomain); cy.get(ssoSelector.saveButton).click(); @@ -416,7 +416,7 @@ export const resetDomain = () => { cy.request( { method: "PATCH", - url: `${Cypress.env("server_host")}/api/organizations`, + url: `${Cypress.env("server_host")}/api/login-configs/organization-general`, headers: { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, diff --git a/frontend/src/modules/WorkspaceSettings/components/BaseSSOConfigurationList/BaseSSOConfigurationList.jsx b/frontend/src/modules/WorkspaceSettings/components/BaseSSOConfigurationList/BaseSSOConfigurationList.jsx index b096985438..fde35f9320 100644 --- a/frontend/src/modules/WorkspaceSettings/components/BaseSSOConfigurationList/BaseSSOConfigurationList.jsx +++ b/frontend/src/modules/WorkspaceSettings/components/BaseSSOConfigurationList/BaseSSOConfigurationList.jsx @@ -409,7 +409,7 @@ class BaseSSOConfigurationList extends React.Component { !this.isInstanceOptionEnabled(sso.sso) || (sso.sso === 'openid' && !featureAccess?.openid) } // Disable the item if defaultSSO is false - data-cy={`dropdwon-options-${sso.sso}`} + data-cy={`dropdown-options-${sso.sso}`} >
{this.getSSOIcon(sso.sso)} diff --git a/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/ConstantForm.jsx b/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/ConstantForm.jsx index 193ff39e99..199c233d7c 100644 --- a/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/ConstantForm.jsx +++ b/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/ConstantForm.jsx @@ -192,7 +192,9 @@ const ConstantForm = ({ {error['name']} {!error['name'] && ( - Name must be unique and max 50 characters + + Name must be unique and max 50 characters + )}
diff --git a/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/EmptyState.jsx b/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/EmptyState.jsx index 1e993cf0ef..438f556f8a 100644 --- a/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/EmptyState.jsx +++ b/frontend/src/modules/WorkspaceSettings/components/ManageOrgConstantsSettings/EmptyState.jsx @@ -20,7 +20,7 @@ const EmptyState = ({ canCreateVariable, setIsManageVarDrawerOpen, isLoading, se

{canCreateVariable && searchTerm === '' && ( setIsManageVarDrawerOpen(true)} className="add-new-constant-button" diff --git a/frontend/src/modules/auth/pages/ResetPasswordPage/components/ResetPasswordInfoScreen/ResetPasswordInfoScreen.jsx b/frontend/src/modules/auth/pages/ResetPasswordPage/components/ResetPasswordInfoScreen/ResetPasswordInfoScreen.jsx index 1f19e9e72e..2a44b1e513 100644 --- a/frontend/src/modules/auth/pages/ResetPasswordPage/components/ResetPasswordInfoScreen/ResetPasswordInfoScreen.jsx +++ b/frontend/src/modules/auth/pages/ResetPasswordPage/components/ResetPasswordInfoScreen/ResetPasswordInfoScreen.jsx @@ -17,7 +17,9 @@ const ForgotPasswordInfoScreen = ({ email }) => {
Password has been reset -

{message}

+

+ {message} +