"""Модуль вкладки настройки Keycloak Аутентификации. Содержит класс KeycloakAuthSettings для работы с вкладкой настройки Keycloak Аутентификации. Позволяет проверять состояние и взаимодействовать с элементами вкладки. """ import re from playwright.sync_api import Page from locators.settings_form_locators import SettingsFormLocators from elements.text_input_element import TextInput from components.toolbar_component import ToolbarComponent from components.alert_component import AlertComponent from components_derived.settings_form_component import SettingsFormComponent from pages.base_page import BasePage class KeycloakAuthSettingsTab(BasePage): """Класс для работы с вкладкой настройки Keycloak Аутентификации. Предоставляет методы для взаимодействия с вкладкой настройки Keycloak Аутентификации. Args: page: Экземпляр страницы Playwright. """ def __init__(self, page: Page) -> None: """Инициализирует компоненты вкладки настройки Keycloak Аутентификации.""" super().__init__(page) self.toolbar = ToolbarComponent(page, "KEYCLOAK") toolbar_button_edit = self.page.get_by_role("navigation"). \ locator("//button[@data-testid='KEYCLOAK__btn__edit']") self.toolbar.add_tooltip_button(toolbar_button_edit, "edit") toolbar_button_save = self.page.get_by_role("navigation"). \ locator("//button[@data-testid='KEYCLOAK__btn__done']") self.toolbar.add_tooltip_button(toolbar_button_save, "save") toolbar_button_cancel = self.page.get_by_role("navigation"). \ locator("//button[@data-testid='KEYCLOAK__btn__close']") self.toolbar.add_tooltip_button(toolbar_button_cancel, "cancel") # Форма для отображения/редактирования полей настроек KEYCLOAK Аутентификации self.settings_form = SettingsFormComponent(page) container_locator = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER) self.input_fields_locators = self.settings_form.get_input_fields_locators(container_locator) loc = self.input_fields_locators.get("url") loc_url_input = loc.locator("//input[@data-testid='KEYCLOAK__text-field__url']") url_setting_input = TextInput(page, loc_url_input, "url_setting_input") self.settings_form.add_content_item("url_setting_input", url_setting_input) loc = self.input_fields_locators.get("url_token") loc_url_token_input = loc.locator("//input[@data-testid='KEYCLOAK__text-field__url_token']") url_token_setting_input = TextInput(page, loc_url_token_input, "url_token_setting_input") self.settings_form.add_content_item("url_token_setting_input", url_token_setting_input) loc = self.input_fields_locators.get("clientid") loc_clientid_input = loc.locator("//input[@data-testid='KEYCLOAK__text-field__clientid']") clientid_setting_input = TextInput(page, loc_clientid_input, "clientid_setting_input") self.settings_form.add_content_item("clientid_setting_input", clientid_setting_input) loc = self.input_fields_locators.get("clientsecret") loc_clientsecret_input = loc.locator("//input[@data-testid='KEYCLOAK__text-field__clientsecret']") clientsecret_setting_input = TextInput(page, loc_clientsecret_input, "clientsecret_setting_input") self.settings_form.add_content_item("clientsecret_setting_input", clientsecret_setting_input) loc = self.input_fields_locators.get("redirect_uri") loc_redirect_uri_input = loc.locator("//input[@data-testid='KEYCLOAK__text-field__redirect_uri']") redirect_uri_setting_input = TextInput(page, loc_redirect_uri_input, "redirect_uri_setting_input") self.settings_form.add_content_item("redirect_uri_setting_input", redirect_uri_setting_input) self.alert = AlertComponent(page) # Действия: def click_cancel_button(self) -> None: """Нажатие кнопки 'Отменить' на тулбаре.""" self.toolbar.check_button_visibility("cancel") self.toolbar.get_button_by_name("cancel").click() def click_edit_button(self) -> None: """Нажатие кнопки 'Редактировать' на тулбаре.""" self.toolbar.check_button_visibility("edit") self.toolbar.get_button_by_name("edit").click() def click_save_button(self) -> None: """Нажатие кнопки 'Сохранить' на тулбаре.""" self.toolbar.check_button_visibility("save") self.toolbar.get_button_by_name("save").click() def get_current_setting_values(self) -> dict: """Возвращает текущее значение полей настроек. Returns: str : Текущее значение полей настроек. """ values = {} field = self.settings_form.get_content_item("url_setting_input") values.update({"url": field.get_input_value().strip()}) field = self.settings_form.get_content_item("url_token_setting_input") values.update({"url_token": field.get_input_value().strip()}) field = self.settings_form.get_content_item("clientid_setting_input") values.update({"clientid": field.get_input_value().strip()}) field = self.settings_form.get_content_item("clientsecret_setting_input") values.update({"clientsecret": field.get_input_value().strip()}) field = self.settings_form.get_content_item("redirect_uri_setting_input") values.update({"redirect_uri": field.get_input_value().strip()}) return values def input_url(self, text: str) -> None: """Заполнение поля 'URL'.""" message_input = self.settings_form.get_content_item("url_setting_input") message_input.clear() message_input.input_value(text) def input_url_token(self, text: str) -> None: """Заполнение поля 'URL_TOKEN'.""" message_input = self.settings_form.get_content_item("url_token_setting_input") message_input.clear() message_input.input_value(text) def input_clientid(self, text: str) -> None: """Заполнение поля 'CLIENTID'.""" message_input = self.settings_form.get_content_item("clientid_setting_input") message_input.clear() message_input.input_value(text) def input_clientsecret(self, text: str) -> None: """Заполнение поля 'CLIENTSECRET'.""" message_input = self.settings_form.get_content_item("clientsecret_setting_input") message_input.clear() message_input.input_value(text) def input_redirect_uri(self, text: str) -> None: """Заполнение поля 'REDIRECT_URI'.""" message_input = self.settings_form.get_content_item("redirect_uri_setting_input") message_input.clear() message_input.input_value(text) # Проверки: def check_content(self): """Проверяет наличие и корректность всех элементов страницы.""" expected_input_field_names = ["url", "url_token", "clientid", "clientsecret", "redirect_uri"] self.should_be_toolbar() actual_input_field_names = self.input_fields_locators.keys() for name in expected_input_field_names: assert name in actual_input_field_names, \ f"Expected input field name {name} is missing in actual input field names" for name in self.settings_form.content_items.keys(): item = self.settings_form.get_content_item(name) item.check_visibility( f"KEYCLOAK settings input form item with name '{name}' is missing" ) def should_be_toolbar(self) -> None: """Проверяет наличие тулбара страницы, наличие и функциональность кнопок тулбара. Raises: AssertionError: Если тулбар или кнопка тулбара отсутствуют. """ loc = self.page.get_by_role("navigation").filter( has_text=re.compile("KEYCLOAK")).locator("div").nth(1) self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar with title 'KEYCLOAK' is missing") self.toolbar.check_button_visibility("edit") self.toolbar.check_button_tooltip("edit", "Редактировать") self.toolbar.get_button_by_name("edit").click() self.toolbar.check_button_visibility("save") self.toolbar.check_button_visibility("cancel") self.toolbar.check_button_tooltip("save", "Сохранить") self.toolbar.check_button_tooltip("cancel", "Отменить") self.toolbar.get_button_by_name("cancel").click() self.toolbar.check_button_visibility("edit") def should_be_success_alert(self) -> None: """Проверяет наличие сообщения об успешном сохранении заданных параметров. Raises: AssertionError: Если тулбар отсутствует. """ alert_type = self.alert.get_alert_type() assert alert_type == "success", f"Expected success alert, but got {alert_type} alert" self.alert.check_alert_presence('\nПараметры успешно\n обновлены\n') self.alert.check_alert_absence('\nПараметры успешно\n обновлены\n')