mangroveorg/datawinners

View on GitHub
func_tests/pages/questionnairetabpage/poll_questionnaire_page.py

Summary

Maintainability
B
6 hrs
Test Coverage
from framework.utils.common_utils import by_css, by_id, generateId, by_xpath
from pages.createquestionnairepage.create_questionnaire_locator import POLL_SMS_DROPDOWN,\
    POLL_VIA_SMS_RD_BUTTON, SMS_TEXTBOX, CREATE_POLL_BUTTON, POLL_TITLE, DATA_SENDER_TAB, POLL_TAB, DATA_TAB_BTN,\
    POLL_VIA_BROADCAST_RD_BUTTON, poll_info_accordian, deactivate_link, POLL_STATUS_INFO,\
    AUTOMATIC_REPLY_ACCORDIAN, POLL_SMS_ACCORDIAN, AUTOMATIC_REPLY_SMS_TEXT, ITALIC_GREY_COMMENT,\
    POLL_SMS_TABLE, SEND_SMS_LINK, PROJECT_LANGUAGE, SAVE_LANG_BTN, SUCCESS_MSG_BOX,\
    DEACTIVATE_BTN, ON_SWITCH, RECIPIENT_DROPDOWN, SEND_BUTTON, CANCEL_SMS, LANGUAGE_TEXT, ACTIVATE_BTN, activate_link,\
    ACTIVE_POLL_NAME, POLL_INFORMATION_BOX, ON_OFF_SWITCH, POLL_STATUS_BY_ID
from pages.createquestionnairepage.create_questionnaire_locator import SEND_SMS_DIALOG, SUCCESS_MSG_SENDIND_SMS
from pages.globalnavigationpage.global_navigation_locator import PROJECT_LINK
from pages.page import Page
from tests.projects.questionnairetests.project_questionnaire_data import POLL, POLL_RECIPIENTS, MY_POLL_RECIPIENTS, DATA_ANALYSIS
from tests.testsettings import UI_TEST_TIMEOUT
import time

class PollQuestionnairePage(Page):
    def __init__(self, driver):
        Page.__init__(self, driver)

    def select_sms_option(self):
        self.driver.find_radio_button(POLL_VIA_SMS_RD_BUTTON).click()

    def select_broadcast_option(self):
        self.driver.find_radio_button(POLL_VIA_BROADCAST_RD_BUTTON).click()

    def enter_sms_text(self):
        self.driver.find_text_box(SMS_TEXTBOX).enter_text("what" + generateId() + "?")

    def select_receipient(self, recipient_type, receipient_name):
        self.select_recipient_type(POLL_SMS_DROPDOWN, recipient_type)
        self._configure_given_contacts(receipient_name)

    def select_recipient_type(self, dropdown, recipient_type):
        self.driver.find_drop_down(dropdown).set_selected(recipient_type)

    def click_create_poll(self, debug=False, page=""):
        self.driver.wait_for_element(UI_TEST_TIMEOUT, CREATE_POLL_BUTTON, True)
        if debug:
            self.driver.create_screenshot("debug-ft-create-poll-page-line-39")

        self.driver.find(CREATE_POLL_BUTTON).click()
        self.driver.wait_until_modal_dismissed()
        if debug:
            self.driver.create_screenshot("debug-ft-poll-created-successfully-after-click-" + page)
        time.sleep(2)
        if debug:
            self.driver.create_screenshot("debug-ft-poll-created-successfully-after-wait2-" + page)
        self.driver.wait_for_page_with_title(UI_TEST_TIMEOUT, "Data Analysis", True)

        if debug:
            self.driver.create_screenshot("debug-ft-poll-created-successfully-redirected-to-analysis-" + page)

    def is_poll_created(self, poll_title):
        self.driver.wait_for_element(UI_TEST_TIMEOUT, POLL_TITLE, True)
        self.driver.wait_for_element(UI_TEST_TIMEOUT, DATA_SENDER_TAB, True)
        return (self.driver.find(POLL_TITLE).text == poll_title) & self.are_all_tabs_loaded()

    def are_all_tabs_loaded(self):
        data_tab = self.driver.find(DATA_TAB_BTN).text == DATA_ANALYSIS
        data_senders_tab = self.driver.find(DATA_SENDER_TAB).text == POLL_RECIPIENTS
        poll_tab = self.driver.find(POLL_TAB).text == POLL
        return data_tab & data_senders_tab & poll_tab

    def does_poll_has_broacast_accordians(self, poll_title):
        data_tab = self.driver.find(DATA_TAB_BTN).text == DATA_ANALYSIS
        poll_tab = self.driver.find(POLL_TAB).text == POLL
        return (self.driver.find(POLL_TITLE).text == poll_title) & data_tab & poll_tab

    def is_poll_status_accordian_present(self):
        self.driver.wait_for_element(UI_TEST_TIMEOUT, POLL_STATUS_INFO, True)
        self.driver.find(POLL_STATUS_INFO).click()
        self.driver.wait_for_element(UI_TEST_TIMEOUT, POLL_STATUS_BY_ID, True)
        return self.driver.find(POLL_STATUS_BY_ID).text != ''

    def is_automatic_reply_sms_option_present(self):
        self.select_element(AUTOMATIC_REPLY_ACCORDIAN)
        self.driver.wait_for_element(UI_TEST_TIMEOUT, LANGUAGE_TEXT, True)
        return self.driver.find(LANGUAGE_TEXT).text == AUTOMATIC_REPLY_SMS_TEXT

    def is_sent_poll_sms_table(self):
        self.select_element(POLL_SMS_ACCORDIAN)
        self.driver.wait_for_element(UI_TEST_TIMEOUT, POLL_SMS_TABLE, True)
        return self.driver.find(POLL_SMS_TABLE) is not None

    def change_automatic_reply_sms_language(self, language):
        try:
            self.select_element(POLL_TAB)
            self.select_element(AUTOMATIC_REPLY_ACCORDIAN)
            self.driver.wait_for_element(UI_TEST_TIMEOUT, ON_SWITCH, True)
            self.driver.find_drop_down(PROJECT_LANGUAGE).set_selected(language)
            self.driver.find_text_box(SAVE_LANG_BTN).click()
            return True
        except:
            return False

    def get_automatic_reply_status(self):
        self.driver.wait_for_element(UI_TEST_TIMEOUT, AUTOMATIC_REPLY_ACCORDIAN, True)
        automatic_reply_status = self.driver.find(AUTOMATIC_REPLY_ACCORDIAN).text
        reply_status_list = automatic_reply_status.split()
        status = reply_status_list[len(reply_status_list) - 1]
        return status

    def is_reply_sms_language_updated(self):
        self.driver.wait_for_element(UI_TEST_TIMEOUT * 2, SUCCESS_MSG_BOX, True)
        return self.driver.find(SUCCESS_MSG_BOX) is not None

    def change_autoamtic_reply_sms_status(self):
        self.select_element(POLL_TAB)
        self.select_element(AUTOMATIC_REPLY_ACCORDIAN)
        self.driver.wait_for_element(UI_TEST_TIMEOUT, ON_OFF_SWITCH)
        self.select_element(ON_OFF_SWITCH)
        self.select_element(SAVE_LANG_BTN)

    def are_all_three_accordians_present(self):
        try:
            self.driver.find(POLL_TAB).click()
            time.sleep(2)
            poll_info = self.is_poll_status_accordian_present()
            automatic_reply_sms = self.is_automatic_reply_sms_option_present()
            poll_sent_sms = self.is_sent_poll_sms_table()
            return poll_info & automatic_reply_sms & poll_sent_sms
        except:
            self.driver.create_screenshot("debug-ft-some-of-3-accordians-not-found")
            return False

    def are_broadcast_poll_accordians_present(self):
        self.select_element(POLL_TAB)
        poll_info = self.is_poll_status_accordian_present()
        automatic_reply_sms = self.is_automatic_reply_sms_option_present()
        return poll_info & automatic_reply_sms

    def is_send_sms_to_more_people_visible(self):
        try:
            return self.driver.find(SEND_SMS_LINK).text == "Send SMS to More People"
        except:
            return False

    def has_DS_received_sms(self, recipent, row, column, debug=False):
        try:
            sms_table_element = self.driver.find(by_id("poll_sms_table"))
        except Exception as e:
            sms_table_element = None

        if not sms_table_element or not sms_table_element.is_displayed():
            self.select_element(POLL_TAB)
            time.sleep(3)
            self.select_element(POLL_SMS_ACCORDIAN)
            self.driver.wait_for_element(UI_TEST_TIMEOUT, by_css("#poll_sms_table"), True)
            self.driver.wait_until_modal_dismissed()

        try:
            elements = self.driver.find_elements_by_css_selector(
                '#poll_sms_table>tbody>tr:nth-of-type(%s)>td:nth-of-type(%s)>span.small_grey' % (row, column))
            recipient_name = [element.text for element in elements]


            for rep_id in recipent:
                if rep_id not in recipient_name:
                    if debug:
                        self.driver.create_screenshot("debug-ft-ds-didn-receive-poll-sms")
                        raise Exception("%s not in [%s]" % (rep_id, ", ".join(recipient_name)))
                    return False
            return True
            
        except Exception as e:
            self.driver.create_screenshot("debug-ft-has-ds-received-sms-element-not-found")
            raise e


    def deactivate_poll(self):
        self.select_element(POLL_TAB)
        self.select_element(poll_info_accordian)
        self.driver.find(deactivate_link).click()
        self.driver.wait_for_element(UI_TEST_TIMEOUT, DEACTIVATE_BTN, True)
        self.driver.find_text_box(DEACTIVATE_BTN).click()

    def activate_poll(self):
        self.select_element(POLL_TAB)
        self.select_element(poll_info_accordian)
        self.driver.find(activate_link).click()
        self.driver.wait_for_element(UI_TEST_TIMEOUT, ACTIVATE_BTN, True)
        time.sleep(1)
        self.driver.find(ACTIVATE_BTN).click()

    def select_send_sms(self, debug=False):
        self.select_element(POLL_TAB)
        time.sleep(3)
        self.click_send_sms_link(debug)

    def click_send_sms_link(self, debug=False):
        self.select_element(SEND_SMS_LINK)
        try:
            self.driver.wait_for_element(UI_TEST_TIMEOUT, SEND_SMS_DIALOG, True)
        except Exception as e:
            if debug:
                self.driver.create_screenshot("debug-ft-click-send-sms-not-found")
            raise e

    def send_sms_to(self, recipient_type, recipient_name, debug=False):
        self.select_recipient_type(RECIPIENT_DROPDOWN, recipient_type)
        time.sleep(2)
        self._configure_given_contacts(recipient_name)
        self.select_element(SEND_BUTTON)
        self.driver.wait_for_element(UI_TEST_TIMEOUT, SUCCESS_MSG_SENDIND_SMS)
        if debug:
            self.driver.create_screenshot("debug-ft-poll-page-line-191")
        self.select_element(CANCEL_SMS)
        self.driver.wait_for_page_load()
        if debug:
            self.driver.create_screenshot("debug-ft-poll_page-line-195")

    def send_sms_to_my_poll_recipients(self):
        self.select_recipient_type(RECIPIENT_DROPDOWN, MY_POLL_RECIPIENTS)

    def get_poll_status(self):
        return self.driver.find(by_id("poll_status")).text

    def get_already_active_poll_name(self):
        return self.driver.find(ACTIVE_POLL_NAME).text

    def is_another_poll_active(self, poll_title):
        self.driver.wait_for_element(UI_TEST_TIMEOUT, ACTIVE_POLL_NAME, True)
        return (self.driver.find(POLL_INFORMATION_BOX) is not None) & (
            self.driver.find(ACTIVE_POLL_NAME).text == poll_title)

    def _configure_given_contacts(self, recipient_name):
        """
        Function to select Group option To whom to send
        return self
        """
        self.driver.wait_for_element(UI_TEST_TIMEOUT,
                                     by_xpath("//input[@type='checkbox' and @value='%s']" % recipient_name),
                                     True)
        self.driver.find(by_xpath("//input[@type='checkbox' and @value='%s']" % recipient_name)).click()
        return self

    def select_element(self, element):
        try:
            time.sleep(5)
            self.driver.wait_for_element(UI_TEST_TIMEOUT * 2, element, True)
            self.driver.find(element).click()
            time.sleep(5)
        except Exception as e:
            self.driver.create_screenshot("debug-ft-select-element-failed")
            raise e

    def get_cell_value(self, column, row):
        cell = by_xpath(".//*[@id='datasender_table']/tbody/tr[%s]/td[%s]" % (row + 1, column + 1))
        self.driver.wait_for_element(UI_TEST_TIMEOUT, cell, True)
        return self.driver.find(cell).text

    def isRecipientAssociated(self, ds_name, row, column):
        return ds_name == self.get_cell_value(column, row)

    def delete_the_poll(self):
        self.select_element(by_css('.delete_project'))
        self.select_element(by_css('div.ui-dialog #confirm_delete_poll'))
        self.driver.wait_for_page_with_title(UI_TEST_TIMEOUT, "Questionnaires & Polls")

    def all_recipients(self, column):
        div = by_xpath(".//*[@id='datasender_table_wrapper']/div[8]")
        div_text = self.driver.find(div).text
        number_of_data_senders = int((div_text.split(' '))[2])
        poll_recipients = []
        for i in range(1, number_of_data_senders + 1):
            poll_recipients.append(self.get_cell_value(column, i))
        return poll_recipients