231 lines
8.9 KiB
Python
231 lines
8.9 KiB
Python
from pages.base_page import BasePage
|
||
from elements.tooltip_button_element import TooltipButton
|
||
from components.toolbar_component import ToolbarComponent
|
||
from components.table_component import TableComponent
|
||
from locators.button_locators import ButtonLocators
|
||
from locators.table_locators import TableLocators
|
||
from playwright.sync_api import Page, Locator
|
||
from data.roles_dict import roles_dict
|
||
|
||
|
||
class SessionsTab(BasePage):
|
||
"""Класс для работы с вкладкой 'Сессия'.
|
||
|
||
Предоставляет методы для взаимодействия с таблицей сессий и проверки её состояния.
|
||
|
||
Args:
|
||
page (Page): Экземпляр страницы Playwright.
|
||
"""
|
||
|
||
def __init__(self, page: Page) -> None:
|
||
"""Инициализация компонентов вкладки 'Сессия'."""
|
||
super().__init__(page)
|
||
|
||
self.toolbar = ToolbarComponent(page, "Сессия")
|
||
self.sessions_table = TableComponent(page)
|
||
|
||
def get_rows_count(self) -> int:
|
||
"""Возвращает количество строк в таблице сессий (без учёта заголовка).
|
||
|
||
Returns:
|
||
int: Количество строк с данными.
|
||
|
||
Raises:
|
||
AssertionError: Если таблица пуста.
|
||
"""
|
||
table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
|
||
rows_count = len(table_content)
|
||
|
||
if rows_count == 0:
|
||
assert False, "The contents of the table are missing"
|
||
|
||
return rows_count - 1
|
||
|
||
def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:
|
||
"""Возвращает кнопку удаления сессии для указанной строки.
|
||
|
||
Args:
|
||
row_index (int): Индекс строки в таблице
|
||
|
||
Returns:
|
||
TooltipButton: Экземпляр кнопки с подсказкой
|
||
|
||
Raises:
|
||
AssertionError: Если строка не найдена.
|
||
"""
|
||
row_locator = self.sessions_table.get_row_locator(
|
||
TableLocators.TABLE_WORK_AREA,
|
||
row_index
|
||
)
|
||
assert isinstance(row_locator, Locator), f"Row with index {row_index} is missing"
|
||
|
||
button_locator = row_locator.locator(ButtonLocators.BUTTON_DELETE_SESSION)
|
||
return TooltipButton(self.page, button_locator, "delete_session_button")
|
||
|
||
def scroll_sessions_table_up(self) -> None:
|
||
"""Прокручивает таблицу сессий вверх."""
|
||
self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
|
||
|
||
def scroll_sessions_table_down(self) -> None:
|
||
"""Прокручивает таблицу сессий вниз."""
|
||
self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
|
||
|
||
def check_sessions_table_content(self, verify: bool = False) -> None:
|
||
"""Проверяет содержимое таблицы сессий.
|
||
|
||
Args:
|
||
verify (bool, optional): Проверять соответствие данных из БД. По умолчанию False.
|
||
|
||
Raises:
|
||
AssertionError: Если таблица пуста или заголовки не соответствуют.
|
||
"""
|
||
expected_headers = [
|
||
'ID сессии',
|
||
'ID пользователя',
|
||
'Время жизни',
|
||
'Роль',
|
||
'Адрес'
|
||
]
|
||
|
||
table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
|
||
len_table_content = len(table_content)
|
||
|
||
if len_table_content == 0:
|
||
assert False, "The contents of the table are missing"
|
||
|
||
actual_headers = table_content[0]
|
||
|
||
self.check_equals(
|
||
actual_headers,
|
||
expected_headers,
|
||
f"Expected table headers {expected_headers} are not equal {actual_headers}"
|
||
)
|
||
|
||
if len_table_content == 1:
|
||
assert False, "Table body is missing"
|
||
|
||
if verify:
|
||
self.verify_sessions_table_content(table_content)
|
||
|
||
for index in range(len_table_content - 1):
|
||
self.should_be_delete_button_on_sessions_table_row(index, "Удалить")
|
||
|
||
def check_sessions_table_verticall_scrolling(self) -> bool:
|
||
"""Проверяет возможность вертикальной прокрутки таблицы.
|
||
|
||
Returns:
|
||
bool: True если прокрутка возможна, иначе False.
|
||
"""
|
||
return self.sessions_table.is_scrollable_vertically(
|
||
TableLocators.TABLE_SCROLL_CONTAINER
|
||
)
|
||
|
||
def check_sessions_table_first_row_visibility(self) -> None:
|
||
"""Проверяет видимость первой строки таблицы.
|
||
|
||
Raises:
|
||
AssertionError: Если первая строка не видна.
|
||
"""
|
||
self.sessions_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)
|
||
|
||
def check_sessions_table_last_row_visibility(self) -> None:
|
||
"""Проверяет видимость последней строки таблицы.
|
||
|
||
Raises:
|
||
AssertionError: Если последняя строка не видна.
|
||
"""
|
||
self.sessions_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)
|
||
|
||
def check_sessions_table_row_highlighting(self, row_index: int) -> None:
|
||
"""Проверяет выделение указанной строки таблицы.
|
||
|
||
Args:
|
||
row_index (int): Индекс проверяемой строки.
|
||
|
||
Raises:
|
||
AssertionError: Если строка не выделена.
|
||
"""
|
||
self.sessions_table.check_row_highlighting(
|
||
TableLocators.TABLE_WORK_AREA,
|
||
row_index
|
||
)
|
||
|
||
def should_be_toolbar(self) -> None:
|
||
"""Проверяет наличие тулбара на вкладке.
|
||
|
||
Raises:
|
||
AssertionError: Если тулбар отсутствует.
|
||
"""
|
||
self.toolbar.check_presence("Toolbar is missing")
|
||
|
||
def should_be_sessions_table(self) -> None:
|
||
"""Проверяет наличие таблицы сессий.
|
||
|
||
Raises:
|
||
AssertionError: Если таблица отсутствует.
|
||
"""
|
||
self.sessions_table.check_presence(
|
||
TableLocators.TABLE_WORK_AREA,
|
||
"Sessions table is missing"
|
||
)
|
||
|
||
def should_be_delete_button_on_sessions_table_row(
|
||
self,
|
||
row_index: int,
|
||
tooltip: str
|
||
) -> None:
|
||
"""Проверяет наличие кнопки удаления в строке таблицы.
|
||
|
||
Args:
|
||
row_index (int): Индекс проверяемой строки
|
||
tooltip (str): Ожидаемый текст подсказки
|
||
|
||
Raises:
|
||
AssertionError: Если кнопка отсутствует или подсказка не соответствует.
|
||
"""
|
||
delete_button = self.get_delete_session_button_from_row(row_index)
|
||
delete_button.check_presence(
|
||
f"Delete session button is missing on {row_index} row"
|
||
)
|
||
delete_button.check_tooltip_with_text(ButtonLocators.TOOLTIP, tooltip)
|
||
|
||
def verify_sessions_table_content(self, sessions_table: list) -> None:
|
||
"""Сверяет данные таблицы с данными из БД.
|
||
|
||
Args:
|
||
sessions_table (list): Данные из таблицы на странице
|
||
|
||
Raises:
|
||
AssertionError: Если данные не соответствуют.
|
||
"""
|
||
expected_sessions_list = []
|
||
|
||
# Отправка запроса к бэкенду для получения информации о сессиях
|
||
response = self.send_get_api_request("e-nms/auth/sessions")
|
||
response_body = self.get_response_body(response)
|
||
|
||
for item in response_body:
|
||
session_info = []
|
||
session_info.append(item["id"])
|
||
session_info.append(item["userId"])
|
||
|
||
# Временно неподдерживаемое поле: время жизни сессии
|
||
session_info.append("")
|
||
|
||
roles = []
|
||
for role in item["roles"]:
|
||
if role in roles_dict.keys():
|
||
roles.append(roles_dict[role])
|
||
|
||
session_info.append(",".join(roles))
|
||
session_info.append(item["ip"])
|
||
|
||
expected_sessions_list.append(session_info)
|
||
|
||
del sessions_table[0] # Удаляем заголовок
|
||
|
||
self.check_lists_equals(
|
||
sessions_table,
|
||
expected_sessions_list,
|
||
"Actual sessions list is not equal expected users list on base db"
|
||
) |