PromucFlow_constructor/app/client/cypress/support/Pages/HomePage.ts

280 lines
12 KiB
TypeScript

import { ObjectsRegistry } from "../Objects/Registry"
export class HomePage {
private agHelper = ObjectsRegistry.AggregateHelper;
private locator = ObjectsRegistry.CommonLocators;
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 _orgImportAppModal = ".t--import-application-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']"
private _orgImport = "[data-cy=t--org-import-app]"
private _uploadFile = "//div/form/input"
public CreateNewOrg(orgNewName: string) {
let oldName: string = ""
cy.get(this._visibleTextSpan('New Organization'))
.should("be.visible")
.first()
.click({ force: true });
cy.wait("@createOrg")
this.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}"));
this.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 });
this.agHelper.Sleep(500)
cy.xpath(this._userRole(role)).click({ force: true });
this.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 });
this.agHelper.Sleep(3000)
//cy.wait("@applications"); this randomly fails & introduces flakyness hence commenting!
cy.get(this._homePageAppCreateBtn).should("be.visible").should("be.enabled");
}
public CreateNewApplication() {
cy.get(this._homePageAppCreateBtn).first().click({ force: true })
this.agHelper.ValidateNetworkStatus("@createNewApplication", 201)
cy.get(this.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(this.locator._loading).should("not.exist");
this.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");
this.agHelper.Sleep()//for logout to complete!
}
public LogintoApp(uname: string, pswd: string, role: 'App Viewer' | 'Developer' | 'Administrator' = 'Administrator') {
this.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");
this.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);
this.agHelper.Sleep(2000)
cy.get(this._appContainer).contains(orgId);
cy.xpath(this.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(this.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,
);
this.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 });
this.agHelper.Sleep()
this.NavigateToHome()
}
public ImportApp(fixtureJson: string, reconnect = false) {
cy.get(this._homeIcon).click();
cy.get(this._optionsIcon).first().click();
cy.get(this._orgImport).click({ force: true });
cy.get(this._orgImportAppModal).should("be.visible");
cy.xpath(this._uploadFile).attachFile(fixtureJson).wait(500);
cy.get(this._orgImportAppModal).should("not.exist");
if (!reconnect) {
this.AssertImport()
}
}
public AssertImport() {
this.agHelper.ValidateToastMessage("Application imported successfully")
this.agHelper.Sleep(5000)//for imported app to settle!
cy.get(this.locator._loading).should("not.exist");
}
}