import datetime import time import unittest import allure import pytest from assertpy import assert_that from parameterized import parameterized from ui_automation_framework.core import TestStatus from ui_automation_framework.utils import AppConfig, CoreConfig from app.api_client import ApiClient from app.src.pages.album_page import AlbumPage from app.src.pages.chart_digest import ChartDigestPage from app.src.pages.left_navigation_panel import LeftNavigationPanel from app.src.pages.login_page import LoginPage from app.src.pages.my_starred_tracks_page import MyStarredTracksPage from app.src.pages.new_music_friday import NewMusicFridayPage from app.src.pages.spotify_playlist_page import SpotifyPlaylistPage from app.src.pages.top_charts_page import TopChartsPage from app.src.pages.track_page import TrackPage @pytest.mark.usefixtures("set_up", "one_time_set_up") class TopChartsPageTest(unittest.TestCase): @pytest.fixture(autouse=True) def classSetup(self): self.loginPage = LoginPage(self.driver) self.topChartsPage = TopChartsPage(self.driver) self.trackPage = TrackPage(self.driver) self.chart_digest = ChartDigestPage(self.driver) self.ap = AlbumPage(self.driver) self.nmf = NewMusicFridayPage(self.driver) self.spotify_playlist_page = SpotifyPlaylistPage(self.driver) self.left_panel = LeftNavigationPanel(self.driver) self.starred_tracks_page = MyStarredTracksPage(self.driver) self.api_client = ApiClient() self.ts = TestStatus(self.driver) @parameterized.expand( [ ("streams_and_sources_tab", AppConfig.get("dsp")["spotify"]), ("streams_and_sources_tab", AppConfig.get("dsp")["amazon"]), ("streams_and_sources_tab", AppConfig.get("dsp")["apple"]), ("streams_and_sources_tab", AppConfig.get("dsp")["by_dsp"]), ("streams_and_sources_tab", AppConfig.get("dsp")["total_streams"]), ("countries_tab", AppConfig.get("dsp")["spotify"]), ("countries_tab", AppConfig.get("dsp")["amazon"]), ("countries_tab", AppConfig.get("dsp")["apple"]), ("countries_tab", AppConfig.get("dsp")["tiktok"]), ("track-performance-youtube", ""), ("performance_tiktok_tab", ""), ] ) @allure.story("AP-3435") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-2747] Date format verification across the portal STEPS 1-15") @allure.description("Verify that the dates across the portal pages are in the next formats: STEPS 1-15") def test_date_format_across_portal_verification_steps_1_15(self, tab, dsp): self.loginPage.login_with_worker() market = AppConfig.get("market")["us"] self.trackPage.select_market(market["name"]) self.trackPage.open_spotify_track_page(AppConfig.get("track40")["id"]) # step 7 self.trackPage.switch_to_tab(tab) time.sleep(2) if dsp != "": self.trackPage.select_dsp(dsp) # step 1 if tab == "streams_and_sources_tab" and dsp in [AppConfig.get("dsp")["spotify"], AppConfig.get("dsp")["apple"]]: release_date = self.trackPage.get_release_date() assert_that(release_date).is_type_of(datetime.date) # step 2 tooltips_header = self.trackPage.get_header_tooltips() for tooltip in tooltips_header: self.trackPage.validate_date(tooltip.split(" ")[-1]) # step 5 footnote = self.trackPage.get_text("//*[contains(text(), 'onwards')]", "xpath") self.trackPage.validate_date(footnote.split(" onwards.")[0].split(" ")[-1]) # step 6, 9-10, 12, 14 file = self.trackPage.export_and_get_csv(["Date"], market["market"]) self.trackPage.validate_date(file["Date"][0]) # step 15 if tab == "performance_tiktok_tab": self.trackPage.verify_tt_comparison_clock_icon() @allure.story("AP-3435") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-2747] Date format verification across the portal STEPS 16-24") @allure.description("Verify that the dates across the portal pages are in the next formats: STEPS 16-24") def test_date_format_across_portal_verification_steps_16_24(self): self.loginPage.login_with_worker() market = AppConfig.get("market")["us"] self.trackPage.select_market(market["name"]) self.trackPage.open_spotify_track_page(AppConfig.get("track40")["id"]) self.trackPage.td_change_dsp(AppConfig.get("dsp")["spotify"]) # step 16 self.trackPage.td_click_export() title = self.trackPage.get_track_title() artist = self.trackPage.get_all_artists_name() file_path_core = f"http://{CoreConfig.SELENOID_HOST}:4444/download/{self.driver.session_id}/" file_columns = self.trackPage.read_from_csv(file_path_core + f"Current Playlists and Stations - {artist} - {title}.csv").dropna().columns streams_latest_date_column_date = str(file_columns[4]).split(" ")[1] self.trackPage.validate_date(streams_latest_date_column_date) # step 17 self.trackPage.hover_on_element("track-page-current-playlists-and-stations-table-cell-track-days-in-playlist-1") added_date_tooltip = self.trackPage.get_text(self.trackPage.hint_locator, "xpath") self.trackPage.validate_date(added_date_tooltip.split(" ")[-1]) # step 20 self.trackPage.td_switch_to_past_playlists_tab() table_ui_added = self.trackPage.td_previous_playlist_get_table_ui("Added") table_ui_removed = self.trackPage.td_previous_playlist_get_table_ui("Removed") assert_that(table_ui_added[0]).is_type_of(datetime.date) assert_that(table_ui_removed[0]).is_type_of(datetime.date) # step 21 self.trackPage.td_click_export() title = self.trackPage.get_track_title() for column in ["Track Added", "Track Removed"]: file_dates = self.trackPage.read_from_csv(file_path_core + f"Past Playlists - {artist} - {title}.csv").dropna().get(column).to_list() self.trackPage.validate_date(file_dates[0]) # step 23-24 self.trackPage.td_switch_to_charts_tab() self.trackPage.track_details_switch_to_charts_sub_tab() for i in [ self.trackPage.CHARTS_SPOTIFY_DAILY, self.trackPage.CHARTS_SPOTIFY_WEEKLY, self.trackPage.CHARTS_APPLE_MUSIC_DAILY, ]: self.trackPage.td_charts_select_dsp(i) self.trackPage.td_charts_verify_columns() self.trackPage.td_click_export() for column in ["Peak Lifetime Position # Date", "Entry Position # Date"]: file_dates = self.trackPage.read_from_csv(file_path_core + f"{i} - {artist} - {title}.csv").dropna().get(column).to_list() if len(file_dates) > 0: self.trackPage.validate_date(file_dates[0]) @parameterized.expand( [ ("album", AppConfig.get("dsp")["spotify"]), ("album", AppConfig.get("dsp")["apple"]), ("tracks", AppConfig.get("dsp")["spotify"]), ("tracks", AppConfig.get("dsp")["apple"]), ("tracks", AppConfig.get("dsp")["total_streams"]), ("countries", AppConfig.get("dsp")["spotify"]), ("countries", AppConfig.get("dsp")["apple"]), ] ) @allure.story("AP-3435") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-2747] Date format verification across the portal STEPS 26-35") @allure.description("Verify that the dates across the portal pages are in the next formats: STEPS 26-35") def test_date_format_across_portal_verification_steps_26_35(self, tab, dsp): self.loginPage.login_with_worker() market = AppConfig.get("market")["us"] self.trackPage.select_market(market["name"]) self.trackPage.open_spotify_page(id=AppConfig.get("album2")["id"], page_type="album") # step 26 release_date = self.trackPage.get_release_date() assert_that(release_date).is_type_of(datetime.date) # step 29, 31-32, 34-35 self.ap.switch_to_tab(tab) self.trackPage.select_dsp(dsp) # step 30 if tab == "album" and dsp in [AppConfig.get("dsp")["spotify"], AppConfig.get("dsp")["apple"]]: footnote = self.trackPage.get_text("//*[contains(text(), 'onwards')]", "xpath") self.trackPage.validate_date(footnote.split(" onwards.")[0].split(" ")[-1]) album_name = self.ap.get_album_title() file_path_core = f"http://{CoreConfig.SELENOID_HOST}:4444/download/{self.driver.session_id}/" if tab == "album": path = file_path_core + f"{album_name} - {market['market'].upper()} - {dsp}.csv" elif tab == "tracks": path = file_path_core + f"""Album Tracks – {album_name.replace("'", " ")}.csv""" else: path = file_path_core + f"{album_name} - Countries - {dsp}.csv" self.ap.click_export() file_dates = self.trackPage.read_from_csv(path).dropna().get("Date").to_list() if len(file_dates) > 0: self.trackPage.validate_date(file_dates[0]) @allure.story("AP-3435") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-2747] Date format verification across the portal STEPS 38-43") @allure.description("Verify that the dates across the portal pages are in the next formats: STEPS 38-43") def test_date_format_across_portal_verification_steps_38_43(self): self.loginPage.login_with_worker() market = AppConfig.get("market")["us"] self.trackPage.select_market(market["name"]) self.spotify_playlist_page.open_spotify_playlist_page(AppConfig.get("playlist1")["id"]) # steps 38-39 icon_export_locator = "(//*[contains(@class, 'icon-export')])[{}]" playlist_name = self.trackPage.get_track_title(True) start = self.trackPage.get_calendar_start_date() end = self.trackPage.get_calendar_end_date() start = datetime.datetime.strptime(start, "%Y-%m-%d").strftime(self.trackPage.get_date_file_format_from_locale()) end = datetime.datetime.strptime(end, "%Y-%m-%d").strftime(self.trackPage.get_date_file_format_from_locale()) export_graph = self.trackPage.wait_for_element_clickable(icon_export_locator.format(1), "xpath") self.trackPage.click_element(element=export_graph) file_path_core = f"http://{CoreConfig.SELENOID_HOST}:4444/download/{self.driver.session_id}/" csv_graph_date_column = self.trackPage.read_from_csv(file_path_core + f"{playlist_name} - {market['market'].upper()} - {start} to {end}.csv").get("Date").to_list() self.trackPage.validate_date(csv_graph_date_column[0]) # step 40 self.trackPage.scroll_to_element("spotify-playlist-details-title", "id") td_release_date = self.trackPage.get_element("release-date-1") self.trackPage.validate_date(self.trackPage.get_text(element=td_release_date)) # step 41 self.trackPage.hover_on_element("days-in-playlist-1") tooltip_date = self.trackPage.get_text(self.trackPage.hint_locator, "xpath").split(",")[0] self.trackPage.validate_date(tooltip_date) # step 42 td_dd_date = self.trackPage.get_text("//*[@id='spotify-playlist-details-tracks-dd-tracklist']/*/*/*[2]", "xpath").split(",")[0] self.trackPage.validate_date(td_dd_date) # step 43 export_td = self.trackPage.wait_for_element_clickable(icon_export_locator.format(2), "xpath") self.trackPage.click_element(element=export_td) csv_td_date = self.trackPage.read_from_csv(file_path_core + f"Analyze Playlist - {playlist_name}.csv") for column in ["Release Date", "Added"]: date_columns_data = csv_td_date.get(column).to_list() self.trackPage.validate_date(date_columns_data[0]) @allure.story("AP-3435") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-2747] Date format verification across the portal STEPS 47-56") @allure.description("Verify that the dates across the portal pages are in the next formats: STEPS 47-56") def test_date_format_across_portal_verification_steps_47_56(self): self.loginPage.login_with_worker() market = AppConfig.get("market")["us"] self.trackPage.select_market(market["name"]) # step 47 for tab in [self.chart_digest.TAB_SPOTIFY, self.chart_digest.TAB_APPLE]: self.chart_digest.select_tab(tab) tooltip = self.chart_digest.get_clock_tooltip_for_table(self.chart_digest.TOP_VIEW) self.trackPage.validate_date(tooltip.split(" ")[-1]) # step 48 self.trackPage.select_market(AppConfig.get("market")["algerial"]["name"]) self.chart_digest.select_tab(self.chart_digest.TAB_SPOTIFY) self.chart_digest.select_section_for_table("{}-{}".format(self.chart_digest.TOP_VIEW, self.chart_digest.SECTION_EXITS_TOP_10)) self.chart_digest.verify_empty_table_top_10_exits(self.chart_digest.TAB_SPOTIFY, self.chart_digest.TOP_VIEW) self.chart_digest.select_tab(tab="{}-{}".format(self.chart_digest.TOP_VIEW, self.chart_digest.TAB_APPLE)) self.chart_digest.verify_empty_table_top_10_exits(self.chart_digest.TAB_APPLE, self.chart_digest.TOP_VIEW) # step 49 self.trackPage.select_market(AppConfig.get("market")["us"]["name"]) self.topChartsPage.open_top_chart_page() daily_date = self.topChartsPage.get_chosen_date() self.trackPage.validate_date(daily_date) self.topChartsPage.change_sub_tab(self.topChartsPage.WEEKLY) weekly_date = self.topChartsPage.get_chosen_date() self.trackPage.validate_date(weekly_date) # step 54 self.left_panel.open_right_hamburger_menu_pages(self.left_panel.link_nmf) self.nmf.nmf_click_export() date_ui = self.nmf.get_chosen_nmf_date() date_ui = datetime.datetime.strptime(date_ui, self.trackPage.get_date_format_from_locale()).strftime(self.trackPage.get_date_file_format_from_locale()) path_to_csv = f"http://{CoreConfig.SELENOID_HOST}:4444/download/{self.driver.session_id}/New Music Friday - {date_ui}.csv" self.trackPage.read_from_csv(path_to_csv) # step 55 self.starred_tracks_page.open_my_starred_tracks_page() self.starred_tracks_page.switch_to_chart_position() dates = self.starred_tracks_page.get_table_dates() for d in dates: self.trackPage.validate_date(d) # step 56 self.nmf.nmf_click_export() path_to_csv = f"http://{CoreConfig.SELENOID_HOST}:4444/download/{self.driver.session_id}/My Starred Tracks.csv" csv_td_date = self.trackPage.read_from_csv(path_to_csv) for column in ["Release Date", "Chart Entry Date, US"]: date_columns_data = csv_td_date.get(column).to_list() self.trackPage.validate_date(date_columns_data[0]) @allure.story("AP-3435") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-2747] Date format verification across the portal STEPS 63-66") @allure.description("Verify that the dates across the portal pages are in the next formats: STEPS 63-66") def test_date_format_across_portal_verification_steps_63_66(self): self.loginPage.login_with_worker() market = AppConfig.get("market")["us"] self.trackPage.select_market(market["name"]) self.left_panel.open_right_hamburger_menu_pages("Playlist Duplication") # step 63 dates = self.starred_tracks_page.get_table_dates("//div[@id][contains(., '/') and string-length(.) > 7]") date = dates[0].split(",")[0] self.trackPage.validate_date(date) self.trackPage.click_element("//div[.='Copied Playlists']", "xpath") dates = self.starred_tracks_page.get_table_dates("//div[@id][contains(., '/') and string-length(.) > 7]") date = dates[0].split(",")[0] self.trackPage.validate_date(date) # step 64, 66 self.trackPage.open_url(f"{CoreConfig.ENV_BASE_URL}/spotify/user/21ifzjxggdajdpc4w6iqxslkq") self.nmf.nmf_click_export() title = self.trackPage.get_track_title(True) path_to_csv = f"http://{CoreConfig.SELENOID_HOST}:4444/download/{self.driver.session_id}/{title}.csv" csv_td_date = self.trackPage.read_from_csv(path_to_csv) date_columns_data = csv_td_date.get("Last updated").to_list() self.trackPage.validate_date(date_columns_data[0]) # step 65 self.trackPage.open_url(f"{CoreConfig.ENV_BASE_URL}/spotify/filtr-playlists") self.nmf.nmf_click_export() path_to_csv = f"http://{CoreConfig.SELENOID_HOST}:4444/download/{self.driver.session_id}/Top Filtr Playlists - {market['name']}.csv" csv_td_date = self.trackPage.read_from_csv(path_to_csv) date_columns_data = csv_td_date.get("Date").to_list() self.trackPage.validate_date(date_columns_data[0].split(" ")[-1]) # COVERED - STEP 19 - AP-5946, STEP 36 - AP-2757, STEP 50 - AP-1556, STEP 51 - AP-1549, STEP 52 - AP-7627, STEP 53 - AP-5972, STEP 67 - AP-6318 # CAN NOT BE AUTOMATED - STEPS - 3-4, 8, 11, 13, 18, 22, 25, 27-28, 33, 37, 44-46, 57-62