PromucFlow_constructor/app/client/cypress/support/gitSync.js
Rudraprasad Das f6d7ce626f
chore: git mod - test fixes (#38357)
## Description
- Locator fixes for cy tests
- Missing saga for discard and merge
- New component for hot keys


Fixes https://github.com/appsmithorg/appsmith/issues/37821
Fixes https://github.com/appsmithorg/appsmith/issues/37822
Fixes https://github.com/appsmithorg/appsmith/issues/37824

## Automation

/ok-to-test tags="@tag.Git"

### 🔍 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/12649057943>
> Commit: 94c57d0a2398fca8e6cbb4be573586aa98dffbe1
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=12649057943&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.Git`
> Spec:
> <hr>Tue, 07 Jan 2025 10:42:55 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No


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

## Release Notes

- **New Features**
- Added repository limit error modal to handle scenarios when repository
limits are reached.
  - Introduced Git hot keys for quick access to Git operations.
- Enhanced Git synchronization functionality with new merge and discard
change capabilities.
- Integrated feature flag handling in test suites for Git-related
functionalities.

- **Improvements**
  - Standardized test identifiers across Git-related components.
  - Refined Git modal interactions and state management.
  - Updated locator references for more consistent testing.
- Improved user feedback with success notifications for branch
deletions.

- **Bug Fixes**
  - Resolved issues with branch switching and URL handling.
  - Improved error handling in Git synchronization processes.

- **Testing**
  - Updated Cypress test suites with new feature flag interceptors.
  - Enhanced test coverage for Git operations and modal interactions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-01-07 12:30:42 +01:00

152 lines
5.6 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 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("latestDeployPreview", () => {
cy.intercept("POST", "/api/v1/applications/publish/*").as("publishApp");
// Wait before publish
// eslint-disable-next-line cypress/no-unnecessary-waiting
cy.wait(2000);
agHelper.AssertAutoSave();
// 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.locators.quickActionsCommitBtn);
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.locators.quickActionsPullBtn);
cy.get(gitSync.locators.quickActionsBranchBtn).click({ force: true });
agHelper.AssertElementVisibility(gitSync.locators.branchSearchInput);
agHelper.ClearNType(gitSync.locators.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.locators.quickActionsPullBtn);
cy.get(gitSync.locators.quickActionsBranchBtn).click({ force: true });
agHelper.AssertElementVisibility(gitSync.locators.branchSearchInput);
agHelper.ClearNType(gitSync.locators.branchSearchInput, `${branch}`);
cy.get(gitSync.locators.branchItem).contains(branch).click();
assertHelper.AssertDocumentReady();
AppSidebar.assertVisible(Cypress.config().pageLoadTimeout);
});
Cypress.Commands.add("commitAndPush", (assertFailure) => {
cy.get(homePage.publishButton).click();
agHelper.AssertElementExist(gitSync.locators.quickActionsPullBtn);
cy.get(gitSync.locators.opsCommitInput).type("Initial Commit");
cy.get(gitSync.locators.opsCommitBtn).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);
});
}
gitSync.CloseOpsModal();
});
Cypress.Commands.add("merge", (destinationBranch) => {
agHelper.AssertElementExist(gitSync.locators.quickActionsPullBtn);
cy.intercept("GET", "/api/v1/git/status/app/*").as(`gitStatus`);
cy.intercept("GET", "/api/v1/git/branch/app/*").as(`gitBranches`);
cy.get(gitSync.locators.quickActionsMergeBtn).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(
gitSync.locators.opsMergeBranchSelect,
0,
false,
);
agHelper.WaitUntilEleDisappear(gitSync.locators.opsMergeLoader);
cy.wait(["@gitBranches", "@gitStatus"]).then((interceptions) => {
if (
interceptions[0]?.response?.statusCode === 200 &&
interceptions[1]?.response?.statusCode === 200
) {
cy.get(gitSync.locators.opsMergeBranchSelect).click();
cy.get(commonLocators.dropdownmenu).contains(destinationBranch).click();
gitSync.AssertAbsenceOfCheckingMergeability();
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(gitSync.locators.opsMergeBtn).click();
assertHelper.AssertNetworkStatus("mergeBranch", 200);
agHelper.AssertContains(Cypress.env("MESSAGES").MERGED_SUCCESSFULLY());
}
});
});
Cypress.Commands.add("gitDiscardChanges", () => {
cy.get(gitSync.locators.quickActionsCommitBtn).click();
cy.get(gitSync.locators.opsDiscardBtn).should("be.visible");
cy.get(gitSync.locators.opsDiscardBtn)
.children()
.should("have.text", "Discard & pull");
cy.get(gitSync.locators.opsDiscardBtn).click();
cy.contains(Cypress.env("MESSAGES").DISCARD_CHANGES_WARNING());
cy.get(gitSync.locators.opsDiscardBtn)
.children()
.should("have.text", "Are you sure?");
cy.get(gitSync.locators.opsDiscardBtn).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",
);
});