import datetime import logging import allure from selenium.webdriver import ActionChains from ui_automation_framework.core import BasePage, TestStatus from ui_automation_framework.utils import AppConfig 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.comparison_page import TrackComparisonPage from app.src.pages.track_page import TrackPage class AudienceGraphChart(BasePage): log = cl.Logger(logging.DEBUG) def __init__(self, driver): super().__init__(driver) self.driver = driver self.audience_graph = self.get_page_locators("AudienceGraphChart", "audience_graph.json") self.comparison_page = TrackComparisonPage(self.driver) self.trackPage = TrackPage(self.driver) self.api_client = ApiClient() self.sql_client = MySqlClient() self.ts = TestStatus(self.driver) @allure.step("Audience Graph - verify elements") def verify_elements(self, tracks_count): self.comparison_page.open_stream_details() self.scroll_to_element(*self.locator(self.audience_graph, "chart")) self.wait_for_element_visible(*self.locator(self.audience_graph, "title")) title = self.get_text(*self.locator(self.audience_graph, "title")) self.wait_for_element_visible(*self.locator(self.audience_graph, "dsp")) dsp = self.get_text(*self.locator(self.audience_graph, "dsp")) self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_bars")) bar_charts = self.get_elements(*self.locator(self.audience_graph, "chart_bars")) self.wait_for_element_visible(*self.locator(self.audience_graph, "legend_male")) legend_male = self.get_text(*self.locator(self.audience_graph, "legend_male")) legend_female = self.get_text(*self.locator(self.audience_graph, "legend_female")) note_1_el = self.wait_for_element_visible(*self.locator(self.audience_graph, "note_1")) note_1_displayed = self.is_element_displayed(element=note_1_el) self.wait_for_element_visible(*self.locator(self.audience_graph, "note_2_spotify")) note_2_spotify = self.is_element_displayed(*self.locator(self.audience_graph, "note_2_spotify")) self.change_dsp(AppConfig.get("dsp")["apple"]) self.wait_for_element_visible(*self.locator(self.audience_graph, "note_2_apple")) note_2_apple = self.is_element_displayed(*self.locator(self.audience_graph, "note_2_apple")) self.change_dsp(AppConfig.get("dsp")["spotify"]) self.ts.markFinal(title == "By Audience Demographics", "title is correct: {}".format(title)) self.ts.markFinal(dsp == AppConfig.get("dsp")["spotify"], "dsp is correct: {}".format(dsp)) self.ts.markFinal(len(bar_charts) == (tracks_count * 14), "bar charts count is: {}".format(len(bar_charts))) self.ts.markFinal(legend_male == "Male", "male is in legend") self.ts.markFinal(legend_female == "Female", "female is in legend") self.ts.markFinal(note_1_displayed, "note 1 is displayed") self.ts.markFinal(note_2_spotify, "note for spotify is displayed") self.ts.markFinal(note_2_apple, "note for apple is displayed") @allure.step("Audience Graph - change dsp") def change_dsp(self, dsp): self.comparison_page.audience_select_dsp_from_dd(dsp) @allure.step("Audience Graph - verify dsp options") def verify_dsp_options(self): self.scroll_to_element(*self.locator(self.audience_graph, "dsp")) e = self.get_elements(*self.locator(self.audience_graph, "dsp_options")) self.ts.markFinal(len(e) == 2, "dsp options are: {}".format(len(e))) @allure.step("Audience Graph - verify age groups") def verify_age_groups(self, dsp): self.change_dsp(dsp) self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_labels")) groups = self.get_elements(*self.locator(self.audience_graph, "chart_labels")) groups = [self.get_text(element=g) for g in groups] groups_expected = [] if dsp == AppConfig.get("dsp")["spotify"]: groups_expected = [ "Female\n0–17", "Male\n0–17", "Female\n18–22", "Male\n18–22", "Female\n23–27", "Male\n23–27", "Female\n28–34", "Male\n28–34", "Female\n35–44", "Male\n35–44", "Female\n45–59", "Male\n45–59", "Female\n60+", "Male\n60+", ] elif dsp == AppConfig.get("dsp")["apple"]: groups_expected = [ "Female\n0–17", "Male\n0–17", "Female\n18–24", "Male\n18–24", "Female\n25–34", "Male\n25–34", "Female\n35–44", "Male\n35–44", "Female\n45–54", "Male\n45–54", "Female\n55–64", "Male\n55–64", "Female\n65+", "Male\n65+", ] self.ts.markFinal(groups == groups_expected, "age groups are correctfor dsp: {}, : {}".format(dsp, groups)) @allure.step("Audience Graph - get spotify demographics delphi") def get_demographics_delphi_api(self, market, isrc, start_date, period, token, dsp): if dsp == AppConfig.get("dsp")["spotify"]: response = self.api_client.get_demographics_delphi(market=market, isrc=isrc, start_date=start_date, period=period, token=token, dsp="spotify")[0]["age_bands"] demographics_api = [ "female_0_17", "male_0_17", "female_18_22", "male_18_22", "female_23_27", "male_23_27", "female_28_34", "male_28_34", "female_35_44", "male_35_44", "female_45_59", "male_45_59", "female_60_150", "male_60_150", ] groups = [int(response[d]) for d in demographics_api] elif dsp == AppConfig.get("dsp")["apple"]: response = self.api_client.get_demographics_delphi(market=market, isrc=isrc, start_date=start_date, period=period, token=token, dsp="apple")[0]["age_bands"] demographics_api = [ "female_18_24", "male_18_24", "female_25_34", "male_25_34", "female_35_44", "male_35_44", "female_45_54", "male_45_54", "female_55_64", "male_55_64", "female_65_plus", "male_65_plus", ] groups = [int(response[d]) for d in demographics_api] groups = [0, 0] + groups return groups @allure.step("Audience Graph - get demographics tooltips") def get_demographics_tooltip_values(self, param="int"): locator_tooltip = "//*[contains(@id, 'tooltip')]" if param == "int": locator_tooltip = "//*[contains(@id, 'tooltip-value')]" self.wait_for_element_visible("comparison-tool-engagement-spotify-chart") self.scroll_to_element(*self.locator(self.audience_graph, "chart_title")) self.click_element(*self.locator(self.audience_graph, "chart_title")) self.page_has_loaded() self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_bars")) elements = self.get_elements(*self.locator(self.audience_graph, "chart_bars")) values = [] for e in elements: self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_bars")) e = self.get_elements(*self.locator(self.audience_graph, "chart_bars"))[elements.index(e)] ActionChains(self.driver).move_to_element(to_element=e).perform() tool = self.get_element(locator=locator_tooltip, locator_type="xpath") text = self.get_text(element=tool) self.log.info("tooltip text: {}".format(text)) value = text if param == "int": value = int(str(text).replace(",", "")) values.append(value) return values @allure.step("Audience Graph - get old demographics") def get_demographics_old(self, market, isrc, start_date, period, token, dsp): groups = [] if dsp == AppConfig.get("dsp")["spotify"]: demographics_db_columns = [ "GenderFemaleAge_0_17", "GenderMaleAge_0_17", "GenderFemaleAge_18_22", "GenderMaleAge_18_22", "GenderFemaleAge_23_27", "GenderMaleAge_23_27", "GenderFemaleAge_28_34", "GenderMaleAge_28_34", "GenderFemaleAge_35_44", "GenderMaleAge_35_44", "GenderFemaleAge_45_59", "GenderMaleAge_45_59", "GenderFemaleAge_60_150", "GenderMaleAge_60_150", ] for c in demographics_db_columns: value = self.sql_client.get_spotify_demographics_old(market=market, isrc=isrc, start_date=start_date, period=period, column=c) groups.append(int(str(value).replace(",", ""))) return groups @allure.step("Audience Graph - verify coloring") def verify_coloring(self, param): self.scroll_to_element(*self.locator(self.audience_graph, "chart_title")) self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_bars")) elements = self.get_elements(*self.locator(self.audience_graph, "chart_bars")) header_colors = self.comparison_page.get_sticky_header_colors() by_audience_colors = [] for e in elements: self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_bars")) e = self.get_elements(*self.locator(self.audience_graph, "chart_bars"))[elements.index(e)] by_audience_colors.append(e.get_attribute("fill")) by_audience_colors = list(set(by_audience_colors)) self.ts.markFinal( all(c in by_audience_colors for c in header_colors), "colors in by audience graph are correct: header: {}, graph: {}".format(header_colors, by_audience_colors), ) self.ts.markFinal( len(by_audience_colors) == param * 2, "count of colors in audience graph is: {}".format(len(by_audience_colors)), ) @allure.step("Audience Graph - get tooltips parsed") def get_demographics_tooltip_values_parsed(self): self.wait_for_element_visible("comparison-tool-engagement-spotify-chart") self.scroll_to_element(*self.locator(self.audience_graph, "chart_title")) self.click_element(*self.locator(self.audience_graph, "chart_title")) self.page_has_loaded() self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_bars_all")) elements = self.get_elements(*self.locator(self.audience_graph, "chart_bars_all")) values = [] for e in elements: self.wait_for_element_visible(*self.locator(self.audience_graph, "chart_bars_all")) e = self.get_elements(*self.locator(self.audience_graph, "chart_bars_all"))[elements.index(e)] ActionChains(self.driver).move_to_element(to_element=e).perform() self.page_has_loaded() self.wait_for_element_visible("//*[contains(@id, 'tooltip-date')]", locator_type="xpath") track_names_loc = self.get_elements("//*[contains(@id, 'tooltip-name')]", locator_type="xpath") track_dates_loc = self.get_elements("//*[contains(@id, 'tooltip-date')]", locator_type="xpath") track_streams_loc = self.get_elements("//*[contains(@id, 'tooltip-value')]", locator_type="xpath") track_names = [self.get_text(element=e) for e in track_names_loc] track_dates = [self.get_text(element=e) for e in track_dates_loc] track_streams = [int(str(self.get_text(element=e)).replace(",", "").replace("None", "0")) for e in track_streams_loc] self.log.info("tooltip tracks: {}".format(track_names)) self.log.info("tooltip dates: {}".format(track_dates)) self.log.info("tooltip streams: {}".format(track_streams)) val = {"names": track_names, "dates": track_dates, "streams": track_streams} values.append(val) return values @allure.step("Audience Graph - verify chart height") def verify_chart_height(self, chart_index, height): self.scroll_to_element(*self.locator(self.audience_graph, "chart_title")) elements = self.get_elements(*self.locator(self.audience_graph, "chart_bars_all")) heights = [int(e.get_attribute("height")) for e in elements] self.ts.markFinal(heights[chart_index] == height, "height of chart with index: {} is: {}".format(chart_index, height)) @allure.step("Audience Graph - verify dsp") def verify_dsp(self, param): self.scroll_to_element("comparison-tool-{}-dsp-dd".format("audience"), "id") self.wait_for_element_visible("comparison-tool-{}-dsp-dd".format("audience"), "id") current_dsp = self.get_text("comparison-tool-{}-dsp-dd".format("audience"), "id") self.ts.markFinal(current_dsp == param, "current dsp is: {}".format(current_dsp)) @allure.step("Audience Graph - verify no data placeholder is displayed") def no_data_placeholder_is_displayed(self): self.page_has_loaded() self.scroll_to_element(*self.locator(self.audience_graph, "title")) no_data = self.wait_for_element_visible(*self.locator(self.audience_graph, "no_data")) self.ts.markFinal(self.is_element_displayed(element=no_data), "no data is displayed") @allure.step("Audience Graph - verify tooltips dates") def verify_tooltip_dates(self, tracks, period): tooltips = [self.get_demographics_tooltip_values_parsed()[0]] dates_expected = [] for t in tracks: end_date = (datetime.datetime.strptime(t.dates.first_date, "%Y-%m-%d") + datetime.timedelta(days=period)).date() last_stream_date = self.api_client.get_first_last_date_for_isrc(isrc=t.isrc)["last_stream_date"]["spotify"] self.log.info("end date: {}, last date: {}".format(end_date, last_stream_date)) if end_date > datetime.datetime.strptime(last_stream_date, "%Y-%m-%d").date(): end_date = datetime.datetime.strptime(last_stream_date, "%Y-%m-%d").date() dates = "{}–{}".format( datetime.datetime.strptime(t.dates.f_date, "%Y-%m-%d").strftime(self.trackPage.get_date_format_from_locale()), datetime.datetime.strptime(str(end_date), "%Y-%m-%d").strftime(self.trackPage.get_date_format_from_locale()), ) dates_expected.append(dates) for tooltip in tooltips: self.ts.markFinal( tooltip["dates"] == dates_expected, "track dates are: {}, expected: {}".format(tooltip["dates"], dates_expected), )