PromucFlow_constructor/app/client/cypress/support/Pages/HomePage.ts
Aishwarya-U-R 47fc1443f2
test: Script fixes for flaky tests + Unskipping few skipped tests + Cypress upgraded (#11724)
* AForceMigration started

* Table_GenralProp Background color failure fix

* Adding assertPageSave()

* Flaky fix

* Flake fix

* S3 - upload case uncomment

* Added click aft clear - Table_AddBtn spec

* Unskipping Promises scripts

* Promises fix

* Table_genral fix

* Separating Table_Color spec

* Failure fixes

* JObjtoInput flaky fix

* .wait to .Sleep

* Failure fix

* HSEditor complete replace fix

* small replace

* Update a user's name flaky fix

* EE_CopyQuery spec fix

* UNSkipping select widget test

* Flaky fixes

* viewportHeight updated

* Page Load spec - fixed & unskipping test

* Mongo cy.al failure fix

* Promises.any fix

* Promises.any fix

* List_Spec fix

* LIst_spec fix

* Promises.any fix

* Replay editor- flaky fix

* S3 flaky fix

* expandCollapse flaky click fix
2022-03-19 21:26:53 +05:30

266 lines
11 KiB
TypeScript

import { AggregateHelper } from "./AggregateHelper";
import { CommonLocators } from "../Objects/CommonLocators";
const agHelper = new AggregateHelper();
const locator = new CommonLocators();
export class HomePage {
private _username = "input[name='username']"
private _password = "input[name='password']"
private _submitBtn = "button[type='submit']"
private _orgCompleteSection = ".t--org-section"
private _orgName = ".t--org-name"
private _optionsIcon = ".t--options-icon"
private _renameOrgInput = "[data-cy=t--org-rename-input]"
private _orgList = (orgName: string) => ".t--org-section:contains(" + orgName + ")"
private _orgShareUsersIcon = (orgName: string) => ".t--org-section:contains(" + orgName + ") .org-share-user-icons"
private _shareOrg = (orgName: string) => ".t--org-section:contains(" + orgName + ") button:contains('Share')"
private _email = "//input[@type='email']"
_visibleTextSpan = (spanText: string) => "span:contains('" + spanText + "')"
private _userRole = (role: string) => "//div[contains(@class, 'label-container')]//span[1][text()='" + role + "']"
private _manageUsers = ".manageUsers"
private _appHome = "//a[@href='/applications']"
_applicationCard = ".t--application-card"
private _homeIcon = ".t--appsmith-logo"
private _appContainer = ".t--applications-container"
private _homePageAppCreateBtn = this._appContainer + " .createnew"
private _newOrganizationCreateNewApp = (newOrgName: string) => "//span[text()='" + newOrgName + "']/ancestor::div[contains(@class, 't--org-name-text')]/parent::div/following-sibling::div//button[contains(@class, 't--new-button')]"
private _existingOrganizationCreateNewApp = (existingOrgName: string) => "//span[text()='" + existingOrgName + "']/ancestor::div[contains(@class, 't--org-name-text')]/following-sibling::div//button[contains(@class, 't--new-button')]"
private _applicationName = ".t--application-name"
private _editAppName = "bp3-editable-text-editing"
private _appMenu = ".t--editor-appname-menu-portal .bp3-menu-item"
private _buildFromScratchActionCard = ".t--BuildFromScratch"
private _buildFromDataTableActionCard = ".t--GenerateCRUDPage"
private _selectRole = "//span[text()='Select a role']/ancestor::div"
private _searchInput = "input[type='text']"
_appHoverIcon = (action: string) => ".t--application-" + action + "-link"
private _deleteUser = (email: string) => "//td[text()='" + email + "']/following-sibling::td//span[contains(@class, 't--deleteUser')]"
private _userRoleDropDown = (email: string, role: string) => "//td[text()='" + email + "']/following-sibling::td//span[text()='" + role + "']"
//private _userRoleDropDown = (email: string) => "//td[text()='" + email + "']/following-sibling::td"
private _leaveOrgConfirmModal = ".t--member-delete-confirmation-modal"
private _leaveOrgConfirmButton = "[data - cy= t--org-leave - button]"
private _lastOrgInHomePage = "//div[contains(@class, 't--org-section')][last()]//span/span"
_editPageLanding = "//h2[text()='Drag and drop a widget here']"
_usersEmailList = "[data-colindex='1']"
public CreateNewOrg(orgNewName: string) {
let oldName: string = ""
cy.get(this._visibleTextSpan('New Organization'))
.should("be.visible")
.first()
.click({ force: true });
cy.wait("@createOrg")
agHelper.Sleep(2000)
cy.xpath(this._lastOrgInHomePage).first().then($ele => {
oldName = $ele.text();
cy.log("oldName is : " + oldName);
this.RenameOrg(oldName, orgNewName);
})
}
public RenameOrg(orgName: string, newOrgName: string) {
cy.contains(orgName)
.closest(this._orgCompleteSection)
.find(this._orgName)
.find(this._optionsIcon)
.click({ force: true });
cy.get(this._renameOrgInput)
.should("be.visible")
.type(newOrgName.concat("{enter}"));
agHelper.Sleep(2000)
cy.wait("@updateOrganization").should(
"have.nested.property",
"response.body.responseMeta.status",
200,
);
cy.contains(newOrgName);
}
//Maps to CheckShareIcon in command.js
public CheckOrgShareUsersCount(orgName: string, count: number) {
cy.get(this._orgList(orgName))
.scrollIntoView()
.should("be.visible");
cy.get(this._orgShareUsersIcon(orgName)).should("have.length", count);
}
//Maps to inviteUserForOrg in command.js
public InviteUserToOrg(orgName: string, email: string, role: string) {
const successMessage = "The user has been invited successfully";
this.stubPostHeaderReq();
cy.get(this._orgList(orgName))
.scrollIntoView()
.should("be.visible");
cy.get(this._shareOrg(orgName))
.first()
.should("be.visible")
.click({ force: true });
cy.xpath(this._email)
.click({ force: true })
.type(email);
cy.xpath(this._selectRole).first().click({ force: true });
agHelper.Sleep(500)
cy.xpath(this._userRole(role)).click({ force: true });
agHelper.ClickButton('Invite')
cy.wait("@mockPostInvite")
.its("request.headers")
.should("have.property", "origin", "Cypress");
cy.contains(email, { matchCase: false });
cy.contains(successMessage);
}
public stubPostHeaderReq() {
cy.intercept("POST", "/api/v1/users/invite", (req) => { req.headers["origin"] = "Cypress"; }).as("mockPostInvite");
}
public NavigateToHome() {
cy.get(this._homeIcon).click({ force: true });
agHelper.Sleep(3000)
cy.get(this._homePageAppCreateBtn).should("be.visible").should("be.enabled");
}
public CreateNewApplication() {
cy.get(this._homePageAppCreateBtn).first().click({ force: true })
cy.wait("@createNewApplication").should(
"have.nested.property",
"response.body.responseMeta.status",
201,
);
cy.get(locator._loading).should("not.exist");
}
//Maps to CreateAppForOrg in command.js
public CreateAppInOrg(orgName: string, appname: string) {
cy.xpath(this._newOrganizationCreateNewApp(orgName))
.scrollIntoView()
.should("be.visible")
.click({ force: true });
cy.wait("@createNewApplication").should(
"have.nested.property",
"response.body.responseMeta.status",
201,
);
cy.get(locator._loading).should("not.exist");
agHelper.Sleep(2000)
this.RenameApplication(appname)
cy.get(this._buildFromScratchActionCard).click();
cy.wait("@updateApplication").should(
"have.nested.property",
"response.body.responseMeta.status",
200,
);
}
//Maps to AppSetupForRename in command.js
public RenameApplication(appName: string) {
cy.get(this._applicationName).then(($appName) => {
if (!$appName.hasClass(this._editAppName)) {
cy.get(this._applicationName).click();
cy.get(this._appMenu)
.contains("Rename", { matchCase: false })
.click();
}
});
cy.get(this._applicationName).type(appName + "{enter}");
}
//Maps to LogOut in command.js
public LogOutviaAPI() {
cy.request("POST", "/api/v1/logout");
agHelper.Sleep()//for logout to complete!
}
public LogintoApp(uname: string, pswd: string, role: 'App Viewer' | 'Developer' | 'Administrator' = 'Administrator') {
agHelper.Sleep() //waiting for window to load
cy.window().its("store").invoke("dispatch", { type: "LOGOUT_USER_INIT" });
cy.wait("@postLogout");
cy.visit("/user/login");
cy.get(this._username).should("be.visible").type(uname)
cy.get(this._password).type(pswd);
cy.get(this._submitBtn).click();
cy.wait("@getUser");
agHelper.Sleep(3000)
if (role != 'App Viewer')
cy.get(this._homePageAppCreateBtn).should("be.visible").should("be.enabled");
}
public FilterApplication(appName: string, orgId: string) {
cy.get(this._searchInput).type(appName);
agHelper.Sleep(2000)
cy.get(this._appContainer).contains(orgId);
cy.xpath(locator._spanButton('Share'))
.first()
.should("be.visible")
}
//Maps to launchApp in command.js
public LaunchAppFromAppHover() {
cy.get(this._appHoverIcon('view'))
.should("be.visible")
.first()
.click();
cy.get(locator._loading).should("not.exist");
cy.wait("@getPagesForViewApp").should(
"have.nested.property",
"response.body.responseMeta.status",
200,
);
}
//Maps to deleteUserFromOrg in command.js
public DeleteUserFromOrg(orgName: string, email: string) {
cy.get(this._orgList(orgName))
.scrollIntoView()
.should("be.visible");
cy.contains(orgName)
.closest(this._orgCompleteSection)
.find(this._orgName)
.find(this._optionsIcon)
.click({ force: true });
cy.get(this._visibleTextSpan('Members')).click({ force: true });
cy.wait("@getMembers").should(
"have.nested.property",
"response.body.responseMeta.status",
200,
);
cy.get(this._deleteUser(email))
.last()
.click({ force: true });
cy.get(this._leaveOrgConfirmModal).should("be.visible");
cy.get(this._leaveOrgConfirmButton).click({ force: true });
this.NavigateToHome()
}
public OpenMembersPageForOrg(orgName: string) {
cy.get(this._appContainer).contains(orgName)
.scrollIntoView()
.should("be.visible");
cy.get(this._appContainer).contains(orgName)
.closest(this._orgCompleteSection)
.find(this._orgName)
.find(this._optionsIcon)
.click({ force: true });
cy.get(this._visibleTextSpan('Members')).last().click({ force: true });
cy.wait("@getMembers").should(
"have.nested.property",
"response.body.responseMeta.status",
200,
);
agHelper.Sleep(2500)//wait for members page to load!
}
public UpdateUserRoleInOrg(orgName: string, email: string, currentRole: string, newRole: string) {
this.OpenMembersPageForOrg(orgName)
cy.xpath(this._userRoleDropDown(email, currentRole)).first().trigger('click');
//cy.xpath(this._userRoleDropDown(email)).first().click({force: true});
cy.get(this._visibleTextSpan(newRole)).last().click({ force: true });
agHelper.Sleep()
this.NavigateToHome()
}
}