Добавлен тест редактирования Стойки
parent
4ad79b108b
commit
b5c1ee5d23
File diff suppressed because it is too large
Load Diff
|
|
@ -31,38 +31,36 @@ class RackLocators:
|
||||||
# Контейнер формы создания/редактирования стойки
|
# Контейнер формы создания/редактирования стойки
|
||||||
FORM_INPUT_CONTAINER = "//div[contains(@class, 'flex xs6 pa-0')]"
|
FORM_INPUT_CONTAINER = "//div[contains(@class, 'flex xs6 pa-0')]"
|
||||||
|
|
||||||
# Локаторы полей формы создания стойки
|
# Форма редактирования стойки в модальном окне
|
||||||
RACK_NAME_FIELD = ("//div[contains(@class, 'container')]"
|
RACK_EDIT_FORM = "[data-testid='cabinet-bar__cabinet-form']"
|
||||||
"//label[text()='Имя']/following-sibling::input")
|
|
||||||
RACK_HEIGHT_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//div[contains(@class, 'v-input__slot') and "
|
|
||||||
".//label[text()='Высота в юнитах']]")
|
|
||||||
RACK_DEPTH_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//div[contains(@class, 'v-input__slot') and "
|
|
||||||
".//label[text()='Глубина (мм)']]")
|
|
||||||
RACK_SERIAL_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//label[text()='Серийный номер']/following-sibling::input")
|
|
||||||
RACK_INVENTORY_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//label[text()='Инвентарный номер']/following-sibling::input")
|
|
||||||
RACK_COMMENT_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//label[text()='Комментарий']/following-sibling::input")
|
|
||||||
RACK_CABLE_ENTRY_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//div[contains(@class, 'v-input__slot') and "
|
|
||||||
".//label[text()='Ввод кабеля']]")
|
|
||||||
RACK_STATE_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//div[contains(@class, 'v-input__slot') and "
|
|
||||||
".//label[text()='Состояние']]")
|
|
||||||
RACK_OWNER_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//div[contains(@class, 'v-input__slot') and "
|
|
||||||
".//label[text()='Владелец']]")
|
|
||||||
RACK_SERVICE_ORG_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//div[contains(@class, 'v-input__slot') and "
|
|
||||||
".//label[text()='Обслуживающая организация']]")
|
|
||||||
RACK_PROJECT_FIELD = ("//div[contains(@class, 'container')]"
|
|
||||||
"//div[contains(@class, 'v-input__slot') and "
|
|
||||||
".//label[text()='Проект/Титул']]")
|
|
||||||
|
|
||||||
# Локаторы для выпадающего меню
|
# Локаторы полей формы
|
||||||
|
INPUT_FORM_RACK_DATA = f"{RACK_EDIT_FORM}"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_NAME = "[data-testid='cabinet-bar__main__text-field__name']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_COMMENT = "[data-testid='cabinet-bar__main__text-field__comment']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_SERIAL = "[data-testid='cabinet-bar__main__text-field__serial_number']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_INVENTORY = "[data-testid='cabinet-bar__main__text-field__inventory_number']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_POWER = "[data-testid='cabinet-bar__main__text-field__allocated_power']"
|
||||||
|
|
||||||
|
# Локаторы для combobox полей
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_CABLE_ENTRY = "[data-testid='cabinet-bar__select_enum__select-field__cable_input']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_CONDITION_TYPE = "[data-testid='cabinet-bar__select_enum__select-field__condition_type']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_DEPTH = "[data-testid='cabinet-bar__select_enum__select-field__depth']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_USIZE = "[data-testid='cabinet-bar__select_enum__select-field__usize']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_OWNER = "[data-testid='cabinet-bar__select__select-field__owner']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_SERVICE_PROVIDER = "[data-testid='cabinet-bar__select__select-field__service_provider']"
|
||||||
|
INPUT_FORM_RACK_DATA_FIELD_PROJECT = "[data-testid='cabinet-bar__select__select-field__project']"
|
||||||
|
|
||||||
|
# Чекбоксы
|
||||||
|
INPUT_FORM_RACK_DATA_CHECKBOX_VENTILATION = "[data-testid='cabinet-bar__main__checkbox__available_ventilation_panel'] input[type='checkbox']"
|
||||||
|
INPUT_FORM_RACK_DATA_CHECKBOX_VENTILATION_LABEL = "label:has-text('Вентиляционная панель')"
|
||||||
|
INPUT_FORM_RACK_DATA_CHECKBOX_VENTILATION_CONTAINER = "[data-testid='cabinet-bar__main__checkbox__available_ventilation_panel']"
|
||||||
|
|
||||||
|
# Локаторы для меню combobox
|
||||||
|
MENU_ACTIVE_RACK_FORM = "//div[contains(@class, 'menuable__content__active')]"
|
||||||
|
MENU_ACTIVE_ITEMS = "//div[@role='list']//div[@role='listitem']"
|
||||||
|
|
||||||
|
# Локаторы для выпадающего меню (которые использовались в старом коде)
|
||||||
DROPDOWN_LIST = 'div.menuable__content__active div[role="list"]'
|
DROPDOWN_LIST = 'div.menuable__content__active div[role="list"]'
|
||||||
DROPDOWN_ITEM_BY_TEXT = ('div.menuable__content__active '
|
DROPDOWN_ITEM_BY_TEXT = ('div.menuable__content__active '
|
||||||
'div[role="listitem"]:has(span:has-text("{}"))')
|
'div[role="listitem"]:has(span:has-text("{}"))')
|
||||||
|
|
@ -126,3 +124,34 @@ class RackLocators:
|
||||||
# Кнопки подтверждения удаления
|
# Кнопки подтверждения удаления
|
||||||
CONFIRM_REMOVE_YES_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__yes']"
|
CONFIRM_REMOVE_YES_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__yes']"
|
||||||
CONFIRM_REMOVE_NO_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__no']"
|
CONFIRM_REMOVE_NO_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__no']"
|
||||||
|
|
||||||
|
# ================ ЛОКАТОРЫ ДЛЯ ВКЛАДОК в модальном окне редактирования ==
|
||||||
|
|
||||||
|
# Локаторы для вкладок в модальном окне редактирования
|
||||||
|
MODAL_TAB_GENERAL = "[data-testid='cabinet-bar__main_tab']"
|
||||||
|
MODAL_TAB_IMAGE = "[data-testid='cabinet-bar__photo_tab']"
|
||||||
|
MODAL_TAB_SETTINGS = "[data-testid='cabinet-bar__settings_tab']"
|
||||||
|
|
||||||
|
# ================ ЛОКАТОРЫ ДЛЯ ВКЛАДКИ "Изображение" ===================
|
||||||
|
|
||||||
|
IMAGE_UPLOAD_CONTAINER = "div.layout.column.fill-height.justify-center.align-center"
|
||||||
|
IMAGE_UPLOAD_ICON = "i.mdi-add_photo_alternate"
|
||||||
|
IMAGE_UPLOAD_INPUT = "input.button-file-upload__input[type='file']"
|
||||||
|
IMAGE_PREVIEW = "img"
|
||||||
|
IMAGE_CONTAINER = "div.layout.column.fill-height.justify-center.align-center"
|
||||||
|
|
||||||
|
# ================ ЛОКАТОРЫ ДЛЯ ВКЛАДКИ "НАСТРОЙКИ" ===================
|
||||||
|
|
||||||
|
# Контейнер вкладки "Настройки"
|
||||||
|
SETTINGS_CONTAINER = "div.layout.back.fill-height.justify-start"
|
||||||
|
SETTINGS_ACCESS_MANAGER_TITLE = "div.v-toolbar__title:has-text('Менеджер доступа')"
|
||||||
|
|
||||||
|
# Локаторы для полей правил доступа
|
||||||
|
SETTINGS_READ_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.read']"
|
||||||
|
SETTINGS_WRITE_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.write']"
|
||||||
|
SETTINGS_SMS_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.sms']"
|
||||||
|
SETTINGS_EMAIL_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.email']"
|
||||||
|
SETTINGS_PUSH_RULES = "[data-testid*='rules.push']"
|
||||||
|
|
||||||
|
# Кнопки вкладки "Настройки"
|
||||||
|
SETTINGS_CANCEL_BUTTON = "[data-testid='LOCATION_SETTINGS__btn__cancel']"
|
||||||
|
|
@ -0,0 +1,414 @@
|
||||||
|
"""Модуль тестов вкладки 'Стойка' в модуле Объекты.
|
||||||
|
|
||||||
|
Содержит тесты для проверки функциональности
|
||||||
|
работы со стойкой оборудования.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import pytest
|
||||||
|
from playwright.sync_api import Page
|
||||||
|
from locators.navigation_panel_locators import NavigationPanelLocators
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.location_page import LocationPage
|
||||||
|
from pages.rack_page import RackPage
|
||||||
|
from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData
|
||||||
|
from components_derived.frames.create_child_element_frame import CreateChildElementFrame
|
||||||
|
from components_derived.modal_edit_rack import ModalEditRack, RackEditData
|
||||||
|
from tools.logger import get_logger
|
||||||
|
|
||||||
|
# Константы
|
||||||
|
RACK_NAME = "Test-Rack-Functionality"
|
||||||
|
|
||||||
|
# Инициализация логгера для всего модуля
|
||||||
|
logger = get_logger("RACK_TESTS")
|
||||||
|
logger.setLevel("INFO")
|
||||||
|
|
||||||
|
class TestRackTab:
|
||||||
|
"""Набор тестов для вкладки 'Стойка' в модуле Объекты.
|
||||||
|
|
||||||
|
Проверяет корректность отображения, функциональность элементов интерфейса
|
||||||
|
и переключение между вкладками стойки оборудования.
|
||||||
|
|
||||||
|
Тесты покрывают следующие функциональные области:
|
||||||
|
1. test_rack_general_info_tab_fields - Заполнение полей вкладки 'Общая информация'
|
||||||
|
2. test_rack_image_tab - Работа с вкладкой 'Изображение'
|
||||||
|
3. test_rack_access_rules - Заполнение полей правил доступа
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Инициализируем атрибуты
|
||||||
|
main_page: MainPage = None
|
||||||
|
location_page: LocationPage = None
|
||||||
|
|
||||||
|
def _check_rack_existance(self, browser: Page, rack_name: str) -> bool:
|
||||||
|
"""Проверяет существование стойки.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
browser: Страница Playwright
|
||||||
|
rack_name: Имя стойки для проверки
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True если стойка существует, False в противном случае
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Обновляем навигационную панель
|
||||||
|
self.main_page.wait_for_timeout(500)
|
||||||
|
self.main_page.click_subpanel_item("test-zone")
|
||||||
|
|
||||||
|
nav_panel_locator = NavigationPanelLocators.TREEVIEW
|
||||||
|
|
||||||
|
# Проверяем видимость элемента
|
||||||
|
element = browser.locator(nav_panel_locator).get_by_text(rack_name, exact=True).first
|
||||||
|
|
||||||
|
if element.is_visible():
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _create_rack(self, browser: Page, rack_name: str) -> None:
|
||||||
|
"""Создает стойку.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
browser: Страница Playwright
|
||||||
|
rack_name: Имя стойки для создания
|
||||||
|
"""
|
||||||
|
logger.debug(f"Creating rack: {rack_name}")
|
||||||
|
|
||||||
|
# Нажимаем кнопку "Создать" на тулбаре
|
||||||
|
self.location_page.click_create_button()
|
||||||
|
|
||||||
|
# Создаем фрейм создания дочернего элемента
|
||||||
|
create_child_frame = CreateChildElementFrame(browser)
|
||||||
|
|
||||||
|
# Нажимаем на плашку "Класс объекта учета"
|
||||||
|
create_child_frame.open_object_class_combobox()
|
||||||
|
|
||||||
|
# Из выпадающего меню выбираем пункт "Стойка"
|
||||||
|
create_child_frame.select_object_class("Стойка")
|
||||||
|
|
||||||
|
# Открывается набор плашек для задания параметров стойки
|
||||||
|
rack_maker = RackObjectMaker(browser)
|
||||||
|
|
||||||
|
# Создаем объект данных стойки
|
||||||
|
rack_data = RackData(
|
||||||
|
name=rack_name,
|
||||||
|
height="42",
|
||||||
|
depth="1000"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Заполняем данные стойки
|
||||||
|
rack_maker.fill_rack_data(rack_data)
|
||||||
|
|
||||||
|
# Нажимаем кнопку создания
|
||||||
|
create_child_frame.click_add_button()
|
||||||
|
|
||||||
|
logger.info(f"Rack '{rack_name}' created successfully")
|
||||||
|
|
||||||
|
def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None:
|
||||||
|
"""Удаляет стойку через контекстное меню.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
browser: Страница Playwright
|
||||||
|
rack_name: Имя стойки для удаления
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 1. Находим элемент стойки в навигационной панели
|
||||||
|
rack_element = browser.locator(
|
||||||
|
NavigationPanelLocators.TREEVIEW
|
||||||
|
).get_by_text(rack_name, exact=True).first
|
||||||
|
|
||||||
|
# Прокручиваем до элемента если нужно
|
||||||
|
rack_element.scroll_into_view_if_needed()
|
||||||
|
self.main_page.wait_for_timeout(500)
|
||||||
|
|
||||||
|
# 2. Проверяем и нажимаем кнопку "Изменить"
|
||||||
|
rack_page = RackPage(browser)
|
||||||
|
|
||||||
|
# Проверяем видимость кнопки
|
||||||
|
rack_page.toolbar.check_button_visibility("edit")
|
||||||
|
|
||||||
|
# Проверяем тултип кнопки
|
||||||
|
rack_page.toolbar.check_button_tooltip("edit", "Изменить")
|
||||||
|
|
||||||
|
# Кликаем на кнопку "Изменить"
|
||||||
|
rack_page.toolbar.get_button_by_name("edit").click()
|
||||||
|
|
||||||
|
# 3. Создаем экземпляр ModalRackEditRack
|
||||||
|
rack_edit = ModalEditRack(browser, rack_name)
|
||||||
|
|
||||||
|
# Используем метод для удаления
|
||||||
|
rack_edit.click_remove_button()
|
||||||
|
|
||||||
|
logger.info(f"Rack '{rack_name}' deleted successfully")
|
||||||
|
|
||||||
|
@pytest.fixture(scope="function", autouse=True)
|
||||||
|
def setup(self, browser: Page) -> None:
|
||||||
|
"""Фикстура для подготовки тестового окружения.
|
||||||
|
|
||||||
|
Выполняет:
|
||||||
|
1. Авторизацию в системе
|
||||||
|
2. Создание стойки если она не существует
|
||||||
|
3. Переход к стойке
|
||||||
|
|
||||||
|
Args:
|
||||||
|
browser (Page): Экземпляр страницы Playwright для взаимодействия с UI
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Авторизация в системе
|
||||||
|
login_page = LoginPage(browser)
|
||||||
|
login_page.do_login()
|
||||||
|
|
||||||
|
# Мы на главной странице
|
||||||
|
self.main_page = MainPage(browser)
|
||||||
|
self.main_page.should_be_navigation_panel()
|
||||||
|
|
||||||
|
# Переходим к Объектам
|
||||||
|
self.main_page.click_main_navigation_panel_item("Объекты")
|
||||||
|
self.main_page.wait_for_timeout(1000)
|
||||||
|
self.main_page.click_main_navigation_panel_item("test-zone")
|
||||||
|
|
||||||
|
# Создаем экземпляр страницы локации
|
||||||
|
self.location_page = LocationPage(browser)
|
||||||
|
|
||||||
|
# Проверяем существование стойки
|
||||||
|
if not self._check_rack_existance(browser, RACK_NAME):
|
||||||
|
self._create_rack(browser, RACK_NAME)
|
||||||
|
self.main_page.wait_for_timeout(3000)
|
||||||
|
else:
|
||||||
|
logger.info(f"Rack '{RACK_NAME}' already exists")
|
||||||
|
|
||||||
|
# Переходим к стойке для тестирования
|
||||||
|
self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone")
|
||||||
|
self.main_page.wait_for_timeout(3000)
|
||||||
|
|
||||||
|
@pytest.fixture(scope="class", autouse=True)
|
||||||
|
def cleanup_rack(self, browser: Page):
|
||||||
|
"""Фикстура для очистки созданной стойки после ВСЕХ тестов класса.
|
||||||
|
|
||||||
|
Выполняется один раз после завершения всех тестов класса TestRackTab.
|
||||||
|
Удаляет созданную стойку.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
browser: Экземпляр страницы Playwright
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Тесты выполняются здесь
|
||||||
|
yield
|
||||||
|
|
||||||
|
# Переходим на главную страницу и в нужную зону
|
||||||
|
login_page = LoginPage(browser)
|
||||||
|
login_page.do_login()
|
||||||
|
|
||||||
|
self.main_page = MainPage(browser)
|
||||||
|
self.main_page.should_be_navigation_panel()
|
||||||
|
|
||||||
|
# Переходим к Объектам
|
||||||
|
self.main_page.click_main_navigation_panel_item("Объекты")
|
||||||
|
self.main_page.wait_for_timeout(1000)
|
||||||
|
self.main_page.click_main_navigation_panel_item("test-zone")
|
||||||
|
self.main_page.wait_for_timeout(1000)
|
||||||
|
|
||||||
|
# Проверяем существование стойки
|
||||||
|
if self._check_rack_existance(browser, RACK_NAME):
|
||||||
|
|
||||||
|
# Переходим на страницу стойки
|
||||||
|
self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone")
|
||||||
|
self.main_page.wait_for_timeout(2000)
|
||||||
|
|
||||||
|
# Удаляем стойку
|
||||||
|
self._delete_rack_from_context_menu(browser, RACK_NAME)
|
||||||
|
|
||||||
|
# Дополнительная проверка
|
||||||
|
self.main_page.click_subpanel_item("test-zone")
|
||||||
|
self.main_page.wait_for_timeout(1000)
|
||||||
|
|
||||||
|
#@pytest.mark.develop
|
||||||
|
def test_rack_general_info_tab_fields(self, browser: Page) -> None:
|
||||||
|
"""Тест заполнения полей вкладки 'Общая информация' стойки."""
|
||||||
|
|
||||||
|
rack_page = RackPage(browser)
|
||||||
|
|
||||||
|
# Переходим в режим редактирования
|
||||||
|
rack_page.click_edit_button()
|
||||||
|
rack_page.wait_for_timeout(1000)
|
||||||
|
|
||||||
|
# Создаем экземпляр ModalEditRack
|
||||||
|
rack_edit = ModalEditRack(browser, RACK_NAME)
|
||||||
|
|
||||||
|
# Создаем тестовые данные для заполнения всех полей
|
||||||
|
rack_edit_data = RackEditData(
|
||||||
|
# Основные поля
|
||||||
|
name="Test-Rack-Functionality",
|
||||||
|
serial="SN123456789",
|
||||||
|
inventory="INV987654321",
|
||||||
|
comment="Тестовый комментарий для стойки (обновленный)",
|
||||||
|
allocated_power="5500",
|
||||||
|
|
||||||
|
# Combobox поля
|
||||||
|
cable_entry="сверху",
|
||||||
|
state="Введен в эксплуатацию",
|
||||||
|
owner="",
|
||||||
|
service_org="",
|
||||||
|
project="",
|
||||||
|
|
||||||
|
# Checkbox поля
|
||||||
|
ventilation_panel=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Заполняем все поля формы
|
||||||
|
results = rack_edit.fill_rack_data(rack_edit_data)
|
||||||
|
|
||||||
|
logger.debug(f"Fill results: {results}")
|
||||||
|
|
||||||
|
# Сохраняем изменения
|
||||||
|
rack_edit.click_done_button()
|
||||||
|
rack_edit.wait_for_timeout(3000)
|
||||||
|
|
||||||
|
# Вход в режим редактирования
|
||||||
|
rack_page.click_edit_button()
|
||||||
|
|
||||||
|
# Проверяем поля, пропуская недоступные
|
||||||
|
verification_results = rack_edit.verify_all_filled_fields(
|
||||||
|
rack_edit_data,
|
||||||
|
skip_fields=["Владелец", "Обслуживающая организация", "Проект/Титул"]
|
||||||
|
)
|
||||||
|
logger.debug(f"Verification results: {verification_results}")
|
||||||
|
|
||||||
|
# Проверяем результаты
|
||||||
|
assert verification_results["incorrectly_filled"] == 0, \
|
||||||
|
f"Available fields incorrectly filled: {verification_results['field_errors']}"
|
||||||
|
assert verification_results["not_filled"] == 0, \
|
||||||
|
f"Available fields not filled: {verification_results['field_errors']}"
|
||||||
|
|
||||||
|
rack_edit.click_close_button()
|
||||||
|
|
||||||
|
#@pytest.mark.develop
|
||||||
|
def test_rack_image_tab(self, browser: Page) -> None:
|
||||||
|
"""Тест вкладки 'Изображение' стойки."""
|
||||||
|
|
||||||
|
rack_page = RackPage(browser)
|
||||||
|
|
||||||
|
# Переходим в режим редактирования
|
||||||
|
rack_page.click_edit_button()
|
||||||
|
rack_page.wait_for_timeout(1000)
|
||||||
|
|
||||||
|
# Создаем экземпляр ModalEditRack
|
||||||
|
rack_edit = ModalEditRack(browser, RACK_NAME)
|
||||||
|
|
||||||
|
# Переключаемся на вкладку "Изображение"
|
||||||
|
rack_edit.switch_to_tab(ModalEditRack.TAB_IMAGE)
|
||||||
|
|
||||||
|
# Проверяем вкладку
|
||||||
|
assert rack_edit.is_tab_active(ModalEditRack.TAB_IMAGE), \
|
||||||
|
"Image tab should be active"
|
||||||
|
|
||||||
|
# Загружаем изображение если есть
|
||||||
|
test_image_path = os.path.join(os.path.dirname(__file__), "test_image.jpg")
|
||||||
|
if os.path.exists(test_image_path):
|
||||||
|
logger.debug(f"Found test image: {test_image_path}")
|
||||||
|
# Находим input и загружаем файл
|
||||||
|
file_input = browser.locator("input[type='file']")
|
||||||
|
if file_input.count() == 0:
|
||||||
|
file_input = browser.locator(".button-file-upload__input")
|
||||||
|
|
||||||
|
if file_input.count() > 0:
|
||||||
|
file_input.set_input_files(test_image_path)
|
||||||
|
rack_page.wait_for_timeout(2000)
|
||||||
|
logger.debug("Test image uploaded")
|
||||||
|
else:
|
||||||
|
logger.warning(f"Test image not found at: {test_image_path}")
|
||||||
|
|
||||||
|
# Сохраняем
|
||||||
|
rack_edit.click_done_button()
|
||||||
|
|
||||||
|
@pytest.mark.develop
|
||||||
|
def test_rack_access_rules(self, browser: Page) -> None:
|
||||||
|
"""Тест заполнения полей правил доступа.
|
||||||
|
|
||||||
|
В каждое поле добавляются ВСЕ пользователи из списка custom_users.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rack_page = RackPage(browser)
|
||||||
|
|
||||||
|
# Переходим в режим редактирования
|
||||||
|
rack_page.click_edit_button()
|
||||||
|
rack_page.wait_for_timeout(1000)
|
||||||
|
|
||||||
|
# Создаем экземпляр ModalEditRack
|
||||||
|
rack_edit = ModalEditRack(browser, RACK_NAME)
|
||||||
|
|
||||||
|
# Переключаемся на вкладку "Настройки"
|
||||||
|
rack_edit.switch_to_tab(ModalEditRack.TAB_SETTINGS)
|
||||||
|
|
||||||
|
# Проверяем, что вкладка активна
|
||||||
|
assert rack_edit.is_tab_active(ModalEditRack.TAB_SETTINGS), \
|
||||||
|
"Settings tab should be active after switching"
|
||||||
|
|
||||||
|
# Целевые поля для заполнения
|
||||||
|
target_fields = [
|
||||||
|
"read_access_rules",
|
||||||
|
"write_access_rules",
|
||||||
|
"sms_access_rules",
|
||||||
|
"email_access_rules",
|
||||||
|
"push_access_rules"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Пользователи для добавления в каждое поле
|
||||||
|
custom_users = [
|
||||||
|
"TestUserRulesAdmin",
|
||||||
|
"TestUserRulesOper",
|
||||||
|
"TestUserRulesManager",
|
||||||
|
"TestUserRulesSec",
|
||||||
|
"TestUserRulesCollector"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Заполняем поля
|
||||||
|
fill_results = rack_edit.fill_access_rules(
|
||||||
|
users_to_add=custom_users,
|
||||||
|
target_fields=target_fields
|
||||||
|
)
|
||||||
|
|
||||||
|
# Проверяем, что все пользователи были добавлены
|
||||||
|
expected_total = len(target_fields) * len(custom_users)
|
||||||
|
assert fill_results["access_rules_filled"] == expected_total, \
|
||||||
|
f"Added {fill_results['access_rules_filled']} users, expected {expected_total}"
|
||||||
|
assert len(fill_results["errors"]) == 0, \
|
||||||
|
f"Errors during filling: {fill_results['errors']}"
|
||||||
|
|
||||||
|
# Проверяем заполнение
|
||||||
|
verification_results = rack_edit.verify_access_rules(
|
||||||
|
expected_users=custom_users,
|
||||||
|
target_fields=target_fields
|
||||||
|
)
|
||||||
|
logger.debug(f"Verification results: {verification_results}")
|
||||||
|
|
||||||
|
# Проверяем результаты
|
||||||
|
assert verification_results["correctly_filled"] == expected_total, \
|
||||||
|
f"Correctly filled {verification_results['correctly_filled']} out of {expected_total}"
|
||||||
|
assert verification_results["incorrectly_filled"] == 0, \
|
||||||
|
f"Verification errors: {verification_results['field_errors']}"
|
||||||
|
|
||||||
|
# Дополнительная проверка
|
||||||
|
assert len(verification_results["fields_verified"]) == len(target_fields), \
|
||||||
|
f"Fields verified: {len(verification_results['fields_verified'])}, expected: {len(target_fields)}"
|
||||||
|
|
||||||
|
# Сохраняем изменения
|
||||||
|
rack_edit.click_done_button()
|
||||||
|
rack_edit.wait_for_timeout(3000)
|
||||||
|
|
||||||
|
# Возвращаемся в режим редактирования и проверяем снова
|
||||||
|
rack_page.click_edit_button()
|
||||||
|
rack_page.wait_for_timeout(1000)
|
||||||
|
|
||||||
|
rack_edit = ModalEditRack(browser, RACK_NAME)
|
||||||
|
rack_edit.switch_to_tab(ModalEditRack.TAB_SETTINGS)
|
||||||
|
|
||||||
|
verification_results_after_save = rack_edit.verify_access_rules(
|
||||||
|
expected_users=custom_users,
|
||||||
|
target_fields=target_fields
|
||||||
|
)
|
||||||
|
logger.debug(f"Verification results after save: {verification_results_after_save}")
|
||||||
|
|
||||||
|
assert verification_results_after_save["correctly_filled"] == expected_total, \
|
||||||
|
f"After save - correctly filled {verification_results_after_save['correctly_filled']} out of {expected_total}"
|
||||||
|
|
||||||
|
rack_edit.click_close_button()
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 5.2 KiB |
Loading…
Reference in New Issue