ToolJet/cypress-tests/cypress/support/utils/common.js
Rohan Lahori 5bec5a5b12
Feature/draft versioning support (#14284)
* added app_versions fields

* added data migration for backward compatibility

* added ce specific logic

* fixed ce migration (need to dev-test)

* moved to data migration

* migration changes

* added endpoint to create draft version

* backend changes

* added draft to app_import scenario

* added version description

* minor changes (needs improvement)

* fixed breaking dropdown in editor

* updated submodule commits

* revert package.json

* revert ui not used changes

* submodule changes

* reverting non used files

* ui changes

* ui changes

* ui changes

* ui changes

* ui changes

* copywriting changes

* ui changes

* ui changes

* edit version modal changes

* ui integration changes

* added button solid and removed unused css

* removed commented code from create version modal

* updated button size to use large

* ui changes

* draft version modal changes

* added sub-module commits to main

* draft version endpoint changes

* ui changes for draft version modal

* fix breaking ui

* ui changes for banner

* minor ui changes

* remove scss changes from themes file

* removed unused components (cleanup)

* removed unused components (pr cleanup)

* draft version changes

* create version modal changes

* canvas banner fixes

* comment creation logic

* refactor: version dropdown

* update endpoint changes

* fix: promote logic

* update submodule

* fix: released version and create version modal

* fix draft version creation

* minor ui changes

* minor backend fixes

* tooltip changes

* added all components in same folder

* added minor comments

* import fixes

* refactor files

* fix: overlay issues

* fix: on version creation

* fix ce bugs

* bug fixes

* bug fixes

* bug fixes

* bug fixes

* base merge

* feat: draft versioning support with UI enhancements and backend adjustments

- Updated AppCanvas to conditionally render AppCanvasBanner based on edit mode.
- Enhanced CreateDraftVersionModal to handle version selection and creation logic.
- Modified CreateVersionModal to streamline version creation process and handle commits.
- Improved ReleaseConfirmation to include development versions in release context.
- Refactored CreateDraftButton and VersionDropdownItem for better UI consistency and dark mode support.
- Updated VersionManagerDropdown to manage draft versions and improve version selection logic.
- Enhanced version switcher and promote/release buttons with dark mode styling.
- Adjusted server-side features and constants to support new draft versioning capabilities.
- Updated styles across components for better visual consistency and responsiveness.

* minor fixes

* rebase

* merge base

* update submodule

* Add data-cy attribute for draft version components

* Update cypress test cases for draft version feature

* Update failing test cases

* Update draft version test cases

* Skip older flow

* migration changes

* migration fixes

* Update the failed test cases

* removed multiple api calls

* fix: version set on draft creation

* fixes

* fix: version update on save version

* fixes

* name fix

* fix version lock banner styling

* bump version to 3.20.50-lts across all components

---------

Co-authored-by: Vijaykant Yadav <[email protected]>
Co-authored-by: ajith-k-v <[email protected]>
Co-authored-by: gsmithun4 <[email protected]>
2025-12-05 22:13:00 +05:30

276 lines
8.9 KiB
JavaScript

import moment from "moment";
import {
commonSelectors,
commonWidgetSelector,
cyParamName,
} from "Selectors/common";
import { commonEeSelectors, multiEnvSelector } from "Selectors/eeCommon";
import { profileSelector } from "Selectors/profile";
import { appPromote } from "Support/utils/platform/multiEnv";
import { commonText, path } from "Texts/common";
export const navigateToProfile = () => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.profileSettings).click();
cy.url().should("include", "settings");
};
export const logout = () => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.logoutLink).click();
cy.wait(1000);
};
export const navigateToManageUsers = () => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.workspaceSettings).click();
cy.get(commonSelectors.manageUsersOption).click({ force: true });
};
export const navigateToManageGroups = () => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.workspaceSettings).click();
cy.get(commonSelectors.manageGroupsOption).click();
};
export const navigateToWorkspaceVariable = () => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.workspaceSettings).click();
cy.get(commonSelectors.workspaceVariableOption).click();
};
export const navigateToManageSSO = () => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.workspaceSettings).click();
cy.get(commonSelectors.manageSSOOption).click();
};
export const randomDateOrTime = (format = "DD/MM/YYYY") => {
let endDate = new Date();
let startDate = new Date(2018, 0, 1);
startDate = new Date(
startDate.getTime() +
Math.random() * (endDate.getTime() - startDate.getTime())
);
return moment(startDate).format(format);
};
export const createFolder = (folderName) => {
cy.intercept("POST", "/api/folders").as("folderCreated");
cy.get(commonSelectors.createNewFolderButton).click();
cy.clearAndType(commonSelectors.folderNameInput, folderName);
cy.get(commonSelectors.buttonSelector(commonText.createFolderButton)).click();
cy.wait("@folderCreated");
cy.verifyToastMessage(
commonSelectors.toastMessage,
commonText.folderCreatedToast
);
};
export const deleteFolder = (folderName) => {
viewFolderCardOptions(folderName);
cy.get(commonSelectors.deleteFolderOption(folderName)).click();
cy.get(commonSelectors.buttonSelector(commonText.modalYesButton)).click();
cy.wait("@folderDeleted");
cy.verifyToastMessage(
commonSelectors.toastMessage,
commonText.folderDeletedToast
);
};
export const deleteDownloadsFolder = () => {
cy.exec("cd ./cypress/downloads/ && rm -rf *", {
failOnNonZeroExit: false,
});
};
export const navigateToAppEditor = (appName) => {
cy.get(commonSelectors.appCard(appName))
.trigger("mousehover")
.trigger("mouseenter")
.find(commonSelectors.editButton)
.click({ force: true });
if (Cypress.env("environment") === "Community") {
cy.intercept("GET", "/api/data-sources").as("appDs");
cy.wait("@appDs", { timeout: 15000 });
cy.skipEditorPopover();
} else {
cy.intercept("GET", "/api/app-environments/**").as("appDs");
cy.wait("@appDs", { timeout: 15000 });
cy.skipEditorPopover();
}
};
export const viewAppCardOptions = (appName) => {
if (Cypress.env("environment") !== "Community") {
cy.waitForElement('[data-cy="ai-icon"]');
}
cy.contains(".homepage-app-card", appName, { timeout: 20000 }).within(() => {
cy.get(`[data-cy="${appName.toLowerCase()}-card"]`).parent().realHover();
cy.get('[data-cy="app-card-menu-icon"]')
.should("be.visible")
.should("not.be.disabled");
// .click({ timeout: 10000 });
cy.get(`[data-cy="${appName.toLowerCase()}-card"]`).click().realHover();
cy.get('[data-cy="app-card-menu-icon"]').click();
});
};
export const viewFolderCardOptions = (folderName) => {
cy.get(commonSelectors.folderListcard(folderName))
.parent()
.within(() => {
cy.get(commonSelectors.folderCardOptions(folderName)).invoke("click");
});
};
export const verifyModal = (title, buttonText, inputFiledSelector) => {
cy.get(commonSelectors.modalComponent).should("be.visible");
cy.get(commonSelectors.modalTitle(title))
.should("be.visible")
.and("have.text", title);
cy.get(commonSelectors.buttonSelector(commonText.closeButton)).should(
"be.visible"
);
cy.get(commonSelectors.buttonSelector(commonText.cancelButton))
.should("be.visible")
.and("have.text", commonText.cancelButton);
cy.get(commonSelectors.buttonSelector(buttonText))
.first()
.should("be.visible")
.and("have.text", buttonText);
if (inputFiledSelector) {
cy.get(inputFiledSelector).should("be.visible");
}
};
export const verifyConfirmationModal = (messagse) => {
cy.get(commonSelectors.modalComponent).should("be.visible");
cy.get(commonSelectors.modalMessage)
.should("be.visible")
.and("have.text", messagse);
cy.get(commonSelectors.buttonSelector(commonText.cancelButton))
.should("be.visible")
.and("have.text", commonText.cancelButton);
cy.get(commonSelectors.buttonSelector(commonText.modalYesButton))
.should("be.visible")
.and("have.text", commonText.modalYesButton);
};
export const closeModal = (buttonText) => {
cy.get(commonSelectors.buttonSelector(buttonText)).click();
cy.get(commonSelectors.modalComponent).should("not.exist");
};
export const cancelModal = (buttonText) => {
cy.get(commonSelectors.buttonSelector(buttonText)).click();
cy.get(commonSelectors.modalComponent).should("not.exist");
};
export const navigateToAuditLogsPage = () => {
cy.get(profileSelector.profileDropdown).invoke("show");
cy.contains("Audit Logs").click();
cy.url().should("include", path.auditLogsPath, { timeout: 1000 });
};
export const manageUsersPagination = (email) => {
cy.wait(200);
cy.get("body").then(($email) => {
if ($email.text().includes(email)) {
cy.log("First page");
} else {
cy.get(commonSelectors.nextPageArrow).click();
manageUsersPagination(email);
}
});
};
export const searchUser = (email) => {
cy.clearAndType(commonSelectors.inputUserSearch, email);
cy.wait(1000);
};
export const selectAppCardOption = (appName, appCardOption) => {
viewAppCardOptions(appName);
cy.get(appCardOption).should("be.visible").click();
};
export const navigateToDatabase = () => {
cy.get(commonSelectors.databaseIcon).click();
cy.url().should("include", path.database);
};
export const randomValue = () => {
return Math.floor(Math.random() * (1000 - 100) + 100) / 100;
};
export const verifyTooltip = (selector, message) => {
cy.get(selector)
.trigger("mouseover", { timeout: 2000 })
.trigger("mouseover")
.then(() => {
cy.get(".tooltip-inner").last().should("have.text", message);
});
};
export const pinInspector = () => {
cy.get(commonWidgetSelector.sidebarinspector).click();
cy.get(commonSelectors.inspectorPinIcon).click();
cy.wait(500);
cy.get("body").then(($body) => {
if (!$body.find(commonSelectors.inspectorPinIcon).length > 0) {
cy.get(commonWidgetSelector.sidebarinspector).click();
cy.get(commonSelectors.inspectorPinIcon).click();
}
});
cy.hideTooltip();
};
export const navigateToworkspaceConstants = () => {
cy.get(commonSelectors.workspaceSettingsIcon).click();
cy.get(commonSelectors.workspaceConstantsOption).click();
};
export const releaseApp = () => {
cy.ifEnv("Enterprise", () => {
appPromote("development", "production");
cy.waitForElement(multiEnvSelector.environmentsTag("production"));
cy.get(multiEnvSelector.environmentsTag("production")).click();
});
cy.ifEnv("Community", () => {
cy.waitForElement(multiEnvSelector.environmentsTag("development"));
cy.get(multiEnvSelector.environmentsTag("development")).click();
});
cy.waitForElement(commonSelectors.releaseButton);
cy.get(commonSelectors.releaseButton).click();
cy.get(commonSelectors.yesButton).click();
cy.verifyToastMessage(commonSelectors.toastMessage, "Version v1 released");
cy.wait(1000);
};
export const verifyTooltipDisabled = (selector, message) => {
cy.get(selector)
.trigger("mouseover", { force: true })
.then(() => {
cy.get(".tooltip-inner").last().should("have.text", message);
});
};
export const fillInputField = (data) => {
Object.entries(data).forEach(([key, value]) => {
const labelSelector = `[data-cy="${cyParamName(key)}-label"]`;
const inputSelector = `[data-cy="${cyParamName(key)}-input"]`;
cy.get(labelSelector).should("contain", key);
cy.get(inputSelector).type(`{selectall}{backspace}${value}`);
});
};
export const navigateToSettingPage = () => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonEeSelectors.instanceSettingIcon).click();
cy.get(commonSelectors.pageSectionHeader).should("be.visible");
};
export const sanitize = (str) => str.toLowerCase().replace(/[^A-Za-z]/g, "");