import datetime import json import random import time import unittest from argparse import Namespace 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 app.api_client import ApiClient from app.mysql_db_client_custom import MySqlClient from app.src.pages.amazon_playlist_page import AmazonPlaylistPage from app.src.pages.apple_playlist_page import ApplePlaylistPage 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 ApplePlaylistPageTest(unittest.TestCase): playlist35 = json.loads(json.dumps(AppConfig.get("playlist35")), object_hook=lambda d: Namespace(**d)) @pytest.fixture(autouse=True) def classSetup(self): self.loginPage = LoginPage(self.driver) self.ap = ApplePlaylistPage(self.driver) self.amazon_playlist = AmazonPlaylistPage(self.driver) self.tp = TrackPage(self.driver) self.api_client = ApiClient() self.sql_client = MySqlClient() self.ts = TestStatus(self.driver) @allure.story("AP-8339") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-8027][Amazon Playlist] Table verification STEPS 1-9") @allure.description("TC verifies table on the Amazon Playlist page. STEPS 1-9") def test_amazon_playlist_table_verification_steps_1_9(self): self.loginPage.login_with_worker() self.amazon_playlist.open_amazon_playlist_page(self.playlist35.amazon_id) # step 1 self.amazon_playlist.verify_table_columns() # steps 2-4 self.amazon_playlist.scroll_down_verify_back_button() # step 5 market = self.tp.parameter_from_url(self.amazon_playlist.hd_filter_market) isrc_track_ui = self.amazon_playlist.get_isrc_for_track_by_index(market=market) self.amazon_playlist.star_unstar_by_index_and_verify_ui() isrcs_starred = self.amazon_playlist.get_isrcs_ids_all_starred_tracks()["isrcs"] assert_that(isrcs_starred).contains(isrc_track_ui) self.amazon_playlist.star_unstar_by_index_and_verify_ui(star=False) isrcs_starred = self.amazon_playlist.get_isrcs_ids_all_starred_tracks()["isrcs"] assert_that(isrcs_starred).does_not_contain(isrc_track_ui) # step 6 self.amazon_playlist.verify_country_hint(index=1) # step 7 self.amazon_playlist.verify_track_name_hint(index=1) # step 8 self.amazon_playlist.verify_track_name_link(index=1) # step 9 self.amazon_playlist.open_amazon_playlist_page(self.playlist35.amazon_id) self.amazon_playlist.verify_artist_name_hint(index=1) @parameterized.expand(["us", "canada"]) @allure.story("AP-8339") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-8027][Amazon Playlist] Table verification STEPS 10-15") @allure.description("TC verifies table on the Amazon Playlist page. STEPS 10-15") def test_amazon_playlist_table_verification_steps_10_15(self, param): self.loginPage.login_with_worker() self.amazon_playlist.open_amazon_playlist_page(self.playlist35.amazon_id) self.tp.select_market(AppConfig.get("market")[param]["name"]) # steps 10-15 self.amazon_playlist.sort_table_by_column(self.ap.TL_COLUMN_POSITION_TREND) self.verify_values_in_table(playlist_id=self.playlist35) @allure.story("AP-8339") @allure.severity(allure.severity_level.NORMAL) @allure.title("[AP-8027][Amazon Playlist] Table verification STEP 16") @allure.description("TC verifies table on the Amazon Playlist page. STEP 16") def test_amazon_playlist_table_verification_step_16(self): self.loginPage.login_with_worker() self.amazon_playlist.open_amazon_playlist_page(self.playlist35.amazon_id) # step 16 self.amazon_playlist.tl_change_date(5) date = self.amazon_playlist.get_chosen_date() date_formatted = datetime.datetime.strptime(date, "%Y-%m-%d").date() self.amazon_playlist.sort_table_by_column(self.amazon_playlist.TL_COLUMN_POSITION) table_track_count = self.amazon_playlist.get_tracklist_count() country = self.tp.parameter_from_url(self.amazon_playlist.hd_filter_market) api_resp = self.api_client.get_amazon_tracklist(self.playlist35.amazon_id, country, f"&start_date={date}&end_date={date}") assert_that(table_track_count).is_greater_than_or_equal_to(len(api_resp["items"])) self.amazon_playlist.tl_change_date(45) date = self.amazon_playlist.get_chosen_date() time.sleep(5) table_track_count = self.amazon_playlist.get_tracklist_count() tracks_release_dates = self.amazon_playlist.get_table_column_values(self.amazon_playlist.TL_COLUMN_RELEASE_DATE) tracks_release_dates_formatted = [datetime.datetime.strptime(release_date, self.tp.get_date_format_from_locale()).date() for release_date in tracks_release_dates if release_date != "N/A"] country = self.tp.parameter_from_url(self.amazon_playlist.hd_filter_market) api_resp = self.api_client.get_amazon_tracklist(self.playlist35.amazon_id, country, f"&start_date={date}&end_date={date}") assert_that(table_track_count).is_equal_to(len(api_resp["items"])) for release_date in tracks_release_dates_formatted: assert_that(release_date).is_less_than(date_formatted) @allure.step("Amazon Playlist page - compare ui and api values in table") def verify_values_in_table(self, playlist_id): index = random.choice([0, 1, 2, 3, 4]) track_id = self.amazon_playlist.get_table_column_values("track_id")[index] market = self.tp.parameter_from_url(self.amazon_playlist.hd_filter_market) isrc = self.api_client.get_isrc_by_apple_id(track_id, market)["data"][0]["attributes"]["isrc"] position_num_ui = self.amazon_playlist.get_table_column_values(self.amazon_playlist.TL_COLUMN_POSITION)[index] release_date_ui = self.amazon_playlist.get_table_column_values(self.amazon_playlist.TL_COLUMN_RELEASE_DATE)[index] if release_date_ui != "N/A": release_date_ui = datetime.datetime.strptime(release_date_ui, self.tp.get_date_format_from_locale()).strftime("%Y-%m-%d") in_playlist_days_ui = self.amazon_playlist.get_table_column_values(self.amazon_playlist.TL_COLUMN_IN_PLAYLIST_DAYS)[index] days_avg_streams_7_ui = self.amazon_playlist.get_table_column_values(self.amazon_playlist.TL_COLUMN_AVG_STREAMS)[index] api_resp = self.api_client.get_amazon_tracklist(playlist_id.amazon_id, market)["items"] amazon_latest = self.api_client.get_latest_date_all()["amazon"] amazon_first_date = (datetime.datetime.strptime(amazon_latest, "%Y-%m-%d") - datetime.timedelta(days=6)).date() streams_resp = self.api_client.get_amazon_streams_playlist(isrc, playlist_id.amazon_id_full, amazon_first_date, amazon_latest, market) position_num_api, release_date_api, in_playlist_days_api, item_resp = -1, -1, -1, -1 self.tp.log.info(f"isrc: {isrc}, market: {market}, index: {index}") for i in api_resp: if i["isrc"] == isrc: item_resp = i position_num_api = item_resp["current"] release_date_api = item_resp["track"]["release_date"] in_playlist_days_api = item_resp["num_days_on"] streams_api = 0 days_api_count = len([s for s in streams_resp if s["country_code"] == market]) if days_api_count != streams_api: streams_api = sum(int(s["streams"]) for s in streams_resp if s["country_code"] == market) / days_api_count assert_that(position_num_ui).described_as(item_resp).is_equal_to(position_num_api) assert_that(release_date_ui).described_as(item_resp).is_equal_to(release_date_api) assert_that(in_playlist_days_ui).described_as(item_resp).is_equal_to(in_playlist_days_api) assert_that(days_avg_streams_7_ui).is_equal_to(int(streams_api))