import json import unittest from argparse import Namespace import allure import pytest from assertpy import assert_that from ui_automation_framework.core import TestStatus from ui_automation_framework.utils import AppConfig 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): track22 = json.loads(json.dumps(AppConfig.get("track22")), object_hook=lambda d: Namespace(**d)) track23 = json.loads(json.dumps(AppConfig.get("track23")), object_hook=lambda d: Namespace(**d)) track15 = json.loads(json.dumps(AppConfig.get("track15")), object_hook=lambda d: Namespace(**d)) track14 = json.loads(json.dumps(AppConfig.get("track14")), 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)) hint_no_data = "There’s no data to display\nfor the selected track." @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) @allure.story("AP-3093") @allure.severity(allure.severity_level.NORMAL) @allure.title("""N/A and zero states verification STEPS 1-13""") @allure.description( """TC Verifies that N/A and zero states are shown in appropriate cases and in accordance with designs. STEPS 1-13""" ) def test_na_and_zero_states_step_1_13(self): 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) self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=self.track22.isrc, id=self.track22.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"]) na_sections = self.comparison_page.get_all_section_with_na() self.comparison_page.empty_playlist_support_displayed() self.ts.markFinal(len(na_sections) == 5, "STEP 1: all sections are empty") self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=self.track23.isrc, id=self.track23.id) self.comparison_page.refresh() self.comparison_page.wait_for_stream_performance_graph_visible() hint_1 = self.comparison_page.get_release_hint_with_track_index(1) na_sections = self.comparison_page.get_all_section_with_na() self.comparison_page.empty_playlist_support_displayed() self.ts.markFinal( hint_1 == self.hint_no_data, "STEP 2: hint no data is displayed for track: {}\n{}\n{}".format(self.track22.name, hint_1, self.hint_no_data), ) self.ts.markFinal(len(na_sections) == 7, "STEP 3-4: all sections are empty: {}".format(len(na_sections))) self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=self.track15.isrc, id=self.track15.id) self.comparison_page.refresh() self.comparison_page.wait_for_stream_performance_graph_visible() hint_2 = self.comparison_page.get_release_hint_with_track_index(2) self.ts.markFinal(hint_2 == self.hint_no_data, "hint no data is displayed for track: {}".format(self.track23.name)) legend_streams = self.comparison_page.get_track_performance_legend_streams() tooltips = self.comparison_page.get_tooltip_info_track_performance(AppConfig.get("periods")["28d"]["count"] + 3) self.ts.markFinal( legend_streams.count("N/A") == 2, "STEP 5-6: na for two tracks are displayed in legend: {}".format(legend_streams.count("N/A")), ) self.ts.markFinal( (self.track15.name in t for t in tooltips), "track: {} is present in tooltips in track performance".format(self.track15.name), ) self.ts.markFinal( (self.track22.name not in t for t in tooltips), "track: {} is not present in tooltips in track performance".format(self.track22.name), ) self.ts.markFinal( (self.track23.name not in t for t in tooltips), "track: {} is not present in tooltips in track performance".format(self.track23.name), ) self.comparison_page.track_performance_select_dsp_from_dd(AppConfig.get("dsp")["spotify"]) self.comparison_page.track_performance_select_source(self.source.chart) legend_streams = self.comparison_page.get_track_performance_legend_streams() tooltips = self.comparison_page.get_tooltip_info_track_performance(AppConfig.get("periods")["28d"]["count"] + 3) self.ts.markFinal(legend_streams == ["N/A", "N/A", "0"], "STEP 7: legend streams is correct: {}".format(legend_streams)) self.ts.markFinal( all(self.track15.name in t for t in tooltips), "track in tooltip shown for track: {} for all days in tooltips".format(self.track15.name), ) self.ts.markFinal( all(str(t).endswith("\n0") for t in tooltips), "zero shown for track: {} for all days in tooltips".format(self.track15.name), ) self.comparison_page.track_performance_select_dsp_from_dd(AppConfig.get("dsp")["apple"]) self.comparison_page.empty_track_performance_displayed() self.comparison_page.track_performance_select_dsp_from_dd(AppConfig.get("dsp")["amazon"]) self.comparison_page.empty_track_performance_displayed() self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=self.track14.isrc, id=self.track14.id) self.comparison_page.refresh() self.comparison_page.wait_for_stream_performance_graph_visible() self.comparison_page.track_performance_select_dsp_from_dd(AppConfig.get("dsp")["amazon"]) legend_streams = self.comparison_page.get_track_performance_legend_streams() tooltips = self.comparison_page.get_tooltip_info_track_performance(AppConfig.get("periods")["28d"]["count"] + 2) self.ts.markFinal( legend_streams.count("N/A") == 3, "STEP 8-10: na for three tracks are displayed in legend: {}".format(legend_streams.count("N/A")), ) self.ts.markFinal( all(self.track14.name in t for t in tooltips), "track in tooltip shown for track: {} for all days in tooltips".format(self.track15.name), ) dsp_tooltips = self.comparison_page.by_dsp_get_tooltips() self.ts.markFinal( (self.track15.name and AppConfig.get("dsp")["spotify"]) in dsp_tooltips[0], "STEP 11: only {} is in tooltip By DSP for track: {}".format(AppConfig.get("dsp")["spotify"], self.track15.name), ) self.ts.markFinal( (AppConfig.get("dsp")["amazon"] and AppConfig.get("dsp")["apple"]) not in dsp_tooltips[0], "STEP 12: dsps: {}, {} not in tooltip By DSP for track: {}".format(AppConfig.get("dsp")["amazon"], AppConfig.get("dsp")["apple"], self.track15.name), ) self.ts.markFinal( (self.track22.name not in t for t in dsp_tooltips), "track: {} is not present in tooltips in By DSP".format(self.track22.name), ) self.ts.markFinal( (self.track23.name not in t for t in dsp_tooltips), "track: {} is not present in tooltips in By DSP".format(self.track23.name), ) by_dsp_table_values = self.comparison_page.get_by_dsp_table_values() self.ts.markFinal( [self.track22.name, self.track23.name, self.track15.name, self.track14.name] == by_dsp_table_values["name"], "STEP 13: track names are displayed in By DSP table: {}".format(by_dsp_table_values["name"]), ) self.ts.markFinal(["N/A", "N/A", "648k", "15M"] == by_dsp_table_values["spotify"], "spotify are correct") self.ts.markFinal(["N/A", "N/A", "N/A", "6.2M"] == by_dsp_table_values["apple"], "apple are correct") self.ts.markFinal(["N/A", "N/A", "N/A", "2.7M"] == by_dsp_table_values["amazon"], "amazon are correct") self.ts.markFinal(["N/A", "N/A", "648k", "24M"] == by_dsp_table_values["total"], "totals are correct") @allure.story("AP-3093") @allure.severity(allure.severity_level.NORMAL) @allure.title("""N/A and zero states verification STEP 14-15""") @allure.description( """TC Verifies that N/A and zero states are shown in appropriate cases and in accordance with designs. STEP 14-15""" ) def test_na_and_zero_states_step_14_15(self): 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 [self.track22, self.track23, self.track15, self.track14]: 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"]) tooltips_engagement = self.comparison_page.by_engagement_get_graph_tooltips() self.ts.markFinal( ((self.track15.name and self.track14.name) in t for t in tooltips_engagement), "STEP 14: track: {}, {} is present in tooltips in By Engagement".format(self.track15.name, self.track14.name), ) self.ts.markFinal( ((self.track22.name and self.track23.name) not in t for t in tooltips_engagement), "track: {}, {} is not present in tooltips in By Engagement".format(self.track22.name, self.track23.name), ) by_engagement_table_values = self.comparison_page.get_by_engagement_table_values() self.ts.markFinal( [self.track22.name, self.track23.name, self.track15.name, self.track14.name] == by_engagement_table_values["name"], "track names are displayed in By Engagement table: {}".format(by_engagement_table_values["name"]), ) self.ts.markFinal(["N/A", "N/A", "514k", "4.5M"] == by_engagement_table_values["forward"], "forward are correct") self.ts.markFinal(["N/A", "N/A", "134k", "11M"] == by_engagement_table_values["back"], "back are correct") self.ts.markFinal(["N/A", "N/A", "648k", "15M"] == by_engagement_table_values["total"], "totals are correct") self.comparison_page.by_engagement_select_dsp_from_dd(AppConfig.get("dsp")["amazon"]) tooltips_engagement = self.comparison_page.by_engagement_get_graph_tooltips() self.ts.markFinal( all(self.track14.name in t for t in tooltips_engagement), "STEP 15: track: {} is present in tooltips in By Engagement".format(self.track15.name), ) self.ts.markFinal( ((self.track22.name and self.track23.name and self.track15.name) not in t for t in tooltips_engagement), "track: {}, {} is not present in tooltips in By Engagement".format(self.track22.name, self.track23.name), ) by_engagement_table_values = self.comparison_page.get_by_engagement_table_values() self.ts.markFinal( [self.track22.name, self.track23.name, self.track15.name, self.track14.name] == by_engagement_table_values["name"], "track names are displayed in By Engagement table: {}".format(by_engagement_table_values["name"]), ) self.ts.markFinal(["N/A", "N/A", "N/A", "589k"] == by_engagement_table_values["forward"], "forward are correct") self.ts.markFinal(["N/A", "N/A", "N/A", "2.1M"] == by_engagement_table_values["back"], "back are correct") self.ts.markFinal(["N/A", "N/A", "N/A", "2.7M"] == by_engagement_table_values["total"], "totals are correct") @allure.story("AP-3093") @allure.severity(allure.severity_level.NORMAL) @allure.title("""N/A and zero states verification STEP 16-19""") @allure.description( """TC Verifies that N/A and zero states are shown in appropriate cases and in accordance with designs. STEP 16-19""" ) def test_na_and_zero_states_step_16_19(self): 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 [self.track22, self.track23, self.track15, self.track14]: 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"]) audience_tooltips = self.audience_graph.get_demographics_tooltip_values(param="all") self.ts.markFinal( (self.track14.name in t for t in audience_tooltips), "STEP 16: track: {} is present in tooltips in By Audience".format(self.track14.name), ) self.ts.markFinal( ((self.track22.name and self.track23.name and self.track15.name) not in t for t in audience_tooltips), "track: {}, {}, {} is not present in tooltips in By Engagement".format(self.track22.name, self.track23.name, self.track15.name), ) self.comparison_page.audience_select_dsp_from_dd(AppConfig.get("dsp")["apple"]) audience_tooltips = self.audience_graph.get_demographics_tooltip_values(param="all") assert_that("Female (0–17)\nLiar\n09/05/19–10/04/19\n0").described_as("STEP 17").is_equal_to(audience_tooltips[0]) self.comparison_page.country_select_dsp_from_dd(AppConfig.get("dsp")["amazon"]) self.comparison_page.country_select_source(AppConfig.get("source")["all"]) for t in range(1, 4): values = self.comparison_page.country_get_values_by_track_index(t) self.ts.markFinal( all("N/A" in v for v in values), "STEP 18: all values in by country for track index: {} are N/A".format(t), ) self.comparison_page.country_select_dsp_from_dd(AppConfig.get("dsp")["amazon"]) self.comparison_page.country_select_source(AppConfig.get("source")["search"]) values = self.comparison_page.country_get_values_by_track_index(4) self.ts.markFinal( all("" == v for v in values), "STEP 19: all values in by country for track: {} are empty".format(self.track15.name), ) for t in range(1, 4): values = self.comparison_page.country_get_values_by_track_index(t) self.ts.markFinal(all("N/A" in v for v in values), "all values in by country for track index: {} are N/A".format(t))