diff --git a/test_repo_issue_flow.py b/test_repo_issue_flow.py new file mode 100644 index 0000000..1e18ea9 --- /dev/null +++ b/test_repo_issue_flow.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- +# @Time : 2023/10/31 14:39 +# @Author : floraachy +# @File : test_repo_issue_flow.py +# @Software: PyCharm +# @Desc: + +# 标准库导入 +import os +import re +# 第三方库导入 +import allure +import pytest +from playwright.sync_api import BrowserContext +from loguru import logger +# 本地应用/模块导入 +from config.path_config import FILES_DIR +from page_objects.projects.issue.repo_issue_page import RepoIssuePage +from page_objects.projects.issue.repo_new_issue_page import RepoNewIssuePage +from page_objects.projects.issue.repo_issue_detail_page import RepoIssueDetailPage +from page_objects.projects.issue.repo_edit_issue_page import RepoEditIssuePage +from utils.requests_utils.api_workflow import get_api_data, api_work_flow +from config.path_config import INTERFACE_DIR +from config.global_vars import GLOBAL_VARS + + +@pytest.mark.issue +class TestRepoIssueFlow: + """疑修""" + cases = { + "test_new_search_edit_delete_issue": [ + {"issue_title": "new - ${generate_paragraph(nb=1)}", + "issue_desc": "${generate_paragraph()}", + "issue_file": " gitlinklogo2.png, gitlinklogo3.jpg", + "new_issue_success_message": "疑修创建成功!", + "edit_issue_title": "update - ${generate_paragraph(nb=1)}", + "edit_issue_desc": "${generate_paragraph()}", + "delete_issue_file": "gitlinklogo3.jpg", + "file_delete_success_message": "附件删除成功", + "update_issue_success_message": "疑修更新成功!", + "delete_issue_confirm_message": "您确定要删除当前疑修?", + "delete_issue_success_message": "疑修删除成功!", + "run": True}], + "test_search_copy_delete_issue": [ + {"new_issue_file": "导入TOC订单.xls, login_demo.yaml", + "copy_issue_title": "update - ${generate_paragraph(nb=1)}", + "copy_issue_desc": "${generate_paragraph()}", + "copy_issue_file": " gitlinklogo2.png, gitlinklogo3.jpg", + "copy_issue_success_message": " 疑修复制成功!", + "delete_issue_confirm_message": "您确定要删除当前疑修?", + "delete_issue_success_message": "疑修删除成功!", + "run": True}] + } + + @pytest.fixture(autouse=True) + def start_for_each(self, request, default_user_context: BrowserContext): + logger.info("for each--start: 测试用户打开新建疑修页面") + + # 测试用户 + user_page = default_user_context.new_page() + self.create_issue_page = RepoNewIssuePage(user_page) + + yield + logger.info("for each--end: 后置操作") + + @pytest.mark.parametrize("case") + def test_new_issue_success(self, case): + """ + 登录 --> 新建疑修 --> 删除疑修 + """ + + # 进入疑修创建页面 + self.create_issue_page.navigate(repo_owner=GLOBAL_VARS.get("repo_owner"), + repo_identifier=GLOBAL_VARS.get("repo_identifier")) + + issue_title = case.get("issue_title") + issue_desc = case.get("issue_desc") + # 兼容一下中文逗号,发现有中文逗号,替换为英文逗号, 同时去除file前后空格,与保存文件的目录,拼接出文件的绝对路径 + issue_files = [os.path.join(FILES_DIR, f.strip()) for f in + case.get("issue_file").replace(",", ",").split(",")] + # 创建疑修 + self.create_issue_page.new_issue_flow(issue_title=issue_title, issue_desc=issue_desc, issue_file=issue_files, + success_message=case.get("new_issue_success_message")) + # + # issue_page = RepoIssuePage(self.create_issue_page.page) + # + # # 点击【疑修(Issue)】导航栏 + # issue_page.click_issue_nav() + # # 页面进入:${repo_owner}/${repo_identifier}/issues + # issue_page.have_url( + # f"{GLOBAL_VARS.get('repo_owner')}/{GLOBAL_VARS.get('repo_identifier')}/issues") + # # 在搜索框中输入疑修标题,点击搜索图标 + # issue_page.search_issue_by_keyword(text=issue_title) + # # 点击疑修标题 + # issue_page.click_issue_title_on_list(title=issue_title) + # # 断言 - 页面进入疑修详情页, 检查网页标题,疑修标题,内容及附件 + # expected_issue_title = issue_title + # # 断言 - 网页标题模糊匹配:expected['issue_title']-疑修 + # issue_page.have_title(re.compile(f"{expected_issue_title}-疑修-.*")) + # # 断言 - 疑修标题,内容及附件 + # expected_issue_file = issue_files if isinstance(issue_files, list) else [issue_files] + # expect_files = [] + # for issue_file in expected_issue_file: + # expect_files.append(os.path.basename(issue_file) if os.path.isabs(issue_file) else issue_file) + # RepoIssueDetailPage(issue_page.page).assert_issue_title_desc_attachment(expect_tittle=issue_title, + # expect_desc=issue_desc, + # expect_attachment=expect_files) + # + # edit_issue_title = case.get("edit_issue_title") + # edit_issue_desc = case.get("edit_issue_desc") + # # 检查一下需要删除的附件是否传递错误 + # # 兼容一下中文逗号,发现有中文逗号,替换为英文逗号, 同时去除file前后空格,与保存文件的目录,拼接出文件的绝对路径 + # delete_issue_files = [os.path.join(FILES_DIR, f.strip()) for f in + # case.get("delete_issue_file").replace(",", ",").split(",")] + # logger.error(f"编辑疑修时,需要删除的疑修附件不是疑修有的附件:{delete_issue_files}") + # + # # 编辑疑修 + # edit_issue_page = RepoEditIssuePage(issue_page.page) + # edit_issue_page.edit_issue_flow(issue_title=edit_issue_title, issue_desc=edit_issue_desc, + # delete_issue_file=delete_issue_files, + # success_message=case.get("update_issue_success_message")) + # # 断言 - 页面进入疑修详情页, 检查网页标题,疑修标题,内容及附件 + # # 断言网页标题模糊匹配:expected['issue_title']-疑修 + # edit_issue_page.have_title(re.compile(f"{edit_issue_title}-疑修-.*")) + # # 断言 - 疑修标题,内容及附件 + # expected_issue_file = list(set(issue_files) - set(delete_issue_files)) + # expect_files = [] + # for issue_file in expected_issue_file: + # expect_files.append(os.path.basename(issue_file) if os.path.isabs(issue_file) else issue_file) + # + # edit_issue_page.assert_issue_title_desc_attachment(expect_tittle=edit_issue_title, + # expect_desc=edit_issue_desc, + # expect_attachment=expect_files) + + # 删除疑修 + RepoIssuePage(page).delete_issue(confirm_message=case.get("delete_issue_confirm_message"), + success_message=case.get("delete_issue_success_message")) + + @pytest.mark.parametrize("case") + def test_search_copy_delete_issue(self, page: Page, case): + """ + 前提条件:当前存在一个疑修 + 1. 登录 + 2. 访问仓库的疑修详情页 + 3. 复制疑修 + 4. 删除刚刚复制的疑修 + """ + + # 我有一个疑修,疑修带有附件,附件名称是 + # 通过接口登录,获取登录cookies + if not GLOBAL_VARS.get("cookies"): + login_api = get_api_data(api_file_path=os.path.join(INTERFACE_DIR, "test_gitlink_login.yaml"), + key="gitlink_login_01") + res = api_work_flow(req_data=login_api, source=GLOBAL_VARS) + login_cookies = res["cookies"] + GLOBAL_VARS["cookies"] = login_cookies + # 上传附件,获取附件id + issue_files = [f.strip() for f in case.get("new_issue_file").replace(",", ",").split(",")] + GLOBAL_VARS["attachment_ids"] = [] + for file in issue_files: + GLOBAL_VARS["file_name"] = file + upload_file_api = get_api_data( + api_file_path=os.path.join(INTERFACE_DIR, "projects", "test_gitlink_upload_files.yaml"), + key="gitlink_upload_file_01") + res = api_work_flow(req_data=upload_file_api, source=GLOBAL_VARS) + GLOBAL_VARS["attachment_ids"].append(res["attachment_id"]) + # 新建疑修 + new_issue_api = get_api_data( + api_file_path=os.path.join(INTERFACE_DIR, "projects", "issues", "test_gitlink_repo_new_issue.yaml"), + key="gitlink_repo_new_issue_01") + res = api_work_flow(req_data=new_issue_api, source=GLOBAL_VARS) + + # 访问疑修详情页 + issue_index = res["issue_index"] + CommonPage(page).navigate( + f"{GLOBAL_VARS.get('repo_owner')}/{GLOBAL_VARS.get('repo_identifier')}/issues/{issue_index}") + issue_title = case.get("copy_issue_title") + issue_desc = case.get("copy_issue_desc") + # 兼容一下中文逗号,发现有中文逗号,替换为英文逗号, 同时去除file前后空格,与保存文件的目录,拼接出文件的绝对路径 + issue_files = [os.path.join(FILES_DIR, f.strip()) for f in + case.get("copy_issue_file").replace(",", ",").split(",")] + # 复制疑修 + RepoIssuePage(page).copy_issue(issue_title=issue_title, issue_desc=issue_desc, issue_file=issue_files, + success_message=case.get("copy_issue_success_message")) + # 断言 - 页面进入疑修详情页, 检查网页标题,疑修标题,内容及附件 + # 断言网页标题模糊匹配:expected['issue_title']-疑修 + CommonPage(page).assert_page_title(re.compile(f"{issue_title}-疑修-.*")) + + # 断言 - 疑修标题,内容及附件 + expected_issue_file = issue_files if isinstance(issue_files, list) else [issue_files] + expect_files = [] + for issue_file in expected_issue_file: + expect_files.append(os.path.basename(issue_file) if os.path.isabs(issue_file) else issue_file) + RepoIssuePage(page).assert_issue_title_desc_attachment(expect_tittle=issue_title, expect_desc=issue_desc, + expect_attachment=expect_files) + RepoIssuePage(page).assert_issue_attachments(expect_files) + + # 删除疑修 + RepoIssuePage(page).delete_issue(confirm_message=case.get("delete_issue_confirm_message"), + success_message=case.get("delete_issue_success_message"))