import datetime import json import unittest from argparse import Namespace import allure import pytest from ui_automation_framework.core import TestStatus from ui_automation_framework.utils import AppConfig, CoreConfig from app.api_client import ApiClient from app.mysql_db_client_custom import MySqlClient from ...pages.add_track_popup import AddTrackPopup from ...pages.audience_graph import AudienceGraphChart from ...pages.comparison_page import TrackComparisonPage from ...pages.left_navigation_panel import LeftNavigationPanel from ...pages.login_page import LoginPage from ...pages.track_page import TrackPage @pytest.mark.usefixtures("set_up", "one_time_set_up") class ComparisonPlaylistSupportTest(unittest.TestCase): track6 = json.loads(json.dumps(AppConfig.get("track6")), object_hook=lambda d: Namespace(**d)) track24 = json.loads(json.dumps(AppConfig.get("track24")), object_hook=lambda d: Namespace(**d)) track15 = json.loads(json.dumps(AppConfig.get("track15")), object_hook=lambda d: Namespace(**d)) track13 = json.loads(json.dumps(AppConfig.get("track13")), object_hook=lambda d: Namespace(**d)) track25 = json.loads(json.dumps(AppConfig.get("track25")), object_hook=lambda d: Namespace(**d)) track22 = json.loads(json.dumps(AppConfig.get("track22")), object_hook=lambda d: Namespace(**d)) track26 = json.loads(json.dumps(AppConfig.get("track26")), object_hook=lambda d: Namespace(**d)) source = json.loads(json.dumps(AppConfig.get("source")), object_hook=lambda d: Namespace(**d)) us = json.loads(json.dumps(AppConfig.get("market")["us"]), object_hook=lambda d: Namespace(**d)) global_m = json.loads(json.dumps(AppConfig.get("market")["global"]), object_hook=lambda d: Namespace(**d)) @pytest.fixture(autouse=True) def classSetup(self): self.loginPage = LoginPage(self.driver) self.trackPage = TrackPage(self.driver) self.add_track_popup = AddTrackPopup(self.driver) self.comparison_page = TrackComparisonPage(self.driver) self.left_panel = LeftNavigationPanel(self.driver) self.audience_graph = AudienceGraphChart(self.driver) self.api_client = ApiClient() self.sql_client = MySqlClient() self.ts = TestStatus(self.driver) @pytest.mark.flaky(reruns=3) @allure.story("AP-2706") @allure.severity(allure.severity_level.NORMAL) @allure.title("""'By DSP' section Data calculation - Table and Track page""") @allure.description( """TC Verifies correctness of data calculation in ‘By DSP’ section (both chart and table). - Table and Track page""" ) def test_by_dsp_data_calculation_table_and_track_page(self): tracks = [self.track6, self.track24, self.track15, self.track13, self.track25] self.comparison_page.remove_tracks_if_present_with_worker(self.us.market) user = self.loginPage.get_user_email_with_worker() token = self.api_client.authorize(user=user) for track in tracks: self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=track.isrc, id=track.id) self.loginPage.login_with_worker() self.loginPage.is_logged_in() self.left_panel.open_comparison_page() self.trackPage.select_market(self.us.name) self.comparison_page.select_market_from_dd(self.us.name) self.comparison_page.select_period_from_dd(AppConfig.get("periods")["28d"]["name"]) url_open = "{base}/spotify/track/{id}?market={market}&str_gr_dsp=5&str_gr_view=1&str_gr_start_date={start}&str_gr_end_date={end}" self.comparison_page.open_new_tab() self.comparison_page.switch_to_tab(1) for period in [ AppConfig.get("periods")["14d"], AppConfig.get("periods")["28d"], AppConfig.get("periods")["8w"], AppConfig.get("periods")["12w"], AppConfig.get("periods")["6m"], AppConfig.get("periods")["1y"], ]: self.comparison_page.select_period_from_dd(period["name"]) track_page_streams = [] self.comparison_page.switch_to_tab(2) for track in tracks: end_date = self.comparison_page.get_end_date_for_track_period(period=period["count"], track=track) self.comparison_page.open_url( url_open.format( base=CoreConfig.ENV_BASE_URL, id=track.id, market=self.us.url, start=track.dates.f_date, end=end_date, ) ) track_page_s = self.trackPage.get_streams_values_by_dsp() track_page_streams.append(track_page_s) self.comparison_page.switch_to_tab(1) by_dsp_table_values = self.comparison_page.get_by_dsp_table_values() for value_name in ["spotify", "apple", "amazon", "total"]: table_values = [float(str(v).replace("M", "").replace("k", "").replace("N/A", "0")) for v in by_dsp_table_values[value_name]] track_page_values = [self.trackPage.apply_rounding(t["{}_value".format(value_name)]) for t in track_page_streams] self.ts.markFinal( table_values == track_page_values, "STEP 5-11: period: {}, values: {} in track page and graph are equal: tp: {}, " "table: {} ".format(period["name"], value_name, track_page_values, table_values), ) @allure.story("AP-2706") @allure.severity(allure.severity_level.NORMAL) @allure.title("""'By DSP' section Data calculation - Graph and Table""") @allure.description( """TC Verifies correctness of data calculation in ‘By DSP’ section (both chart and table). - Graph and Table""" ) def test_by_dsp_data_calculation_graph_vs_table(self): tracks = [self.track6, self.track24, self.track15, self.track13, self.track25] self.comparison_page.remove_tracks_if_present_with_worker(self.us.market) user = self.loginPage.get_user_email_with_worker() token = self.api_client.authorize(user=user) for track in tracks: self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=track.isrc, id=track.id) self.loginPage.login_with_worker() self.loginPage.is_logged_in() self.left_panel.open_comparison_page() self.trackPage.select_market(self.us.name) self.comparison_page.select_market_from_dd(self.us.name) self.comparison_page.select_period_from_dd(AppConfig.get("periods")["14d"]["name"]) tooltips = self.comparison_page.by_dsp_get_tooltips_parsed() tooltips_values_sorted = [] for track in tracks: tooltip_sorted = self.comparison_page.by_dsp_get_tooltip_for_track(tooltips, track) tooltips_values_sorted.append(tooltip_sorted) end_date = str(self.comparison_page.get_end_date_for_track_period(period=AppConfig.get("periods")["14d"]["count"], track=track)) range_tooltip = tooltip_sorted["track_date"] range_expected = "{}–{}".format( datetime.datetime.strptime(track.dates.f_date, "%Y-%m-%d").strftime(self.trackPage.get_date_format_from_locale()), datetime.datetime.strptime(end_date, "%Y-%m-%d").strftime(self.trackPage.get_date_format_from_locale()), ) self.ts.markFinal( range_tooltip == range_expected, "STEP 4: date in tooltip is correct: ui: {}, expected: {}".format(range_tooltip, range_expected), ) by_dsp_table_values = self.comparison_page.get_by_dsp_table_values() for value_name in ["spotify", "apple", "amazon", "total"]: table_values = [float(str(v).replace("M", "").replace("k", "").replace("N/A", "0")) for v in by_dsp_table_values[value_name]] graph_values = [self.trackPage.apply_rounding(float(str(t["{}_value".format(value_name)]).split("\n")[0].replace(",", ""))) for t in tooltips_values_sorted] self.ts.markFinal( table_values == graph_values, "STEP 1-3: values for {} in graph and table are equal: table: {}, graph: {}".format(value_name, table_values, graph_values), ) @allure.story("AP-2706") @allure.severity(allure.severity_level.NORMAL) @allure.title("""'By DSP' section Data calculation - Table and Track page - Global STEP 12-16""") @allure.description( """TC Verifies correctness of data calculation in ‘By DSP’ section (both chart and table). - Table and Track page - Global STEP 12-16""" ) def test_by_dsp_data_calculation_table_and_track_page_step_12_16(self): tracks = [self.track6, self.track24, self.track15, self.track13, self.track25] self.comparison_page.remove_tracks_if_present_with_worker(self.us.market) user = self.loginPage.get_user_email_with_worker() token = self.api_client.authorize(user=user) for track in tracks: self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=track.isrc, id=track.id) self.loginPage.login_with_worker() self.loginPage.is_logged_in() self.left_panel.open_comparison_page() self.trackPage.select_market(self.global_m.name) for period in [AppConfig.get("periods")["14d"], AppConfig.get("periods")["8w"], AppConfig.get("periods")["1y"]]: self.comparison_page.select_period_from_dd(period["name"]) tooltips = self.comparison_page.by_dsp_get_tooltips_parsed() tooltips_values_sorted = [] for track in tracks: self.comparison_page.log.info(f"Track: {track.name}") tooltip_sorted = self.comparison_page.by_dsp_get_tooltip_for_track(tooltips, track) tooltips_values_sorted.append(tooltip_sorted) end_date = str(self.comparison_page.get_end_date_for_track_period(period=period["count"], track=track)) range_tooltip = tooltip_sorted["track_date"] range_expected = "{}–{}".format( datetime.datetime.strptime(track.dates.f_date, "%Y-%m-%d").strftime(self.trackPage.get_date_format_from_locale()), datetime.datetime.strptime(end_date, "%Y-%m-%d").strftime(self.trackPage.get_date_format_from_locale()), ) self.ts.markFinal( range_tooltip == range_expected, "STEP 12-13: date in tooltip is correct: ui: {}, expected: {}".format(range_tooltip, range_expected), ) self.comparison_page.select_period_from_dd(AppConfig.get("periods")["1y"]["name"]) url_open = "{base}/spotify/track/{id}?market={market}&str_gr_dsp=5&str_gr_view=1&str_gr_start_date={start}&str_gr_end_date={end}" self.comparison_page.open_new_tab() track_page_streams = [] self.comparison_page.switch_to_tab(2) for track in tracks: end_date = self.comparison_page.get_end_date_for_track_period(period=AppConfig.get("periods")["1y"]["count"], track=track) self.comparison_page.open_url( url_open.format( base=CoreConfig.ENV_BASE_URL, id=track.id, market=self.global_m.url, start=track.dates.f_date, end=end_date, ) ) track_page_s = self.trackPage.get_streams_values_by_dsp() track_page_streams.append(track_page_s) self.comparison_page.switch_to_tab(1) by_dsp_table_values = self.comparison_page.get_by_dsp_table_values() for value_name in ["spotify", "apple", "amazon", "total"]: table_values = [float(str(v).replace("M", "").replace("k", "").replace("B", "").replace("N/A", "0")) for v in by_dsp_table_values[value_name]] track_page_values = [self.trackPage.apply_rounding(t["{}_value".format(value_name)]) for t in track_page_streams] self.ts.markFinal( table_values == track_page_values, "STEP 14-16: period: {}, values: {} in track page and graph are equal: tp: {}, " "table: {} ".format(AppConfig.get("periods")["1y"]["name"], value_name, track_page_values, table_values), )