ToolJet/cypress-tests/cypress/support/utils/workFlows.js

205 lines
6.1 KiB
JavaScript
Raw Normal View History

import { commonSelectors } from "Selectors/common";
import { commonText } from "Texts/common";
import { workflowsText } from "Texts/workflows";
import { workflowSelector } from "Selectors/workflows";
import { deleteDatasource } from "Support/utils/dataSource";
import { selectAppCardOption, closeModal } from "Support/utils/common";
Cypress.Commands.add("createWorkflowApp", (wfName) => {
cy.get(workflowSelector.globalWorkFlowsIcon).click();
cy.get(workflowSelector.workflowsCreateButton).click();
cy.get(workflowSelector.workFlowNameInputField).type(wfName);
cy.get(workflowSelector.createWorkFlowsButton).click();
});
Cypress.Commands.add("fillStartNodeInput", () => {
cy.get(workflowSelector.startNode).click({ force: true });
cy.get(workflowSelector.parametersInputField)
.click()
.realType("{")
.realType('"')
.realType("key")
.realType('"')
.realType(":")
.realType('"')
.realType("your value")
.realType('"')
.realType("}");
cy.wait(500);
cy.get("body").click(50, 50);
cy.wait(500);
});
Cypress.Commands.add("dataSourceNode", (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",
"A few seconds ago"
);
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 === "data")
.length
) {
cy.contains("span.node-key", "data", { 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("connectNodeToResponse", (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("Response", { timeout: 5000 }).click({ force: true });
cy.wait(500);
cy.get(workflowSelector.nodeName("response1"))
.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);
});
Cypress.Commands.add("deleteWorkflow", (wfName) => {
cy.intercept("DELETE", "/api/apps/*").as("appDeleted");
cy.backToWorkFlows();
cy.get(commonSelectors.appCard(wfName))
.realHover()
.find(commonSelectors.appCardOptionsButton)
.realHover()
.click();
cy.get(workflowSelector.deleteWorkFlowOption).click();
cy.get(commonSelectors.buttonSelector(commonText.modalYesButton)).click();
cy.wait("@appDeleted");
});
Cypress.Commands.add("backToWorkFlows", () => {
cy.get(commonSelectors.pageLogo).click();
cy.get(commonSelectors.backToAppOption).click();
});
Cypress.Commands.add("revealWorkflowToken", (selectors) => {
cy.get(selectors.workflowTokenField).invoke("text").then((tokenText) => {
if (tokenText.includes("*")) {
cy.get(selectors.workflowTokenEyeIcon).click({ force: true });
cy.wait(300);
cy.revealWorkflowToken(selectors);
}
});
})
Cypress.Commands.add("deleteWorkflowfromDashboard", (wfName) => {
cy.intercept("DELETE", "/api/apps/*").as("appDeleted");
cy.get(commonSelectors.appCard(wfName))
.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",
(wfName, fixtureFile = "cypress/fixtures/exportedApp.json") => {
cy.backToWorkFlows();
selectAppCardOption(
wfName,
commonSelectors.appCardOptions(workflowsText.exportWFOption)
);
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) => {
const exportedName = json.app[0].definition.appV2.name;
cy.writeFile(fixtureFile, json);
});
});
cy.deleteWorkflowfromDashboard(wfName);
}
);
Cypress.Commands.add(
"importWorkflowApp",
(wfName, fixturePath = "cypress/fixtures/exportedApp.json") => {
cy.get(workflowSelector.importWorkFlowsOption).click();
cy.get(workflowSelector.importWorkFlowsLabel).click();
cy.get('input[type="file"]').first().selectFile(fixturePath, { force: true });
cy.wait(2000);
cy.get(workflowSelector.workFlowNameInputField).clear().type(wfName);
cy.get(workflowSelector.importWorkFlowsButton).click();
}
);