Добавлен тест редактирования Стойки
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')]"
|
||||
|
||||
# Локаторы полей формы создания стойки
|
||||
RACK_NAME_FIELD = ("//div[contains(@class, 'container')]"
|
||||
"//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()='Проект/Титул']]")
|
||||
# Форма редактирования стойки в модальном окне
|
||||
RACK_EDIT_FORM = "[data-testid='cabinet-bar__cabinet-form']"
|
||||
|
||||
# Локаторы для выпадающего меню
|
||||
# Локаторы полей формы
|
||||
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_ITEM_BY_TEXT = ('div.menuable__content__active '
|
||||
'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_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