import logging 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.api.constants import APPLE, SPOTIFY from app.src.helpers.api_data_provider import ApiDataProvider 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.profile_page import ProfilePage from app.src.pages.search_page import SearchPage from app.src.pages.starred_page import StarredPage from app.src.pages.track_page import TrackPage @pytest.mark.usefixtures("set_up", "one_time_set_up", "authorized_api") class PlaylistsTest: 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.chartDigestPage = ChartDigestPage(self.driver, authorized_api) self.starredPage = StarredPage(self.driver, authorized_api) self.trackPage = TrackPage(self.driver, authorized_api) self.data_provider = ApiDataProvider(authorized_api) self.profilePage = ProfilePage(self.driver) self.searchPage = SearchPage(self.driver, authorized_api) self.fake = Faker() @pytest.fixture def star_and_unstar_playlists(self): all_starred_playlists = self.api.apollo.get_v1_star_playlist()["body"]["items"] for playlist in all_starred_playlists: self.api.apollo.delete_v1_star_playlist(playlist["id"], playlist["vendor"], playlist["country_code"]) playlists_search_ids = self.api.apollo.get_search_history("playlist", 25)["body"]["items"] apple_ids = [item["id"] for item in playlists_search_ids if item["vendor"] == "apple"] spotify_ids = [item["id"] for item in playlists_search_ids if item["vendor"] == "spotify"] for playlist_id in apple_ids: self.api.apollo.post_v1_star_playlist(playlist_id, "apple", "us") for playlist_id in spotify_ids: self.api.apollo.post_v1_star_playlist(playlist_id, "spotify") yield len(apple_ids + spotify_ids) for playlist_id in apple_ids: self.api.apollo.delete_v1_star_playlist(playlist_id, "apple", "us") for playlist_id in spotify_ids: self.api.apollo.delete_v1_star_playlist(playlist_id, "spotify") @allure.story("https://data-analytics.atlassian.net/browse/AG-5265") @allure.severity(allure.severity_level.NORMAL) @allure.title("Pagination") @allure.description("User should be able to scroll through the playlists") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-1341") @pytest.mark.smoke def test_all_playlists_pagination(self): track_position_in_full_charts = 1 last_playlist_position = 18 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) assert_that(self.trackPage.is_track_page_opened(track_name)).described_as("Verified track page is opened").is_true() self.trackPage.scroll_to_playlists().select_playlist_dsp("APPLE MUSIC").open_playlists() last_playlist = self.trackPage.get_playlist_name_by_position(last_playlist_position) self.trackPage.scroll_on_the_playlists() wait( lambda: self.trackPage.get_playlist_name_by_position(last_playlist_position) != last_playlist, waiting_for="Last track title to be different", ) self.trackPage.click_back_button().scroll_to_playlists().select_playlist_dsp("SPOTIFY").open_playlists() last_playlist = self.trackPage.get_playlist_name_by_position(last_playlist_position) self.trackPage.scroll_on_the_playlists() wait( lambda: self.trackPage.get_playlist_name_by_position(last_playlist_position) != last_playlist, waiting_for="Last track title to be different", ) @allure.story("https://data-analytics.atlassian.net/browse/AG-8527") @allure.severity(allure.severity_level.NORMAL) @allure.title("Pagination") @allure.description("User should be able to scroll through the starred playlists") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-8519") @pytest.mark.smoke def test_starred_playlists_pagination(self, star_and_unstar_playlists): total_number_of_starred_playlists = star_and_unstar_playlists last_playlist_position = total_number_of_starred_playlists self.loginPage.login_as_regular_user().select_starred_tracks_tab() self.starredPage.click_on_playlists_tab() assert_that(self.starredPage.get_starred_playlists_count()).is_equal_to(20) last_playlist_title = self.starredPage.get_starred_playlist_title(20) self.starredPage.scroll_on_the_starred_playlists() assert_that(self.starredPage.get_starred_playlists_count()).is_equal_to(total_number_of_starred_playlists) new_last_playlist_title = self.starredPage.get_starred_playlist_title(last_playlist_position) assert_that(new_last_playlist_title).described_as("Pagination checking").is_not_equal_to(last_playlist_title) @allure.story("https://data-analytics.atlassian.net/browse/AG-5265") @allure.severity(allure.severity_level.NORMAL) @allure.title("Search") @allure.description("User should be able to find a playlist via search field") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-4666," "https://data-analytics.atlassian.net/browse/AG-4661") @pytest.mark.smoke def test_all_playlists_search(self): query = "Top" 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) assert_that(self.trackPage.is_track_page_opened(track_name), "track page is opened").is_true() self.trackPage.scroll_to_playlists().select_playlist_dsp("APPLE MUSIC").open_playlists().search_for_playlist(query) results = self.trackPage.get_playlists_search_results() assert_that(self.trackPage.is_search_value_in_list(query, results), "Search results include the search query").is_true() self.trackPage.click_back_button().scroll_to_playlists().select_playlist_dsp("SPOTIFY").open_playlists().search_for_playlist(query) results = self.trackPage.get_playlists_search_results() assert_that(self.trackPage.is_search_value_in_list(query, results), "Search results includes the search query").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-7599") @allure.severity(allure.severity_level.NORMAL) @allure.title("Verification for trends icons") @allure.description("Trends icons should has relevant direction accordingly to API data") @pytest.mark.smoke def test_trends_icons_spotify(self): test_data = self.data_provider.get_top_charts_spotify_track_data() track_name = test_data[0] isrc = test_data[1] playlist_data = self.api.gate.get_playlists_by_track(isrc, SPOTIFY, limit=5).items self.loginPage.login_as_regular_user() self.searchPage.search_for(track_name).open_track_page_from_results(1) self.trackPage.open_playlists() for item in playlist_data: position = ( next( filter( lambda x: x[1].id == item.id, enumerate(self.api.gate.get_playlists_by_track(isrc, SPOTIFY, search=item.name).items), ) )[0] + 1 ) if not item.personalized: self.trackPage.search_for_playlist(item.name) playlist_ui_data = self.trackPage.get_playlist_data_by_position(position) if not item.trend: assert_that(playlist_ui_data).is_not_in(["\ue902", "\ue905", "\ue904"]) continue if item.trend > 0: icon = "\ue902" elif item.trend < 0: icon = "\ue905" elif item.trend == 0: icon = "\ue904" assert_that(playlist_ui_data).described_as("Trend icon is wrong").contains(icon) @allure.story("https://data-analytics.atlassian.net/browse/AG-7599") @allure.severity(allure.severity_level.NORMAL) @allure.title("Verification for trends icons") @allure.description("Trends icons should has relevant direction accordingly to API data") @pytest.mark.smoke def test_trends_icons_apple(self): playlist_position = 1 test_data = self.data_provider.get_top_charts_apple_track_data() isrc = test_data[1] track_name = self.api.apollo.get_list_of_spotify_tracks(f"isrc:{isrc}")["body"]["tracks"]["items"][0]["name"] market = ["Australia", "au"] playlist_data = self.api.gate.get_playlists_by_track(isrc, APPLE, market=market[1], limit=5).items self.loginPage.login_as_regular_user() self.profilePage.open_profile_screen_and_select_market(market[0]).select_search_tab() self.searchPage.search_for(track_name).open_track_page_from_results(1) self.trackPage.select_playlist_dsp("APPLE MUSIC").open_playlists() for playlist in playlist_data: self.trackPage.search_for_playlist(playlist.name) playlist_ui_data = self.trackPage.get_playlist_data_by_position(playlist_position) if not playlist.trend: assert_that(playlist_ui_data).is_not_in(["\ue902", "\ue905", "\ue904"]) continue elif playlist.trend > 0: icon = "\ue902" elif playlist.trend < 0: icon = "\ue905" elif playlist.trend == 0: icon = "\ue904" assert_that(playlist_ui_data).contains(icon)