import random from allure_commons._allure import step from assertpy import assert_that from playwright.sync_api import Page, expect from src.helpers.date_utils import get_ui_date_from_url from src.helpers.logger import Logger from src.helpers.string_utils import get_int_from_str, round_percent from src.locators.artist_page.details.tracks_table import ArtistPageTracksTableLocators from src.pages.apollo_header_main import ApolloHeader from src.ui_elements.base_ui_element import BaseUIElement tab_name = "Artist Page Tracks table - " class ArtistPageTracksTable(ApolloHeader): log = Logger() def __init__(self, page: Page): super().__init__(page) self.page = page self.entity_type = '' self.url = f'/{self.entity_type}' self.title = BaseUIElement(self.page, ArtistPageTracksTableLocators.TITLE, tab_name + "title") self.table_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.TABLE_HEADER, tab_name + "table header") self.position_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_POSITION, tab_name + "position heade") self.position_cells = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_POSITION_CELL, tab_name + "position cells") self.starred_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_STARRED, tab_name + "starred header") self.starred_cells = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_STARRED_CELL, tab_name + "starred cells") self.cover_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_COVER, tab_name + "cover header") self.cover_cells = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_COVER_CELL, tab_name + "cover cells") self.track_name_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_TRACK_NAME, tab_name + "track name") self.track_name_cells = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_TRACK_NAME_CELL, tab_name + "track name cells") self.tracks_isrc = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_TRACK_ISRC, tab_name + "track isrcs") self.track_name_name = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_TRACK_NAME_NAME, tab_name + "track name name") self.album_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_ALBUM, tab_name + "album header") self.album_cells = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_ALBUM_CELL, tab_name + "album cells") self.release_date_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_RELEASE_DATE, tab_name + "release date header") self.release_date_cells = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_RELEASE_DATE_CELL, tab_name + "release date cells") self.streams_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_STREAMS, tab_name + "streams header") self.streams_cells = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_STREAMS_CELL, tab_name + "streams cells") self.streams_tooltip = BaseUIElement(self.page, ArtistPageTracksTableLocators.CURRENT_STREAMS_TOOLTIP, tab_name + "streams tooltip") self.change_header = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_CHANGE, tab_name + "change header") self.change_streams = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_CHANGE_POSITION, tab_name + "change position") self.change_percentages = BaseUIElement(self.page, ArtistPageTracksTableLocators.COLUMN_CHANGE_PERCENTAGE, tab_name + "change percentage") @step(tab_name + "verify table data") def verify_table_data(self, response): self.position_cells._element.nth(3).scroll_into_view_if_needed() first_position = 1 last_position = 8 random_int = random.randint(first_position, last_position)-1 track_isrc = self.tracks_isrc._element.nth(random_int).text_content() map_of_maps = {} for dictionary in response: map_of_maps[dictionary["spotifyTrack"]["isrc"]] = dictionary assert_that(map_of_maps.keys()).contains(track_isrc) expect(self.track_name_name._element.nth(random_int))\ .to_have_text(map_of_maps[track_isrc]["spotifyTrack"]["trackName"]) expect(self.album_cells._element.nth(random_int)) \ .to_have_text(map_of_maps[track_isrc]["spotifyTrack"]["albumName"]) expect(self.release_date_cells._element.nth(random_int)) \ .to_have_text(get_ui_date_from_url(map_of_maps[track_isrc]["spotifyTrack"]["album"]["releaseDate"])) assert_that(get_int_from_str(self.streams_cells._element.nth(random_int).text_content())) \ .is_equal_to(map_of_maps[track_isrc]["streams_7_days"]) streams_last_week = map_of_maps[track_isrc]["streams_7_days"] streams_previous_week = map_of_maps[track_isrc]["streams_8_14_days"] change = streams_last_week-streams_previous_week assert_that(self.change_streams._element.nth(random_int).get_attribute("id").replace("-trend-position-", "")) \ .is_equal_to(f"""{change}""") @step(tab_name + "verify table data streams") def verify_table_data_streams(self, response): self.position_cells._element.nth(3).scroll_into_view_if_needed() first_position = 1 last_position = 8 random_int = random.randint(first_position, last_position)-1 track_isrc = self.tracks_isrc._element.nth(random_int).text_content() map_of_maps = {} for dictionary in response: map_of_maps[dictionary["spotifyTrack"]["isrc"]] = dictionary assert_that(map_of_maps.keys()).contains(track_isrc) # current streams assert_that(get_int_from_str(self.streams_cells._element.nth(random_int).text_content())) \ .is_equal_to(map_of_maps[track_isrc]["streams_7_days"]) streams_last_week = map_of_maps[track_isrc]["streams_7_days"] streams_previous_week = map_of_maps[track_isrc]["streams_8_14_days"] change = streams_last_week - streams_previous_week if streams_previous_week == 0: percentage = 0 else: percentage = round_percent(abs(change/streams_previous_week*100)) # streams change and percentage assert_that(self.change_streams._element.nth(random_int).get_attribute("id").replace("-trend-position-", "")) \ .is_equal_to(f"""{change}""") expect(self.change_percentages._element.nth(random_int)) \ .to_have_text( f"""({percentage}%)""")