import unittest import allure import pytest from assertpy import assert_that from faker import Faker from app.src.helpers.api_data_provider import ApiDataProvider from app.src.helpers.data_formaters import DataFormatter 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.starred_page import StarredPage from app.src.pages.track_page import TrackPage @pytest.mark.usefixtures("set_up", "one_time_set_up", "authorized_api") class FullChartsTest(unittest.TestCase): @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.profilePage = ProfilePage(self.driver) self.apiHelper = ApiDataProvider(authorized_api) self.fake = Faker() @allure.story("https://data-analytics.atlassian.net/browse/AG-4992") @allure.severity(allure.severity_level.NORMAL) @allure.title("Star/Unstar tracks") @allure.description("User should be able to star/unstar tracks from the full charts") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2011," "https://data-analytics.atlassian.net/browse/AG-2012") @pytest.mark.smoke def test_starring_full_charts(self): market = "France" self.loginPage.login_as_regular_user() self.profilePage.open_profile_screen_and_select_market(market).select_chart_digest_tab() self.chartDigestPage.open_full_charts() track_name_spotify = self.chartDigestPage.get_full_charts_track_title(1) self.chartDigestPage.swipe_track_full_charts(1).star_on_full_charts(1).click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_starred(track_name_spotify), "Track is NOT added to the starred tracks screen").is_true() self.starredPage.select_chart_digest_tab() self.chartDigestPage.open_full_charts().swipe_track_full_charts(1).unstar_on_full_charts(1).click_back_button().select_starred_tracks_tab() assert_that( self.starredPage.is_track_unstarred(track_name_spotify), "Track is NOT removed from the starred tracks screen", ).is_true() self.starredPage.select_chart_digest_tab() self.chartDigestPage.open_full_charts().select_dsp("APPLE MUSIC") track_name_apple = self.chartDigestPage.get_full_charts_track_title(1) self.chartDigestPage.swipe_track_full_charts(1).star_on_full_charts(1).click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_starred(track_name_apple), "Track is NOT added to the starred tracks screen").is_true() self.starredPage.select_chart_digest_tab() self.chartDigestPage.open_full_charts().select_dsp("APPLE MUSIC").swipe_track_full_charts(1).unstar_on_full_charts(1).click_back_button().select_starred_tracks_tab() assert_that(self.starredPage.is_track_unstarred(track_name_apple), "Track is NOT removed from the starred tracks screen").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-4992") @allure.severity(allure.severity_level.NORMAL) @allure.title("Filter tracks by Sony") @allure.description("User should be able to see only Sony/Non-Sony tracks") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2013" "https://data-analytics.atlassian.net/browse/AG-5901") @pytest.mark.smoke def test_sony_filtering_spotify(self): self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().click_filter_selection().close_popup_tap_outside() top_data = self.api.apollo.get_charts_top("spotify", "global", fields="is_sony")["body"]["tracks"] all_track_names = [i["name"] for i in top_data] sony_track_names = [i["name"] for i in top_data if i["distributed_by"] == "sme"] theorchard_track_names = [i["name"] for i in top_data if i["distributed_by"] == "theorchard"] awal_track_names = [i["name"] for i in top_data if i["distributed_by"] == "awal"] for api_track, ui_track in zip(all_track_names, self.chartDigestPage.get_full_charts_search_results()): assert_that(ui_track).contains(api_track) self.chartDigestPage.click_filter_selection().select_filter({"Sony"}) for api_track, ui_track in zip(sony_track_names, self.chartDigestPage.get_full_charts_search_results()): assert_that(ui_track).contains(api_track) self.chartDigestPage.click_filter_selection().select_filter({"Awal", "Non-Sony"}) for api_track, ui_track in zip(theorchard_track_names, self.chartDigestPage.get_full_charts_search_results()): assert_that(ui_track).contains(api_track) self.chartDigestPage.click_filter_selection().select_filter({"Sony", "Non-Sony"}) for api_track, ui_track in zip(awal_track_names, self.chartDigestPage.get_full_charts_search_results()): assert_that(ui_track).contains(api_track) @allure.story("https://data-analytics.atlassian.net/browse/AG-4992") @allure.severity(allure.severity_level.NORMAL) @allure.title("Filter tracks by Sony") @allure.description("User should be able to see only Sony/Non-Sony tracks") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2013") @pytest.mark.smoke def test_sony_filtering_apple(self): self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts() top_data = self.api.apollo.get_charts_top("spotify", "global", fields="is_sony")["body"]["tracks"] non_sony_track_names = [i["name"] for i in top_data if i["distributed_by"] is None] self.chartDigestPage.click_filter_selection().select_filter({"Non-Sony"}) for api_track, ui_track in zip(non_sony_track_names, self.chartDigestPage.get_full_charts_search_results()): assert_that(ui_track).contains(api_track) @allure.story("https://data-analytics.atlassian.net/browse/AG-4992") @allure.severity(allure.severity_level.NORMAL) @allure.title("Search by track title") @allure.description("User should be able to search by track title on full charts and search should be saved on navigation back " "from the track page") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2016" "https://data-analytics.atlassian.net/browse/AG-2018") @pytest.mark.smoke def test_search_track_title(self): track_title_spotify = self.apiHelper.get_spotify_charts_artist_track_streams()[1] track_title_apple = self.apiHelper.get_apple_charts_artist_track()[1] self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().search_track_in_full_charts(track_title_spotify) results = self.chartDigestPage.get_full_charts_search_results() assert_that( self.chartDigestPage.is_search_value_in_list(track_title_spotify, results), "Search results don't include the search query", ).is_true() self.chartDigestPage.open_track_from_full_charts(1).click_back_button() results = self.chartDigestPage.get_full_charts_search_results() assert_that(self.chartDigestPage.is_search_value_in_list(track_title_spotify, results), "Search wasn't saved").is_true() self.chartDigestPage.click_back_button().select_dsp("APPLE MUSIC").open_full_charts().search_track_in_full_charts(track_title_apple) results = self.chartDigestPage.get_full_charts_search_results() assert_that( self.chartDigestPage.is_search_value_in_list(track_title_apple, results), "Search results don't include the search query", ).is_true() self.chartDigestPage.open_track_from_full_charts(1).click_back_button() results = self.chartDigestPage.get_full_charts_search_results() assert_that(self.chartDigestPage.is_search_value_in_list(track_title_apple, results), "Search wasn't saved").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-4992") @allure.severity(allure.severity_level.NORMAL) @allure.title("Search by artist") @allure.description("User should be able to search by artist on full charts") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2017") @pytest.mark.smoke def test_search_track_artist(self): artist_spotify = self.apiHelper.get_spotify_charts_artist_track_streams()[0] artist_apple = self.apiHelper.get_apple_charts_artist_track()[0] self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().search_track_in_full_charts(artist_spotify) results = self.chartDigestPage.get_full_charts_search_results() assert_that( self.chartDigestPage.is_search_value_in_list(artist_spotify, results), "Search results don't include the search query", ).is_true() self.chartDigestPage.click_back_button().select_dsp("APPLE MUSIC").open_full_charts().search_track_in_full_charts(artist_apple) results = self.chartDigestPage.get_full_charts_search_results() assert_that( self.chartDigestPage.is_search_value_in_list(artist_apple, results), "Search results don't include the search query", ).is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-4992") @allure.severity(allure.severity_level.NORMAL) @allure.title("Open track") @allure.description("User should be able to open track from the full charts") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2075") @pytest.mark.smoke def test_track_opening(self): self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts() track_name_spotify = self.chartDigestPage.get_full_charts_track_title(1) self.chartDigestPage.open_track_from_full_charts(1) assert_that(self.trackPage.is_track_page_opened(track_name_spotify), "Track page wasn't successfully opened").is_true() self.chartDigestPage.click_back_button().click_back_button().select_dsp("APPLE MUSIC").open_full_charts() track_name_apple = self.chartDigestPage.get_full_charts_track_title(1) self.chartDigestPage.open_track_from_full_charts(1) assert_that(self.trackPage.is_track_page_opened(track_name_apple), "Track page wasn't successfully opened").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-4992") @allure.severity(allure.severity_level.NORMAL) @allure.title("Full charts scrolling") @allure.description("User should be able to scroll tracks on the full charts") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2062") @pytest.mark.smoke def test_full_charts_scrolling(self): self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts() track_name = self.chartDigestPage.get_full_charts_track_title(19) self.chartDigestPage.scroll_down_full_charts() scrolled_track_name = self.chartDigestPage.get_full_charts_track_title(19) assert_that(scrolled_track_name).described_as("Page scrolling").is_not_equal_to(track_name) self.chartDigestPage.select_dsp("APPLE MUSIC") track_name = self.chartDigestPage.get_full_charts_track_title(19) self.chartDigestPage.scroll_down_full_charts() scrolled_track_name = self.chartDigestPage.get_full_charts_track_title(19) assert_that(scrolled_track_name).described_as("Page scrolling").is_not_equal_to(track_name) @allure.story("https://data-analytics.atlassian.net/browse/AG-6804") @allure.severity(allure.severity_level.NORMAL) @allure.title("Streams Volume") @allure.description("Streams volume calculation for Spotify and no streams data for Apple") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2592" "https://data-analytics.atlassian.net/browse/AG-2602" "https://data-analytics.atlassian.net/browse/AG-3027") @pytest.mark.regression def test_streams_volume(self): spotify_data = self.apiHelper.get_spotify_charts_artist_track_streams() spotify_track_name = spotify_data[1] spotify_streams_count = spotify_data[2] apple_data = self.apiHelper.get_apple_charts_artist_track() apple_track_name = apple_data[1] self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().search_track_in_full_charts(spotify_track_name) spotify_track_info = self.chartDigestPage.get_full_charts_track_info(1) rounded_streams = DataFormatter.round_streams(spotify_streams_count) assert_that(spotify_track_info).described_as("Matching stream value with API").contains(rounded_streams) self.chartDigestPage.select_dsp("APPLE MUSIC").search_track_in_full_charts(apple_track_name) apple_track_info = self.chartDigestPage.get_full_charts_track_info(1) assert_that(apple_track_info).described_as("Streams info in apple dsp").does_not_contain("STREAMS") @allure.story("https://data-analytics.atlassian.net/browse/AG-6804") @allure.severity(allure.severity_level.NORMAL) @allure.title("Sorting") @allure.description("Tracks should be sorted by charts position") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2006" "https://data-analytics.atlassian.net/browse/AG-2007") @pytest.mark.regression def test_tracks_sorting(self): self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts() track_1, track_4, track_7 = map(self.chartDigestPage.get_full_charts_track_info, [1, 4, 7]) assert_that(track_1).described_as("Sorting order").contains("#1") assert_that(track_4).described_as("Sorting order").contains("#4") assert_that(track_7).described_as("Sorting order").contains("#7") self.chartDigestPage.select_dsp("APPLE MUSIC") track_1, track_4, track_7 = map(self.chartDigestPage.get_full_charts_track_info, [1, 4, 7]) assert_that(track_1).described_as("Sorting order").contains("#1") assert_that(track_4).described_as("Sorting order").contains("#4") assert_that(track_7).described_as("Sorting order").contains("#7") @allure.story("https://data-analytics.atlassian.net/browse/AG-6804") @allure.severity(allure.severity_level.NORMAL) @allure.title("Switching tabs with saved filtering") @allure.description("Sony filter state should be saved") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2015") @pytest.mark.regression def test_saved_sony_filtering(self): self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts() assert_that(self.chartDigestPage.is_header_contains_vendors(["All Tracks"])).is_true() self.chartDigestPage.select_dsp("APPLE MUSIC") assert_that(self.chartDigestPage.is_header_contains_vendors(["All Tracks"])).is_true() self.chartDigestPage.click_filter_selection().select_filter({"Non-Sony"}) assert_that(self.chartDigestPage.is_header_contains_vendors(["Non-Sony"])).is_true() self.chartDigestPage.select_dsp("SPOTIFY") assert_that(self.chartDigestPage.is_header_contains_vendors(["Non-Sony"])).is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-6804") @allure.severity(allure.severity_level.NORMAL) @allure.title("Search init with 1 special char and empty state") @allure.description("One char should initiate search") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2025" "https://data-analytics.atlassian.net/browse/AG-2023" "https://data-analytics.atlassian.net/browse/AG-2019" "https://data-analytics.atlassian.net/browse/AG-2027") @pytest.mark.regression def test_search_init_special_char_empty_state(self): query = "\u2764" self.loginPage.login_as_regular_user().select_chart_digest_tab() self.chartDigestPage.open_full_charts().search_track_in_full_charts(query) assert_that(self.chartDigestPage.are_no_search_results_displayed(), "Empty state isn't shown").is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-6804") @allure.severity(allure.severity_level.NORMAL) @allure.title("Empty state") @allure.description("No charts message when data isn't available for market") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2301" "https://data-analytics.atlassian.net/browse/AG-2302") @pytest.mark.regression def test_chart_empty_state(self): market_without_spotify = "China" market_without_apple = "Iceland" self.loginPage.login_as_regular_user().select_profile_tab() self.profilePage.open_profile_screen_and_select_market(market_without_spotify).select_chart_digest_tab() self.chartDigestPage.select_dsp("APPLE MUSIC").open_full_charts().select_dsp("SPOTIFY") assert_that( self.chartDigestPage.is_full_charts_no_spotify_data_message_displayed(), "No spotify data message wasn't displayed", ).is_true() self.chartDigestPage.click_back_button().select_profile_tab() self.profilePage.open_profile_screen_and_select_market(market_without_apple).select_chart_digest_tab() self.chartDigestPage.select_dsp("SPOTIFY").open_full_charts().select_dsp("APPLE MUSIC") assert_that( self.chartDigestPage.is_full_charts_no_apple_data_message_displayed(), "No apple data message wasn't displayed", ).is_true() @allure.story("https://data-analytics.atlassian.net/browse/AG-6804") @allure.severity(allure.severity_level.NORMAL) @allure.title("Charts tooltip") @allure.description("Tooltip message for available and not available market data") @allure.testcase("https://data-analytics.atlassian.net/browse/AG-2030" "https://data-analytics.atlassian.net/browse/AG-2881") @pytest.mark.regression def test_tooltips_message(self): market_1 = ["China", "cn"] market_2 = ["Iceland", "is"] self.loginPage.login_as_regular_user().select_profile_tab() self.profilePage.open_profile_screen_and_select_market(market_1[0]).select_chart_digest_tab() self.chartDigestPage.select_dsp("APPLE MUSIC").open_full_charts().click_charts_tooltip() assert_that( self.chartDigestPage.is_full_charts_apple_available_market_data_tooltip_msg_displayed(market_1[1]), "Proper apple music tooltip message isn't displayed", ).is_true() self.chartDigestPage.close_popup_tap_outside().select_dsp("SPOTIFY").click_charts_tooltip() assert_that( self.chartDigestPage.is_full_charts_unavailable_market_data_tooltip_msg_displayed(), "Proper apple music tooltip message isn't displayed", ).is_true() self.chartDigestPage.close_popup_tap_outside().click_back_button().select_profile_tab() self.profilePage.open_profile_screen_and_select_market(market_2[0]).select_chart_digest_tab() self.chartDigestPage.select_dsp("SPOTIFY").open_full_charts().click_charts_tooltip() assert_that( self.chartDigestPage.is_full_charts_spotify_available_market_data_tooltip_msg_displayed(market_2[1]), "Proper spotify music tooltip message isn't displayed", ).is_true() self.chartDigestPage.close_popup_tap_outside().select_dsp("APPLE MUSIC").click_charts_tooltip() assert_that( self.chartDigestPage.is_full_charts_unavailable_market_data_tooltip_msg_displayed(), "Proper spotify music tooltip message isn't displayed", ).is_true()