PromucFlow_constructor/app/client/cypress/support/Pages/HomePage.ts
Arsalan Yaldram 6496f84374
fix: Added Button Container for the firefox drag issue (#11627)
* fix: Added Button Container for the firefox drag issue

* fix: Removed un-necessary styles, added Container in Canvas mode.

* fix: Removed renderMode check from styled function.

* fix: Code refactor and handled Icon Button Component.

* fix: Added extensive comments.

* fix: handled menu button drag issues.

* fix: Fixed some failing tests.

* New Button locator (with drag-container) fix

* NewBtn container locator fix

* btn locator fix

* MongoShopping spec fix

* Mongo, Postgress fixes

* Stat box fix

* Testcase title update

Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
2022-03-13 22:51:04 +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).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()
}
}