Актуализация тестов после перехода на версию приложения 1.40
parent
a07cb43b80
commit
e3804bd9c9
|
|
@ -0,0 +1,3 @@
|
||||||
|
ENV=test
|
||||||
|
AUTH_LOGIN = admin
|
||||||
|
AUTH_PASSWORD = enodemon-admin
|
||||||
|
|
@ -31,6 +31,37 @@ class CheckboxGroupComponent(BaseComponent):
|
||||||
def get_checkbox_locator(self, text: str, container_locator: Locator | None = None) -> Locator:
|
def get_checkbox_locator(self, text: str, container_locator: Locator | None = None) -> Locator:
|
||||||
"""Возвращает локатор чек-бокса с указанным текстом.
|
"""Возвращает локатор чек-бокса с указанным текстом.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
text (str): Текст элемента для выбора.
|
||||||
|
container_locator (Locator | None): Локатор контейнера с чек-боксами.
|
||||||
|
Если не указан, поиск по всей странице.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Locator: Локатор чек-бокса.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if container_locator:
|
||||||
|
listitem_locator = container_locator.get_by_role("listitem")
|
||||||
|
else:
|
||||||
|
listitem_locator = self.page.locator("//div[contains(@class, 'menuable__content__active')]"). \
|
||||||
|
get_by_role("listitem")
|
||||||
|
|
||||||
|
listitem_locator.last.scroll_into_view_if_needed()
|
||||||
|
listitem_locator.last.wait_for(state="visible")
|
||||||
|
|
||||||
|
all_items = listitem_locator.all()
|
||||||
|
for i, item in enumerate(all_items):
|
||||||
|
if item.inner_text() == text:
|
||||||
|
checkbox_locator = item.get_by_role("checkbox")
|
||||||
|
expect(checkbox_locator).to_be_visible(), \
|
||||||
|
f"Checkbox with text '{text}' is missing or not visible"
|
||||||
|
return checkbox_locator
|
||||||
|
|
||||||
|
assert False, f"Checkbox locator for {text} has not been found"
|
||||||
|
|
||||||
|
def get_checkbox_locator_or(self, text: str, container_locator: Locator | None = None) -> Locator:
|
||||||
|
"""Возвращает локатор чек-бокса с указанным текстом.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
text (str): Текст элемента для выбора.
|
text (str): Текст элемента для выбора.
|
||||||
container_locator (Locator | None): Локатор контейнера с чек-боксами.
|
container_locator (Locator | None): Локатор контейнера с чек-боксами.
|
||||||
|
|
|
||||||
|
|
@ -106,3 +106,16 @@ class SendTestEmailModalWindow(ModalWindowComponent):
|
||||||
|
|
||||||
self.alert.check_alert_presence('\nТестовое сообщение\nотправлено\n')
|
self.alert.check_alert_presence('\nТестовое сообщение\nотправлено\n')
|
||||||
self.alert.check_alert_absence('\nТестовое сообщение\nотправлено\n')
|
self.alert.check_alert_absence('\nТестовое сообщение\nотправлено\n')
|
||||||
|
|
||||||
|
def should_be_error_alert(self, alert_text: str) -> None:
|
||||||
|
"""Проверяет наличие сообщения об неуспешной отправке тестового сообщения.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: Если тулбар отсутствует.
|
||||||
|
"""
|
||||||
|
|
||||||
|
alert_type = self.alert.get_alert_type()
|
||||||
|
assert alert_type == "error", f"Expected error alert, but got {alert_type} alert"
|
||||||
|
|
||||||
|
self.alert.check_alert_presence(alert_text)
|
||||||
|
self.alert.check_alert_absence(alert_text)
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,10 @@ class SelectionBarComponent(BaseComponent):
|
||||||
clear_button_locator = self.selection_bar_locator.locator(
|
clear_button_locator = self.selection_bar_locator.locator(
|
||||||
SelectionBarLocators.CLEAR_SELECTION_BUTTON
|
SelectionBarLocators.CLEAR_SELECTION_BUTTON
|
||||||
)
|
)
|
||||||
|
if clear_button_locator.count() == 0:
|
||||||
|
clear_button_locator = self.selection_bar_locator.locator("../..").locator(
|
||||||
|
SelectionBarLocators.CLEAR_SELECTION_BUTTON
|
||||||
|
)
|
||||||
clear_button_locator.click()
|
clear_button_locator.click()
|
||||||
|
|
||||||
def get_available_options(self) -> list[str]:
|
def get_available_options(self) -> list[str]:
|
||||||
|
|
@ -87,8 +91,13 @@ class SelectionBarComponent(BaseComponent):
|
||||||
def get_selection_bar_title(self) -> str:
|
def get_selection_bar_title(self) -> str:
|
||||||
"""Возвращает название панели выбора значения"""
|
"""Возвращает название панели выбора значения"""
|
||||||
|
|
||||||
|
title_text = ""
|
||||||
title_locator = self.selection_bar_locator.locator(SelectionBarLocators.TITLE_LOCATOR)
|
title_locator = self.selection_bar_locator.locator(SelectionBarLocators.TITLE_LOCATOR)
|
||||||
return title_locator.text_content()
|
if title_locator.count() > 0:
|
||||||
|
title_text = title_locator.text_content()
|
||||||
|
else:
|
||||||
|
title_text = self.selection_bar_locator.get_attribute("placeholder")
|
||||||
|
return title_text
|
||||||
|
|
||||||
def get_selected_values(self) -> list[str]:
|
def get_selected_values(self) -> list[str]:
|
||||||
"""Возвращает список выбранных значений"""
|
"""Возвращает список выбранных значений"""
|
||||||
|
|
@ -96,6 +105,11 @@ class SelectionBarComponent(BaseComponent):
|
||||||
selected_values_locator = self.selection_bar_locator.locator(
|
selected_values_locator = self.selection_bar_locator.locator(
|
||||||
SelectionBarLocators.PARAMETERS_SELECTED
|
SelectionBarLocators.PARAMETERS_SELECTED
|
||||||
)
|
)
|
||||||
|
if selected_values_locator.count() == 0:
|
||||||
|
selected_values_locator = self.selection_bar_locator.locator("../..").locator(
|
||||||
|
SelectionBarLocators.PARAMETERS_SELECTED
|
||||||
|
)
|
||||||
|
print(selected_values_locator)
|
||||||
selected_values = selected_values_locator.all_inner_texts()
|
selected_values = selected_values_locator.all_inner_texts()
|
||||||
return selected_values[0].splitlines()
|
return selected_values[0].splitlines()
|
||||||
|
|
||||||
|
|
@ -153,6 +167,9 @@ class SelectionBarComponent(BaseComponent):
|
||||||
self.selection_bar_locator.click(force=True)
|
self.selection_bar_locator.click(force=True)
|
||||||
|
|
||||||
# Ждем появления выпадающего списка
|
# Ждем появления выпадающего списка
|
||||||
|
if self.page.locator(SelectionBarLocators.LIST_ACTIVE).count() == 0:
|
||||||
|
assert False, "Values list is empty"
|
||||||
|
|
||||||
if self.page.locator(SelectionBarLocators.LIST_ACTIVE).count() > 1:
|
if self.page.locator(SelectionBarLocators.LIST_ACTIVE).count() > 1:
|
||||||
self.page.locator(SelectionBarLocators.LIST_ACTIVE).last.wait_for(state="attached")
|
self.page.locator(SelectionBarLocators.LIST_ACTIVE).last.wait_for(state="attached")
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ class Environment:
|
||||||
DEVELOP: str = 'develop'
|
DEVELOP: str = 'develop'
|
||||||
|
|
||||||
URLS: Dict[str, str] = {
|
URLS: Dict[str, str] = {
|
||||||
TEST: 'https://192.168.2.76/',
|
TEST: 'https://192.168.236.12/',
|
||||||
DEVELOP: 'https://192.168.2.69/'
|
DEVELOP: 'https://192.168.2.69/'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -414,8 +414,8 @@ class EmailNotificationsSettingsTab(BasePage):
|
||||||
|
|
||||||
if name == "checkbox_activate":
|
if name == "checkbox_activate":
|
||||||
is_activate_checked = item.is_checked()
|
is_activate_checked = item.is_checked()
|
||||||
assert not is_activate_checked, (
|
assert is_activate_checked, (
|
||||||
"Checkbox 'Активировать' should not be checked by default"
|
"Checkbox 'Активировать' should be checked"
|
||||||
)
|
)
|
||||||
|
|
||||||
def _check_tls_settings_content(self):
|
def _check_tls_settings_content(self):
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,8 @@ class TestActionsEventsContainer:
|
||||||
browser: Экземпляр страницы Playwright.
|
browser: Экземпляр страницы Playwright.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
rows_to_start_scrolling = 20
|
||||||
|
|
||||||
lp = LoginPage(browser)
|
lp = LoginPage(browser)
|
||||||
lp.do_login()
|
lp.do_login()
|
||||||
|
|
||||||
|
|
@ -90,58 +92,62 @@ class TestActionsEventsContainer:
|
||||||
actions_events_container = mp.click_events_panel_actions_tab()
|
actions_events_container = mp.click_events_panel_actions_tab()
|
||||||
actions_events_container.click_archive_button()
|
actions_events_container.click_archive_button()
|
||||||
|
|
||||||
events_panel_position = mp.get_events_panel_position()
|
rows_count = actions_events_container.get_events_table_rows_count()
|
||||||
|
if rows_count > rows_to_start_scrolling:
|
||||||
|
events_panel_position = mp.get_events_panel_position()
|
||||||
|
|
||||||
# Проверка, что панель с таблицей открыта
|
# Проверка, что панель с таблицей открыта
|
||||||
assert events_panel_position != "bottom", "Panel with actions events should be opened"
|
assert events_panel_position != "bottom", "Panel with actions events should be opened"
|
||||||
|
|
||||||
is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
|
is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
|
||||||
|
|
||||||
# Убеждаемся, что панель открыта наполовину и проверяем скроллинг
|
# Убеждаемся, что панель открыта наполовину и проверяем скроллинг
|
||||||
assert events_panel_position == "center",\
|
assert events_panel_position == "center",\
|
||||||
"Panel with actions events should be located on the main page center"
|
"Panel with actions events should be located on the main page center"
|
||||||
assert is_scrollable, "Actions events table should be scrollable"
|
assert is_scrollable, "Actions events table should be scrollable"
|
||||||
|
|
||||||
# Скроллинг вниз
|
# Скроллинг вниз
|
||||||
actions_events_container.scroll_events_table_down()
|
actions_events_container.scroll_events_table_down()
|
||||||
browser.wait_for_timeout(1000)
|
browser.wait_for_timeout(1000)
|
||||||
|
|
||||||
# Проверка видимости последней строки после прокрутки
|
# Проверка видимости последней строки после прокрутки
|
||||||
actions_events_container.check_events_table_last_row_visibility()
|
actions_events_container.check_events_table_last_row_visibility()
|
||||||
|
|
||||||
# Скроллинг вверх
|
# Скроллинг вверх
|
||||||
actions_events_container.scroll_events_table_up()
|
actions_events_container.scroll_events_table_up()
|
||||||
browser.wait_for_timeout(1000)
|
browser.wait_for_timeout(1000)
|
||||||
|
|
||||||
# Проверка видимости первой строки после прокрутки
|
# Проверка видимости первой строки после прокрутки
|
||||||
actions_events_container.check_events_table_first_row_visibility()
|
actions_events_container.check_events_table_first_row_visibility()
|
||||||
|
|
||||||
# Раскрываем панель полностью и проверяем скроллинг
|
# Раскрываем панель полностью и проверяем скроллинг
|
||||||
assert mp.check_expand_more_button(), \
|
assert mp.check_expand_more_button(), \
|
||||||
"Expand more button should be present"
|
"Expand more button should be present"
|
||||||
mp.click_events_panel_expand_more_button()
|
mp.click_events_panel_expand_more_button()
|
||||||
mp.wait_for_timeout(500)
|
mp.wait_for_timeout(500)
|
||||||
|
|
||||||
events_panel_position = mp.get_events_panel_position()
|
events_panel_position = mp.get_events_panel_position()
|
||||||
assert events_panel_position == "top",\
|
assert events_panel_position == "top",\
|
||||||
"Panel with actions events should be located on the main page top"
|
"Panel with actions events should be located on the main page top"
|
||||||
|
|
||||||
is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
|
is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
|
||||||
assert is_scrollable, "Actions events table should be scrollable in the full window"
|
assert is_scrollable, "Actions events table should be scrollable in the full window"
|
||||||
|
|
||||||
# Скроллинг вниз
|
# Скроллинг вниз
|
||||||
actions_events_container.scroll_events_table_down()
|
actions_events_container.scroll_events_table_down()
|
||||||
browser.wait_for_timeout(1000)
|
browser.wait_for_timeout(1000)
|
||||||
|
|
||||||
# Проверка видимости последней строки после прокрутки
|
# Проверка видимости последней строки после прокрутки
|
||||||
actions_events_container.check_events_table_last_row_visibility()
|
actions_events_container.check_events_table_last_row_visibility()
|
||||||
|
|
||||||
# Скроллинг вверх
|
# Скроллинг вверх
|
||||||
actions_events_container.scroll_events_table_up()
|
actions_events_container.scroll_events_table_up()
|
||||||
browser.wait_for_timeout(1000)
|
browser.wait_for_timeout(1000)
|
||||||
|
|
||||||
# Проверка видимости первой строки после прокрутки
|
# Проверка видимости первой строки после прокрутки
|
||||||
actions_events_container.check_events_table_first_row_visibility()
|
actions_events_container.check_events_table_first_row_visibility()
|
||||||
|
else:
|
||||||
|
print("Not enough data to check vertical scrolling")
|
||||||
|
|
||||||
# @pytest.mark.develop
|
# @pytest.mark.develop
|
||||||
def test_real_time_task_view(self, browser: Page):
|
def test_real_time_task_view(self, browser: Page):
|
||||||
|
|
@ -255,7 +261,7 @@ class TestActionsEventsContainer:
|
||||||
# convert2timestamp=True)
|
# convert2timestamp=True)
|
||||||
# assert is_descending_order, "Column data should be in descending order"
|
# assert is_descending_order, "Column data should be in descending order"
|
||||||
|
|
||||||
@pytest.mark.develop
|
# @pytest.mark.develop
|
||||||
def test_real_time_events_table_pagination(self, browser: Page):
|
def test_real_time_events_table_pagination(self, browser: Page):
|
||||||
"""Проверяет возможность пагинации таблицы событий на примере вкладки 'Реальное время'.
|
"""Проверяет возможность пагинации таблицы событий на примере вкладки 'Реальное время'.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -157,16 +157,14 @@ class TestEmailNotificationsSettingsTab:
|
||||||
send_test_email_window.close_by_toolbar_button()
|
send_test_email_window.close_by_toolbar_button()
|
||||||
|
|
||||||
# @pytest.mark.develop
|
# @pytest.mark.develop
|
||||||
# TO-DO: rewrite tescase after feature release
|
def test_send_test_email_successful(self, browser: Page) -> None:
|
||||||
def test_send_test_email(self, browser: Page) -> None:
|
|
||||||
"""Тест модального окна для посылки тестового E-mail.
|
"""Тест модального окна для посылки тестового E-mail.
|
||||||
|
|
||||||
Проверяет:
|
Проверяет:
|
||||||
Возможность посылки тестового E-mail.
|
Возможность посылки тестового E-mail по существующему адресу.
|
||||||
"""
|
"""
|
||||||
# Адрес куда отправлять e-mail
|
# Адрес куда отправлять e-mail
|
||||||
# Пока фейковый
|
sent_address = "audiomine.platform@gmail.com"
|
||||||
fake_address = "test@grandpas_village.com"
|
|
||||||
|
|
||||||
# Инициализация вкладки
|
# Инициализация вкладки
|
||||||
email_notification_settings_tab = EmailNotificationsSettingsTab(browser)
|
email_notification_settings_tab = EmailNotificationsSettingsTab(browser)
|
||||||
|
|
@ -176,7 +174,7 @@ class TestEmailNotificationsSettingsTab:
|
||||||
|
|
||||||
send_test_email_window = email_notification_settings_tab.click_test_button()
|
send_test_email_window = email_notification_settings_tab.click_test_button()
|
||||||
|
|
||||||
send_test_email_window.input_email(fake_address)
|
send_test_email_window.input_email(sent_address)
|
||||||
|
|
||||||
with browser.expect_response("**/e-nms/email/testEmail") as response_info:
|
with browser.expect_response("**/e-nms/email/testEmail") as response_info:
|
||||||
send_test_email_window.click_test_button()
|
send_test_email_window.click_test_button()
|
||||||
|
|
@ -187,6 +185,39 @@ class TestEmailNotificationsSettingsTab:
|
||||||
|
|
||||||
send_test_email_window.close()
|
send_test_email_window.close()
|
||||||
|
|
||||||
|
# @pytest.mark.develop
|
||||||
|
def test_send_test_email_address_validation(self, browser: Page) -> None:
|
||||||
|
"""Тест модального окна для посылки тестового E-mail.
|
||||||
|
|
||||||
|
Проверяет:
|
||||||
|
Валидацию вводимого адреса E-mail.
|
||||||
|
"""
|
||||||
|
# Адрес куда отправлять e-mail - фейковый
|
||||||
|
incorrect_addresses = ["rrrrr", "@mail.ru", "rrrmail.ru", "rr@mail", "rrrr@@mail.ru", "rr@mailru", "rr@my_mail.ru"]
|
||||||
|
|
||||||
|
# Инициализация вкладки
|
||||||
|
email_notification_settings_tab = EmailNotificationsSettingsTab(browser)
|
||||||
|
|
||||||
|
send_test_email_window = email_notification_settings_tab.click_test_button()
|
||||||
|
|
||||||
|
# Пустое поле ввода адреса
|
||||||
|
send_test_email_window.click_test_button()
|
||||||
|
send_test_email_window.should_be_error_alert('\nПоле должно быть заполнено\n')
|
||||||
|
|
||||||
|
for address in incorrect_addresses:
|
||||||
|
send_test_email_window.input_email(address)
|
||||||
|
send_test_email_window.click_test_button()
|
||||||
|
send_test_email_window.should_be_error_alert('\nНекорректный e-mail\n')
|
||||||
|
|
||||||
|
# нет проверки валидности домена
|
||||||
|
# fake_address = "test@grandpasvillage.com"
|
||||||
|
|
||||||
|
# send_test_email_window.input_email(fake_address)
|
||||||
|
# send_test_email_window.click_test_button()
|
||||||
|
# send_test_email_window.should_be_error_alert('\Ошибка входа в систему\n')
|
||||||
|
|
||||||
|
send_test_email_window.close()
|
||||||
|
|
||||||
def _get_default_value(self, setting_name: str, default_settings: dict) -> str| None:
|
def _get_default_value(self, setting_name: str, default_settings: dict) -> str| None:
|
||||||
for setting in default_settings:
|
for setting in default_settings:
|
||||||
if setting["name"] == setting_name:
|
if setting["name"] == setting_name:
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ class TestPushNotificationsSettingsTab:
|
||||||
assert msg_value == expected_msg_value, \
|
assert msg_value == expected_msg_value, \
|
||||||
f"Actual message field value {msg_value} is not equal expected message field value {expected_msg_value}"
|
f"Actual message field value {msg_value} is not equal expected message field value {expected_msg_value}"
|
||||||
|
|
||||||
# @pytest.mark.develop
|
@pytest.mark.develop
|
||||||
def test_send_push_notification(self, browser: Page) -> None:
|
def test_send_push_notification(self, browser: Page) -> None:
|
||||||
"""Тест содержимого вкладки настройки Push уведомлений.
|
"""Тест содержимого вкладки настройки Push уведомлений.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ class TestBackupSettingsTab:
|
||||||
main_page.click_subpanel_item("Обслуживание и диагностика")
|
main_page.click_subpanel_item("Обслуживание и диагностика")
|
||||||
main_page.click_subpanel_item("Резервное копирование")
|
main_page.click_subpanel_item("Резервное копирование")
|
||||||
|
|
||||||
# @pytest.mark.develop
|
@pytest.mark.develop
|
||||||
def test_backup_settings_tab_content(self, browser: Page) -> None:
|
def test_backup_settings_tab_content(self, browser: Page) -> None:
|
||||||
"""Тест содержимого вкладки 'Резервное копирование'.
|
"""Тест содержимого вкладки 'Резервное копирование'.
|
||||||
|
|
||||||
|
|
@ -166,10 +166,12 @@ class TestBackupSettingsTab:
|
||||||
for setting in settings_list:
|
for setting in settings_list:
|
||||||
expected = expected_sd_settings[setting]
|
expected = expected_sd_settings[setting]
|
||||||
if dates.get(expected):
|
if dates.get(expected):
|
||||||
expected = dates[expected]
|
expected_setting = dates[expected]
|
||||||
|
else:
|
||||||
|
expected_setting = str(expected)
|
||||||
actual = streaming_data_settings[setting]
|
actual = streaming_data_settings[setting]
|
||||||
assert actual == expected,\
|
assert actual == expected_setting,\
|
||||||
f"Actual value {actual} is not equal expected {expected} for field '{setting}'"
|
f"Actual value {actual} is not equal expected {expected_setting} for field '{setting}'"
|
||||||
|
|
||||||
# @pytest.mark.develop
|
# @pytest.mark.develop
|
||||||
def test_backup_settings_tab_check_backup_copies_amount(self, browser: Page) -> None:
|
def test_backup_settings_tab_check_backup_copies_amount(self, browser: Page) -> None:
|
||||||
|
|
@ -341,7 +343,7 @@ class TestBackupSettingsTab:
|
||||||
backup_settings_tab.input_inventory_backups_number(orig_backup_limitation)
|
backup_settings_tab.input_inventory_backups_number(orig_backup_limitation)
|
||||||
backup_settings_tab.click_save_button()
|
backup_settings_tab.click_save_button()
|
||||||
|
|
||||||
@pytest.mark.develop
|
# @pytest.mark.develop
|
||||||
def test_backup_settings_tab_set_streaming_data_settings(self, browser: Page) -> None:
|
def test_backup_settings_tab_set_streaming_data_settings(self, browser: Page) -> None:
|
||||||
"""Тест проверки возможности изменения значения настроек 'Потоковые данные'."""
|
"""Тест проверки возможности изменения значения настроек 'Потоковые данные'."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ class TestCertificatesTab:
|
||||||
certificates_tab = CertificatesTab(browser)
|
certificates_tab = CertificatesTab(browser)
|
||||||
|
|
||||||
certificates_tab.click_certificate_tab_button()
|
certificates_tab.click_certificate_tab_button()
|
||||||
|
certificates_tab.wait_for_timeout(5000)
|
||||||
viewed_certificate = certificates_tab.get_certificate()
|
viewed_certificate = certificates_tab.get_certificate()
|
||||||
|
|
||||||
db_certificate_response = certificates_tab.send_get_api_request("api/certs/infoCert")
|
db_certificate_response = certificates_tab.send_get_api_request("api/certs/infoCert")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue