ToolJet/cypress-tests/cypress/support/utils/userPermissions.js
2026-02-26 12:20:53 +05:30

285 lines
No EOL
9.3 KiB
JavaScript

import { commonSelectors, commonWidgetSelector } from "Selectors/common";
import { workspaceConstantsSelectors } from "Selectors/workspaceConstants";
import { addAndVerifyConstants } from "Support/utils/workspaceConstants";
import { groupsSelector } from "Constants/selectors/manageGroups";
import { navigateToManageGroups } from "Support/utils/common";
import { versionSwitcherSelectors } from "Constants/selectors/version";
import { multiEnvSelector } from "Constants/selectors/eeCommon";
export const constantsOperations = {
createConstant: (name, value) => {
cy.get(commonSelectors.workspaceConstantsIcon).click();
addAndVerifyConstants(name, value);
},
deleteConstant: (name) => {
cy.get(workspaceConstantsSelectors.constDeleteButton(name)).click();
cy.get(commonSelectors.yesButton).click();
},
};
// Permission verification helpers
export const verifyPermissions = {
checkAppPermissions: (shouldExist = true) => {
const assertion = shouldExist ? "exist" : "not.exist";
cy.get(commonSelectors.appCreateButton).should(assertion);
},
checkFolderPermissions: (shouldExist = true) => {
const assertion = shouldExist ? "exist" : "not.exist";
cy.get(commonSelectors.createNewFolderButton).should(assertion);
},
checkConstantsPermissions: (shouldExist = true) => {
const assertion = shouldExist ? "exist" : "not.exist";
cy.get(commonSelectors.workspaceConstantsIcon).should(assertion);
},
checkSettingsAccess: (shouldExist = true) => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.workspaceSettings).should(
shouldExist ? "exist" : "not.exist"
);
},
};
export const getGroupPermissionInput = (isEnterprise, flag) => {
return isEnterprise
? {
appCreate: flag,
appDelete: flag,
appPromote: flag,
appRelease: flag,
workflowCreate: flag,
workflowDelete: flag,
dataSourceCreate: flag,
dataSourceDelete: flag,
folderCRUD: flag,
orgConstantCRUD: flag,
}
: {
appCreate: flag,
appDelete: flag,
folderCRUD: flag,
orgConstantCRUD: flag,
};
};
export const verifyBuilderPermissions = (
appName,
folderName,
constName,
constValue,
isAdmin = false
) => {
verifyBasicPermissions(true);
// App operations
cy.apiCreateApp(appName);
cy.apiDeleteApp();
// Folder operations
cy.apiCreateFolder(folderName);
cy.apiDeleteFolder();
// Constants management
cy.get(commonSelectors.workspaceConstantsIcon).click();
addAndVerifyConstants(constName, constValue);
cy.get(workspaceConstantsSelectors.constDeleteButton(constName)).click();
cy.get(commonSelectors.yesButton).click();
cy.ifEnv("Enterprise", () => {
cy.apiCreateDataSource(
`${Cypress.env("server_host")}/api/data-sources`,
appName,
"restapi",
[{ key: "url", value: "https://jsonplaceholder.typicode.com/users" }]
);
cy.apiDeleteDataSource(appName);
cy.apiCreateWorkflow(appName);
cy.apiDeleteWorkflow(appName);
});
verifySettingsAccess(isAdmin);
cy.get(commonSelectors.workspaceSettings).click();
cy.get(commonSelectors.manageSSOOption).should("not.exist");
};
export const verifyBasicPermissions = (canCreate = true) => {
cy.get(commonSelectors.dashboardAppCreateButton).should(
canCreate ? "be.enabled" : "be.disabled"
);
cy.get(commonSelectors.createNewFolderButton).should(
canCreate ? "exist" : "not.exist"
);
cy.get('[data-cy="database-icon"]').should(canCreate ? "exist" : "not.exist");
cy.ifEnv("Enterprise", () => {
cy.get(commonSelectors.globalDataSourceIcon).should(
canCreate ? "exist" : "not.exist"
);
cy.get(commonSelectors.workspaceConstantsIcon).should(
canCreate ? "exist" : "not.exist"
);
});
};
export const verifySettingsAccess = (shouldExist = true) => {
cy.get(commonSelectors.settingsIcon).click();
cy.get(commonSelectors.workspaceSettings).should(
shouldExist ? "exist" : "not.exist"
);
};
export const verifyEnvironmentTagsInGranularUI = (groupName, environmentTags) => {
navigateToManageGroups();
cy.get(groupsSelector.groupLink(groupName)).click();
cy.get(groupsSelector.permissionsLink).click();
cy.get(groupsSelector.granularLink).click();
cy.get(groupsSelector.granularAccessPermission).within(() => {
cy.get(groupsSelector.environmentTags).should('be.visible');
cy.get('.environment-tag').should('have.length', environmentTags.length);
cy.get('.environment-tag').each(($el, index) => {
cy.wrap($el).should('have.text', environmentTags[index]);
});
});
};
export const verifyEnvironmentAccess = (environments, options = {}) => {
const defaults = {
workspaceName: "my-workspace",
componentName: "text1",
canEdit: true,
appId: Cypress.env("appId"),
appName: undefined,
version: "v1",
canAllView: true,
allowedEnvironment: "staging"
};
const opts = {
...defaults,
...options,
// use nullish coalescing so false/"" are not overwritten
workspaceName: options.workspaceName ?? defaults.workspaceName,
componentName: options.componentName ?? defaults.componentName,
canEdit: options.canEdit ?? defaults.canEdit,
appId: options.appId ?? defaults.appId,
appName: options.appName ?? defaults.appName,
version: options.version ?? defaults.version,
canAllView: options.canAllView ?? defaults.canAllView,
allowedEnvironment: options.allowedEnvironment ?? defaults.allowedEnvironment
};
verifyAppBuilderAccess(environments, opts);
verifyPreviewAccess(environments, opts);
verifyPreviewURLAccess(environments, opts);
};
const assertRestrictedTooltip = (selector, env) => {
cy.get(selector).should("be.disabled").trigger("mouseover", { force: true });
cy.get("div.tooltip-inner")
.should("be.visible")
.and("contain", `Access to ${env} environment is restricted. Contact admin to know more.`);
cy.get(selector).trigger("mouseout", { force: true });
cy.get("div.tooltip-inner").should("not.exist");
};
export const verifyAppBuilderAccess = (envNames, { workspaceName, canEdit, appId }) => {
if (!canEdit) {
cy.visit(`/${workspaceName}/apps/${appId}`, { failOnStatusCode: false });
cy.url().should("match", /\/error\/restricted(-preview)?/);
cy.get('[data-cy="modal-header"]').should("be.visible").and("contain.text", "Restricted access");
return;
}
cy.get(versionSwitcherSelectors.versionSwitcherButton).click();
envNames.forEach((envName) => {
const envSelector = `[data-cy="${envName.name}-environment-name"]`;
if (envName.hasAccess) cy.get(envSelector).should("be.enabled");
else assertRestrictedTooltip(envSelector, envName.name);
});
}
const assertEnvRestrictedTooltip = (envButton, env) => {
envButton.find(multiEnvSelector.envNameDropdown)
.should("have.css", "cursor", "not-allowed")
.trigger("mouseover", { force: true });
cy.get("div.tooltip-inner")
.should("be.visible")
.and("contain", `Access to ${env} environment is restricted. Contact admin to know more.`);
envButton.trigger("mouseout", { force: true });
cy.get("div.tooltip-inner").should("not.exist");
};
export const verifyPreviewAccess = (
envNames,
{ appId, componentName, canEdit, appName, version, canAllView, allowedEnvironment }
) => {
const openPreviewSettingsIfClosed = () => {
cy.get("body").then(($body) => {
if ($body.find("div.preview-settings-overlay").length === 0) {
cy.get(commonSelectors.previewSettings).should("be.visible").click();
}
});
};
const openEnvDropdown = () => {
cy.get("body").then(($body) => {
if (!$body.find(multiEnvSelector.selectedEnvName).length) {
cy.get(multiEnvSelector.envContainer).should("be.visible").click();
}
});
};
if (canEdit) {
cy.get(commonWidgetSelector.editorPreviewLink).first().should("have.attr", "href");
cy.openInCurrentTab(commonWidgetSelector.previewButton);
} else {
if (canAllView === false) return;
// stable: go straight to preview URL, avoid hover/new-tab behavior
const previewUrl = `${Cypress.config("baseUrl")}/applications/${appId}/home?env=${allowedEnvironment}&version=${version}`;
cy.visit(previewUrl, { failOnStatusCode: false });
}
envNames.forEach((envName) => {
openPreviewSettingsIfClosed();
openEnvDropdown();
const envButton = cy.contains(
'[data-cy="env-name-list"] button',
new RegExp(`^${envName.name}$`, "i")
);
if (envName.hasAccess) {
envButton.should("be.enabled").click();
cy.get(commonWidgetSelector.draggableWidget(componentName)).should("contain", envName.name);
} else {
assertEnvRestrictedTooltip(envButton, envName.name);
}
});
};
export const verifyPreviewURLAccess = (envNames, { appId, componentName, version }) => {
envNames.forEach((envName) => {
const previewUrl = `${Cypress.config("baseUrl")}/applications/${appId}/home?env=${envName.name}&version=${version}`;
cy.visit(previewUrl);
if (envName.hasAccess) {
cy.url().should('include', `/applications/${appId}/home`);
cy.url().should('include', `env=${envName.name}`);
cy.get(commonWidgetSelector.draggableWidget(componentName))
.should("contain", `${envName.name}`);
} else {
cy.url().should("match", /\/error\/restricted(-preview)?/);
cy.get('[data-cy="modal-header"]')
.should('be.visible')
.and('contain.text', 'Restricted access');
}
});
};