PromucFlow_constructor/app/client/cypress/support/gitSync.js
NandanAnantharamu 87d535ac23
test: PartialExport_Widgets_spec - updated exported json file to compare and added confirmation of successful import (#33090)
RCA:
Test was failing at comparison step where we export and compare
 
Solution:
Updated the WidgetsExportedOnly.json, now the comparison step is working
as expected
Improved the assertions within importApp() reduced wait time and also
removed the Toast message verification


/ok-to-test tags="@tag.Workspace,@tag.ImportExport"

<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/8941790028>
> Commit: 23535e879fde6b8d3018e6bcd762a85df18fea9c
> Cypress dashboard url: <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=8941790028&attempt=1"
target="_blank">Click here!</a>

<!-- end of auto-generated comment: Cypress test results  -->
2024-05-07 11:23:16 +05:30

287 lines
9.9 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";
import {
createMessage,
UNABLE_TO_IMPORT_APP,
} from "../../src/ce/constants/messages";
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(createMessage(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
}
}
},
);