2025-09-09 12:18:12 +00:00
|
|
|
import { fake } from "Fixtures/fake";
|
|
|
|
|
import { workflowsText } from "Texts/workflows";
|
|
|
|
|
import { workflowSelector } from "Selectors/workflows";
|
|
|
|
|
import { commonSelectors, commonWidgetSelector } from "Selectors/common";
|
|
|
|
|
import { commonText } from "Texts/common";
|
|
|
|
|
import { selectAppCardOption } from "Support/utils/common";
|
|
|
|
|
import { navigateBackToWorkflowsDashboard } from "Support/utils/workFlows";
|
|
|
|
|
|
2025-10-15 09:03:22 +00:00
|
|
|
Cypress.Commands.add("createWorkflowApp", (workflowName) => {
|
2025-09-09 12:18:12 +00:00
|
|
|
cy.get(workflowSelector.globalWorkFlowsIcon).click();
|
|
|
|
|
cy.get(workflowSelector.workflowsCreateButton).click();
|
2025-10-15 09:03:22 +00:00
|
|
|
cy.get(workflowSelector.workFlowNameInputField).type(workflowName);
|
2025-09-09 12:18:12 +00:00
|
|
|
cy.get(workflowSelector.createWorkFlowsButton).click();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add("connectDataSourceNode", (nodeType) => {
|
|
|
|
|
cy.get(workflowSelector.startNodeHandleRight).trigger("mousedown", {
|
|
|
|
|
button: 0,
|
|
|
|
|
force: true,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
cy.get(".react-flow__pane")
|
|
|
|
|
.trigger("mousemove", { clientX: 600, clientY: 300, force: true })
|
|
|
|
|
.wait(500)
|
|
|
|
|
.trigger("mouseup", { force: true });
|
|
|
|
|
|
|
|
|
|
cy.contains(nodeType, { timeout: 5000 })
|
|
|
|
|
.scrollIntoView()
|
|
|
|
|
.click({ force: true });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add("verifyTextInResponseOutput", (expectedText) => {
|
|
|
|
|
cy.get(workflowSelector.workflowRunButton).click();
|
|
|
|
|
cy.get(workflowSelector.workflowLogs).should(
|
|
|
|
|
"have.text",
|
|
|
|
|
workflowsText.workflowRunhelperText
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
cy.get('[data-cy="response1-node-name"]').click();
|
|
|
|
|
cy.wait(500);
|
|
|
|
|
cy.get('[data-cy="tab-output"]').click();
|
|
|
|
|
|
|
|
|
|
cy.wait(500);
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
if (
|
|
|
|
|
$body
|
|
|
|
|
.find("span.node-key")
|
|
|
|
|
.filter((_, el) => el.innerText === workflowsText.responseNodeKey)
|
|
|
|
|
.length
|
|
|
|
|
) {
|
|
|
|
|
cy.contains("span.node-key", workflowsText.responseNodeKey, {
|
|
|
|
|
timeout: 3000,
|
|
|
|
|
})
|
|
|
|
|
.click({ force: true })
|
|
|
|
|
.wait(300);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
cy.get("body").then(($body) => {
|
|
|
|
|
const icons = $body.find("span.json-tree-node-icon");
|
|
|
|
|
if (icons.length > 0) {
|
|
|
|
|
cy.wrap(icons).each(($el) => {
|
|
|
|
|
if ($el[0].style.transform === "rotate(0deg)") {
|
|
|
|
|
cy.wrap($el).click({ force: true }).wait(200);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
cy.get(".json-tree-valuetype", { timeout: 3000 }).then(($vals) => {
|
|
|
|
|
const texts = [...$vals].map((el) => el.innerText.trim());
|
|
|
|
|
const match = texts.some((txt) => txt.includes(expectedText));
|
|
|
|
|
expect(
|
|
|
|
|
match,
|
|
|
|
|
`Expected some value to include "${expectedText}", but got:\n\n${texts.join("\n")}`
|
|
|
|
|
).to.be.true;
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"connectNodeToResponseNode",
|
|
|
|
|
(nodeTitle, returnStatement) => {
|
|
|
|
|
cy.get(workflowSelector.nodeName(nodeTitle))
|
|
|
|
|
.should("exist")
|
|
|
|
|
.parents(".react-flow__node")
|
|
|
|
|
.as("sourceNode");
|
|
|
|
|
|
|
|
|
|
cy.get(workflowSelector.nodeHandleRight(nodeTitle)).trigger("mousedown", {
|
|
|
|
|
button: 0,
|
|
|
|
|
force: true,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
cy.get(".react-flow__pane")
|
|
|
|
|
.trigger("mousemove", { clientX: 800, clientY: 400, force: true })
|
|
|
|
|
.trigger("mouseup", { force: true });
|
|
|
|
|
|
|
|
|
|
cy.wait(500);
|
|
|
|
|
|
|
|
|
|
cy.contains(workflowsText.responseNodeLabel, { timeout: 5000 }).click({
|
|
|
|
|
force: true,
|
|
|
|
|
});
|
|
|
|
|
cy.wait(500);
|
|
|
|
|
|
|
|
|
|
cy.get(workflowSelector.nodeName(workflowsText.responseNodeName))
|
|
|
|
|
.parents(".react-flow__node")
|
|
|
|
|
.click({ force: true });
|
|
|
|
|
|
|
|
|
|
cy.get('.cm-content[contenteditable="true"]')
|
|
|
|
|
.clearAndTypeOnCodeMirror("")
|
|
|
|
|
.clearAndTypeOnCodeMirror("")
|
|
|
|
|
.clearAndTypeOnCodeMirror(returnStatement);
|
|
|
|
|
|
|
|
|
|
cy.get("body").click(50, 50);
|
|
|
|
|
cy.wait(500);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2025-10-15 09:03:22 +00:00
|
|
|
Cypress.Commands.add("deleteWorkflow", (workflowName) => {
|
2025-09-09 12:18:12 +00:00
|
|
|
cy.intercept("DELETE", "/api/apps/*").as("appDeleted");
|
|
|
|
|
navigateBackToWorkflowsDashboard();
|
2025-10-15 09:03:22 +00:00
|
|
|
cy.get(commonSelectors.appCard(workflowName))
|
2025-09-09 12:18:12 +00:00
|
|
|
.realHover()
|
|
|
|
|
.find(commonSelectors.appCardOptionsButton)
|
|
|
|
|
.realHover()
|
|
|
|
|
.click();
|
|
|
|
|
cy.get(workflowSelector.deleteWorkFlowOption).click();
|
|
|
|
|
cy.get(commonSelectors.buttonSelector(commonText.modalYesButton)).click();
|
|
|
|
|
cy.wait("@appDeleted");
|
|
|
|
|
});
|
|
|
|
|
|
2025-10-15 09:03:22 +00:00
|
|
|
Cypress.Commands.add("deleteWorkflowfromDashboard", (workflowName) => {
|
2025-09-09 12:18:12 +00:00
|
|
|
cy.intercept("DELETE", "/api/apps/*").as("appDeleted");
|
2025-10-15 09:03:22 +00:00
|
|
|
cy.get(commonSelectors.appCard(workflowName))
|
2025-09-09 12:18:12 +00:00
|
|
|
.realHover()
|
|
|
|
|
.find(commonSelectors.appCardOptionsButton)
|
|
|
|
|
.realHover()
|
|
|
|
|
.click();
|
|
|
|
|
cy.get(workflowSelector.deleteWorkFlowOption).click();
|
|
|
|
|
cy.get(commonSelectors.buttonSelector(commonText.modalYesButton)).click();
|
|
|
|
|
cy.wait("@appDeleted");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"exportWorkflowApp",
|
2025-10-15 09:03:22 +00:00
|
|
|
(workflowName, fixtureFile = "cypress/fixtures/exportedApp.json") => {
|
2025-09-09 12:18:12 +00:00
|
|
|
navigateBackToWorkflowsDashboard();
|
|
|
|
|
|
2025-10-15 09:03:22 +00:00
|
|
|
cy.get(`[data-cy="${workflowName}-card"]`)
|
2025-10-15 06:41:28 +00:00
|
|
|
.trigger('mouseover')
|
|
|
|
|
.find('[data-cy="app-card-menu-icon"]')
|
|
|
|
|
.click({ force: true });
|
|
|
|
|
|
|
|
|
|
cy.get(commonSelectors.appCardOptions(workflowsText.exportWFOption))
|
|
|
|
|
.click();
|
|
|
|
|
|
2025-09-09 12:18:12 +00:00
|
|
|
cy.wait(2000);
|
|
|
|
|
|
|
|
|
|
cy.exec("ls -t ./cypress/downloads/ | head -1").then((result) => {
|
|
|
|
|
const downloadedAppExportFileName = result.stdout.trim();
|
|
|
|
|
const filePath = `./cypress/downloads/${downloadedAppExportFileName}`;
|
|
|
|
|
cy.readFile(filePath, { timeout: 15000 }).then((json) => {
|
|
|
|
|
cy.writeFile(fixtureFile, json);
|
|
|
|
|
});
|
|
|
|
|
});
|
2025-10-15 06:41:28 +00:00
|
|
|
|
2025-10-15 09:03:22 +00:00
|
|
|
cy.deleteWorkflowfromDashboard(workflowName);
|
2025-09-09 12:18:12 +00:00
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2025-10-15 09:03:22 +00:00
|
|
|
Cypress.Commands.add("addWorkflowInApp", (workflowName) => {
|
2025-09-09 12:18:12 +00:00
|
|
|
cy.get(workflowSelector.showDSPopoverButton).click();
|
|
|
|
|
cy.get(workflowSelector.workflowSearchInput).type(
|
|
|
|
|
workflowsText.workflowLabel
|
|
|
|
|
);
|
|
|
|
|
cy.contains(`[id*="react-select-"]`, workflowsText.workflowLabel).click();
|
2025-10-15 09:03:22 +00:00
|
|
|
cy.get(workflowSelector.queryRenameInput).clear().type(workflowName);
|
2025-09-16 06:52:48 +00:00
|
|
|
cy.get(workflowSelector.workflowDropdown).parent()
|
|
|
|
|
.find('.react-select__control')
|
|
|
|
|
.click();
|
2025-10-15 09:03:22 +00:00
|
|
|
cy.get(workflowSelector.workflowSelectInput).realType(workflowName);
|
|
|
|
|
cy.get(workflowSelector.workflowSelectOption).contains(workflowName).click();
|
2025-09-09 12:18:12 +00:00
|
|
|
});
|