import datetime import json import unittest from argparse import Namespace import allure import pytest from ui_automation_framework.core import TestStatus from ui_automation_framework.utils import AppConfig from app.api_client import ApiClient from app.mysql_db_client_custom import MySqlClient from ...pages.add_track_popup import AddTrackPopup from ...pages.comparison_page import TrackComparisonPage from ...pages.left_navigation_panel import LeftNavigationPanel from ...pages.login_page import LoginPage from ...pages.track_page import TrackPage @pytest.mark.usefixtures("set_up", "one_time_set_up") class ComparisonPlaylistSupportTest(unittest.TestCase): track3 = json.loads(json.dumps(AppConfig.get("track3")), object_hook=lambda d: Namespace(**d)) track14 = json.loads(json.dumps(AppConfig.get("track14")), object_hook=lambda d: Namespace(**d)) playlist11 = json.loads(json.dumps(AppConfig.get("playlist11")), object_hook=lambda d: Namespace(**d)) us = json.loads(json.dumps(AppConfig.get("market")["us"]), object_hook=lambda d: Namespace(**d)) uk = json.loads(json.dumps(AppConfig.get("market")["uk"]), object_hook=lambda d: Namespace(**d)) global_market = json.loads(json.dumps(AppConfig.get("market")["global"]), object_hook=lambda d: Namespace(**d)) periods = [["14 Days", 14], ["28 Days", 28], ["8 Weeks", 56], ["12 Weeks", 84], ["6 Months", 182], ["1 Year", 365]] @pytest.fixture(autouse=True) def classSetup(self): self.loginPage = LoginPage(self.driver) self.trackPage = TrackPage(self.driver) self.add_track_popup = AddTrackPopup(self.driver) self.comparison_page = TrackComparisonPage(self.driver) self.left_panel = LeftNavigationPanel(self.driver) self.api_client = ApiClient() self.sql_client = MySqlClient() self.ts = TestStatus(self.driver) @allure.story("AP-3115") @allure.severity(allure.severity_level.NORMAL) @allure.title( """Playlist Support: Displaying of the top Apple playlists according to the selected period STEP 1-7""" ) @allure.description( """TC verifies that a user can see only limited number of top Apple playlists on Playlist Support section that is corresponded to the selected period. For instance, a user selected 14 days period. BE should define track’s first date (01.01.20) and add 14 days period (15.01.20). Playlists that have track’s life circle periods during this period 01.01.20 - 15.01.20 will be displayed only in Playlist support section. This calculation should be applied for every added track and doesn’t depend on each other. STEP 1-7""" ) def test_displaying_top_apple_playlists_due_to_selected_period_step_1_7(self): self.comparison_page.remove_tracks_if_present_with_worker(self.us.market) user = self.loginPage.get_user_email_with_worker() token = self.api_client.authorize(user=user) self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=self.track3.isrc, id=self.track3.id) self.loginPage.login_with_worker() self.loginPage.is_logged_in() self.left_panel.open_comparison_page() self.comparison_page.wait_for_stream_performance_graph_visible() self.comparison_page.select_market_from_dd(self.us.name) self.comparison_page.wait_for_stream_performance_graph_visible() first_date = self.comparison_page.get_api_first_date_all_dsp(isrc=self.track3.isrc) self.ts.markFinal( first_date == datetime.datetime.strptime(self.track3.dates.f_date, "%Y-%m-%d").date(), "STEP 1-3: first date is: {}".format(first_date), ) for period in self.periods: self.comparison_page.select_period_from_dd(period[0]) self.comparison_page.playlist_details_select_dsp_from_dd(AppConfig.get("dsp")["apple"]) title_ids_api = self.comparison_page.get_playlists_from_local_market_api_get( apple_spotify="apple", period=period[1], tracks=[self.track3.apple_id], param="id", market=self.us.market, ) title_names_api = self.comparison_page.get_playlists_from_local_market_api_get( apple_spotify="apple", period=period[1], tracks=[self.track3.apple_id], param="name", market=self.us.market, ) title_index = int(title_ids_api.index(self.playlist11.apple_id)) + 1 added_date_ui = self.comparison_page.get_tooltip_info_for_track_and_title(1, title_index, "added", self.playlist11.name) removed_date_ui = self.comparison_page.get_tooltip_info_for_track_and_title(1, title_index, "removed", self.playlist11.name) periods_api = self.api_client.get_playlist_track_history_with_period_for_track_for_market( apple_spotify="apple", period=period[1], track=[self.track3.apple_id], token=token, market=self.us.market, )[ title_index - 1 ]["tracks"][ 0 ]["periods"] added_api = [] removed_api = [] for p in periods_api: added_api.append(datetime.datetime.strptime(p[0], "%Y-%m-%d").date()) removed_api.append(datetime.datetime.strptime(p[1], "%Y-%m-%d").date()) added_db = self.sql_client.select_date_track_life_circle_playlist_apple( isrc=self.track3.isrc, playlist_id=self.playlist11.apple_id, interval=period[1], column="EntryDate", country=self.us.market, ) removed_db = self.sql_client.select_date_track_life_circle_playlist_apple( isrc=self.track3.isrc, playlist_id=self.playlist11.apple_id, interval=period[1], column="ExitDate", country=self.us.market, ) names_ui = self.comparison_page.get_playlist_details_names() ids_db = self.sql_client.get_playlist_ids_apple_for_track(isrc=self.track3.isrc, exit_date=self.track3.dates.f_date, period=period[1], country=self.us.market) self.ts.markFinal( added_db == added_api == added_date_ui, "STEP 4-7: added dates match ui, api, db for period: {}".format(period[0]), ) self.ts.markFinal(removed_db == removed_api == removed_date_ui, "removed dates match ui, api, db") self.ts.markFinal(names_ui == title_names_api, "api and ui titles match") self.ts.markFinal(set(ids_db) == set(title_ids_api), "api and db ids match") @allure.story("AP-3115") @allure.severity(allure.severity_level.NORMAL) @allure.title( """Playlist Support: Displaying of the top Apple playlists according to the selected period STEP 8-9""" ) @allure.description( """TC verifies that a user can see only limited number of top Apple playlists on Playlist Support section that is corresponded to the selected period. For instance, a user selected 14 days period. BE should define track’s first date (01.01.20) and add 14 days period (15.01.20). Playlists that have track’s life circle periods during this period 01.01.20 - 15.01.20 will be displayed only in Playlist support section. This calculation should be applied for every added track and doesn’t depend on each other. STEP 8-9""" ) def test_displaying_top_apple_playlists_due_to_selected_period_step_8_9(self): self.comparison_page.remove_tracks_if_present_with_worker(self.us.market) user = self.loginPage.get_user_email_with_worker() token = self.api_client.authorize(user=user) track_list = [self.track3, self.track14] for track in track_list: self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=track.isrc, id=track.id) self.loginPage.login_with_worker() self.loginPage.is_logged_in() self.left_panel.open_comparison_page() self.comparison_page.wait_for_stream_performance_graph_visible() self.comparison_page.select_market_from_dd(self.us.name) self.comparison_page.wait_for_stream_performance_graph_visible() for track in track_list: first_date = self.comparison_page.get_api_first_date_all_dsp(isrc=track.isrc) self.ts.markFinal( first_date == datetime.datetime.strptime(track.dates.f_date, "%Y-%m-%d").date(), "STEP 8-9: first date is: {}".format(first_date), ) for period in self.periods: self.comparison_page.select_period_from_dd(period[0]) self.comparison_page.playlist_details_select_dsp_from_dd(AppConfig.get("dsp")["apple"]) title_ids_api = self.comparison_page.get_playlists_from_local_market_api_get( apple_spotify="apple", period=period[1], tracks=[self.track3.apple_id, self.track14.apple_id], param="id", market=self.us.market, ) title_names_api = self.comparison_page.get_playlists_from_local_market_api_get( apple_spotify="apple", period=period[1], tracks=[self.track3.apple_id, self.track14.apple_id], param="name", market=self.us.market, ) title_index = int(title_ids_api.index(self.playlist11.apple_id)) + 1 names_ui = self.comparison_page.get_playlist_details_names() ids_db = [] for track in track_list: added_date_ui = self.comparison_page.get_tooltip_info_for_track_and_title((track_list.index(track) + 1), title_index, "added", self.playlist11.name) removed_date_ui = self.comparison_page.get_tooltip_info_for_track_and_title((track_list.index(track) + 1), title_index, "removed", self.playlist11.name) added_db = self.sql_client.select_date_track_life_circle_playlist_apple( isrc=track.isrc, playlist_id=self.playlist11.apple_id, interval=period[1], column="EntryDate", country=self.us.market, ) removed_db = self.sql_client.select_date_track_life_circle_playlist_apple( isrc=track.isrc, playlist_id=self.playlist11.apple_id, interval=period[1], column="ExitDate", country=self.us.market, ) ids_db_track = self.sql_client.get_playlist_ids_apple_for_track(isrc=track.isrc, exit_date=track.dates.f_date, period=period[1], country=self.us.market) ids_db.extend(ids_db_track) self.ts.markFinal( added_db == added_date_ui, "STEP 8-9: added dates match ui, api, db for period: {}, \n{},\n{}".format(period[0], added_db, added_date_ui), ) self.ts.markFinal( set(removed_date_ui).issubset(removed_db), "removed dates match ui: {}, db: {}".format(removed_date_ui, removed_db), ) self.ts.markFinal(names_ui == title_names_api, "api and ui titles match") self.ts.markFinal( set(ids_db) == set(title_ids_api), "api and db ids match: {}\n, {}".format(set(ids_db), set(title_ids_api)), ) @allure.story("AP-3115") @allure.severity(allure.severity_level.NORMAL) @allure.title( """Playlist Support: Displaying of the top Apple playlists according to the selected period STEP 10""" ) @allure.description( """TC verifies that a user can see only limited number of top Apple playlists on Playlist Support section that is corresponded to the selected period. For instance, a user selected 14 days period. BE should define track’s first date (01.01.20) and add 14 days period (15.01.20). Playlists that have track’s life circle periods during this period 01.01.20 - 15.01.20 will be displayed only in Playlist support section. This calculation should be applied for every added track and doesn’t depend on each other. STEP 10""" ) def test_displaying_top_apple_playlists_due_to_selected_period_step_10(self): self.comparison_page.remove_tracks_if_present_with_worker(self.us.market) user = self.loginPage.get_user_email_with_worker() token = self.api_client.authorize(user=user) track_list = [self.track3, self.track14] for track in track_list: self.api_client.add_track_to_comparison(token=token, market=self.us.market, isrc=track.isrc, id=track.id) self.loginPage.login_with_worker() self.loginPage.is_logged_in() self.left_panel.open_comparison_page() self.comparison_page.wait_for_stream_performance_graph_visible() self.comparison_page.select_market_from_dd(self.global_market.name) self.comparison_page.wait_for_stream_performance_graph_visible() for period in self.periods: self.comparison_page.select_period_from_dd(period[0]) self.comparison_page.playlist_details_select_dsp_from_dd(AppConfig.get("dsp")["apple"]) title_ids_api = self.api_client.get_playlist_ids_with_period_tracks( apple_spotify="apple", period=period[1], track=[self.track3.apple_id, self.track14.apple_id], param_name="id", token=token, ) title_names_api = self.api_client.get_playlist_ids_with_period_tracks( apple_spotify="apple", period=period[1], track=[self.track3.apple_id, self.track14.apple_id], param_name="name", token=token, ) title_index = int(title_ids_api.index(self.playlist11.apple_id)) + 1 names_ui = self.comparison_page.get_playlist_details_names() ids_db = [] for track in track_list: added_date_ui = self.comparison_page.get_tooltip_info_for_track_and_title((track_list.index(track) + 1), title_index, "added", self.playlist11.name) removed_date_ui = self.comparison_page.get_tooltip_info_for_track_and_title((track_list.index(track) + 1), title_index, "removed", self.playlist11.name) added_db = self.sql_client.select_date_track_life_circle_playlist_apple_global(isrc=track.isrc, playlist_id=self.playlist11.apple_id, interval=period[1], column="EntryDate") removed_db = self.sql_client.select_date_track_life_circle_playlist_apple_global(isrc=track.isrc, playlist_id=self.playlist11.apple_id, interval=period[1], column="ExitDate") ids_db_track = self.sql_client.get_playlist_ids_apple_for_track_global(isrc=track.isrc, exit_date=track.dates.f_date, period=period[1]) ids_db.extend(ids_db_track) self.ts.markFinal( added_db == added_date_ui, "STEP 10: added dates match ui, db for period: {}, \n{},\n{}".format(period[0], added_db, added_date_ui), ) self.ts.markFinal( set(removed_date_ui).issubset(removed_db), "removed dates match ui: {}, db: {}".format(removed_date_ui, removed_db), ) self.ts.markFinal(names_ui == title_names_api, "api and ui titles match") self.ts.markFinal( set(ids_db) == set(title_ids_api), "api and db ids match: {}\n, {}".format(set(ids_db), set(title_ids_api)), )