class Test_Login:
    baseURL = ReadConfig.getApplicationURL()
    username = ReadConfig.getUseremail()
    password = ReadConfig.getPassword()
    logger = LogGen.loggen()
    create_boardURL = ReadConfig.getvaluesfrom_json('page_urls',
                                                    'create_board')
    create_board_title = ReadConfig.getvaluesfrom_json('title', 'create_board')
    str_page_header = ReadConfig.getvaluesfrom_json('header', 'create_board')
    session_name = ReadConfig.getvaluesfrom_json('create-board_data',
                                                 'session_name')
    owner = ReadConfig.getvaluesfrom_json('create-board_data', 'owner')
    success_message = ReadConfig.getvaluesfrom_json('create-board_data',
                                                    'success_message')

    @pytest.mark.smoke
    @pytest.mark.ui
    def test_login_create_board(self, setup):
        try:
            self.logger.info("****Started Login Test****")
            self.driver = setup
            self.driver.maximize_window()
            self.driver.get(self.baseURL)
            self.lp = LoginPage(self.driver)
            self.bp = BoardPage(self.driver)
            assert self.lp.login(self.username, self.password)
            self.bp.go_to_create_board()
            self.ui_helper = UIHelper(self.driver)
            pstr_url = self.driver.current_url
            assert self.ui_helper.verify_url(self.create_boardURL, pstr_url)
            pstr_title = self.driver.title
            assert self.create_board_title, pstr_title
            assert self.bp.verify_page_header(self.str_page_header)
            bln_final_result = self.bp.create_board(self.session_name,
                                                    self.owner,
                                                    self.success_message)
            if bln_final_result:
                self.logger.info("*** Test 001 passed****")
                self.driver.close()
                assert True
            else:
                self.logger.error("****Test 001 failed****")
                self.driver.close()
                assert False
        except Exception as exception_msg:
            self.logger.info(exception_msg)
            self.driver.save_screenshot("." + os.sep + "Screenshots" + os.sep +
                                        "test_login_createBoard_exception.png")
            self.driver.close()
            assert False
class Test_UI_springboard:
    baseURL = ReadConfig.getApplicationURL()
    username = ReadConfig.getUseremail()
    password = ReadConfig.getPassword()
    logger = LogGen.loggen()
    login_url = ReadConfig.getvaluesfrom_json('page_urls', 'login_url')
    create_boardURL = ReadConfig.getvaluesfrom_json('page_urls',
                                                    'create_board')
    create_board_title = ReadConfig.getvaluesfrom_json('title', 'create_board')
    str_page_header = ReadConfig.getvaluesfrom_json('header', 'create_board')
    session_name = ReadConfig.getvaluesfrom_json('create-board_data',
                                                 'session_name')
    owner = ReadConfig.getvaluesfrom_json('create-board_data', 'owner')
    success_message = ReadConfig.getvaluesfrom_json('create-board_data',
                                                    'success_message')
    board_url = ReadConfig.getvaluesfrom_json('page_urls', 'board_page')
    card_type_went_well = ReadConfig.getvaluesfrom_json('card_type', 'green')
    card_type_not_went_well = ReadConfig.getvaluesfrom_json('card_type', 'red')
    card_modal_header = ReadConfig.getvaluesfrom_json('header',
                                                      'sprint_board_modal')
    well_add_card_title = ReadConfig.getvaluesfrom_json(
        'went_well_data', 'title')
    well_add_card_description = ReadConfig.getvaluesfrom_json(
        'went_well_data', 'description')
    well_card_activity = ReadConfig.getvaluesfrom_json('card_activity',
                                                       'went_well')
    well_like_count = ReadConfig.getvaluesfrom_json('card_activity',
                                                    'like_count')
    not_well_add_card_title = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'title')
    not_well_add_card_description = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'description')
    not_well_expected_desc = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'description_displayed')
    not_well_card_activity = ReadConfig.getvaluesfrom_json(
        'card_activity', 'not went well')
    not_well_delete_header = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'delete_header')
    not_well_delete_question = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'delete_question')

    @pytest.fixture()
    def launch_app(self, setup):
        self.driver = setup
        self.lp = LoginPage(self.driver)
        self.driver.maximize_window()
        self.driver.get(self.baseURL + self.login_url)
        # login to application and verify homepage
        assert self.lp.login(self.username, self.password)

    @pytest.mark.smoke
    @pytest.mark.ui
    def test_springboard(self, launch_app):
        self.bp = BoardPage(self.driver)
        self.cp = CreateCard(self.driver)
        self.ui_helper = UIHelper(self.driver)
        self.login_create_board()
        self.card_manipulation()

    def login_create_board(self):
        self.logger.info("****Started create board Test****")
        # go to create board link
        self.bp.go_to_create_board()
        pstr_url = self.driver.current_url
        # verify current url of create board
        assert self.ui_helper.verify_url(self.baseURL + self.create_boardURL,
                                         pstr_url)
        pstr_title = self.driver.title
        # verify title of create board page
        assert self.create_board_title, pstr_title
        # verify header of create board page
        assert self.bp.verify_page_header(self.str_page_header)
        # verify board creation with success message created
        bln_final_result = self.bp.create_board(self.session_name, self.owner,
                                                self.success_message)
        if bln_final_result:
            self.logger.info("*** Board created successfully****")
            self.logger.info("****Create board Test End****")
            assert True
        else:
            self.logger.error("****Board creation unsuccessful****")
            self.logger.info("****Create board Test End****")
            assert False

    def card_manipulation(self):
        self.logger.info("****Started Card manipulation Test****")
        self.cp.wait_board_page_to_load()
        pstr_url = self.driver.current_url
        #verify board url
        assert self.ui_helper.verify_url(self.baseURL + self.board_url,
                                         pstr_url)
        #click went well card card
        self.cp.clickCard(self.card_type_went_well)
        #verify modal header
        assert self.cp.verify_modal_header(self.card_modal_header)
        #create went well card
        self.cp.create_card(self.well_add_card_title,
                            self.well_add_card_description)
        #verify well card creation
        assert self.cp.verify_card(self.card_type_went_well,
                                   self.well_add_card_title,
                                   self.well_add_card_description)
        self.cp.wait_board_page_to_load()
        #click did'nt go well card
        self.cp.clickCard(self.card_type_not_went_well)
        #verify modal header
        assert self.cp.verify_modal_header(self.card_modal_header)
        #create didn't go well card
        self.cp.create_card(self.not_well_add_card_title,
                            self.not_well_add_card_description)
        #verify didn't go well card
        assert self.cp.verify_card(self.card_type_not_went_well,
                                   self.not_well_add_card_title,
                                   self.not_well_expected_desc)
        #like the went well card
        self.cp.click_activity(self.card_type_went_well,
                               self.well_card_activity)
        #verify like
        bln_like = self.cp.verify_activity(
            self.card_type_went_well,
            self.well_card_activity,
            pstr_like_count=self.well_like_count)
        #delete the didn't go well card
        self.cp.click_activity(self.card_type_not_went_well,
                               self.not_well_card_activity)
        #verify card delete modal
        assert self.cp.verify_delete_modal(self.not_well_delete_header,
                                           self.not_well_delete_question)
        #confirm card delete
        self.cp.delete_card()
        #verify didn't go well card is deleted
        bln_delete_card = self.cp.verify_delete_card(
            self.card_type_not_went_well)
        if bln_like and bln_delete_card:
            self.logger.info("***Card manipulation Successful****")
            self.logger.info("*** Card manipulation test ended****")
            assert True
        else:
            self.logger.error("****Card manipulation unsuccessful****")
            self.logger.info("*** Card manipulation test ended****")
            assert False
class Test_Login:
    baseURL = ReadConfig.getApplicationURL()
    username = ReadConfig.getUseremail()
    password = ReadConfig.getPassword()
    logger = LogGen.loggen()
    session_name = ReadConfig.getvaluesfrom_json('create-board_data',
                                                 'session_name')
    owner = ReadConfig.getvaluesfrom_json('create-board_data', 'owner')
    success_message = ReadConfig.getvaluesfrom_json('create-board_data',
                                                    'success_message')
    board_url = ReadConfig.getvaluesfrom_json('page_urls', 'board_page')
    card_type_went_well = ReadConfig.getvaluesfrom_json('card_type', 'green')
    card_type_not_went_well = ReadConfig.getvaluesfrom_json('card_type', 'red')
    card_modal_header = ReadConfig.getvaluesfrom_json('header',
                                                      'sprint_board_modal')
    well_add_card_title = ReadConfig.getvaluesfrom_json(
        'went_well_data', 'title')
    well_add_card_description = ReadConfig.getvaluesfrom_json(
        'went_well_data', 'description')
    well_card_activity = ReadConfig.getvaluesfrom_json('card_activity',
                                                       'went_well')
    well_like_count = ReadConfig.getvaluesfrom_json('card_activity',
                                                    'like_count')
    not_well_add_card_title = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'title')
    not_well_add_card_description = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'description')
    not_well_expected_desc = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'description_displayed')
    not_well_card_activity = ReadConfig.getvaluesfrom_json(
        'card_activity', 'not went well')
    not_well_delete_header = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'delete_header')
    not_well_delete_question = ReadConfig.getvaluesfrom_json(
        'not_went_well_data', 'delete_question')

    @pytest.mark.smoke
    @pytest.mark.ui
    def test_create_card_not_went_well(self, setup):
        try:
            self.logger.info("****Started Login Test****")
            self.driver = setup
            self.driver.maximize_window()
            self.driver.get(self.baseURL)
            self.lp = LoginPage(self.driver)
            self.bp = BoardPage(self.driver)
            assert self.lp.login(self.username, self.password)
            self.bp.go_to_create_board()
            bln_final_result = self.bp.create_board(self.session_name,
                                                    self.owner,
                                                    self.success_message)
            if bln_final_result:
                self.ui_helper = UIHelper(self.driver)
                self.cp = CreateCard(self.driver)
                self.cp.wait_board_page_to_load()
                pstr_url = self.driver.current_url
                assert self.ui_helper.verify_url(self.board_url, pstr_url)
                self.cp.clickCard(self.card_type_went_well)
                assert self.cp.verify_modal_header(self.card_modal_header)
                self.cp.create_card(self.well_add_card_title,
                                    self.well_add_card_description)
                assert self.cp.verify_card(self.card_type_went_well,
                                           self.well_add_card_title,
                                           self.well_add_card_description)
                self.cp.clickCard(self.card_type_not_went_well)
                assert self.cp.verify_modal_header(self.card_modal_header)
                self.cp.create_card(self.not_well_add_card_title,
                                    self.not_well_add_card_description)
                assert self.cp.verify_card(self.card_type_not_went_well,
                                           self.not_well_add_card_title,
                                           self.not_well_expected_desc)
                self.cp.click_activity(self.card_type_went_well,
                                       self.well_card_activity)
                bln_like = self.cp.verify_activity(
                    self.card_type_went_well,
                    self.well_card_activity,
                    pstr_like_count=self.well_like_count)
                self.cp.click_activity(self.card_type_not_went_well,
                                       self.not_well_card_activity)
                assert self.cp.verify_delete_modal(
                    self.not_well_delete_header, self.not_well_delete_question)
                self.cp.delete_card()
                bln_delete_card = self.cp.verify_delete_card(
                    self.card_type_not_went_well)
                if bln_like and bln_delete_card:
                    self.logger.info("***Test 003 passed****")
                    self.driver.close()
                    assert True
                else:
                    self.logger.error("****Test 003 failed ****")
                    self.driver.close()
                    assert False
        except Exception as exception_msg:
            self.logger.info(exception_msg)
            self.driver.save_screenshot(
                "." + os.sep + "Screenshots" + os.sep +
                "test_createCard_not_well_exception.png")
            self.driver.close()
            assert False
class JobPage:
    # Job Page
    logger = LogGen.loggen()
    explicit_wait = ReadConfig.getexplicitwait()
    job_locator = Joblocators()
    baseURL = ReadConfig.getApplicationURL()

    def __init__(self, driver):
        self.driver = driver
        self.ui_helper = UIHelper(self.driver)

    def verify_job_page(self, str_pageheader):
        """  Description:
                                |  This method will allow user to verify base page
                                :param str_pageheader: Page header
                                :type str_pageheader: String

                                :return: None

                                                        """
        pstr_page_header = self.job_locator.pstr_verify_home_page.format(
            str_pageheader)
        bln_page_header = self.ui_helper.is_element_displayed(pstr_page_header)
        if bln_page_header:
            self.logger.info("****User is on the Job page****")
            return True
        else:
            self.logger.info("****User is not on the Job page****")
            self.driver.save_screenshot("." + os.sep + "Screenshots" + os.sep +
                                        "test_login.png")
            self.driver.close()
            return False

    def verify_list_elements(self, pstr_naivigation_list, pstr_list_type):
        """  Description:
            |  This method will verify list_elements rendering on the page
        :param pstr_naivigation_list: list of elements to be verified
        :type pstr_naivigation_list: Dictionary
        :param pstr_list_type: type of list. E.g. Top Nav, sector list,etc.
        :type pstr_list_type: String

        :return: boolean

                                """
        bln_top = False
        pstr_actual_list = []
        if pstr_list_type == "sector_list":
            pstr_nav_list = pstr_naivigation_list.values()
            pstr_web_elem = self.driver.find_elements_by_xpath(
                self.job_locator.pstr_sector_list)
            bln_top = self.ui_helper.match_attributes_by_text(
                pstr_nav_list, pstr_web_elem)
        elif pstr_list_type == "top_nav":
            pstr_nav_list = pstr_naivigation_list.keys()
            pstr_web_elem = self.driver.find_elements_by_xpath(
                self.job_locator.pstr_nav_list)
            bln_top = self.ui_helper.match_attributes_by_text(
                pstr_nav_list, pstr_web_elem)
        elif pstr_list_type == "search_fields_list":
            pstr_search_placeholders = pstr_naivigation_list.values()
            pstr_web_ele_search = self.driver.find_elements_by_xpath(
                self.job_locator.pstr_search_list)
            if len(pstr_search_placeholders) == len(pstr_web_ele_search):
                for element in pstr_web_ele_search:
                    pstr_actual_list.append(
                        element.get_attribute("placeholder"))
                bln_top = ', '.join(map(
                    str, pstr_search_placeholders)) in ', '.join(
                        map(str, pstr_actual_list))
            else:
                self.logger.info(
                    "****Search box count mismatched. There may be few or more****"
                )
                self.driver.save_screenshot("." + os.sep + "Screenshots" +
                                            os.sep +
                                            "test_job_search_fields.png")
                self.driver.close()
                return False

        return bln_top

    def verify_top_links(self, pstr_nav_links, pstr_nav_headers):
        """  Description:
                    |  This method will verify links redirection along with pae headers
                :param pstr_nav_links: list of links to be verified on the page
                :type pstr_nav_links: Dictionary
                :param pstr_nav_headers: list of headers to be verified
                :type pstr_nav_headers: Dictionary

                :return: boolean

                                        """
        bln_verify_link = False
        bln_page_header = False
        for prop, value in pstr_nav_links.items():
            pstr_val = pstr_nav_headers[prop]
            pstr_link = self.job_locator.pstr_nav_links.format(prop)
            bln_pstr_link = self.ui_helper.is_element_displayed(pstr_link)
            if bln_pstr_link:
                self.ui_helper.click(pstr_link)
                pstr_page_header = self.job_locator.pstr_nav_head.format(
                    pstr_val)
                bln_page_header = self.ui_helper.is_element_displayed(
                    pstr_page_header)
                given_link = self.baseURL + value
                pstr_url = self.driver.current_url
                bln_verify_link = self.ui_helper.verify_url(
                    given_link, pstr_url)
            else:
                self.logger.info("**** Link not found. ****")
                self.driver.save_screenshot("." + os.sep + "Screenshots" +
                                            os.sep + "test_job_nav_link.png")
                self.driver.close()
                return False
        if bln_verify_link and bln_page_header:
            self.logger.info("**** Page headers verified ****")
            return True
        else:
            return False

    def click_sector(self, pstr_sector_type):
        """  Description:
                        |  This method will click on the sector type
                        :param pstr_sector_type: Name of type of sector
                        :type pstr_sector_type: String

                        :return: None

                                                """
        pstr_web_elem = self.driver.find_elements_by_xpath(
            self.job_locator.pstr_sector_list)
        for element in pstr_web_elem:
            if element.text == pstr_sector_type:
                element.click()
                self.logger.info(pstr_sector_type + "**** Clicked****")
                break

            else:
                self.logger.info(pstr_sector_type + "**** Not found****")