import logging import unittest import allure import pytest from assertpy import assert_that from faker import Faker from ui_automation_framework.utils import logger as cl from app.src.helpers.api_data_provider import ApiDataProvider from app.src.helpers.data_formaters import DataFormatter from app.src.helpers.waiting_wrapper import wait from app.src.pages.chart_digest_page import ChartDigestPage from app.src.pages.login_page import LoginPage from app.src.pages.playlist_placements_page import PlaylistPlacementsPage from app.src.pages.profile_page import ProfilePage from app.src.pages.search_page import SearchPage from app.src.pages.starred_page import StarredPage from app.src.pages.streams_by_markets_page import StreamsByMarketsPage from app.src.pages.track_page import TrackPage @pytest.mark.usefixtures("set_up", "one_time_set_up", "authorized_api") class PlaylistsPlacementsTest(unittest.TestCase): log = cl.Logger(logging.DEBUG) @pytest.fixture(autouse=True) def classSetup(self, authorized_api): self.api = authorized_api self.loginPage = LoginPage(self.driver, authorized_api) self.profilePage = ProfilePage(self.driver) self.chartDigestPage = ChartDigestPage(self.driver, authorized_api) self.starredPage = StarredPage(self.driver, authorized_api) self.trackPage = TrackPage(self.driver, authorized_api) self.streamsPage = StreamsByMarketsPage(self.driver, authorized_api) self.searchPage = SearchPage(self.driver, authorized_api) self.playlistsPage = PlaylistPlacementsPage(self.driver, authorized_api) self.data_provider = ApiDataProvider(authorized_api) self.fake = Faker() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Search") @allure.description("Test playlist placements search") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6986, " "https://data-analytics.atlassian.net/browse/AG-6987, " "https://data-analytics.atlassian.net/browse/AG-6991") @pytest.mark.smoke def test_search(self): track_position_in_full_charts = 1 track = self.api.apollo.get_full_charts_data("spotify", "global")[0] playlist = next( filter( lambda x: x.current_position is not None, self.api.apollo.get_spotify_track_playlists(isrc=track.isrc, recent_adds_only="false"), ) ) self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts() track_name = self.chartDigestPage.get_full_charts_track_title(track_position_in_full_charts) self.chartDigestPage.open_track_from_full_charts(track_position_in_full_charts) self.trackPage.open_playlists().click_on_playlist_by_position(playlist.position_ui) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() self.playlistsPage.click_search_field() assert_that(self.playlistsPage.is_playlists_search_screen_displayed(), "Playlists search wasn't opened").is_true() assert_that(self.playlistsPage.get_playlists_search_results()).described_as( "Playlists search tracks count").is_length(20) self.playlistsPage.search_for_track_in_playlists(track.name[:20]) results = self.playlistsPage.get_playlists_search_results() assert_that(any(track_name in result for result in results), "Search results don't include top track").is_true() self.playlistsPage.clear_playlists_search_field().search_for_track_in_playlists(track.artist) results = self.playlistsPage.get_playlists_search_results() assert_that(any(track.artist in result for result in results), "Search results don't include query") self.playlistsPage.clear_playlists_search_field().scroll_playlists_search_results() assert_that(self.playlistsPage.is_playlists_search_screen_displayed(), "Playlists search header isn't displayed") self.playlistsPage.click_playlists_search_cancel_button() assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Search") @allure.description("Test playlist placements search") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6986, " "https://data-analytics.atlassian.net/browse/AG-6987, " "https://data-analytics.atlassian.net/browse/AG-6991") @pytest.mark.smoke def test_search_apple(self): track_position_in_full_charts = 1 playlist_position = 1 track_data = self.data_provider.get_apple_charts_artist_track() query_name_without_and = track_data[0] query_name_with_and = None if len(query_name_without_and.split(",")) == 2: query_name_with_and = " &".join(query_name_without_and.split( ",")) # in case if you have a comma, such as: 'Bad Bunny, Chencho Corleone' elif len(query_name_without_and.split(",")) > 2: query_name_with_and = ",".join(query_name_without_and.split(",")[:-1]) + " &" + \ query_name_without_and.split(",")[-1] query_artist = track_data[1] self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.select_dsp("APPLE MUSIC").open_full_charts().search_track_in_full_charts( query_name_without_and) self.chartDigestPage.open_track_from_full_charts(track_position_in_full_charts) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") self.playlistsPage.click_search_field() assert_that(self.playlistsPage.is_playlists_search_screen_displayed(), "Playlists search wasn't opened") assert_that(self.playlistsPage.get_playlists_search_results(), "Playlists search tracks count").is_length(20) if query_name_with_and: query_name = query_name_with_and else: query_name = query_name_without_and self.playlistsPage.search_for_track_in_playlists(query_name) results = self.playlistsPage.get_playlists_search_results() self.log.info(query_artist) self.log.info(results) assert_that(any(query_name.lower() in result.lower() for result in results), "Search results don't include query") assert_that(any(query_artist.lower() in result.lower() for result in results), "Search results don't include artist") self.playlistsPage.clear_playlists_search_field().search_for_track_in_playlists(query_artist) results = self.playlistsPage.get_playlists_search_results() assert_that(any(query_artist.lower() in result.lower() for result in results), "Search results don't include query") self.playlistsPage.clear_playlists_search_field().scroll_playlists_search_results() assert_that(self.playlistsPage.is_playlists_search_screen_displayed(), "Playlists search header isn't displayed") self.playlistsPage.click_playlists_search_cancel_button() assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Tracks sorting in a playlist") @allure.description("User should be able to sort palylists by date and position") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6977, " "https://data-analytics.atlassian.net/browse/AG-6979, " "https://data-analytics.atlassian.net/browse/AG-6978, " "https://data-analytics.atlassian.net/browse/AG-6980") @pytest.mark.smoke def test_sorting(self): track_position_in_full_charts = 1 playlist_position = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().open_track_from_full_charts(track_position_in_full_charts) self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) self.playlistsPage.click_sorting_icon() assert_that(self.playlistsPage.is_sorting_popup_opened(), "Sorting pop-up wasn't opened") self.playlistsPage.select_sorting_by("Newest Adds") dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates).described_as("Sorting order is by newest date").is_sorted() assert_that(positions).described_as("Secondary sorting order is by the position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("NEWEST ADDS"), "Sorting type isn't displayed") self.playlistsPage.scroll_down_to_tracks().click_sorting_icon().select_sorting_by("Position") positions = self.playlistsPage.get_playlist_tracks_positions() assert_that(positions).described_as("Sorting order is by position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("POSITION"), "Sorting type isn't displayed") assert_that( self.playlistsPage.is_scrolled_header_contains(self.playlistsPage.get_main_track_positions()), "Scrolled header without position", ) self.playlistsPage.click_sorting_icon().select_sorting_by("Oldest Adds") dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates, "Sorting order is by oldest date").is_sorted(reverse=True) assert_that(positions, "Secondary sorting is by the position").is_sorted() assert_that( self.playlistsPage.is_scrolled_header_contains(self.playlistsPage.get_main_track_date_added()), "Scrolled header without date", ) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Tracks sorting in a playlist Apple") @allure.description("User should be able to sort palylists by date and position") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6977, " "https://data-analytics.atlassian.net/browse/AG-6979, " "https://data-analytics.atlassian.net/browse/AG-6978, " "https://data-analytics.atlassian.net/browse/AG-6980") @pytest.mark.smoke def test_sorting_apple(self): track_position_in_full_charts = 1 playlist_position = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.select_dsp("APPLE MUSIC").open_full_charts().open_track_from_full_charts( track_position_in_full_charts) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( playlist_position) self.playlistsPage.click_sorting_icon() assert_that(self.playlistsPage.is_sorting_popup_opened(), "Sorting pop-up wasn't opened") self.playlistsPage.select_sorting_by("Newest Adds") dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates, "Sorting order is by newest date").is_sorted() assert_that(positions, "Secondary sorting is by the position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("NEWEST ADDS"), "Sorting type isn't displayed") self.playlistsPage.scroll_down_to_tracks().click_sorting_icon().select_sorting_by("Position") positions = self.playlistsPage.get_playlist_tracks_positions() assert_that(positions, "Sorting order is by the position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("POSITION"), "Sorting type isn't displayed") assert_that( self.playlistsPage.is_scrolled_header_contains(self.playlistsPage.get_main_track_positions_and_trend()), "Scrolled header without position and trend", ) self.playlistsPage.click_sorting_icon().select_sorting_by("Oldest Adds") dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates, "Sorting order is by th oldest date").is_sorted(reverse=True) assert_that(positions, "Secondary sorting is by the position").is_sorted() assert_that( self.playlistsPage.is_scrolled_header_contains(self.playlistsPage.get_main_track_date_added()), "Scrolled header without date", ) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation from Playlist Card") @allure.description("User should be able to open playlist placements page from the track page") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6838, " "https://data-analytics.atlassian.net/browse/AG-6831") @pytest.mark.smoke def test_navigation_to_playlist_placements_from_track_page(self): track_position_in_full_charts = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts() track_name = self.chartDigestPage.get_full_charts_track_title(track_position_in_full_charts) self.chartDigestPage.open_track_from_full_charts(track_position_in_full_charts) self.trackPage.open_playlists() playlist_name_spotify = self.trackPage.get_playlist_name_by_position(1) self.trackPage.click_on_playlist_by_position(1) assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name_spotify), "Playlist placement wasn't opened", ) self.playlistsPage.click_back_button().click_back_button() assert_that(self.trackPage.is_track_page_opened(track_name), "User not on the track page") playlist_name_apple = self.trackPage.select_playlist_dsp( "APPLE MUSIC").open_playlists().get_playlist_name_by_position(1) self.trackPage.click_on_playlist_by_position(1) assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name_apple), "Playlist placement wasn't opened", ) self.playlistsPage.click_back_button() assert_that(self.trackPage.is_track_page_opened(track_name), "User not on the track page") @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation from Playlists Placements") @allure.description("User should be able to open playlist placements page from the playlists page") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6838, " "https://data-analytics.atlassian.net/browse/AG-6831") @pytest.mark.smoke def test_navigation_to_playlist_placements_from_playlists_spotify(self): track_position_in_full_charts = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().open_track_from_full_charts(track_position_in_full_charts) self.trackPage.open_playlists() for playlist in self.trackPage.get_playlists(): playlist_name = self.playlistsPage.get_playlist_name_by_element(playlist) self.playlistsPage.click_on_playlist(playlist) assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name), "Playlist placement wasn't opened", ) self.playlistsPage.click_back_button() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation from Playlists Placements") @allure.description("User should be able to open playlist placements page from the playlists page") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6838, " "https://data-analytics.atlassian.net/browse/AG-6831") @pytest.mark.smoke def test_navigation_to_playlist_placements_from_playlists_apple(self): track_position_in_full_charts = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.select_dsp("APPLE MUSIC").open_full_charts().open_track_from_full_charts( track_position_in_full_charts) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists() for playlist in self.trackPage.get_playlists(): playlist_name = self.trackPage.get_playlist_name_by_element(playlist) self.playlistsPage.click_on_playlist(playlist) assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name), "Playlist placement wasn't opened", ) self.playlistsPage.click_back_button() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation to the track page and back from playlist placements spotify") @allure.description("User should be able to open the track from the placements page and return back") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6951, " "https://data-analytics.atlassian.net/browse/AG-6952") @pytest.mark.smoke def test_navigation_to_the_track(self): track_position_in_full_charts = 1 playlist_position = 1 track_position_in_playlist = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().open_track_from_full_charts(track_position_in_full_charts) self.trackPage.open_playlists() playlist_name = self.trackPage.get_playlist_name_by_position(playlist_position) self.trackPage.click_on_playlist_by_position(playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") track_name = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.click_track_card(track_position_in_playlist) assert_that(self.trackPage.is_track_page_opened(track_name), "Appropriate track wasn't opened") self.trackPage.close_track_page() assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name), "Playlist placement wasn't opened", ) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation to the track page and back from playlist placements apple") @allure.description("User should be able to open the track from the placements page and return back") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6951, " "https://data-analytics.atlassian.net/browse/AG-6952") @pytest.mark.smoke def test_navigation_to_the_track_apple(self): track_position_in_full_charts = 1 playlist_position = 1 track_position_in_playlist = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.select_dsp("APPLE MUSIC").open_full_charts().open_track_from_full_charts( track_position_in_full_charts) self.trackPage.open_playlists() playlist_name = self.trackPage.get_playlist_name_by_position(playlist_position) self.trackPage.click_on_playlist_by_position(playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") track_name = self.playlistsPage.get_track_name(track_position_in_playlist) # TODO: find the better way to work with one-word track track_name = track_name.split()[0] self.playlistsPage.click_track_card(track_position_in_playlist) assert_that(self.trackPage.is_track_page_opened(track_name), "Appropriate track wasn't opened") self.trackPage.close_track_page() assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name), "Playlist placement wasn't opened", ) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation to the track page and back from several levels of a track page") @allure.description( "User should be able to open the track from the placements page, go into several levels deep and return back") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6951, " "https://data-analytics.atlassian.net/browse/AG-6952") @pytest.mark.regression def test_navigation_to_the_track_several_levels(self): track_position_in_full_charts = 1 playlist_position = 1 track_position_in_playlist = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().open_track_from_full_charts(track_position_in_full_charts) self.trackPage.open_playlists() playlist_name = self.trackPage.get_playlist_name_by_position(playlist_position) self.trackPage.click_on_playlist_by_position(playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") track_name = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.click_track_card(track_position_in_playlist) assert_that(self.trackPage.is_track_page_opened(track_name), "Appropriate track wasn't opened") self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") track_name = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.click_track_card(track_position_in_playlist) assert_that(self.trackPage.is_track_page_opened(track_name), "Appropriate track wasn't opened") self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened") track_name = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.click_track_card(track_position_in_playlist) assert_that(self.trackPage.is_track_page_opened(track_name), "Appropriate track wasn't opened") self.trackPage.close_track_page() assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name), "Playlist placement wasn't opened", ) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Star/Unstar") @allure.description("User should be able to add track to the starred tracks screen") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-6893") @pytest.mark.smoke def test_star_unstar_track(self): track_name = "drivers license" playlist_position = 1 track_position_in_search = 1 track_position_in_playlist = 1 self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) playlist_track_name = self.playlistsPage.get_track_name(1) self.playlistsPage.swipe_track_in_tracklist(track_position_in_playlist).star_track( track_position_in_playlist).click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_starred(playlist_track_name), "Track wasn't starred").is_true() self.starredPage.select_search_tab() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) self.playlistsPage.swipe_track_in_tracklist(track_position_in_playlist).unstar_track( track_position_in_playlist).click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_unstarred(playlist_track_name), "Track wasn't unstarred").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Star/Unstar Apple") @allure.description("Usershould be able to add track to the starred tracks screen") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-6893") @pytest.mark.smoke def test_star_unstar_track_apple(self): track_name = "drivers license" playlist_position = 1 track_position_in_search = 1 track_position_in_playlist = 1 for track in self.api.apollo.get_starred_tracks()["body"]: self.api.apollo.delete_v1_starred_tracks(track["isrc"]) self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( playlist_position) playlist_track_name = self.playlistsPage.get_track_name(1) # because symbol between artists could be different playlist_track_name = playlist_track_name.replace(" &", ",") self.playlistsPage.swipe_track_in_tracklist(track_position_in_playlist).star_track( track_position_in_playlist).click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_starred(playlist_track_name), "Track wasn't starred").is_true() self.starredPage.select_search_tab() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( playlist_position) self.playlistsPage.swipe_track_in_tracklist(track_position_in_playlist).unstar_track( track_position_in_playlist).click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_unstarred(playlist_track_name), "Track wasn't unstarred").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Track data in header for personalized playlist") @allure.description("The data should be accordingly API sources") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-7162, " "https://data-analytics.atlassian.net/browse/AG-7164") @pytest.mark.smoke def test_header_data_personalized_playlist(self): track_position_in_search = 1 track_name, isrc = next( filter( lambda x: self.data_provider.get_personalized_playlist_data(x[1], "_gl") is not None, self.data_provider.get_top_charts_spotify_tracks_data(), ) ) playlist_id = self.data_provider.get_personalized_playlist_data(isrc, "_gl")[1] playlist_name = self.data_provider.get_personalized_playlist_data(isrc, "_gl")[0] # 6 - days as delta, for 1 week period start_date, end_date = self.data_provider.get_track_start_end_dates(isrc, 6) streams_range = self.data_provider.get_streams_track_data_in_playlist(isrc, "spotify", playlist_id, "global", start_date, end_date) if streams_range: current_range, prev_range = streams_range else: current_range, prev_range = None, None track_data_in_playlist = self.data_provider.get_spotify_track_data_in_playlist(isrc, playlist_id, "global") playlist_name_api = track_data_in_playlist.playlist_name market_api = track_data_in_playlist.track_market updated_date_api = track_data_in_playlist.updated_date added_date_api = track_data_in_playlist.added_date added_date_api = str(added_date_api) self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.open_playlists().search_for_playlist(playlist_name).click_in_playlist_by_text(playlist_name, is_parametrized=True) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() main_track_data = self.playlistsPage.get_main_track_data() header_data = self.playlistsPage.get_header_data() if streams_range: streams_api = DataFormatter.round_streams(current_range) else: streams_api = "N/A" date_range_api = self.data_provider.get_dates_range_from_api_formatted(isrc) assert_that(header_data, "Headers data").described_as("Updated date ").contains(updated_date_api).described_as( "Owner market").contains(market_api).described_as("Playlist name").contains(playlist_name_api) assert_that(main_track_data.lower(), "Main track data").described_as("Streams data").contains( streams_api.lower()).described_as("Added data").contains(added_date_api.lower()).described_as( "Date range").contains(date_range_api) if prev_range is not None: streams_trend = round((current_range - prev_range) / prev_range * 100) assert_that(main_track_data).described_as("Streams trend").contains(str(abs(streams_trend))) streams_ui_info = main_track_data.partition("STREAMS")[2] if streams_trend > 0: icon = "\ue905" elif streams_trend < 0: icon = "\ue902" else: icon = "\ue904" assert_that(streams_ui_info, "Trend icon").contains(icon) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Track data in header for NON personalized playlist Spotify") @allure.description("The data should be accordingly API sources") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-7163, " "https://data-analytics.atlassian.net/browse/AG-7164") @pytest.mark.smoke def test_header_data_non_personalized_playlist(self): test_data = self.data_provider.get_top_charts_spotify_track_data() track_name = test_data[0] isrc = test_data[1] playlist_data = self.data_provider.get_non_personalized_playlist_data(isrc, "global") playlist_id = playlist_data[1] playlist_name = playlist_data[0] # 6 - days delta, for 1 week period start_date = self.data_provider.get_track_start_end_dates(isrc, 6)[0] end_date = self.data_provider.get_track_start_end_dates(isrc, 6)[1] track_streams_data_in_playlists = self.data_provider.get_streams_track_data_in_playlist(isrc, "spotify", playlist_id, "_gl", start_date, end_date) track_data_in_playlists = self.data_provider.get_spotify_track_data_in_playlist(isrc, playlist_id, "global") track_position_in_search = 1 self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.open_playlists().search_for_playlist(playlist_name).click_in_playlist_by_text(playlist_name) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() main_track_data = self.playlistsPage.get_main_track_data() header_data = self.playlistsPage.get_header_data() added_date_api = track_data_in_playlists.days_added updated_date_api = track_data_in_playlists.updated_date market_api = track_data_in_playlists.track_market.upper() playlist_name_api = track_data_in_playlists.playlist_name # track_name_api = track_data_in_playlists[0] date_range_api = self.data_provider.get_dates_range_from_api_formatted(isrc) position_ui_info = main_track_data.partition("STREAMS")[0] streams_ui_info = main_track_data.partition("STREAMS")[2] if track_streams_data_in_playlists: if track_streams_data_in_playlists[0] and track_streams_data_in_playlists[1]: streams_trend = round(((track_streams_data_in_playlists[0] - track_streams_data_in_playlists[1]) / track_streams_data_in_playlists[1]) * 100) streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(main_track_data).described_as("Streams data").contains(streams_api).described_as( "Streams trend").contains(str(DataFormatter.round_streams_trend(abs(streams_trend)))) self.log.info(main_track_data) self.log.info(streams_ui_info) if streams_trend > 0: icon = "\ue905" elif streams_trend < 0: icon = "\ue902" else: icon = "\ue904" assert_that(streams_ui_info).contains(icon) elif track_streams_data_in_playlists[0] and not track_streams_data_in_playlists[1]: streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(main_track_data, "Streams data matching").contains(str(streams_api)) else: assert_that(main_track_data, "Streams data matching").contains("N/A") position_trend_api = track_data_in_playlists.trend_position position_api = track_data_in_playlists.current_position # API returns only positive value so we have to calculate it manually calculated_api_position_trend = track_data_in_playlists[8] assert_that(header_data.lower()).described_as("Updated date").contains(updated_date_api).described_as( "Owner market").contains(market_api.lower()).described_as("Playlist name").contains( playlist_name_api.lower()) assert_that(main_track_data).described_as("Track position").contains(str(abs(position_api))).described_as( "Date range").contains(date_range_api).described_as("Added date").contains(added_date_api).described_as( "Position trend").contains(str(abs(position_trend_api))) if calculated_api_position_trend > 0: icon = "\ue905" elif calculated_api_position_trend < 0: icon = "\ue902" else: icon = "0" assert_that(position_ui_info, "Trend icon").contains(icon) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Track data in header for Apple playlist") @allure.description("The data should be accordingly API sources") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-7163, " "https://data-analytics.atlassian.net/browse/AG-7164") @pytest.mark.smoke def test_header_data_apple_playlist(self): market = "us" top_data = self.data_provider.get_top_charts_apple_track_data(market) isrc = top_data[1] track_name = self.api.apollo.get_list_of_spotify_tracks(f"isrc:{isrc}")["body"]["tracks"]["items"][0]["name"] playlist_data = self.data_provider.get_apple_playlist_data(isrc, market) market = playlist_data[2] all_markets = self.api.apollo.get_markets()["body"] market_ui = "" for m in all_markets: if m["code"] == market.lower(): market_ui = m["name"] playlist_id = playlist_data[1] playlist_name = playlist_data[0] # 6 days delta, for 1 week period start_date = self.data_provider.get_track_start_end_dates(isrc, 6)[0] end_date = self.data_provider.get_track_start_end_dates(isrc, 6)[1] track_streams_data_in_playlists = self.data_provider.get_streams_track_data_in_playlist(isrc, "apple", playlist_id, market, start_date, end_date) track_data_in_playlists = self.data_provider.get_apple_track_data_in_playlist(isrc, playlist_id, market) track_position_in_search = 1 updated_date_api = track_data_in_playlists.updated_date playlist_name_api = playlist_data[0] added_date_api = track_data_in_playlists.days_added if added_date_api >= 365: added_date_api = int(added_date_api / 365) if added_date_api == 1: added_date_api = "1 Year Ago" else: added_date_api = f"{added_date_api} Years Ago" elif added_date_api == 0: added_date_api = "Today" else: added_date_api = f"{added_date_api} Days Ago" # track_name_api = track_data_in_playlists[0] date_range_api = self.data_provider.get_dates_range_from_api_formatted(isrc) self.loginPage.login_as_regular_user().select_profile_tab() self.profilePage.open_markets().select_market_via_search(market_ui) self.searchPage.select_search_tab().search_for(track_name).open_track_page_from_results( track_position_in_search) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().search_for_playlist( playlist_name).click_on_playlist_by_position(1) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() main_track_data = self.playlistsPage.get_main_track_data() header_data = self.playlistsPage.get_header_data() position_trend_api = track_data_in_playlists.trend position_api = track_data_in_playlists.current_position position_ui_info = main_track_data.partition("STREAMS")[0] streams_ui_info = main_track_data.partition("STREAMS")[2] if track_streams_data_in_playlists: if track_streams_data_in_playlists[0] and track_streams_data_in_playlists[1]: streams_trend = ((track_streams_data_in_playlists[0] - track_streams_data_in_playlists[1]) / track_streams_data_in_playlists[1]) * 100 streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(main_track_data).described_as("Streams data").contains(streams_api).described_as( "Streams trend").contains(DataFormatter.round_streams_trend(streams_trend)) if streams_trend > 0: assert "\ue905" in streams_ui_info elif streams_trend < 0: assert "\ue902" in streams_ui_info else: assert "\ue904" in streams_ui_info elif track_streams_data_in_playlists[0] and not track_streams_data_in_playlists[1]: streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(main_track_data, "Streams data matching").contains(str(streams_api)) else: assert_that(main_track_data, "Streams data matching").contains("N/A") assert_that(header_data, "Header data checkups").described_as("Updated date").contains( str(updated_date_api)).described_as("Owner market").contains(market).described_as("Playlist name").contains( playlist_name_api) assert_that(main_track_data.lower(), "Track data checkups").described_as("Position").contains( str(abs(position_api))).described_as("Position trend").contains(str(abs(position_trend_api))).described_as( "Streams data").contains(track_name.lower()).described_as("Date range").contains( date_range_api ).described_as("Added date").contains(added_date_api.lower()) if position_trend_api > 0: icon = "\ue902" elif position_trend_api < 0: icon = "\ue905" else: icon = "\ue904" assert_that(position_ui_info).contains(icon) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Matching data between header and search card item") @allure.description("Content of top header card should match with the on in the search card") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-7154") @pytest.mark.smoke def test_header_and_search_card_data_match_spotify(self): test_playlist_position = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() tracks = self.chartDigestPage.open_full_charts().get_full_charts_tracks() for position, track in enumerate(tracks[:6]): self.chartDigestPage.open_track_from_full_charts(position + 1) assert_that(self.trackPage.is_track_image_displayed(), "Track page wasn't opened").is_true() self.trackPage.open_playlists().click_on_playlist_by_position(test_playlist_position) main_track_string = self.playlistsPage.get_main_track_data_without_position_title_and_date() main_track_data = main_track_string.split() search_string = main_track_string.partition("Added")[0] self.playlistsPage.search_for_track_in_playlists(search_string[:-1]) search_item_data = self.playlistsPage.get_playlists_search_results()[:1] for data in main_track_data: assert_that(str(search_item_data).lower(), "Cards data").contains(data.lower()) self.playlistsPage.click_playlists_search_cancel_button().click_back_button().click_back_button().click_back_button() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Matching data between header and search card item") @allure.description("Content of top header card should match with the on in the search card") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-7154") @pytest.mark.smoke def test_header_and_search_card_data_match_apple(self): test_playlist_position = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() tracks = self.chartDigestPage.select_dsp("APPLE MUSIC").open_full_charts().get_full_charts_tracks() for position, track in enumerate(tracks[:5]): self.chartDigestPage.open_track_from_full_charts(position + 1) assert_that(self.trackPage.is_track_image_displayed(), "Track page wasn't opened").is_true() self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( test_playlist_position) main_track_string = self.playlistsPage.get_main_track_data_without_position_title_and_date() main_track_data = main_track_string.split() search_string = main_track_string.partition("Added")[0] self.playlistsPage.search_for_track_in_playlists(search_string[:-1]) search_item_data = self.playlistsPage.get_playlists_search_results()[:1] for data in main_track_data: assert_that(str(search_item_data).lower(), "Cards data").contains(data.lower()) self.playlistsPage.click_playlists_search_cancel_button().click_back_button().click_back_button().click_back_button() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Star/Unstar") @allure.description("User should be able to add track to the starred tracks screen") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-6893") @pytest.mark.smoke def test_star_unstar_track_search(self): track_name = "drivers license" playlist_position = 1 track_position_in_search = 1 track_position_in_playlist = 1 self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) self.playlistsPage.click_search_field() playlist_track_name = self.playlistsPage.get_track_name(1) self.playlistsPage.swipe_track_in_tracklist(track_position_in_playlist).star_track( track_position_in_playlist).click_playlists_search_cancel_button().click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_starred(playlist_track_name), "Track wasn't starred").is_true() self.starredPage.select_search_tab() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) self.playlistsPage.click_search_field().swipe_track_in_tracklist(track_position_in_playlist).unstar_track( track_position_in_playlist).click_playlists_search_cancel_button().click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_unstarred(playlist_track_name), "Track wasn't unstarred").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Star/Unstar") @allure.description("User should be able to add track to the starred tracks screen") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-6893") @pytest.mark.smoke def test_star_unstar_track_apple_search(self): track_name = "drivers license" playlist_position = 1 track_position_in_search = 1 track_position_in_playlist = 1 for track in self.api.apollo.get_starred_tracks()["body"]: self.api.apollo.delete_v1_starred_tracks(track["isrc"]) self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( playlist_position) self.playlistsPage.click_search_field() playlist_track_name = self.playlistsPage.get_track_name(1) # because artist name could be displayed differently playlist_track_name = playlist_track_name.replace(" &", ",") self.playlistsPage.swipe_track_in_tracklist(track_position_in_playlist).star_track( track_position_in_playlist).click_playlists_search_cancel_button().click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_starred(playlist_track_name), "Track wasn't starred").is_true() self.starredPage.select_search_tab() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( playlist_position) self.playlistsPage.click_search_field().swipe_track_in_tracklist(track_position_in_playlist).unstar_track( track_position_in_playlist).click_playlists_search_cancel_button().click_back_button().click_back_button().click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_unstarred(playlist_track_name), "Track wasn't unstarred").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Pagination") @allure.description("User should be able to scroll tracks on the playlist screen screen") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6896" "https://data-analytics.atlassian.net/browse/AG-6876") @pytest.mark.smoke def test_pagination(self): track_name = "drivers license" playlist_position = 1 track_position_in_search = 1 track_position_in_playlist = 18 self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.open_playlists().click_on_playlist_by_position(playlist_position) wait( lambda: len(self.playlistsPage.lt_search_results.elements) == 20, waiting_for="Playlist search results to be with length 20 ", timeout=30, ) last_track_title = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.scroll_down_to_tracks().scroll_down().scroll_down().scroll_down().scroll_down() wait( lambda: self.playlistsPage.get_track_name(track_position_in_playlist) != last_track_title, waiting_for=f"Page to be scrolled, the last was {last_track_title}", ) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Pagination") @allure.description("User should be able to scroll tracks on the playlist screen screen") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6896" "https://data-analytics.atlassian.net/browse/AG-6876") @pytest.mark.smoke def test_pagination_apple(self): track_name = "drivers license" playlist_position = 1 track_position_in_search = 1 track_position_in_playlist = 18 self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(track_position_in_search) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().click_on_playlist_by_position( playlist_position) assert_that(self.playlistsPage.get_playlists_search_results()).is_length(20) last_track_title = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.scroll_down_to_tracks().scroll_down().scroll_down().scroll_down().scroll_down() new_last_track_title = self.playlistsPage.get_track_name(track_position_in_playlist) assert_that(new_last_track_title, "Pagination check").is_not_equal_to(last_track_title) @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation to the track page and back from playlist placements spotify") @allure.description("User should be able to open the track from the placements page and return back") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6951, " "https://data-analytics.atlassian.net/browse/AG-6952") @pytest.mark.smoke def test_navigation_to_the_track_from_search(self): track_position_in_full_charts = 1 playlist_position = 1 track_position_in_playlist = 1 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().open_track_from_full_charts(track_position_in_full_charts) self.trackPage.open_playlists() playlist_name = self.trackPage.get_playlist_name_by_position(playlist_position) self.trackPage.click_on_playlist_by_position(playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() self.playlistsPage.click_search_field() track_name = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.click_track_card(track_position_in_playlist) assert_that(self.trackPage.is_track_page_opened(track_name), "Appropriate track wasn't opened").is_true() self.trackPage.close_track_page() assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name), "Playlist placement wasn't opened", ).is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-7088") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation to the track page and back from playlist placements spotify") @allure.description("User should be able to open the track from the placements page and return back") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6951, " "https://data-analytics.atlassian.net/browse/AG-6952") @pytest.mark.smoke def test_navigation_to_the_track_from_search_apple(self): track_position_in_full_charts = 1 playlist_position = 1 track_position_in_playlist = 2 self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().open_track_from_full_charts(track_position_in_full_charts) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists() playlist_name = self.trackPage.get_playlist_name_by_position(playlist_position) self.trackPage.click_on_playlist_by_position(playlist_position) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() self.playlistsPage.click_search_field() for i in range(5): track_position_in_playlist += i track_name = self.playlistsPage.get_track_name(track_position_in_playlist) if track_name != "N/A N/A": break else: raise Exception("Couldn't find a track with ISRC") self.playlistsPage.click_track_card(track_position_in_playlist) assert_that(self.trackPage.is_track_page_opened(track_name), "Appropriate track wasn't opened").is_true() self.trackPage.close_track_page() assert_that( self.playlistsPage.is_playlists_placements_page_opened_for_name(playlist_name), "Playlist placement wasn't opened", ).is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-7811") @allure.severity(allure.severity_level.NORMAL) @allure.title("Extended navigation") @pytest.mark.regression def test_extended_navigation_e2e_flow(self): track_name = "Easy On Me" market = ["United States", "US", "Canada", "CA"] self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).lt_track_search_results.select_by_text(track_name) self.trackPage.open_playlists().click_on_playlist_by_position(1) self.playlistsPage.click_track_card_for_sony_track(0) self.trackPage.click_select_market_button().select_market_via_search(market[0]) assert_that(self.trackPage.is_market_selected(market[1], market[0]), "Market is selected").is_true() self.trackPage.open_market_specific_market_detailed_page().open_date_picker() picker_dates = self.trackPage.get_date_picker_dates() self.trackPage.select_12_weeks_date_filter() assert_that(self.trackPage.is_12_weeks_date_filter_applied(picker_dates)).is_true() self.trackPage.open_date_picker().select_2_weeks_date_filter() assert_that(self.trackPage.is_2_weeks_date_filter_applied(picker_dates)).is_true() self.trackPage.open_combined_streams_detailed_view() wait(self.trackPage.is_detailed_streams_overview_opened, waiting_for="Verified detailed view to be opened") self.trackPage.close_streams_overview_detailed_view() self.trackPage.scroll_to_streams_monitoring().click_audience_demographics_tile_1() wait(self.trackPage.is_demographics_popup_opened, waiting_for="Verified demographics popup to be opened") self.trackPage.close_popup_tap_outside() self.trackPage.select_demographics_dsp("APPLE MUSIC").click_audience_demographics_tile_2() wait(self.trackPage.is_demographics_popup_opened, waiting_for="Verified demographics popup to be opened") self.trackPage.close_popup_tap_outside() self.trackPage.select_stream_monitoring_apple_tab().select_stream_monitoring_amazon_tab().select_stream_monitoring_by_dsp_tab() self.trackPage.close_track_page() self.trackPage.click_top_5_show_all() assert_that(self.streamsPage.is_streams_by_markets_opened(), "Show all button is displayed").is_true() self.streamsPage.open_date_picker() assert_that(self.streamsPage.is_date_picker_opened(), "Verified date picker popup is opened").is_true() picker_dates = self.streamsPage.get_date_picker_dates() self.streamsPage.select_1_year_date_filter() assert_that(self.streamsPage.is_1_year_date_filter_applied_top_markets(picker_dates), "Verified filter applied").is_true() self.streamsPage.open_combined_graph_detailed() assert_that(self.streamsPage.is_detailed_combined_graph_opened(), "Verified detailed view is opened").is_true() self.streamsPage.close_combined_graph_detailed().open_all_markets_tab().search_for_market( market[0]).click_all_markets_card() assert_that(self.trackPage.is_market_changed(market[1]), "Verified appropriate market selected on market detailed page").is_true() self.streamsPage.close_track_page().close_track_page() self.trackPage.scroll_to_chart_placements().click_spotify_charts().close_track_page().click_apple_charts().close_track_page() self.trackPage.open_playlists().click_on_playlist_by_position(1) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() self.playlistsPage.close_track_page().close_track_page() if self.trackPage.is_lastes_adds_contains_playlists(): playlist_name = self.trackPage.get_latest_adds_playlist_title(1) self.trackPage.click_on_playlist_from_latest_adds() assert self.playlistsPage.is_playlists_placements_page_opened_for_name( playlist_name), "Appropriate playlist placements page wasn't opened" self.playlistsPage.close_track_page() if self.trackPage.is_top_5_contains_playlists(): playlist_name = self.trackPage.get_top_5_playlist_title() self.trackPage.click_on_playlist_from_top_5() assert self.playlistsPage.is_playlists_placements_page_opened_for_name( playlist_name), "Appropriate playlist placements page wasn't opened" # TRACK 2 self.playlistsPage.close_track_page().close_track_page().click_track_card_for_sony_track(1) self.trackPage.open_market_specific_market_detailed_page().click_market_selector().select_market_via_search( market[2]) assert_that(self.trackPage.is_market_changed(market[3]), "Market is selected").is_true() self.trackPage.open_date_picker() picker_dates = self.trackPage.get_date_picker_dates() self.trackPage.select_12_weeks_date_filter() assert_that(self.trackPage.is_12_weeks_date_filter_applied(picker_dates)).is_true() self.trackPage.open_date_picker().select_2_weeks_date_filter() assert_that(self.trackPage.is_2_weeks_date_filter_applied(picker_dates)).is_true() self.trackPage.open_combined_streams_detailed_view() assert_that(self.trackPage.is_detailed_streams_overview_opened(), "Verified detailed view is opened").is_true() self.trackPage.close_streams_overview_detailed_view() self.trackPage.scroll_to_streams_monitoring().click_audience_demographics_tile_1() assert_that(self.trackPage.is_demographics_popup_opened(), "Verified demographics popup is opened").is_true() self.trackPage.close_popup_tap_outside() self.trackPage.select_demographics_dsp("APPLE MUSIC").click_audience_demographics_tile_2() assert_that(self.trackPage.is_demographics_popup_opened(), "Verified demographics popup is opened").is_true() self.trackPage.close_popup_tap_outside() self.trackPage.select_stream_monitoring_apple_tab().select_stream_monitoring_amazon_tab().select_stream_monitoring_by_dsp_tab() self.trackPage.close_track_page() self.trackPage.click_top_5_show_all() assert_that(self.streamsPage.is_streams_by_markets_opened(), "Show all button is displayed").is_true() self.streamsPage.open_date_picker() assert_that(self.streamsPage.is_date_picker_opened(), "Verified date picker popup is opened").is_true() picker_dates = self.streamsPage.get_date_picker_dates() self.streamsPage.select_1_year_date_filter() assert_that(self.streamsPage.is_1_year_date_filter_applied_top_markets(picker_dates), "Verified filter applied").is_true() self.streamsPage.open_combined_graph_detailed() assert_that(self.streamsPage.is_detailed_combined_graph_opened(), "Verified detailed view is opened").is_true() self.streamsPage.close_combined_graph_detailed().open_all_markets_tab().search_for_market( market[0]).click_all_markets_card() assert_that(self.trackPage.is_market_changed(market[1]), "Verified appropriate market selected on market detailed page").is_true() self.streamsPage.close_track_page().close_track_page() self.trackPage.scroll_to_chart_placements().click_spotify_charts().close_track_page().click_apple_charts().close_track_page() self.trackPage.open_playlists().click_on_playlist_by_position(1) assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlists page wasn't opened").is_true() self.playlistsPage.close_track_page().close_track_page() if self.trackPage.is_lastes_adds_contains_playlists(): playlist_name = self.trackPage.get_latest_adds_playlist_title(1) self.trackPage.click_on_playlist_from_latest_adds() assert self.playlistsPage.is_playlists_placements_page_opened_for_name( playlist_name), "Appropriate playlist placements page wasn't opened" self.playlistsPage.close_track_page() if self.trackPage.is_top_5_contains_playlists(): playlist_name = self.trackPage.get_top_5_playlist_title() self.trackPage.click_on_playlist_from_top_5() assert self.playlistsPage.is_playlists_placements_page_opened_for_name( playlist_name), "Appropriate playlist placements page wasn't opened" @allure.story("https://data-analytics.atlassian.net/browse/AG-7832") @allure.severity(allure.severity_level.NORMAL) @allure.title("Playlists tracklist search results") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-7707") @pytest.mark.smoke def test_playlist_search_results_to_api(self): top_data = self.api.apollo.get_charts_top("spotify", "global", fields="is_sony")["body"]["tracks"] track = next(filter(lambda x: x["is_sony"], top_data)) track_query, track_isrc = track["name"], track["isrc"] # Get playlist id and name playlist_data = self.data_provider.get_non_personalized_playlist_data(track_isrc, "us") playlist_id = playlist_data[1] spotify_playlist_name = playlist_data[0] track_data_in_playlists = self.data_provider.get_spotify_track_data_in_playlist(track_isrc, playlist_id, "global") start_date = self.data_provider.get_track_start_end_dates(track_isrc, 6)[0] end_date = self.data_provider.get_track_start_end_dates(track_isrc, 6)[1] track_streams_data_in_playlists = self.data_provider.get_streams_track_data_in_playlist(track_isrc, "spotify", playlist_id, "_gl", start_date, end_date) self.loginPage.login_as_regular_user() self.searchPage.search_for(track_query).open_track_page_from_results(1) self.trackPage.open_playlists().search_for_playlist(spotify_playlist_name).click_on_playlist_by_position(1) track_data_ui = self.playlistsPage.click_search_field().search_for_track_in_playlists( track_query).get_playlists_search_results()[0] added_date_api = track_data_in_playlists.days_added track_name_api = track_query streams_ui_info = track_data_ui.partition("Ago")[2] if track_streams_data_in_playlists: if track_streams_data_in_playlists[0] and track_streams_data_in_playlists[1]: streams_trend = round(((track_streams_data_in_playlists[0] - track_streams_data_in_playlists[1]) / track_streams_data_in_playlists[1]) * 100) streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(track_data_ui).described_as("Streams data").contains(streams_api).described_as( "Streams trend").contains(str(abs(streams_trend))) if streams_trend > 0: icon = "\ue905" elif streams_trend < 0: icon = "\ue902" else: icon = "\ue904" assert_that(streams_ui_info).contains(icon) elif track_streams_data_in_playlists[0] and not track_streams_data_in_playlists[1]: streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(track_data_ui, "Streams data").contains(str(streams_api)) else: assert_that(track_data_ui, "Streams data").contains("N/A") position_api = track_data_in_playlists.current_position assert_that(track_data_ui).described_as("Position").contains(str(abs(position_api))).described_as( "Track name").contains(track_name_api).described_as("Added date").contains(added_date_api) @allure.story("https://data-analytics.atlassian.net/browse/AG-7832") @allure.severity(allure.severity_level.NORMAL) @allure.title("Playlists tracklist search results") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-7707") @pytest.mark.smoke def test_playlist_search_results_to_api_apple(self): # Get track isrc and name from charts top_data = self.api.apollo.get_charts_top("apple", "us", fields="is_sony")["body"]["tracks"] track_query = self.api.apollo.get_list_of_spotify_tracks(f"isrc:{top_data[0]['isrc']}")["body"]["tracks"]["items"][0]["name"] track_query_full = f"{top_data[0]['artist']} {track_query}" track_isrc = top_data[0]["isrc"] # Get playlist id and name playlist_data = self.data_provider.get_apple_playlist_data(track_isrc, "us") apple_playlist_name = playlist_data[0] playlist_id = playlist_data[1] track_data_in_playlists = self.data_provider.get_apple_track_data_in_playlist(track_isrc, playlist_id, "us") start_date = self.data_provider.get_track_start_end_dates(track_isrc, 6)[0] end_date = self.data_provider.get_track_start_end_dates(track_isrc, 6)[1] track_streams_data_in_playlists = self.data_provider.get_streams_track_data_in_playlist(track_isrc, "apple", playlist_id, "us", start_date, end_date) self.loginPage.login_as_regular_user().select_profile_tab() self.profilePage.open_markets().select_market_via_search("United States").select_search_tab() self.searchPage.search_for(track_query_full).open_track_page_from_results(1) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists().search_for_playlist( apple_playlist_name).click_on_playlist_by_position(1) track_data_ui = self.playlistsPage.click_search_field().search_for_track_in_playlists( top_data[0]["name"]).get_playlists_search_results()[0] added_date_api = str(track_data_in_playlists.days_added) track_name_api = track_query position_trend_api = track_data_in_playlists.trend position_api = track_data_in_playlists.current_position position_ui_info = track_data_ui.partition("Ago")[0] streams_ui_info = track_data_ui.partition("Ago")[2] if track_streams_data_in_playlists: if track_streams_data_in_playlists[0] and track_streams_data_in_playlists[1]: streams_trend = round(((track_streams_data_in_playlists[0] - track_streams_data_in_playlists[1]) / track_streams_data_in_playlists[1]) * 100) streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(track_data_ui).described_as("Streams data").contains(streams_api).described_as( "Streams trend").contains(str(DataFormatter.round_streams_trend(abs(streams_trend)))) if streams_trend > 0: icon = "\ue905" elif streams_trend < 0: icon = "\ue902" else: icon = "\ue904" assert_that(streams_ui_info).contains(icon) elif track_streams_data_in_playlists[0] and not track_streams_data_in_playlists[1]: streams_api = DataFormatter.round_streams(track_streams_data_in_playlists[0]) assert_that(track_data_ui, "Streams data").contains(str(streams_api)) else: assert_that(track_data_ui, "Streams data").contains("N/A") (assert_that(track_data_ui, "Track data"). described_as("Position").contains(str(abs(position_api))). described_as("Trend position").contains(str(abs(position_trend_api))). described_as("Streams data").contains(track_name_api). described_as("Added date").contains(added_date_api)) if position_trend_api < 0: icon = "\ue905" elif position_trend_api > 0: icon = "\ue902" else: icon = "\ue904" assert_that(position_ui_info).contains(icon) @allure.story("https://data-analytics.atlassian.net/browse/AG-7832") @allure.severity(allure.severity_level.NORMAL) @allure.title("Tracks sorting in a playlist on search") @allure.description("User should be able to sort palylists by date and position on search") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-7707") @pytest.mark.smoke def test_search_sorting(self): spotify_playlist_name = "Top Pop Hits" track_query = "Shake It Off" query = "It" self.loginPage.login_as_regular_user() self.searchPage.search_for(track_query).open_track_page_from_results(1) self.trackPage.open_playlists().search_for_playlist(spotify_playlist_name).click_on_playlist_by_position(1) self.playlistsPage.click_sorting_icon() assert_that(self.playlistsPage.is_sorting_popup_opened(), "Sorting pop-up wasn't opened").is_true() self.playlistsPage.select_sorting_by("Newest Adds").click_search_field().search_for_track_in_playlists(query) dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates, "Sorting order is by newest date").is_sorted() assert_that(positions, "Secondary sorting is by the position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("NEWEST ADDS"), "Sorting type isn't displayed").is_true() self.playlistsPage.clear_playlists_search_field() dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates, "Sorting order is by newest date").is_sorted() assert_that(positions, "Secondary sorting is by the position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("NEWEST ADDS"), "Sorting type isn't displayed").is_true() self.playlistsPage.click_playlists_search_cancel_button().click_sorting_icon().select_sorting_by( "Position").click_search_field().search_for_track_in_playlists(query) positions = self.playlistsPage.get_playlist_tracks_positions() assert_that(positions, "Sorting order is by the position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("POSITION"), "Sorting type isn't displayed").is_true() self.playlistsPage.clear_playlists_search_field() positions = self.playlistsPage.get_playlist_tracks_positions() assert_that(positions, "Sorting order is by the position").is_sorted() assert_that(self.playlistsPage.is_selected_sorting_title_displayed("POSITION"), "Sorting type isn't displayed").is_true() self.playlistsPage.click_playlists_search_cancel_button().click_sorting_icon().select_sorting_by( "Oldest Adds").click_search_field().search_for_track_in_playlists(query) dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates, "Dorting order is by th oldest date").is_sorted(reverse=True) assert_that(positions, "Secondary sorting is by the position").is_sorted() self.playlistsPage.clear_playlists_search_field() dates = self.playlistsPage.get_playlist_tracks_added_dates() positions = self.playlistsPage.get_positions_for_secondary_sorting() assert_that(dates, "Dorting order is by th oldest date").is_sorted(reverse=True) assert_that(positions, "Secondary sorting is by the position").is_sorted() @allure.story("https://data-analytics.atlassian.net/browse/AG-7832") @allure.severity(allure.severity_level.NORMAL) @allure.title("Pagination Search") @allure.description("User should be able to scroll tracks on the playlist search screen") @allure.testcase( "https://data-analytics.atlassian.net/browse/AG-6896" "https://data-analytics.atlassian.net/browse/AG-6876") @pytest.mark.smoke def test_pagination_search(self): spotify_playlist_name = "Top Pop Hits" query = "It" track_position_in_playlist = 18 track_query = "Shake It Off" self.loginPage.login_as_regular_user() self.searchPage.search_for(track_query).open_track_page_from_results(1) self.trackPage.open_playlists().search_for_playlist(spotify_playlist_name).click_in_playlist_by_text( spotify_playlist_name) total_tracks = len( self.playlistsPage.click_search_field().search_for_track_in_playlists(query).get_playlists_search_results()) assert_that(total_tracks).is_equal_to(20) last_track_title = self.playlistsPage.get_track_name(track_position_in_playlist) self.playlistsPage.scroll_down_to_tracks().scroll_down().scroll_down().scroll_down().scroll_down() total_number_of_tracks_after_scroll = len(self.playlistsPage.lt_playlist_tracks.texts) new_last_track_title = self.playlistsPage.get_track_name(total_number_of_tracks_after_scroll) assert_that(new_last_track_title, "Pagination check").is_not_equal_to(last_track_title) # self.playlistsPage.clear_playlists_search_field() # last_track_title = self.playlistsPage.get_track_name(track_position_in_playlist) # self.playlistsPage.scroll_down_to_tracks().scroll_down().scroll_down().scroll_down().scroll_down() # new_last_track_title = self.playlistsPage.get_track_name(total_number_of_tracks_after_scroll) # assert_that(new_last_track_title, "Pagination check").is_not_equal_to(last_track_title) @allure.story("https://data-analytics.atlassian.net/browse/AG-7832") @allure.severity(allure.severity_level.NORMAL) @allure.title("Navigation on search") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-7707") @pytest.mark.smoke def test_search_navigation(self): playlist_name = "Top Pop Hits" query = "It" track_position = 1 track_query = "Shake It Off" self.loginPage.login_as_regular_user() self.searchPage.search_for(track_query).open_track_page_from_results(1) self.trackPage.open_playlists().search_for_playlist(playlist_name).click_on_playlist_by_position(1) self.playlistsPage.click_search_field().search_for_track_in_playlists(query) track_name = self.playlistsPage.get_track_name(track_position) self.playlistsPage.click_track_card(track_position) assert_that(self.trackPage.is_track_page_opened(track_name), "Proper track page wasn't opened").is_true() self.trackPage.close_track_page() assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlist placements page isn't displayed").is_true() track_name = self.playlistsPage.get_track_name(track_position) self.playlistsPage.click_search_field().click_track_card(track_position) assert_that(self.trackPage.is_track_page_opened(track_name), "Proper track page wasn't opened").is_true() self.trackPage.close_track_page() assert_that(self.playlistsPage.is_playlists_placements_page_opened(), "Playlist placements page isn't displayed").is_true()