PromucFlow_constructor/app/client/cypress/support/gitSync.js
Shrikant Sharat Kandula cd22fc1087
test: Some cleanup for Git Cypress tests (#32836)
1. Change usage of ports bound to 3000, 5000 and 8000 to 4200, which
will be the canonical port for TED in the future.
2. Switch to using TED's native git repo management APIs, instead of the
Gitea compatibility layer.
3. Remove code from GitHub ages.


/ok-to-test tags="@tag.Sanity, @tag.Git"<!-- This is an auto-generated
comment: Cypress test results -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/8785291879>
> Commit: b38f4eb388716f7fcfc2a032d788c2ebb951568b
> Cypress dashboard url: <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=8785291879&attempt=2"
target="_blank">Click here!</a>

<!-- end of auto-generated comment: Cypress test results  -->





<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Refactor**
- Enhanced Git integration by shifting from GitHub to Gitea for
repository operations in test environments.
- Updated URLs and endpoints across various test scripts and data
fixtures to align with new configurations.
- **Tests**
- Modified test scenarios to reflect changes in Git operations and URL
configurations.
- **Chores**
- Updated CI workflows by replacing old secrets with new ones for better
configuration management.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-04-23 10:01:14 +05:30

287 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";
});
});
cy.get(gitSyncLocators.bottomBarCommitButton).click();
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(
"Unable to import application in workspace",
"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
}
}
},
);