diff --git a/components_derived/modal_add_AD_user.py b/components_derived/modal_add_AD_user.py index b614a3b..4b8e83f 100644 --- a/components_derived/modal_add_AD_user.py +++ b/components_derived/modal_add_AD_user.py @@ -52,7 +52,7 @@ class AddADUserModalWindow(ModalWindowComponent): # Добавление элементов формы checkbox_1 = Checkbox( page, - self.page.get_by_role("checkbox").nth(0), + input_form_locator.get_by_role("checkbox").nth(0), "active_directory" ) self.add_content_item("active_directory_checkbox", checkbox_1) @@ -65,6 +65,7 @@ class AddADUserModalWindow(ModalWindowComponent): self.add_content_item("active_directory_checkbox_label", label_1) # Начальный набор полей формы + # Поле Группа group_loc = input_form_locator.get_by_role("combobox").nth(0) group_input = TextInput(page, group_loc, "group_input") self.add_content_item("group_input", group_input) @@ -76,10 +77,28 @@ class AddADUserModalWindow(ModalWindowComponent): locator_button_search = self.page.get_by_role("button", name="Поиск") self.add_button(locator_button_search, "search") + # Поле Имя loc = input_form_locator.locator("xpath=div[3]").locator(text_field_locator) name_input = TextInput(page, loc, "name_input") self.add_content_item("name_input", name_input) + # Чекбокс "Блокировка" - индекс 1 + checkbox_2 = Checkbox( + page, + input_form_locator.get_by_role("checkbox").nth(1), + "blocking" + ) + self.add_content_item("blocking_checkbox", checkbox_2) + + # Метка "Блокировка" - индекс 1 + label_2 = Text( + page, + self.page.locator(label_locator).nth(1), + "blocking_checkbox_label" + ) + self.add_content_item("blocking_checkbox_label", label_2) + + # Поле Роль role_loc = input_form_locator.get_by_role("combobox").nth(1) role_input = TextInput(page, role_loc, "role_input") self.add_content_item("role_input", role_input) @@ -88,31 +107,36 @@ class AddADUserModalWindow(ModalWindowComponent): DropdownList(page) ) - loc = input_form_locator.locator("xpath=div[6]").locator(text_field_locator) + # Поле Комментарий + loc = input_form_locator.locator("xpath=div[7]").locator(text_field_locator) commentary_input = TextInput(page, loc, "commentary_input") self.add_content_item("commentary_input", commentary_input) - loc = input_form_locator.locator("xpath=div[7]").locator(text_field_locator) + # Поле E-mail + loc = input_form_locator.locator("xpath=div[8]").locator(text_field_locator) email_input = TextInput(page, loc, "email_input") self.add_content_item("email_input", email_input) - loc = input_form_locator.locator("xpath=div[8]").locator(text_field_locator) + # Поле Номер для СМС + loc = input_form_locator.locator("xpath=div[9]").locator(text_field_locator) phone_input = TextInput(page, loc, "phone_input") self.add_content_item("phone_input", phone_input) - checkbox_2 = Checkbox( + # Чекбокс "Подписка на Push-уведомления" - индекс 2 + checkbox_3 = Checkbox( page, - page.get_by_role("checkbox").nth(1), + input_form_locator.get_by_role("checkbox").nth(2), "push_notification" ) - self.add_content_item("push_notification_checkbox", checkbox_2) + self.add_content_item("push_notification_checkbox", checkbox_3) - label_2 = Text( + # Метка "Подписка на Push-уведомления" - индекс 2 + label_3 = Text( page, - self.page.locator(label_locator).nth(1), + self.page.locator(label_locator).nth(2), "push_notification_checkbox_label" ) - self.add_content_item("push_notification_checkbox_label", label_2) + self.add_content_item("push_notification_checkbox_label", label_3) # Добавление кнопок действий locator_button_add = self.page.get_by_role("button", name="Добавить") @@ -134,6 +158,26 @@ class AddADUserModalWindow(ModalWindowComponent): self.get_content_item("active_directory_checkbox").uncheck(force=True) + def check_blocking_checkbox(self): + """Включает чек-бокс Блокировка.""" + + self.get_content_item("blocking_checkbox").check(force=True) + + def uncheck_blocking_checkbox(self): + """Выключает чек-бокс Блокировка.""" + + self.get_content_item("blocking_checkbox").uncheck(force=True) + + def check_push_notification_checkbox(self): + """Включает чек-бокс Push-уведомления.""" + + self.get_content_item("push_notification_checkbox").check(force=True) + + def uncheck_push_notification_checkbox(self): + """Выключает чек-бокс Push-уведомления.""" + + self.get_content_item("push_notification_checkbox").uncheck(force=True) + def update_input_form_fields(self, expand): """Персчитывает локаторы полей формы ввода при добавлении/удалении дополнительного поля. """ @@ -144,13 +188,13 @@ class AddADUserModalWindow(ModalWindowComponent): new_loc = input_form_locator.locator("xpath=div[4]").locator(text_field_locator) self.get_content_item("name_input").update_locator(new_loc) - new_loc = input_form_locator.locator("xpath=div[7]").locator(text_field_locator) + new_loc = input_form_locator.locator("xpath=div[8]").locator(text_field_locator) self.get_content_item("commentary_input").update_locator(new_loc) - new_loc = input_form_locator.locator("xpath=div[8]").locator(text_field_locator) + new_loc = input_form_locator.locator("xpath=div[9]").locator(text_field_locator) self.get_content_item("email_input").update_locator(new_loc) - new_loc = input_form_locator.locator("xpath=div[9]").locator(text_field_locator) + new_loc = input_form_locator.locator("xpath=div[10]").locator(text_field_locator) self.get_content_item("phone_input").update_locator(new_loc) role_loc = input_form_locator.get_by_role("combobox").nth(2) @@ -159,13 +203,13 @@ class AddADUserModalWindow(ModalWindowComponent): new_loc = input_form_locator.locator("xpath=div[3]").locator(text_field_locator) self.get_content_item("name_input").update_locator(new_loc) - new_loc = input_form_locator.locator("xpath=div[6]").locator(text_field_locator) + new_loc = input_form_locator.locator("xpath=div[7]").locator(text_field_locator) self.get_content_item("commentary_input").update_locator(new_loc) - new_loc = input_form_locator.locator("xpath=div[7]").locator(text_field_locator) + new_loc = input_form_locator.locator("xpath=div[8]").locator(text_field_locator) self.get_content_item("email_input").update_locator(new_loc) - new_loc = input_form_locator.locator("xpath=div[8]").locator(text_field_locator) + new_loc = input_form_locator.locator("xpath=div[9]").locator(text_field_locator) self.get_content_item("phone_input").update_locator(new_loc) role_loc = input_form_locator.get_by_role("combobox").nth(1) @@ -181,18 +225,25 @@ class AddADUserModalWindow(ModalWindowComponent): menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA) input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA) + # Поле "Группа" - выбор из списка group_name = user_data.get("group") if group_name is None: assert False, "Value of 'group' is missing" - name = user_data.get("name") - if name is None: - assert False, "Value of 'name' is missing" + # Поле "Пользователи AD" - выбор из списка + name_AD = user_data.get("name_AD") + if name_AD is None: + assert False, "Value of 'name_AD' is missing" + # Поле "Имя" - если определено (не None) вводим вручную + name = user_data.get("name") + + # Поле "Роль" - выбор из списка role = user_data.get("role") if role is None: assert False, "Value of 'role' is missing" + # Поиск и выбор заданной группы из списка существующих group_field = self.get_content_item("group_input") group_field.click() @@ -205,6 +256,7 @@ class AddADUserModalWindow(ModalWindowComponent): group_list.check_item_with_text(group_name) group_list.click_item_with_text(group_name) + # Нажатие кнопки "Поиск" search_button = self.get_button_by_name("search") search_button.click() @@ -212,6 +264,10 @@ class AddADUserModalWindow(ModalWindowComponent): if count == 2: assert False, f"Selected group {group_name} is empty. Use another group." + # Если в группе есть пользователи, открывается новое поле, персчет локаторов + self.update_input_form_fields(expand=True) + + # Поиск и выбор заданного пользователя AD из списка существующих user_AD_loc = input_form_locator.get_by_role("combobox").nth(1) user_AD_input = TextInput(self.page, user_AD_loc, "user_AD_input") self.add_content_item("user_AD_input", user_AD_input) @@ -224,12 +280,18 @@ class AddADUserModalWindow(ModalWindowComponent): user_AD_list = self.get_content_item("user_AD_list") user_AD_list.scroll_until_end(menu_locator) user_AD_names = group_list.get_item_names(menu_locator) - if name not in user_AD_names: - assert False, f"Required user name {name} is missing" + if name_AD not in user_AD_names: + assert False, f"Required user name {name_AD} is missing" - user_AD_list.check_item_with_text(name) - user_AD_list.click_item_with_text(name) + user_AD_list.check_item_with_text(name_AD) + user_AD_list.click_item_with_text(name_AD) + # Заполнение поля "Имя" (ручной ввод) если задано + if name: + name_field = self.get_content_item("name_input") + name_field.input_value(name) + + # Поиск и выбор заданной роли из списка существующих role_field = self.get_content_item("role_input") role_field.click() @@ -237,6 +299,32 @@ class AddADUserModalWindow(ModalWindowComponent): roles_list.check_item_with_text(user_data["role"]) roles_list.click_item_with_text(user_data["role"]) + if user_data.get("commentary"): + input_field = self.get_content_item("commentary_input") + input_field.input_value(user_data["commentary"]) + + if user_data.get("email"): + input_field = self.get_content_item("email_input") + input_field.input_value(user_data["email"]) + + if user_data.get("phone_number"): + input_field = self.get_content_item("phone_input") + input_field.input_value(user_data["phone_number"]) + + if user_data.get("blocking_checked"): + checkbox = self.get_content_item("blocking_checkbox") + if user_data["blocking_checked"]: + checkbox.check() + else: + checkbox.uncheck() + + if user_data.get("push_notification_checked"): + checkbox = self.get_content_item("push_notification_checkbox") + if user_data["push_notification_checked"]: + checkbox.check() + else: + checkbox.uncheck() + # Отправка формы add_button = self.get_button_by_name("add") add_button.click() @@ -247,10 +335,7 @@ class AddADUserModalWindow(ModalWindowComponent): title, f"Confirmation dialog window with title '{title}' is missing" ) - - # На первом этапе реального пользователя не создаем - self.new_user_confirm.click_cancel_button() - self.close_window() + self.new_user_confirm.click_allow_button() def close_window(self): """Закрывает модальное окно через кнопку 'Закрыть'.""" @@ -290,6 +375,11 @@ class AddADUserModalWindow(ModalWindowComponent): "Active Directory", "Label 'Active Directory' is missing" ) + elif name == "blocking_checkbox_label": + item.check_have_text( + "Блокировка", + "Label 'Блокировка' is missing" + ) elif name == "push_notification_checkbox_label": item.check_have_text( "Подписка на Push-уведомления", @@ -323,10 +413,24 @@ class AddADUserModalWindow(ModalWindowComponent): elif name in no_op_names: continue else: + print(f"check item: {name}") item.check_visibility( f"Modal window content item with name '{name}' is missing" ) + # Дополнительная проверка состояния чекбоксов + blocking_checkbox = self.get_content_item("blocking_checkbox") + is_blocking_checked = blocking_checkbox.is_checked() + assert not is_blocking_checked, ( + "Checkbox 'Блокировка' should not be checked by default" + ) + + push_checkbox = self.get_content_item("push_notification_checkbox") + is_push_checked = push_checkbox.is_checked() + assert not is_push_checked, ( + "Checkbox 'Подписка на Push-уведомления' should not be checked by default" + ) + self.check_button_visibility("search") self.check_button_visibility("add") self.check_button_visibility("close") @@ -334,6 +438,7 @@ class AddADUserModalWindow(ModalWindowComponent): search_button = self.get_button_by_name("search") search_button.click() + # Проверка что поле "Пользователи AD" появилось после поиска user_AD_loc = input_form_locator.get_by_role("combobox").nth(1) user_AD_input = TextInput(self.page, user_AD_loc, "user_AD_input") self.add_content_item("user_AD_input", user_AD_input) diff --git a/components_derived/modal_add_local_user.py b/components_derived/modal_add_local_user.py index 90714ce..da4c02c 100644 --- a/components_derived/modal_add_local_user.py +++ b/components_derived/modal_add_local_user.py @@ -52,7 +52,7 @@ class AddLocalUserModalWindow(ModalWindowComponent): self.add_toolbar_title(self.window_title) self.add_toolbar_button(locator_button_toolbar_close, "close") - # Добавление элементов формы + # Добавление элементов формы по порядку расположения в окне checkbox_1 = Checkbox( page, self.page.locator(input_form_locator).get_by_role("checkbox").nth(0), @@ -68,6 +68,7 @@ class AddLocalUserModalWindow(ModalWindowComponent): ) self.add_content_item("active_directory_checkbox_label", label_1) + # Поле Имя loc = ( self.page.locator(input_form_locator) .locator("xpath=div[2]") @@ -76,48 +77,10 @@ class AddLocalUserModalWindow(ModalWindowComponent): name_input = TextInput(page, loc, "name_input") self.add_content_item("name_input", name_input) - role_loc = self.page.locator(input_form_locator).get_by_role("combobox").nth(0) - role_input = TextInput(page, role_loc, "role_input") - self.add_content_item("role_input", role_input) - self.add_content_item("roles_list", DropdownList(page)) - - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[5]") - .locator(text_field_locator) - ) - password_input = TextInput(page, loc, "password_input") - self.add_content_item("password_input", password_input) - - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[6]") - .locator(text_field_locator) - ) - commentary_input = TextInput(page, loc, "commentary_input") - self.add_content_item("commentary_input", commentary_input) - - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[7]") - .locator(text_field_locator) - ) - email_input = TextInput(page, loc, "email_input") - self.add_content_item("email_input", email_input) - - loc = ( - self.page.locator(input_form_locator) - .locator("xpath=div[8]") - .locator(text_field_locator) - ) - phone_input = TextInput(page, loc, "phone_input") - self.add_content_item("phone_input", phone_input) - # Чекбокс "Блокировка" - индекс 1 checkbox_2 = Checkbox( page, - self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA) - .get_by_role("checkbox").nth(1), + self.page.locator(input_form_locator).get_by_role("checkbox").nth(1), "blocking" ) self.add_content_item("blocking_checkbox", checkbox_2) @@ -130,6 +93,48 @@ class AddLocalUserModalWindow(ModalWindowComponent): ) self.add_content_item("blocking_checkbox_label", label_2) + # Поле Роль + role_loc = self.page.locator(input_form_locator).get_by_role("combobox").nth(0) + role_input = TextInput(page, role_loc, "role_input") + self.add_content_item("role_input", role_input) + self.add_content_item("roles_list", DropdownList(page)) + + # Поле Пароль + loc = ( + self.page.locator(input_form_locator) + .locator("xpath=div[5]") + .locator(text_field_locator) + ) + password_input = TextInput(page, loc, "password_input") + self.add_content_item("password_input", password_input) + + # Поле Комментарий + loc = ( + self.page.locator(input_form_locator) + .locator("xpath=div[6]") + .locator(text_field_locator) + ) + commentary_input = TextInput(page, loc, "commentary_input") + self.add_content_item("commentary_input", commentary_input) + + # Поле E-mail + loc = ( + self.page.locator(input_form_locator) + .locator("xpath=div[7]") + .locator(text_field_locator) + ) + email_input = TextInput(page, loc, "email_input") + self.add_content_item("email_input", email_input) + + # Поле Номер для СМС + loc = ( + self.page.locator(input_form_locator) + .locator("xpath=div[8]") + .locator(text_field_locator) + ) + phone_input = TextInput(page, loc, "phone_input") + self.add_content_item("phone_input", phone_input) + # Чекбокс "Подписка на Push-уведомления" - индекс 2 checkbox_3 = Checkbox( page, @@ -154,6 +159,7 @@ class AddLocalUserModalWindow(ModalWindowComponent): locator_button_close = self.page.get_by_role("button", name="Закрыть") self.add_button(locator_button_close, "close") + # Добавление компонента подтверждения/отмены заведения пользователя self.new_user_confirm = ConfirmComponent(page, " Отмена ", " Добавить ") # Действия: @@ -167,6 +173,26 @@ class AddLocalUserModalWindow(ModalWindowComponent): self.get_content_item("active_directory_checkbox").uncheck(force=True) + def check_blocking_checkbox(self): + """Включает чек-бокс Блокировка.""" + + self.get_content_item("blocking_checkbox").check(force=True) + + def uncheck_blocking_checkbox(self): + """Выключает чек-бокс Блокировка.""" + + self.get_content_item("blocking_checkbox").uncheck(force=True) + + def check_push_notification_checkbox(self): + """Включает чек-бокс Push-уведомления.""" + + self.get_content_item("push_notification_checkbox").check(force=True) + + def uncheck_push_notification_checkbox(self): + """Выключает чек-бокс Push-уведомления.""" + + self.get_content_item("push_notification_checkbox").uncheck(force=True) + def new_user(self, user_data): """Заполняет форму и добавляет нового пользователя. diff --git a/components_derived/modal_edit_user.py b/components_derived/modal_edit_user.py index b7b35b4..d37a7ce 100644 --- a/components_derived/modal_edit_user.py +++ b/components_derived/modal_edit_user.py @@ -50,6 +50,7 @@ class EditUserModalWindow(ModalWindowComponent): self.add_toolbar_button(locator_button_toolbar_close, "close") # Добавление полей формы + # Поле Имя loc = ( self.page.locator(input_form_locator) .locator("xpath=div[1]") @@ -58,11 +59,13 @@ class EditUserModalWindow(ModalWindowComponent): name_input = TextInput(page, loc, "name_input") self.add_content_item("name_input", name_input) + # Поле Роль role_loc = self.page.locator(input_form_locator).get_by_role("combobox").nth(0) role_input = TextInput(page, role_loc, "role_input") self.add_content_item("role_input", role_input) self.add_content_item("roles_list", DropdownList(page)) + # Поле Комментарий loc = ( self.page.locator(input_form_locator) .locator("xpath=div[4]") @@ -71,6 +74,7 @@ class EditUserModalWindow(ModalWindowComponent): commentary_input = TextInput(page, loc, "commentary_input") self.add_content_item("commentary_input", commentary_input) + # Поле E-mail loc = ( self.page.locator(input_form_locator) .locator("xpath=div[5]") @@ -79,6 +83,7 @@ class EditUserModalWindow(ModalWindowComponent): email_input = TextInput(page, loc, "email_input") self.add_content_item("email_input", email_input) + # Поле Номер для СМС loc = ( self.page.locator(input_form_locator) .locator("xpath=div[6]") @@ -140,6 +145,27 @@ class EditUserModalWindow(ModalWindowComponent): self.save_user_confirm = ConfirmComponent(page, " Отмена ", " Сохранить ") self.delete_user_confirm = ConfirmComponent(page, " Отмена ", " Удалить ") + # Действия: + def check_blocking_checkbox(self): + """Включает чек-бокс Блокировка.""" + + self.get_content_item("blocking_checkbox").check(force=True) + + def uncheck_blocking_checkbox(self): + """Выключает чек-бокс Блокировка.""" + + self.get_content_item("blocking_checkbox").uncheck(force=True) + + def check_push_notification_checkbox(self): + """Включает чек-бокс Push-уведомления.""" + + self.get_content_item("push_notification_checkbox").check(force=True) + + def uncheck_push_notification_checkbox(self): + """Выключает чек-бокс Push-уведомления.""" + + self.get_content_item("push_notification_checkbox").uncheck(force=True) + def close_window(self): """Закрывает окно через кнопку 'Закрыть'.""" @@ -227,6 +253,7 @@ class EditUserModalWindow(ModalWindowComponent): reset_password_button = self.get_button_by_name("reset_password") reset_password_button.click() + # Проверки: def check_content(self, user_name, role): """Проверяет наличие и корректность элементов окна. @@ -273,19 +300,6 @@ class EditUserModalWindow(ModalWindowComponent): f"Modal window content item with name '{name}' is missing" ) - # Дополнительная проверка состояния чекбоксов - blocking_checkbox = self.get_content_item("blocking_checkbox") - is_blocking_checked = blocking_checkbox.is_checked() - assert not is_blocking_checked, ( - "Checkbox 'Блокировка' should not be checked by default" - ) - - push_checkbox = self.get_content_item("push_notification_checkbox") - is_push_checked = push_checkbox.is_checked() - assert not is_push_checked, ( - "Checkbox 'Подписка на Push-уведомления' should be checked by default" - ) - self.check_button_visibility("save") self.check_button_visibility("delete") self.check_button_visibility("reset_password") diff --git a/pages/users_tab.py b/pages/users_tab.py index fe2fb88..36a84f3 100644 --- a/pages/users_tab.py +++ b/pages/users_tab.py @@ -183,8 +183,6 @@ class UsersTab(BasePage): add_user_window.check_active_directory_checkbox() self.add_modal_window("add_AD_user", "") add_user_window = self.get_modal_window("add_AD_user") - add_user_window.new_user(user_data) - return True add_user_window.new_user(user_data) @@ -195,8 +193,9 @@ class UsersTab(BasePage): self.alert.check_alert_absence(' Новый пользователь \n успешно добавлен! ') is_added = True elif alert_type == "error": - self.alert.check_alert_presence(f' Имя {user_data["name"]} уже используется ') - self.alert.check_alert_absence(f' Имя {user_data["name"]} уже используется ') + print(f' Имя {user_data["name"]} уже используется ') + self.alert.check_alert_presence(f' Имя {user_data["name"]} уже \n используется ') + self.alert.check_alert_absence(f' Имя {user_data["name"]} уже \n используется ') else: assert False, f"Got unexpected alert type {alert_type}" diff --git a/tests/e2e/test_add_user.py b/tests/e2e/test_add_user.py new file mode 100644 index 0000000..b8a233d --- /dev/null +++ b/tests/e2e/test_add_user.py @@ -0,0 +1,179 @@ +"""Модуль тестов вкладки 'Пользователи'. + +Содержит тесты для проверки функциональности +работы с пользователями системы. +""" + +from typing import Dict +import pytest +from playwright.sync_api import Page +from pages.users_tab import UsersTab +from pages.main_page import MainPage +from pages.login_page import LoginPage + +class TestUsersTabAddUser: + """Класс тестов для проверки вкладки 'Пользователи' - действия при создании пользователя. + + Тесты покрывают следующие сценарии: + 1. test_add_user_window_content: Проверяет содержимое окна добавления пользователя + 2. test_add_user_window_close_buttons: Проверяет кнопки закрытия окна добавления + 3. test_add_local_user: Проверяет добавление локального пользователя + 4. test_add_AD_user: Проверяет добавление пользователя Active Directory + """ + + @pytest.fixture(scope="function", autouse=True) + def setup(self, browser: Page) -> None: + """Настраивает тестовое окружение. + + Args: + browser: Экземпляр страницы Playwright. + """ + + lp = LoginPage(browser) + lp.do_login() + + mp = MainPage(browser) + mp.should_be_navigation_panel() + mp.click_main_navigation_panel_item("Настройки") + mp.click_subpanel_item("Пользователи") + + @pytest.fixture(scope="function") + def cleanup_users(self, browser: Page) -> None: + """Фикстура для очистки тестовых пользователей и их сеансов после теста.""" + yield + + # Выход из системы текущего пользователя + mp = MainPage(browser) + mp.do_logout() + + # Авторизация администратором для очистки + login_page = LoginPage(browser) + login_page.do_login() + + # Удаляем тестовых пользователей + self._cleanup_test_users(browser) + + def _cleanup_test_users(self, browser: Page) -> None: + """Удаляет тестовых пользователей.""" + mp = MainPage(browser) + mp.click_main_navigation_panel_item("Настройки") + mp.click_subpanel_item("Пользователи") + ut = UsersTab(browser) + + # Удаляем тестовых пользователей + test_users = ["TestUser", "TestUserAD"] + + for user_name in test_users: + # Проверяем существует ли пользователь и удаляем его + user_index = ut.find_user_in_table(user_name, "Администратор") + if user_index != -1: + ut.open_edit_user_page_by_user(user_name, "Администратор") + ut.delete_user(user_name) + + # @pytest.mark.develop + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_add_user_window_content(self, browser: Page) -> None: + """Проверяет содержимое окна добавления пользователя. + + Args: + browser: Экземпляр страницы Playwright. + """ + + ut = UsersTab(browser) + ut.open_add_user_window() + ut.check_add_user_window_content() + ut.transform_to_add_AD_user_window() + ut.check_add_AD_user_window_content() + + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_add_user_window_close_buttons(self, browser: Page) -> None: + """Проверяет кнопки закрытия окна добавления. + + Args: + browser: Экземпляр страницы Playwright. + """ + + ut = UsersTab(browser) + ut.open_add_user_window() + ut.close_add_user_window_by_toolbar_button() + + ut.open_add_user_window() + ut.close_add_user_window() + + ut.open_add_user_window() + ut.transform_to_add_AD_user_window() + ut.close_add_AD_user_window_by_toolbar_button() + + ut.open_add_user_window() + ut.transform_to_add_AD_user_window() + ut.close_add_AD_user_window() + + # @pytest.mark.develop + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_add_local_user(self, browser: Page, cleanup_users: None) -> None: + """Проверяет добавление локального пользователя. + + Args: + browser: Экземпляр страницы Playwright. + cleanup_users: Фикстура для автоматического удаления пользователя после теста. + """ + + user_data: Dict[str, str] = {"name": "TestUser", "role": "Администратор", "password": "987654321abcd"} + self._add_user(browser, user_data) + + # @pytest.mark.develop + # @pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_add_AD_user(self, browser: Page, cleanup_users: None) -> None: + """Проверяет добавление пользователя Active Directory. + + Args: + browser: Экземпляр страницы Playwright. + cleanup_users: Фикстура для автоматического удаления пользователя после теста. + """ + + user_data: Dict[str, str] = { + "auth_type": "active_directory", + "group": "NMS_tester", + "name_AD": "tester1", # Выбор из списка "Пользователи AD" + "name": "TestUserAD", # Ручной ввод в поле "Имя" + "role": "Администратор" + } + self._add_user(browser, user_data) + + def _add_user(self, browser: Page, user_data: Dict[str, str]) -> None: + """Действия при добавлении пользователя. + + Args: + browser: Экземпляр страницы Playwright. + user_data: Список полей для заполнения формы создания пользователя. + """ + + ut = UsersTab(browser) + + # Проверяем, есть ли такой пользователь + user_exists = ut.find_user_in_table(user_data["name"], user_data["role"]) != -1 + + if not user_exists: + # Создаем пользователя впервые + ut.open_add_user_window() + success = ut.add_new_user(user_data) + + if success: + # Ждем обновления таблицы с использованием ожиданий Playwright + browser.wait_for_timeout(2000) + + # Проверяем наличие пользователя в таблице + user_found = ut.find_user_in_table(user_data["name"], user_data["role"]) != -1 + if not user_found: + # Если пользователь не найден, обновляем страницу + browser.reload() + browser.wait_for_timeout(2000) + else: + ut.close_add_user_window() + + # Пытаемся создать такого же пользователя снова + ut.open_add_user_window() + success_second = ut.add_new_user(user_data) + + # Должно вернуться False при попытке создания существующего пользователя + assert not success_second, "Ожидалась ошибка при создании существующего пользователя" diff --git a/tests/e2e/test_edit_user.py b/tests/e2e/test_edit_user.py new file mode 100644 index 0000000..98d9860 --- /dev/null +++ b/tests/e2e/test_edit_user.py @@ -0,0 +1,212 @@ +"""Модуль тестов вкладки 'Пользователи'. + +Содержит тесты для проверки функциональности +работы с пользователями системы. +""" + +from typing import Dict +import pytest +from playwright.sync_api import Page +from pages.users_tab import UsersTab +from pages.main_page import MainPage +from pages.login_page import LoginPage + +class TestUsersTab: + """Класс тестов для проверки вкладки 'Пользователи'. + + Тесты покрывают следующие сценарии: + 1. test_edit_user_window_content: Проверяет содержимое окна редактирования + 2. test_edit_user_window_close_buttons: Проверяет кнопки закрытия окна редактирования + 3. test_delete_user: Проверяет добавление и удаление пользователя + 4. test_reset_password: Проверяет сброс пароля пользователя + 5. test_edit_user_role: Проверяет изменение роли пользователя + """ + + @pytest.fixture(scope="function", autouse=True) + def setup(self, browser: Page) -> None: + """Настраивает тестовое окружение. + + Args: + browser: Экземпляр страницы Playwright. + """ + + lp = LoginPage(browser) + lp.do_login() + + mp = MainPage(browser) + mp.should_be_navigation_panel() + mp.click_main_navigation_panel_item("Настройки") + mp.click_subpanel_item("Пользователи") + + @pytest.fixture(scope="function") + def cleanup_users(self, browser: Page) -> None: + """Фикстура для очистки тестовых пользователей и их сеансов после теста.""" + yield + + # Выход из системы текущего пользователя + mp = MainPage(browser) + mp.do_logout() + + # Авторизация администратором для очистки + login_page = LoginPage(browser) + login_page.do_login() + + # Удаляем тестовых пользователей + self._cleanup_test_users(browser) + + def _cleanup_test_users(self, browser: Page) -> None: + """Удаляет тестовых пользователей.""" + mp = MainPage(browser) + mp.click_main_navigation_panel_item("Настройки") + mp.click_subpanel_item("Пользователи") + ut = UsersTab(browser) + + # Удаляем тестовых пользователей + test_users = ["TestUser", "TestUserAutoOperator", "TestUserAutoAdmin"] + + for user_name in test_users: + # Проверяем существует ли пользователь и удаляем его + user_index = ut.find_user_in_table(user_name, "Администратор") + if user_index != -1: + ut.open_edit_user_page_by_user(user_name, "Администратор") + ut.delete_user(user_name) + + # @pytest.mark.develop + # @pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_edit_user_window_content(self, browser: Page) -> None: + """Проверяет содержимое окна редактирования. + + Args: + browser: Экземпляр страницы Playwright. + """ + + ut = UsersTab(browser) + user_name, role = ut.open_edit_user_page_by_index(0) + ut.check_edit_user_window_content(user_name, role) + + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_edit_user_window_close_buttons(self, browser: Page) -> None: + """Проверяет кнопки закрытия окна редактирования. + + Args: + browser: Экземпляр страницы Playwright. + """ + + ut = UsersTab(browser) + user_name, _ = ut.open_edit_user_page_by_index(0) + ut.close_edit_user_window_by_toolbar_button(user_name) + user_name, _ = ut.open_edit_user_page_by_index(0) + ut.close_edit_user_window(user_name) + + # @pytest.mark.develop + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_delete_user(self, browser: Page, cleanup_users: None) -> None: + """Проверяет удаление пользователя. + + Args: + browser: Экземпляр страницы Playwright. + cleanup_users: Фикстура для автоматического удаления пользователя после теста. + """ + + user_data: Dict[str, str] = {"name": "TestUser", "role": "Администратор", "password": "987654321abcd"} + + mp = MainPage(browser) + ut = UsersTab(browser) + + # Проверяем, есть ли такой пользователь + user_exists = ut.find_user_in_table(user_data["name"], user_data["role"]) != -1 + + if not user_exists: + # Создаем пользователя впервые + ut.open_add_user_window() + success = ut.add_new_user(user_data) + + if success: + # Ждем обновления таблицы с использованием ожиданий Playwright + browser.wait_for_timeout(2000) + + # Проверяем наличие пользователя в таблице + user_found = ut.find_user_in_table(user_data["name"], user_data["role"]) != -1 + if not user_found: + # Если пользователь не найден, обновляем страницу + browser.reload() + browser.wait_for_timeout(2000) + else: + ut.close_add_user_window() + + ut.open_edit_user_page_by_user(user_data["name"], user_data["role"]) + ut.delete_user(user_data["name"]) + mp.click_subpanel_item("Пользователи") + mp.click_subpanel_item("Пользователи") + ut.should_not_be_user_in_table(user_data["name"], user_data["role"]) + + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_reset_password(self, browser: Page, cleanup_users: None) -> None: + """Проверяет сброс пароля пользователя. + + Args: + browser: Экземпляр страницы Playwright. + cleanup_users: Фикстура для автоматического удаления пользователя после теста. + """ + + user_data: Dict[str, str] = {"name": "TestUserAutoAdmin", "role": "Администратор", "password": "123456789abcd"} + + mp = MainPage(browser) + ut = UsersTab(browser) + + ut.open_add_user_window() + ut.add_new_user(user_data) + mp.click_subpanel_item("Пользователи") + mp.click_subpanel_item("Пользователи") + ut.open_edit_user_page_by_user(user_data["name"], user_data["role"]) + new_password = ut.reset_password(user_data["name"]) + + if len(new_password) == 0: + assert False, "Unsuccessful password reset" + + new_lp = LoginPage(browser) + new_lp.do_login(username=user_data["name"], password=new_password) + new_mp = MainPage(browser) + new_mp.do_logout() + lp_1 = LoginPage(browser) + lp_1.do_login() + mp_1 = MainPage(browser) + mp_1.should_be_navigation_panel() + mp_1.click_main_navigation_panel_item("Настройки") + mp_1.click_subpanel_item("Пользователи") + ut_1 = UsersTab(browser) + ut_1.open_edit_user_page_by_user(user_data["name"], user_data["role"]) + ut_1.delete_user(user_data["name"]) + mp_1.click_subpanel_item("Пользователи") + mp_1.click_subpanel_item("Пользователи") + ut_1.should_not_be_user_in_table(user_data["name"], user_data["role"]) + + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_edit_user_role(self, browser: Page, cleanup_users: None) -> None: + """Проверяет изменение роли пользователя. + + Args: + browser: Экземпляр страницы Playwright. + cleanup_users: Фикстура для автоматического удаления пользователя после теста. + """ + + user_data: Dict[str, str] = {"name": "TestUserAutoOperator", "role": "Оператор", "password": "1232456789abcd"} + + mp = MainPage(browser) + ut = UsersTab(browser) + + ut.open_add_user_window() + ut.add_new_user(user_data) + mp.click_subpanel_item("Пользователи") + mp.click_subpanel_item("Пользователи") + ut.open_edit_user_page_by_user(user_data["name"], user_data["role"]) + new_user_data = {"role": "Контактное лицо"} + ut.edit_user(user_data["name"], new_user_data) + mp.click_subpanel_item("Пользователи") + mp.click_subpanel_item("Пользователи") + ut.should_be_user_in_table(user_data["name"], new_user_data["role"]) + ut.open_edit_user_page_by_user(user_data["name"], new_user_data["role"]) + ut.delete_user(user_data["name"]) + mp.click_subpanel_item("Пользователи") + mp.click_subpanel_item("Пользователи") + ut.should_not_be_user_in_table(user_data["name"], new_user_data["role"]) diff --git a/tests/e2e/test_users_tab.py b/tests/e2e/test_users_tab.py index fc666bb..81665c2 100644 --- a/tests/e2e/test_users_tab.py +++ b/tests/e2e/test_users_tab.py @@ -4,7 +4,6 @@ работы с пользователями системы. """ -from typing import Dict import pytest from playwright.sync_api import Page from pages.users_tab import UsersTab @@ -17,14 +16,6 @@ class TestUsersTab: Тесты покрывают следующие сценарии: 1. test_users_tab_content: Проверяет содержимое вкладки 'Пользователи' 2. test_users_tab_toolbar_buttons: Проверяет кнопки на панели инструментов - 3. test_add_user_window_content: Проверяет содержимое окна добавления пользователя - 4. test_add_user_window_close_buttons: Проверяет кнопки закрытия окна добавления - 5 test_edit_user_window_content: Проверяет содержимое окна редактирования - 6. test_edit_user_window_close_buttons: Проверяет кнопки закрытия окна редактирования - 7. test_add_and_delete_user: Проверяет добавление и удаление пользователя - 8. test_add_AD_user: Проверяет добавление пользователя Active Directory - 9. test_reset_password: Проверяет сброс пароля пользователя - 10.test_edit_user_role: Проверяет изменение роли пользователя """ @pytest.fixture(scope="function", autouse=True) @@ -43,39 +34,6 @@ class TestUsersTab: mp.click_main_navigation_panel_item("Настройки") mp.click_subpanel_item("Пользователи") - @pytest.fixture(scope="function") - def cleanup_users(self, browser: Page) -> None: - """Фикстура для очистки тестовых пользователей и их сеансов после теста.""" - yield - - # Выход из системы текущего пользователя - mp = MainPage(browser) - mp.do_logout() - - # Авторизация администратором для очистки - login_page = LoginPage(browser) - login_page.do_login() - - # Удаляем тестовых пользователей - self._cleanup_test_users(browser) - - def _cleanup_test_users(self, browser: Page) -> None: - """Удаляет тестовых пользователей.""" - mp = MainPage(browser) - mp.click_main_navigation_panel_item("Настройки") - mp.click_subpanel_item("Пользователи") - ut = UsersTab(browser) - - # Удаляем тестовых пользователей - test_users = ["TestUser", "TestUserAutoOperator", "TestUserAutoAdmin"] - - for user_name in test_users: - # Проверяем существует ли пользователь и удаляем его - user_index = ut.find_user_in_table(user_name, "Администратор") - if user_index != -1: - ut.open_edit_user_page_by_user(user_name, "Администратор") - ut.delete_user(user_name) - #@pytest.mark.skip(reason=" Временно исключено из тестирования") def test_users_tab_content(self, browser: Page) -> None: """Проверяет содержимое вкладки 'Пользователи'. @@ -99,207 +57,3 @@ class TestUsersTab: ut = UsersTab(browser) ut.should_be_toolbar_buttons() - - # @pytest.mark.develop - #@pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_add_user_window_content(self, browser: Page) -> None: - """Проверяет содержимое окна добавления пользователя. - - Args: - browser: Экземпляр страницы Playwright. - """ - - ut = UsersTab(browser) - ut.open_add_user_window() - ut.check_add_user_window_content() - ut.transform_to_add_AD_user_window() - ut.check_add_AD_user_window_content() - - #@pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_add_user_window_close_buttons(self, browser: Page) -> None: - """Проверяет кнопки закрытия окна добавления. - - Args: - browser: Экземпляр страницы Playwright. - """ - - ut = UsersTab(browser) - ut.open_add_user_window() - ut.close_add_user_window_by_toolbar_button() - - ut.open_add_user_window() - ut.close_add_user_window() - - ut.open_add_user_window() - ut.transform_to_add_AD_user_window() - ut.close_add_AD_user_window_by_toolbar_button() - - ut.open_add_user_window() - ut.transform_to_add_AD_user_window() - ut.close_add_AD_user_window() - - #@pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_edit_user_window_content(self, browser: Page) -> None: - """Проверяет содержимое окна редактирования. - - Args: - browser: Экземпляр страницы Playwright. - """ - - ut = UsersTab(browser) - user_name, role = ut.open_edit_user_page_by_index(0) - ut.check_edit_user_window_content(user_name, role) - - #@pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_edit_user_window_close_buttons(self, browser: Page) -> None: - """Проверяет кнопки закрытия окна редактирования. - - Args: - browser: Экземпляр страницы Playwright. - """ - - ut = UsersTab(browser) - user_name, _ = ut.open_edit_user_page_by_index(0) - ut.close_edit_user_window_by_toolbar_button(user_name) - user_name, _ = ut.open_edit_user_page_by_index(0) - ut.close_edit_user_window(user_name) - - # @pytest.mark.develop - #@pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_add_and_delete_user(self, browser: Page, cleanup_users: None) -> None: - """Проверяет добавление и удаление пользователя. - - Args: - browser: Экземпляр страницы Playwright. - cleanup_users: Фикстура для автоматического удаления пользователя после теста. - """ - - user_data: Dict[str, str] = {"name": "TestUser", "role": "Администратор", "password": "987654321abcd"} - - mp = MainPage(browser) - ut = UsersTab(browser) - - # Проверяем, есть ли такой пользователь - user_exists = ut.find_user_in_table(user_data["name"], user_data["role"]) != -1 - - if not user_exists: - # Создаем пользователя впервые - ut.open_add_user_window() - success = ut.add_new_user(user_data) - - if success: - # Ждем обновления таблицы с использованием ожиданий Playwright - browser.wait_for_timeout(2000) - - # Проверяем наличие пользователя в таблице - user_found = ut.find_user_in_table(user_data["name"], user_data["role"]) != -1 - if not user_found: - # Если пользователь не найден, обновляем страницу - browser.reload() - browser.wait_for_timeout(2000) - else: - ut.close_add_user_window() - - # Пытаемся создать такого же пользователя снова - ut.open_add_user_window() - success_second = ut.add_new_user(user_data) - - # Должно вернуться False при попытке создания существующего пользователя - assert not success_second, "Ожидалась ошибка при создании существующего пользователя" - - ut.open_edit_user_page_by_user(user_data["name"], user_data["role"]) - ut.delete_user(user_data["name"]) - mp.click_subpanel_item("Пользователи") - mp.click_subpanel_item("Пользователи") - ut.should_not_be_user_in_table(user_data["name"], user_data["role"]) - - # @pytest.mark.develop - @pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_add_AD_user(self, browser: Page, cleanup_users: None) -> None: - """Проверяет добавление пользователя Active Directory. - - Args: - browser: Экземпляр страницы Playwright. - cleanup_users: Фикстура для автоматического удаления пользователя после теста. - """ - - user_data: Dict[str, str] = {"auth_type":"active_directory", - "group": "Администраторы", - "name": "Администратор", - "role": "Администратор"} - - ut = UsersTab(browser) - - ut.open_add_user_window() - ut.add_new_user(user_data) - - #@pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_reset_password(self, browser: Page, cleanup_users: None) -> None: - """Проверяет сброс пароля пользователя. - - Args: - browser: Экземпляр страницы Playwright. - cleanup_users: Фикстура для автоматического удаления пользователя после теста. - """ - - user_data: Dict[str, str] = {"name": "TestUserAutoAdmin", "role": "Администратор", "password": "123456789abcd"} - - mp = MainPage(browser) - ut = UsersTab(browser) - - ut.open_add_user_window() - ut.add_new_user(user_data) - mp.click_subpanel_item("Пользователи") - mp.click_subpanel_item("Пользователи") - ut.open_edit_user_page_by_user(user_data["name"], user_data["role"]) - new_password = ut.reset_password(user_data["name"]) - - if len(new_password) == 0: - assert False, "Unsuccessful password reset" - - new_lp = LoginPage(browser) - new_lp.do_login(username=user_data["name"], password=new_password) - new_mp = MainPage(browser) - new_mp.do_logout() - lp_1 = LoginPage(browser) - lp_1.do_login() - mp_1 = MainPage(browser) - mp_1.should_be_navigation_panel() - mp_1.click_main_navigation_panel_item("Настройки") - mp_1.click_subpanel_item("Пользователи") - ut_1 = UsersTab(browser) - ut_1.open_edit_user_page_by_user(user_data["name"], user_data["role"]) - ut_1.delete_user(user_data["name"]) - mp_1.click_subpanel_item("Пользователи") - mp_1.click_subpanel_item("Пользователи") - ut_1.should_not_be_user_in_table(user_data["name"], user_data["role"]) - - #@pytest.mark.skip(reason=" Временно исключено из тестирования") - def test_edit_user_role(self, browser: Page, cleanup_users: None) -> None: - """Проверяет изменение роли пользователя. - - Args: - browser: Экземпляр страницы Playwright. - cleanup_users: Фикстура для автоматического удаления пользователя после теста. - """ - - user_data: Dict[str, str] = {"name": "TestUserAutoOperator", "role": "Оператор", "password": "1232456789abcd"} - - mp = MainPage(browser) - ut = UsersTab(browser) - - ut.open_add_user_window() - ut.add_new_user(user_data) - mp.click_subpanel_item("Пользователи") - mp.click_subpanel_item("Пользователи") - ut.open_edit_user_page_by_user(user_data["name"], user_data["role"]) - new_user_data = {"role": "Контактное лицо"} - ut.edit_user(user_data["name"], new_user_data) - mp.click_subpanel_item("Пользователи") - mp.click_subpanel_item("Пользователи") - ut.should_be_user_in_table(user_data["name"], new_user_data["role"]) - ut.open_edit_user_page_by_user(user_data["name"], new_user_data["role"]) - ut.delete_user(user_data["name"]) - mp.click_subpanel_item("Пользователи") - mp.click_subpanel_item("Пользователи") - ut.should_not_be_user_in_table(user_data["name"], new_user_data["role"])