import logging import uuid from datetime import datetime import allure from assertpy import assert_that from ui_automation_framework.core import BasePage, TestStatus from ui_automation_framework.utils import CoreConfig from ui_automation_framework.utils import logger as cl from app.api_client import ApiClient from app.src.pages.login_page import LoginPage from app.src.pages.track_page import TrackPage class JunoPage(BasePage): log = cl.Logger(logging.DEBUG) view_id = "view_id" juno_views_dd = "juno-views-dd" juno_markets_dd = "juno-markets-dd" juno_manage_views_button = "juno-manage-views-button" juno_title = "juno-title" view_popup_crossmark = "1-close-icon" view_popup_input = "(//*[@id='1'])[1]" view_save_button = "undefined-button-confirm" saved_filters_overview_button = "//*[text()='Saved Filters Overview']" saved_filters_overview_title = "//*[@tag][text()='Saved Filters Overview']" saved_filters_overview_close_icon = "//*[contains(@class, 'icon-close')]" saved_filters_names = "//*[contains(@id, 'saved-filter-')]" default_filter_list = ["Full Catalog", "Exploitation", "Catalog", "Local Rep", "Frontline"] position_column = "position" track_column = "track" previous_7_days_streams_column = "prevWeekStreams" current_7_days_streams_column = "currentWeekStreams" current_7_days_streams_change_column = "change" def __init__(self, driver): super().__init__(driver) self.driver = driver self.ts = TestStatus(self.driver) self.tp = TrackPage(self.driver) self.loginPage = LoginPage(self.driver) self.api_client = ApiClient() @allure.step("Juno Page - open") def open(self, default_views=False): if default_views: self.set_default_views() url = f"{CoreConfig.ENV_BASE_URL}/juno" self.tp.open_url(url) self.log.info(f"url1: {self.get_url()}") self.is_opened() @allure.step("Juno Page - is opened") def is_opened(self): assert_that(self.is_element_displayed("juno-title")).is_true() @allure.step("Juno Page - select view") def select_view(self, param=1): self.wait_for_element_visible("juno-table-table-cell-position-1") if isinstance(param, int): view_id_by_index_loc = f"(//*[@id='{self.juno_views_dd}']/..//div[string-length(text()) > 0])[{param}]" else: view_id_by_index_loc = f"//*[@id='{self.juno_views_dd}']/..//*[text()='{param}']" self.click_views_dd() item_el = self.wait_for_element_clickable(view_id_by_index_loc, "xpath") self.click_element(element=item_el) @allure.step("Juno Page - get selected view name") def get_selected_view_name(self): loc = f"(//*[@id='{self.juno_views_dd}']/..//span[string-length(text()) > 0])[1]" text = self.get_text(loc, "xpath") return text @allure.step("Juno Page - set default views") def set_default_views(self): user = self.loginPage.get_user_email_with_worker() api_views = self.api_client.get_user_data_settings(user=user) filters_ids = api_views["data"]["juno_filters"]["filters"].keys() filters = [api_views["data"]["juno_filters"]["filters"][i]["name"] for i in filters_ids] default_filter_uuid = api_views["data"]["juno_filters"]["default"] if set(filters) != set(self.default_filter_list) or api_views["data"]["juno_filters"]["filters"][default_filter_uuid] != "Full Catalog": default_uuid = str(uuid.uuid1()) timestamp_now = f"""{str(datetime.utcnow()).replace(" ", "T")[:-3]}Z""" payload = { "data": { "juno_filters": { "default": default_uuid, "filters": { str(uuid.uuid1()): { "name": "Exploitation", "type": 5, "changed_at": timestamp_now, "created_at": timestamp_now, "country_code": [ "af", "al", "dz", "ad", "ao", "ai", "ag", "ar", "am", "au", "at", "az", "bs", "bh", "bd", "bb", "by", "be", "bz", "bj", "bm", "bt", "bo", "ba", "bw", "br", "vg", "bn", "bg", "bf", "bi", "kh", "cm", "ca", "cv", "ky", "td", "cl", "cn", "co", "km", "cg", "cr", "hr", "cw", "cy", "cz", "ci", "cd", "dk", "dj", "dm", "do", "ec", "eg", "sv", "gq", "ee", "fj", "fi", "fr", "ga", "gm", "ge", "de", "gh", "gr", "gd", "gt", "gn", "gw", "gy", "ht", "hn", "hk", "hu", "is", "in", "id", "iq", "ie", "il", "it", "jm", "jp", "jo", "kz", "ke", "ki", "xk", "kw", "kg", "la", "lv", "lb", "ls", "lr", "li", "lt", "lu", "mo", "mg", "mw", "my", "mv", "ml", "mt", "mh", "mr", "mu", "mx", "fm", "md", "mc", "mn", "me", "ma", "mz", "mm", "na", "nr", "np", "nl", "nz", "ni", "ne", "ng", "mk", "no", "om", "pk", "pw", "ps", "pa", "pg", "py", "pe", "ph", "pl", "pt", "qa", "ro", "ru", "rw", "kn", "lc", "vc", "ws", "sm", "st", "sa", "sn", "rs", "sc", "sl", "sg", "sk", "si", "sb", "za", "kr", "es", "lk", "sd", "sr", "sz", "se", "ch", "sy", "tw", "tj", "tz", "th", "tl", "tg", "to", "tt", "tn", "tr", "tm", "tc", "tv", "ug", "ua", "ae", "gb", "uy", "uz", "vu", "ve", "vn", "ye", "zm", "zw", ], "is_immutable": True, "is_subscribed": False, "percent_change": 10, "isrc_country_code": ["us"], }, str(uuid.uuid1()): {"name": "Catalog", "type": 3, "changed_at": timestamp_now, "created_at": timestamp_now, "country_code": ["worldwide"], "is_immutable": True, "is_subscribed": False, "percent_change": 10, "max_product_sale_days": 1095}, default_uuid: {"name": "Full Catalog", "type": 1, "changed_at": timestamp_now, "created_at": timestamp_now, "country_code": ["worldwide"], "is_immutable": True, "is_subscribed": True, "percent_change": 10}, str(uuid.uuid1()): {"name": "Local Rep", "type": 4, "changed_at": timestamp_now, "created_at": timestamp_now, "country_code": ["worldwide"], "is_immutable": True, "is_subscribed": False, "percent_change": 10}, str(uuid.uuid1()): {"name": "Frontline", "type": 2, "changed_at": timestamp_now, "created_at": timestamp_now, "country_code": ["worldwide"], "is_immutable": True, "is_subscribed": False, "percent_change": 10, "min_product_sale_days": 1095}, }, } } } self.api_client.put_user_data_settings(user=user, payload=payload) @allure.step("Juno Page - verify filters") def verify_filters(self, values=""): slider_loc = "//*[@role='slider']" streams_market_loc = "juno-markets-dd" isrc_market_loc = "juno-isrc-markets-dd" slider_els = [self.get_text(element=s) for s in self.get_elements(slider_loc, "xpath")] streams_market = self.get_text(streams_market_loc) isrc_market = self.get_text(isrc_market_loc) assert_that(slider_els).is_equal_to(values[:3]) assert_that(streams_market).is_equal_to(values[3]) assert_that(isrc_market).is_equal_to(values[4]) @allure.step("Juno Page - click expand collapse button") def click_expand_collapse_button(self): button_loc = "//button//../*[contains(@class, 'collapse') or contains(@class, 'expand')]" self.click_element(button_loc, "xpath") @allure.step("Juno Page - click views dd") def click_views_dd(self): el = self.wait_for_element_clickable(self.juno_views_dd) self.click_element(element=el) @allure.step("Juno Page - get views list") def get_views_list(self): loc = "//*[@id='juno-views-dd']/*[contains(@style, 'box-shadow')]//../*[string-length(text()) > 0]" list_filters = [self.get_text(element=f) for f in self.get_elements(loc, "xpath")[:-1]] return list_filters @allure.step("Juno Page - verify views dd hover") def verify_views_dd_hover(self): loc = f"//*[text()='{self.default_filter_list[3]}']" property_name = "background-color" color_before = self.get_element(loc, "xpath").value_of_css_property(property_name) self.hover_on_element(loc, "xpath") color_after = self.get_element(loc, "xpath").value_of_css_property(property_name) assert_that(color_before).is_not_equal_to(color_after) @allure.step("Juno Page - choose markets") def choose_markets(self, param): self.click_element(self.juno_markets_dd) for c in param: c_dd = self.get_element(f"{c} ") self.click_on_element_js(element=c_dd) self.click_element("//button[.='Apply']", "xpath") @allure.step("Juno Page - save new view") def save_new_view(self, param, saved=True): self.open_create_new_view() self.enter_view_name(param) self.click_element(self.view_save_button) if saved: assert_that(self.is_element_displayed("//*[text()='Filter successfully saved.']", "xpath")).is_true() @allure.step("Juno Page - open create new view popup") def open_create_new_view(self): self.wait_for_element_clickable(self.juno_manage_views_button) self.click_element(self.juno_manage_views_button) assert_that(self.is_element_displayed("//*[text()='Create name for filter.']", "xpath")).is_true() @allure.step("Juno Page - click on title") def click_on_title(self): self.click_element(self.juno_title) @allure.step("Juno Page - get table column values") def get_table_column_values(self, param): loc = f"//*[contains(@id, 'juno-table-table-cell-{param}-')]" self.wait_for_element_visible(loc, "xpath") values = [self.get_text(element=v) for v in self.get_elements(loc, "xpath")] if param in [self.position_column, self.previous_7_days_streams_column, self.current_7_days_streams_column]: values = [int(v.replace(",", "")) if len(v) > 0 else 0 for v in values] elif param == self.current_7_days_streams_change_column: values = [v.replace(",", "").replace("(", "").replace("%)", "") if len(v) > 0 else 0 for v in values] self.log.info(f"values for {param}: {values}") return values @allure.step("Juno Page - sort by column") def click_on_column(self, param): loc = f"juno-table-table-cell-{param}" self.wait_for_element_clickable(loc) self.click_element(loc) self.click_on_title() @allure.step("Juno Page - enter view name") def enter_view_name(self, param): self.send_text(data=param, locator=self.view_popup_input, locator_type="xpath") @allure.step("Juno Page - view popup crossmark is displayed") def view_crossmark_is_displayed(self): assert_that(self.is_element_displayed(self.view_popup_crossmark)).is_true() @allure.step("Juno Page - view popup crossmark click") def click_view_crossmark(self): self.click_element(self.view_popup_crossmark) @allure.step("Juno Page - get popup view name") def get_view_name_input_popup(self): el = self.get_element(self.view_popup_input, "xpath") text = self.get_attribute_value(element=el, attribute="value") return text @allure.step("Juno Page - view popup click cancel") def view_popup_click_cancel(self): loc = "undefined-button-cancel" self.click_element(loc) @allure.step("Juno Page - view popup verify save button") def verify_save_button(self): property = "background-color" item = self.get_element(self.view_save_button) color_grey = item.value_of_css_property(property) self.enter_view_name("123") color_before = item.value_of_css_property(property) assert_that(color_grey).is_not_equal_to(color_before) self.hover_on_element(self.view_save_button) color_after = item.value_of_css_property(property) assert_that(color_before).is_not_equal_to(color_after) self.click_view_crossmark() @allure.step("Juno Page - view popup click saved filters overview button") def click_saved_filters_overview(self): self.click_element(self.saved_filters_overview_button, "xpath") assert_that(self.is_element_displayed(self.saved_filters_overview_title, "xpath")).is_true() @allure.step("Juno Page - saved filters overview popup - get filters list") def get_saved_filters_list(self): list_ui = [self.get_text(element=v) for v in self.get_elements(self.saved_filters_names, "xpath")] return list_ui @allure.step("Juno Page - saved filters overview popup - close") def close_overview_filters_popup(self): self.click_element(self.saved_filters_overview_close_icon, "xpath") assert_that(self.is_element_displayed(self.juno_title)).is_true() @allure.step("Juno Page - view popup - filter name is duplicated message") def filter_name_is_duplicated(self): assert_that(self.is_element_displayed("//*[text()='A saved filter with this name already exists.']", "xpath")).is_true()