## Description
We are using `createMessage()` and `Cypress.env("MESSAGES")` in Cypress
code to use strings. This can create confusion around the method to use
and creates inconsistency in our cypress code base. This PR unifies it
by following one way ie ` Cypress.env("MESSAGES")`. MESSAGES is defined
in
https://github.com/appsmithorg/appsmith/blob/release/app/client/cypress/support/e2e.js#L61
Conversation link -
https://theappsmith.slack.com/archives/C06FWBV74GH/p1715753205226649
Fixes #`Issue Number`
_or_
Fixes `Issue URL`
> [!WARNING]
> _If no issue exists, please create an issue first, and check with the
maintainers if the issue is valid._
## Automation
/ok-to-test tags="@tag.All"
### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/9252248316>
> Commit: 585170639f477848d15e0bbfc8033e6679c24f60
> Cypress dashboard url: <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=9252248316&attempt=1"
target="_blank">Click here!</a>
<!-- end of auto-generated comment: Cypress test results -->
## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No
---------
Co-authored-by: Abhijeet <abhi.nagarnaik@gmail.com>
286 lines
9.8 KiB
JavaScript
286 lines
9.8 KiB
JavaScript
/* eslint-disable cypress/no-unnecessary-waiting */
|
|
/* eslint-disable cypress/no-assigning-return-values */
|
|
|
|
import { AppSidebar } from "./Pages/EditorNavigation";
|
|
|
|
require("cy-verify-downloads").addCustomCommand();
|
|
require("cypress-file-upload");
|
|
import gitSyncLocators from "../locators/gitSyncLocators";
|
|
import homePage from "../locators/HomePage";
|
|
import { ObjectsRegistry } from "./Objects/Registry";
|
|
const gitSync = ObjectsRegistry.GitSync;
|
|
const agHelper = ObjectsRegistry.AggregateHelper;
|
|
const dataManager = ObjectsRegistry.DataManager;
|
|
const assertHelper = ObjectsRegistry.AssertHelper;
|
|
|
|
const commonLocators = require("../locators/commonlocators.json");
|
|
|
|
Cypress.Commands.add("revokeAccessGit", (appName) => {
|
|
cy.xpath("//span[text()= `${appName}`]").parent().next().click();
|
|
cy.get(gitSyncLocators.disconnectAppNameInput).type(appName);
|
|
cy.get(gitSyncLocators.disconnectButton).click();
|
|
cy.intercept("POST", "api/v1/git/disconnect/app/*").as("disconnect");
|
|
cy.get(gitSyncLocators.disconnectButton).click();
|
|
cy.wait("@disconnect").should(
|
|
"have.nested.property",
|
|
"response.body.responseMeta.status",
|
|
200,
|
|
);
|
|
cy.window()
|
|
.its("store")
|
|
.invoke("getState")
|
|
.then((state) => {
|
|
const { id, name } = state.ui.gitSync.disconnectingGitApp;
|
|
expect(name).to.eq("");
|
|
expect(id).to.eq("");
|
|
});
|
|
});
|
|
|
|
Cypress.Commands.add("latestDeployPreview", () => {
|
|
cy.intercept("POST", "/api/v1/applications/publish/*").as("publishApp");
|
|
// Wait before publish
|
|
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
cy.wait(2000);
|
|
cy.assertPageSave();
|
|
|
|
// Stubbing window.open to open in the same tab
|
|
cy.window().then((window) => {
|
|
cy.stub(window, "open").callsFake((url) => {
|
|
window.location.href = Cypress.config().baseUrl + url.substring(1);
|
|
window.location.target = "_self";
|
|
});
|
|
});
|
|
agHelper.GetNClick(gitSync._bottomBarCommit);
|
|
cy.wait(2000); // wait for modal to load
|
|
cy.xpath("//span[text()='Latest deployed preview']").click();
|
|
cy.log("pagename: " + localStorage.getItem("PageName"));
|
|
cy.wait(5000); //wait time for page to load!
|
|
});
|
|
|
|
Cypress.Commands.add("createGitBranch", (branch) => {
|
|
agHelper.AssertElementVisibility(gitSync._bottomBarPull);
|
|
cy.get(gitSyncLocators.branchButton).click({ force: true });
|
|
agHelper.AssertElementVisibility(gitSyncLocators.branchSearchInput);
|
|
agHelper.ClearNType(gitSyncLocators.branchSearchInput, `${branch}`);
|
|
// increasing timeout to reduce flakyness
|
|
cy.get(".ads-v2-spinner", {
|
|
timeout: Cypress.config().pageLoadTimeout,
|
|
}).should("exist");
|
|
cy.get(".ads-v2-spinner", {
|
|
timeout: Cypress.config().pageLoadTimeout,
|
|
}).should("not.exist");
|
|
assertHelper.AssertDocumentReady();
|
|
AppSidebar.assertVisible(Cypress.config().pageLoadTimeout);
|
|
});
|
|
|
|
Cypress.Commands.add("switchGitBranch", (branch, expectError) => {
|
|
agHelper.AssertElementVisibility(gitSync._bottomBarPull);
|
|
cy.get(gitSyncLocators.branchButton).click({ force: true });
|
|
agHelper.AssertElementVisibility(gitSyncLocators.branchSearchInput);
|
|
agHelper.ClearNType(gitSyncLocators.branchSearchInput, `${branch}`);
|
|
cy.get(gitSyncLocators.branchListItem).contains(branch).click();
|
|
if (!expectError) {
|
|
// increasing timeout to reduce flakyness
|
|
cy.get(".ads-v2-spinner", {
|
|
timeout: Cypress.config().pageLoadTimeout,
|
|
}).should("exist");
|
|
cy.get(".ads-v2-spinner", {
|
|
timeout: Cypress.config().pageLoadTimeout,
|
|
}).should("not.exist");
|
|
}
|
|
assertHelper.AssertDocumentReady();
|
|
AppSidebar.assertVisible(Cypress.config().pageLoadTimeout);
|
|
});
|
|
|
|
Cypress.Commands.add("commitAndPush", (assertFailure) => {
|
|
cy.get(homePage.publishButton).click();
|
|
agHelper.AssertElementExist(gitSync._bottomBarPull);
|
|
cy.get(gitSyncLocators.commitCommentInput).type("Initial Commit");
|
|
cy.get(gitSyncLocators.commitButton).click();
|
|
if (!assertFailure) {
|
|
// check for commit success
|
|
//adding timeout since commit is taking longer sometimes
|
|
cy.wait("@commit", { timeout: 35000 }).should(
|
|
"have.nested.property",
|
|
"response.body.responseMeta.status",
|
|
201,
|
|
);
|
|
cy.wait(3000);
|
|
} else {
|
|
cy.wait("@commit", { timeout: 35000 }).then((interception) => {
|
|
const status = interception.response.body.responseMeta.status;
|
|
expect(status).to.be.gte(400);
|
|
});
|
|
}
|
|
|
|
cy.get(gitSyncLocators.closeGitSyncModal).click();
|
|
});
|
|
|
|
Cypress.Commands.add("merge", (destinationBranch) => {
|
|
agHelper.AssertElementExist(gitSync._bottomBarPull);
|
|
|
|
cy.intercept("GET", "/api/v1/git/status/app/*").as(`gitStatus`);
|
|
|
|
cy.intercept("GET", "/api/v1/git/branch/app/*").as(`gitBranches`);
|
|
|
|
cy.get(gitSyncLocators.bottomBarMergeButton).click({ force: true });
|
|
//cy.wait(6000); // wait for git status call to finish
|
|
/*cy.wait("@gitStatus").should(
|
|
"have.nested.property",
|
|
"response.body.responseMeta.status",
|
|
200,
|
|
); */
|
|
|
|
agHelper.AssertElementEnabledDisabled(
|
|
gitSyncLocators.mergeBranchDropdownDestination,
|
|
0,
|
|
false,
|
|
);
|
|
agHelper.WaitUntilEleDisappear(gitSync._mergeLoader);
|
|
cy.wait(["@gitBranches", "@gitStatus"]).then((interceptions) => {
|
|
if (
|
|
interceptions[0]?.response?.statusCode === 200 &&
|
|
interceptions[1]?.response?.statusCode === 200
|
|
) {
|
|
cy.get(gitSyncLocators.mergeBranchDropdownDestination).click();
|
|
cy.get(commonLocators.dropdownmenu).contains(destinationBranch).click();
|
|
agHelper.AssertElementAbsence(gitSync._checkMergeability, 35000);
|
|
assertHelper.WaitForNetworkCall("mergeStatus");
|
|
cy.get("@mergeStatus").should(
|
|
"have.nested.property",
|
|
"response.body.data.isMergeAble",
|
|
true,
|
|
);
|
|
cy.wait(2000);
|
|
cy.contains(Cypress.env("MESSAGES").NO_MERGE_CONFLICT());
|
|
cy.get(gitSyncLocators.mergeCTA).click();
|
|
assertHelper.AssertNetworkStatus("mergeBranch", 200);
|
|
agHelper.AssertContains(Cypress.env("MESSAGES").MERGED_SUCCESSFULLY());
|
|
}
|
|
});
|
|
});
|
|
|
|
Cypress.Commands.add(
|
|
"importAppFromGit",
|
|
(repo, assertConnectFailure, failureMessage) => {
|
|
const testEmail = "test@test.com";
|
|
const testUsername = "testusername";
|
|
|
|
cy.intercept("GET", "api/v1/git/import/keys?keyType=ECDSA").as(
|
|
`generateKey-${repo}`,
|
|
);
|
|
cy.get(gitSyncLocators.gitRepoInput).type(
|
|
`${dataManager.GIT_CLONE_URL}/${repo}.git`,
|
|
);
|
|
cy.get(gitSyncLocators.generateDeployKeyBtn).click();
|
|
cy.wait(`@generateKey-${repo}`).then((result) => {
|
|
const key = result.response.body.data.publicKey.trimEnd();
|
|
cy.request({
|
|
method: "POST",
|
|
url: `${dataManager.GIT_API_BASE}/api/v1/git/keys/${repo}`,
|
|
body: {
|
|
title: "key1",
|
|
key,
|
|
read_only: false,
|
|
},
|
|
});
|
|
|
|
cy.get(gitSyncLocators.useGlobalGitConfig).click({ force: true });
|
|
|
|
cy.get(gitSyncLocators.gitConfigNameInput).type(
|
|
`{selectall}${testUsername}`,
|
|
);
|
|
cy.get(gitSyncLocators.gitConfigEmailInput).type(
|
|
`{selectall}${testEmail}`,
|
|
);
|
|
// click on the connect button and verify
|
|
cy.get(gitSyncLocators.connectSubmitBtn).click();
|
|
|
|
if (!assertConnectFailure) {
|
|
// check for connect success
|
|
cy.wait("@importFromGit").should(
|
|
"have.nested.property",
|
|
"response.body.responseMeta.status",
|
|
201,
|
|
);
|
|
} else {
|
|
cy.wait("@importFromGit").then((interception) => {
|
|
const status = interception.response.body.responseMeta.status;
|
|
const message = interception.response.body.responseMeta.error.message;
|
|
expect(status).to.be.gte(400);
|
|
expect(message).to.contain(failureMessage);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
);
|
|
|
|
Cypress.Commands.add("gitDiscardChanges", () => {
|
|
cy.get(gitSyncLocators.bottomBarCommitButton).click();
|
|
cy.get(gitSyncLocators.discardChanges).should("be.visible");
|
|
cy.get(gitSyncLocators.discardChanges)
|
|
.children()
|
|
.should("have.text", "Discard & pull");
|
|
cy.get(gitSyncLocators.discardChanges).click();
|
|
cy.contains(Cypress.env("MESSAGES").DISCARD_CHANGES_WARNING());
|
|
cy.get(gitSyncLocators.discardChanges)
|
|
.children()
|
|
.should("have.text", "Are you sure?");
|
|
cy.get(gitSyncLocators.discardChanges).click();
|
|
cy.contains(Cypress.env("MESSAGES").DISCARDING_AND_PULLING_CHANGES());
|
|
cy.validateToastMessage("Discarded changes successfully.");
|
|
cy.wait(2000);
|
|
assertHelper.AssertContains(
|
|
Cypress.env("MESSAGES").UNABLE_TO_IMPORT_APP(),
|
|
"not.exist",
|
|
);
|
|
});
|
|
|
|
Cypress.Commands.add(
|
|
"regenerateSSHKey",
|
|
(repo, generateKey = true, protocol = "ECDSA") => {
|
|
let generatedKey;
|
|
cy.get(gitSyncLocators.bottomBarCommitButton).click();
|
|
cy.get("[data-testid=t--tab-GIT_CONNECTION]").click();
|
|
cy.wait(2000);
|
|
cy.get(gitSyncLocators.SSHKeycontextmenu).eq(2).click();
|
|
if (protocol === "ECDSA") {
|
|
cy.get(gitSyncLocators.regenerateSSHKeyECDSA).click();
|
|
} else if (protocol === "RSA") {
|
|
cy.get(gitSyncLocators.regenerateSSHKeyRSA).click();
|
|
}
|
|
cy.contains(Cypress.env("MESSAGES").REGENERATE_KEY_CONFIRM_MESSAGE());
|
|
cy.xpath(gitSyncLocators.confirmButton).click();
|
|
if (protocol === "ECDSA") {
|
|
cy.intercept("POST", "/api/v1/applications/ssh-keypair/*").as(
|
|
`generateKey-${repo}`,
|
|
);
|
|
} else if (protocol === "RSA") {
|
|
cy.intercept("POST", "/api/v1/applications/ssh-keypair/*?keyType=RSA").as(
|
|
`generateKey-${repo}-RSA`,
|
|
);
|
|
}
|
|
|
|
if (generateKey) {
|
|
if (protocol === "ECDSA") {
|
|
cy.wait(`@generateKey-${repo}`).then((result) => {
|
|
const key = result.response.body.data.publicKey.trimEnd();
|
|
cy.request({
|
|
method: "POST",
|
|
url: `${dataManager.GIT_API_BASE}/api/v1/repos/Cypress/${repo}/keys`,
|
|
body: {
|
|
title: "key1",
|
|
key,
|
|
read_only: false,
|
|
},
|
|
});
|
|
|
|
cy.get(gitSyncLocators.closeGitSyncModal);
|
|
});
|
|
} else if (protocol === "RSA") {
|
|
// doesn't work with github
|
|
}
|
|
}
|
|
},
|
|
);
|