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 -->
287 lines
9.8 KiB
JavaScript
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
|
|
}
|
|
}
|
|
},
|
|
);
|