import logging import time 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 AppConfig, CoreConfig from ui_automation_framework.utils import logger as cl from app.api_client import ApiClient from app.mysql_db_client_custom import MySqlClient from app.src.pages.track_page import TrackPage class GTPHotHitsModal(BasePage): log = cl.Logger(logging.DEBUG) CURRENT_TAB = "current" PREVIOUS_TAB = "previous" NOT_FEATURED_TAB = "not-featured" CURRENT_TAB_NAME = "CURRENT" PREVIOUS_TAB_NAME = "PREVIOUS" NOT_FEATURED_TAB_NAME = "NOT FEATURED" OVERVIEW_VIEW = "overview-scope-bar" DETAILS_VIEW = "details-scope-bar" country_sel = "//*[contains(@id, 'country-name')][string-length(text()) > 0]" tooltip_sel = "// *[contains( @ id, 'hot-hits') and contains( @ id, 'tooltip')]" def __init__(self, driver): super().__init__(driver) self.driver = driver self.hhm_locators = self.get_page_locators("GTPHotHitsModal", "gtp_hot_hits_modal_elements.json") self.tp = TrackPage(self.driver) self.sql_client = MySqlClient() self.api_client = ApiClient() self.ts = TestStatus(self.driver) @allure.step("Verify GTP Hot Hits modal opened") def is_modal_opened(self): title = self.wait_for_element_visible(*self.locator(self.hhm_locators, "title")) title = self.is_element_displayed(element=title) self.ts.markFinal(title, "Hot hits modal is opened") @allure.step("Hot Hits modal - verify tabs") def verify_tabs(self, tab_active=CURRENT_TAB): tabs = [] for t in self.CURRENT_TAB, self.PREVIOUS_TAB, self.NOT_FEATURED_TAB: tab_el = self.wait_for_element_visible(f"gtp-hot-hits-modal-window-{t}-tab") tabs.append(self.get_text(element=tab_el).split(" (")[0]) if t == tab_active: assert_that(self.get_attribute_value(element=tab_el, attribute="data-selected")).is_equal_to("selected") assert_that(["CURRENT", "PREVIOUS", "NOT FEATURED"]).is_equal_to(tabs) @allure.step("Hot Hits modal - select tab") def select_tab(self, tab): tab_el = self.wait_for_element_clickable(f"gtp-hot-hits-modal-window-{tab}-tab") self.click_element(element=tab_el) assert_that(self.get_attribute_value(element=tab_el, attribute="data-selected")).is_equal_to("selected") return int(self.get_text(element=tab_el).split("(")[1].split(")")[0]) @allure.step("Hot Hits modal - get displayed countries") def get_tab_content(self): flag_sel = "//*[contains(@id, 'country-flag')]" dates_added_sel = "//*[contains(@id, 'added-date')][string-length(text()) > 0]" self.wait_for_element_visible(self.country_sel, "xpath") countries_el = self.get_elements(self.country_sel, "xpath") self.click_element(element=countries_el[0]) countries = [self.get_text(element=c) for c in countries_el] flag_el = self.get_elements(flag_sel, "xpath") flags = [c.get_attribute("src").split("/")[-1].split(".")[0].replace("_unknown", "gulf") for c in flag_el] dates = [] tab_el = self.wait_for_element_clickable(f"gtp-hot-hits-modal-window-{self.NOT_FEATURED_TAB}-tab") if self.get_attribute_value(element=tab_el, attribute="data-selected") != "selected": dates_el = self.get_elements(dates_added_sel, "xpath") dates = [(datetime.strptime(self.get_text(element=d).split(" ")[1], self.tp.get_date_format_from_locale())).date() for d in dates_el] data = {"countries": countries, "flags": flags, "dates": dates} self.hover_on_element("gtp-hot-hits-modal-window-close-icon") self.log.info(f"hh data: {data}") return data @allure.step("Hot Hits modal - get track id") def get_track_id(self): track_name_sel = "//*[contains(@id, 'track-name-link')][string-length(text()) > 0]" track_el = self.wait_for_element_visible(track_name_sel, "xpath") track_id = track_el.get_attribute("href").split("/")[-1] return track_id @allure.step("Hot Hits modal - get markets from db") def get_markets_from_db(self): id = self.get_track_id() isrc = self.api_client.get_isrc_by_spotify_id("_gl", id)["external_ids"]["isrc"] db_rows = self.sql_client.get_hot_hits_markets(isrc) self.log.info(f"db rows: {db_rows}") db_actual_markets = [] for market in db_rows: if market[0] != "ru": db_actual_markets.append(market) lates_date_db = self.sql_client.get_hot_hits_latest_date() lates_date_db = datetime.strptime(lates_date_db, "%Y-%m-%d").date() data = {self.CURRENT_TAB: {}, self.PREVIOUS_TAB: {}, self.NOT_FEATURED_TAB: []} for market, min_date, max_date in db_actual_markets: if min_date is None: data[self.NOT_FEATURED_TAB].append(market) elif max_date < lates_date_db: data[self.PREVIOUS_TAB].update({market: min_date}) else: data[self.CURRENT_TAB].update({market: min_date}) self.log.info(f"data db hot hits: {data}") return data @allure.step("Hot Hits modal - verify tooltip for item in table") def verify_tooltip(self, tab): self.wait_for_element_visible(self.country_sel, "xpath") countries_el = self.get_elements(self.country_sel, "xpath") if len(countries_el) > 0: self.hover_on_element(element=countries_el[0]) if tab == self.NOT_FEATURED_TAB: assert_that(self.is_element_displayed(self.tooltip_sel, "xpath")).is_false() else: tooltip_text = self.get_text(self.tooltip_sel, "xpath").replace("\n", "") if tab == self.CURRENT_TAB: assert_that(tooltip_text).ends_with(" days on Hot Hits") elif tab == self.PREVIOUS_TAB: assert_that(" days on Hot HitsRemoved" in tooltip_text).described_as(tooltip_text).is_true() @allure.step("Hot Hits modal - verify chart position column header") def verify_chart_position_column_header(self, chart_date): column_el = self.wait_for_element_visible("gtp-table-cell-position") column_text = self.get_text(element=column_el) chart_date = datetime.strptime(chart_date, "%Y-%m-%d").strftime(AppConfig.get("date_formats")["mm/dd/yy"]) expected_text = f"Chart,\n{chart_date}\nPosition #" assert_that(expected_text).is_equal_to(column_text) @allure.step("Hot Hits modal - verify streams column header") def verify_streams_column_header(self, streams_date): column_el = self.wait_for_element_visible("//*[@id='gtp-table-cell-streams'][contains(., '/')]", "xpath") column_text = self.get_text(element=column_el) chart_date = datetime.strptime(streams_date, "%Y-%m-%d").strftime(self.tp.get_date_format_from_locale()) expected_text = f"{chart_date}\nStreams" assert_that(expected_text).is_equal_to(column_text) @allure.step("Hot Hits modal - verify header") def verify_header(self): header_sel = "gtp-hot-hits-modal-window-title" header_el = self.wait_for_element_visible(header_sel) header_text = self.get_text(element=header_el) api_resp_dates = self.api_client.get_tracks_gtp() hh_date = api_resp_dates["hot_hits_date"] hh_date = str(datetime.strptime(hh_date, "%Y-%m-%d").strftime(self.tp.get_date_format_from_locale())) assert_that(f"Hot Hits, {hh_date}").is_equal_to(header_text) @allure.step("Hot Hits modal - verify track and artist names") def verify_track_and_artist_name(self): track_sel = "gtp-hot-hits-modal-window-track-name-link" artist_sel = "(//*[@id='gtp-hot-hits-modal-window-artist-name--link']//../a)[1]" track_el = self.wait_for_element_clickable(track_sel) artist_el = self.wait_for_element_clickable(artist_sel, "xpath") track_href = track_el.get_attribute("href") artist_href = artist_el.get_attribute("href") assert_that(track_href).starts_with(f"{CoreConfig.ENV_BASE_URL}/spotify/track/") assert_that(artist_href).starts_with(f"{CoreConfig.ENV_BASE_URL}/spotify/artist/") @allure.step("Hot Hits modal - filter tab content") def filter_by(self, param, clear=False): if clear: self.clear_filter_input() filter_sel = "gtp-hot-hits-modal-window-markets-filter-input" filter_el = self.wait_for_element_clickable(filter_sel) self.send_text(data=param, element=filter_el) time.sleep(1) @allure.step("Hot Hits modal - clear filter input") def clear_filter_input(self): filter_clear_sel = "gtp-hot-hits-modal-window-markets-filter-input-close-icon" filter_clear_el = self.wait_for_element_clickable(filter_clear_sel) self.click_element(element=filter_clear_el) @allure.step("Hot Hits modal - verify active tab") def verify_active_tab(self, tab): tab_el = self.wait_for_element_clickable(f"gtp-hot-hits-modal-window-{tab}-tab") assert_that(self.get_attribute_value(element=tab_el, attribute="data-selected")).is_equal_to("selected") @allure.step("Hot Hits modal - get displayed tabs") def get_displayed_tabs(self): tabs_el = self.get_elements("//*[contains(@id, 'tab') and contains(@id, 'modal')]", "xpath") tabs_ui = [self.get_text(element=t) for t in tabs_el] return tabs_ui @allure.step("Hot Hits modal - verify not results message") def verify_no_results(self): no_result_sel = "//*[text()='No results to show. Try another filter.']" message = self.is_element_displayed(no_result_sel, "xpath") assert_that(message).is_true() @allure.step("Hot Hits modal - close the pop-up window") def close_hot_hits_modal(self): close_button = self.get_element(*self.locator(self.hhm_locators, "close_icon")) self.click_element(element=close_button) @allure.step("Hot Hits modal - select view") def select_view(self, view): tab_el = self.wait_for_element_clickable(f"[object Object]-{view}") self.click_element(element=tab_el) assert_that(self.get_attribute_value(element=tab_el, attribute="data-selected")).is_equal_to("selected") return self.get_text(element=tab_el)