import pytest from pages import MenuManagementPage @pytest.mark.web @pytest.mark.menu_management class TestMenuManagement: """菜单管理测试类""" @pytest.fixture(autouse=True) def setup(self, web_page, test_config): """设置测试环境""" self.page = web_page self.config = test_config self.menu_page = MenuManagementPage(self.page, test_config.base_url) self.menu_page.navigate() def test_menu_management_page_loaded(self): """测试菜单管理页面加载""" assert self.menu_page.is_loaded() def test_add_menu_success(self): """测试成功添加菜单""" initial_count = self.menu_page.get_menu_count() self.menu_page.click_add_menu() self.menu_page.fill_menu_form( { "name": "测试菜单", "path": "/test-menu", "icon": "test-icon", "sort_order": "1", "parent_id": "", "is_visible": True, } ) self.menu_page.save_menu() assert self.menu_page.get_menu_count() == initial_count + 1 assert self.menu_page.is_menu_exists("测试菜单") def test_add_sub_menu(self): """测试添加子菜单""" menus = self.menu_page.get_menu_list() if menus: parent_id = menus[0]["id"] initial_count = self.menu_page.get_menu_count() self.menu_page.click_add_menu() self.menu_page.fill_menu_form( { "name": "子菜单", "path": "/sub-menu", "icon": "sub-icon", "sort_order": "1", "parent_id": parent_id, "is_visible": True, } ) self.menu_page.save_menu() assert self.menu_page.get_menu_count() == initial_count + 1 assert self.menu_page.is_menu_exists("子菜单") def test_add_hidden_menu(self): """测试添加隐藏菜单""" initial_count = self.menu_page.get_menu_count() self.menu_page.click_add_menu() self.menu_page.fill_menu_form( { "name": "隐藏菜单", "path": "/hidden-menu", "icon": "hidden-icon", "sort_order": "1", "parent_id": "", "is_visible": False, } ) self.menu_page.save_menu() assert self.menu_page.get_menu_count() == initial_count + 1 assert self.menu_page.is_menu_exists("隐藏菜单") def test_search_menu(self): """测试搜索菜单""" self.menu_page.search_menu("用户") menus = self.menu_page.get_menu_list() assert any("用户" in menu["name"] for menu in menus) def test_edit_menu(self): """测试编辑菜单""" menus = self.menu_page.get_menu_list() if menus: menu_id = menus[0]["id"] self.menu_page.edit_menu(menu_id) self.menu_page.fill_menu_form({"name": "更新后的菜单名"}) self.menu_page.save_menu() updated_menus = self.menu_page.get_menu_list() updated_menu = next((m for m in updated_menus if m["id"] == menu_id), None) assert updated_menu is not None assert updated_menu["name"] == "更新后的菜单名" def test_delete_menu(self): """测试删除菜单""" initial_count = self.menu_page.get_menu_count() self.menu_page.click_add_menu() self.menu_page.fill_menu_form( { "name": "待删除菜单", "path": "/to-delete", "icon": "delete-icon", "sort_order": "1", "parent_id": "", "is_visible": True, } ) self.menu_page.save_menu() menus = self.menu_page.get_menu_list() menu_to_delete = next((m for m in menus if m["name"] == "待删除菜单"), None) if menu_to_delete: self.menu_page.delete_menu(menu_to_delete["id"]) assert self.menu_page.get_menu_count() == initial_count assert not self.menu_page.is_menu_exists("待删除菜单") def test_expand_and_collapse_menu(self): """测试展开和折叠菜单""" menus = self.menu_page.get_menu_list() if menus: menu_id = menus[0]["id"] self.menu_page.expand_menu(menu_id) expanded_menu = self.page.query_selector(f".menu-item[data-id='{menu_id}'].expanded") assert expanded_menu is not None self.menu_page.collapse_menu(menu_id) collapsed_menu = self.page.query_selector(f".menu-item[data-id='{menu_id}'].collapsed") assert collapsed_menu is not None def test_get_menu_tree(self): """测试获取菜单树""" tree = self.menu_page.get_menu_tree() assert isinstance(tree, list) assert len(tree) > 0 def test_drag_and_drop_menu(self): """测试拖拽菜单""" menus = self.menu_page.get_menu_list() if len(menus) >= 2: source_id = menus[0]["id"] target_id = menus[1]["id"] self.menu_page.drag_and_drop_menu(source_id, target_id) updated_menus = self.menu_page.get_menu_list() assert len(updated_menus) == len(menus) @pytest.mark.parametrize( "name,path,icon,sort_order", [ ("菜单1", "/menu1", "icon1", "1"), ("菜单2", "/menu2", "icon2", "2"), ("菜单3", "/menu3", "icon3", "3"), ], ) def test_add_multiple_menus(self, name, path, icon, sort_order): """测试添加多个菜单""" initial_count = self.menu_page.get_menu_count() self.menu_page.click_add_menu() self.menu_page.fill_menu_form( { "name": name, "path": path, "icon": icon, "sort_order": sort_order, "parent_id": "", "is_visible": True, } ) self.menu_page.save_menu() assert self.menu_page.get_menu_count() == initial_count + 1 assert self.menu_page.is_menu_exists(name) def test_cancel_menu_edit(self): """测试取消菜单编辑""" menus = self.menu_page.get_menu_list() if menus: menu_id = menus[0]["id"] original_name = menus[0]["name"] self.menu_page.edit_menu(menu_id) self.menu_page.fill_menu_form({"name": "临时菜单名"}) self.menu_page.cancel_edit() updated_menus = self.menu_page.get_menu_list() updated_menu = next((m for m in updated_menus if m["id"] == menu_id), None) assert updated_menu is not None assert updated_menu["name"] == original_name def test_add_duplicate_menu(self): """测试添加重复菜单""" menus = self.menu_page.get_menu_list() if menus: existing_menu = menus[0] initial_count = self.menu_page.get_menu_count() self.menu_page.click_add_menu() self.menu_page.fill_menu_form( { "name": existing_menu["name"], "path": "/duplicate", "icon": "duplicate-icon", "sort_order": "1", "parent_id": "", "is_visible": True, } ) self.menu_page.save_menu() assert self.menu_page.get_menu_count() == initial_count