Home Manual Reference Source

src/page_objects/web/profile/profile.page.js

import BasePage from "../../base.page.js";

/** 
 * ProfilePage 
 * @extends BasePage
 */
class ProfilePage extends BasePage {
  /**
   * @param {args} args Args from controller
   */
  constructor(args) {
    super(args);
  }

  // PAGE ELEMENTS

  /* eslint-disable require-jsdoc, max-len */
  username() {
    return this.element(
      "textarea[class^=components-SettingsModal-ProfileSettings__userNameInput]"
    );
  }

  copyMeetingLinkButton() {
    return this.element("button[Copy link]");
  }

  additionalNumbersLink() {
    return this.element("a=Additional numbers");
  }

  nameEditSubmitButton() {
    return this.element('button[type="submit"]');
  }

  nameEditCancelButton() {
    return this.element('button[type="button"]');
  }

  allInfo() {
    return this.elements(
      "section[class^=components-SettingsModal-ProfileSettings__profileSection] dl"
    );
  }
  /* eslint-enable require-jsdoc, max-len */

  // PAGE FUNCTIONS

  /** Private helper function to parseMyProfile that takes a string with all the
   * information from the phone number element in My Profile and parses out the
   * phone numbers into objects
   * @param {String} allPhoneInfo String with newline chars and subheadings
   * @return {Object} Object with number and extension
   */
  _parsePhoneNumbers(allPhoneInfo) {
    return allPhoneInfo.map(phoneNumber => {
      const matchedText = phoneNumber.match(/(.+) extension (.+)/);
      const number = matchedText[1];
      const extension = matchedText[2];
      return { number: number, extension: extension };
    });
  }

  /* eslint-disable max-statements */
  /** 
   * Parse information from My Profile
   * @return {Object} containing username, meeting link, array of phone number
   * objects, and video address
   * @example Returns {
   * name: 'KylieAdmin',
   * meetingLink: 'https://call.lifesizecloudbeta.com/extension/8480359'
   * phoneInfo: { extensionsMatch: true, extension: 8480359},
   * videoAddress: '8480359@lifesizecloudbeta.com'
   * }
   * @todo Clean this up. We can probably declare additional elements at top.
   */
  async parseMyProfile() {
    const allInfo = await this.allInfo().all();
    const name = await this.username().getText();

    // Meeting Link
    const meetingLinkElement = await allInfo[0].element("dd");
    const meetingLinkText = await meetingLinkElement.getText();
    const meetingLink = meetingLinkText.match(/(.+)Copy link/)[1];

    // Phone numbers and extensions
    const phoneDds = await allInfo[1].elements("dd");
    const allPhoneDds = await phoneDds.all();
    const allPhoneText = await Promise.all(
      allPhoneDds.map(async e => await e.getText())
    );
    allPhoneText.pop(); // get rid of last element
    const phoneInfo = await this._parsePhoneNumbers(allPhoneText);

    // Video address
    const videoAddressElement = await allInfo[2].element("dd");
    const videoAddress = await videoAddressElement.getText();

    return {
      name,
      meetingLink,
      phoneInfo,
      videoAddress
    };
  }
  /* eslint-enable max-statements */

  /** 
   * Open page for viewing additional numbers 
   */
  async goToAdditionalNumbers() {
    await this.additionalNumbersLink().click();
  }

  /** 
   * Copy meeting link to clipboard 
   */
  async copyMeetingLink() {
    await this.copyMeetingLinkButton().click();
  }

  /** 
   * Change username, and submit.
   * @param {String} newName New username with desired changes
   */
  async editNameSubmit(newName) {
    await this.username().click();
    await this.username().setValue(newName);
    await this.nameEditSubmitButton().click();
  }

  /** 
   * Change username, and cancel.
   * @param {String} newName New username with changes
   */
  async editNameCancel(newName) {
    await this.username().click();
    await this.username().setValue(newName);
    await this.nameEditCancelButton().click();
  }

  /** 
   * Get text from username element
   * @return {String} text from username element
   */
  async usernameText() {
    return await this.username().getText();
  }
}

export default ProfilePage;