import datetime import logging import unittest import allure import pytest from assertpy import assert_that from parameterized import parameterized from ui_automation_framework.core import TestStatus from ui_automation_framework.utils import AppConfig from ui_automation_framework.utils import logger as cl from app.api_client import ApiClient from app.src.pages.chart_digest import ChartDigestPage from app.src.pages.left_navigation_panel import LeftNavigationPanel from app.src.pages.login_page import LoginPage from app.src.pages.track_page import TrackPage @pytest.mark.usefixtures("set_up", "one_time_set_up") class TopChartsPageTest(unittest.TestCase): log = cl.Logger(logging.DEBUG) @pytest.fixture(autouse=True) def classSetup(self): self.loginPage = LoginPage(self.driver) self.left_panel = LeftNavigationPanel(self.driver) self.chart_digest = ChartDigestPage(self.driver) self.trackPage = TrackPage(self.driver) self.api_client = ApiClient() self.ts = TestStatus(self.driver) @parameterized.expand(["us", "argentina", "albania"]) @allure.story("AP-680") @allure.severity(allure.severity_level.NORMAL) @allure.title("Verification of the 'Chart Changes' section for Spotify tracks") @allure.description("""TC verify functionality of the Chart Changes section, that it works as expected for Top 200 Spotify Tracks.""") def test_cc_spotify(self, m): user = self.loginPage.get_user_email_with_worker() token = self.api_client.authorize(user=user) self.loginPage.login_with_worker() self.loginPage.is_logged_in() self.left_panel.open_chart_digest_page() self.chart_digest.is_opened() self.trackPage.select_market(AppConfig.get("market")[m]["name"]) self.chart_digest.scroll_to_section(table=self.chart_digest.CHART_CHANGES) # step 1 self.chart_digest.select_tab(self.chart_digest.TAB_SPOTIFY) # step 2 self.chart_digest.cc_verify_header_and_icon() # step 3 self.chart_digest.verify_title_hover(table=self.chart_digest.CHART_CHANGES, tab=self.chart_digest.TAB_SPOTIFY) # step 4-6, 9-10, 12, 16-17 chart_date_api = self.api_client.get_vendor_api_tracks(vendor=self.chart_digest.TAB_SPOTIFY, market=AppConfig.get("market")[m]["market"], token=token)["chart_date"] if chart_date_api == "": count_cc_tracks = 0 else: entries_api = self.api_client.get_charts_additions(vendor=self.chart_digest.TAB_SPOTIFY, market=AppConfig.get("market")[m]["market"], date=chart_date_api, token=token)["tracks"] exits_api = self.api_client.get_charts_removals(vendor=self.chart_digest.TAB_SPOTIFY, market=AppConfig.get("market")[m]["market"], date=chart_date_api, token=token)["tracks"] count_cc_tracks = len(entries_api) + len(exits_api) self.chart_digest.verify_show_all_button(count_entries=len(entries_api), count_exits=len(exits_api)) self.chart_digest.log.info("Tracks count: " + str(count_cc_tracks)) if count_cc_tracks == 0: # step 15 self.chart_digest.verify_empty_chart_changes() else: cc_ui = self.chart_digest.cc_section_verify_elements() # step 7-8 entries = entries_api[:3] exits = exits_api[:3] cc_names = [entries_api[n]["name"] for n in range(len(entries))] + [exits_api[n]["name"] for n in range(len(exits))] # cc_artists = [entries_api[a]['artists'][b]['name'] for a in range(len(entries)) for b in range(len(entries_api[a]['artists']))] + \ # [exits_api[a]['artists'][b]['name'] for a in range(len(exits)) for b in range(len(exits_api[a]['artists']))] cc_artists = [] for a in range(len(entries)): for b in range(len(entries_api[a]["artists"])): if ", " in entries_api[a]["artists"][b]["name"]: cc_artists.extend(entries_api[a]["artists"][b]["name"].split(", ")) else: cc_artists.append(entries_api[a]["artists"][b]["name"]) for a in range(len(exits)): for b in range(len(exits_api[a]["artists"])): if ", " in exits_api[a]["artists"][b]["name"]: cc_artists.extend(exits_api[a]["artists"][b]["name"].split(", ")) else: cc_artists.append(exits_api[a]["artists"][b]["name"]) cc_positions = [entries_api[n]["position"] for n in range(len(entries))] + [exits_api[n]["position"] for n in range(len(exits))] artists_list = [str(a).split(", ") for a in cc_ui["artists"]] artists_ui = [a for l in artists_list for a in l] assert_that(cc_names).is_equal_to(cc_ui["names"]) assert_that(cc_artists).is_equal_to(artists_ui) assert_that(cc_positions).is_equal_to(cc_ui["positions"]) # step 11 self.chart_digest.click_element(element=cc_ui["names_el"][0]) title = self.trackPage.get_track_title() self.ts.markFinal(title == cc_ui["names"][0], "title is correct: {}".format(title)) # step 13 chart_date = datetime.datetime.strptime(chart_date_api, "%Y-%m-%d").date() previous_chart_date = chart_date - datetime.timedelta(days=1) last_available_chart_info = self.api_client.get_charts_tracks(vendor=self.chart_digest.TAB_SPOTIFY, market=AppConfig.get("market")[m]["market"], date=chart_date_api, type="daily")["tracks"] previous_chart_info = self.api_client.get_charts_tracks(vendor=self.chart_digest.TAB_SPOTIFY, market=AppConfig.get("market")[m]["market"], date=str(previous_chart_date), type="daily")["tracks"] last_available_chart_tracks_names = [last_available_chart_info[n]["name"] for n in range(len(last_available_chart_info))] last_available_chart_tracks_positions = [last_available_chart_info[n]["position"] for n in range(len(last_available_chart_info))] previous_chart_tracks_names = [previous_chart_info[n]["name"] for n in range(len(previous_chart_info))] previous_chart_tracks_position = [previous_chart_info[n]["position"] for n in range(len(previous_chart_info))] entries_names = [entries_api[n]["name"] for n in range(len(entries))] exits_names = [exits_api[n]["name"] for n in range(len(exits))] entries_positions = [entries_api[n]["position"] for n in range(len(entries))] exits_positions = [exits_api[n]["position"] for n in range(len(exits))] assert_that(entries_names).is_subset_of(last_available_chart_tracks_names) assert_that(entries_positions).is_subset_of(last_available_chart_tracks_positions) assert_that(exits_names).is_subset_of(previous_chart_tracks_names) assert_that(exits_positions).is_subset_of(previous_chart_tracks_position)