From ccc3e69deeccb16a09de41da1a7a70f8b9dfc41d Mon Sep 17 00:00:00 2001 From: MementoMori <1003350679@qq.com> Date: Wed, 28 Jul 2021 18:45:26 +0800 Subject: [PATCH 1/3] =?UTF-8?q?startpart=E9=83=A8=E5=88=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- release-assistant/test/base/basetest.py | 120 +++++++++++++- .../test/mock_data/startpart.txt | 153 ++++++++++++++++++ .../test_start/mock_data/mock_cve_data.xlsx | Bin 0 -> 9638 bytes .../test_start/mock_data/mock_obs_data.json | 31 ++++ .../test/test_start/test_start_cli.py | 129 ++++++++++++++- 5 files changed, 429 insertions(+), 4 deletions(-) create mode 100644 release-assistant/test/mock_data/startpart.txt create mode 100644 release-assistant/test/test_start/mock_data/mock_cve_data.xlsx create mode 100644 release-assistant/test/test_start/mock_data/mock_obs_data.json diff --git a/release-assistant/test/base/basetest.py b/release-assistant/test/base/basetest.py index 02114e2..bf31359 100644 --- a/release-assistant/test/base/basetest.py +++ b/release-assistant/test/base/basetest.py @@ -18,11 +18,34 @@ import json import sys import unittest from io import StringIO - +from unittest import mock import requests - +from pathlib import Path from javcra.cli.base import BaseCommand +MOCK_DATA_FOLDER = str(Path(Path(__file__).parents[1], "mock_data")) + + +class obj(object): + """ + class for object + """ + + def __init__(self, dict_): + self.__dict__.update(dict_) + + +def dict2obj(d): + """ + dict to object + Args: + d: dict + + Returns: + + """ + return json.loads(json.dumps(d), object_hook=obj) + class TestBase(unittest.TestCase): """ @@ -81,6 +104,12 @@ class TestBase(unittest.TestCase): self.expect_str.strip().strip("\r\n").strip("\n"), self.print_result ) + def _to_add_cleanup(self): + """_to_add_cleanup""" + for tc in self._to_clean_patchers: + self.addCleanup(tc.stop) + self._to_clean_patchers.clear() + def tearDown(self) -> None: """ The last to run after each test case is run @@ -93,10 +122,11 @@ class TestBase(unittest.TestCase): BaseCommand.subparsers = BaseCommand.parser.add_subparsers( help="Just A Very Convenient Release Assistant" ) + self._to_add_cleanup() return super().tearDown() -class TestMixin(unittest.TestCase): +class TestMixin(TestBase): """ The base class that sends HTTP requests """ @@ -192,3 +222,87 @@ class TestMixin(unittest.TestCase): issuse_describe_url, data=dict(access_token=access_token) ).get("body") return describe + + def _create_patch(self, mock_name, **kwargs): + """create_patch + + Args: + method_name (str): mock method or attribute name + + """ + patcher = mock.patch(mock_name, **kwargs) + self._to_clean_patchers.append(patcher) + patcher.start() + + def _to_update_kw_and_make_mock(self, mock_name, effect=None, **kwargs): + """_to_update_kw_and_make_mock + + Args: + mock_name (str): mock method or attribute name + effect (Any, optional): side effect value + + Raises: + ValueError: If the side_effect or return_value keyword parameter is not specified + specify the value of the effect keyword parameter + """ + if "side_effect" not in kwargs and "return_value" not in kwargs: + if effect is None: + raise ValueError( + "If the side_effect or return_value keyword parameter is not specified," + "specify the value of the effect keyword parameter" + ) + kwargs["side_effect"] = effect + self._create_patch(mock_name, **kwargs) + + @staticmethod + def read_file_content(path, folder=MOCK_DATA_FOLDER, is_json=True): + """to read file content if is_json is True return dict else return str + + Args: + path: Absolute path or the path relative of mock_data folder + is_json: if is True use json.loads to load data else not load + + Raises: + FileNotFoundError:Check Your path Please + JSONDecodeError:Check Your Josn flie Please + + Returns: + file's content:if is_json is True return dict else return str + """ + curr_path = Path(folder, path) + if Path(path).is_absolute(): + curr_path = path + + with open(str(curr_path), "r", encoding="utf-8") as f_p: + if is_json: + return json.loads(f_p.read()) + else: + return f_p.read() + + def mock_requests_request(self, **kwargs): + """mock_requests_request""" + self._to_update_kw_and_make_mock( + "requests.request", + **kwargs, + ) + + def mock_obs_cloud_listObjects(self, **kwargs): + """mock_requests_listObjects""" + self._to_update_kw_and_make_mock( + "obs.ObsClient.listObjects", + **kwargs, + ) + + def mock_obs_cloud_getObjects(self, **kwargs): + """mock_requests_getObjects""" + self._to_update_kw_and_make_mock( + "obs.ObsClient.getObject", + **kwargs, + ) + + def mock_pandas_read_excel(self, **kwargs): + """mock_pandas_read_excel""" + self._to_update_kw_and_make_mock( + "pandas.read_excel", + **kwargs, + ) diff --git a/release-assistant/test/mock_data/startpart.txt b/release-assistant/test/mock_data/startpart.txt new file mode 100644 index 0000000..891a551 --- /dev/null +++ b/release-assistant/test/mock_data/startpart.txt @@ -0,0 +1,153 @@ +{ + "id": 6853820, + "url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW", + "repository_url": "https://gitee.com/api/v5/enterprises/open_euler", + "labels_url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW/labels", + "comments_url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW/comments", + "html_url": "https://gitee.com/openeuler/release-tools/issues/I42WFW", + "parent_url": null, + "number": "I42WFW", + "parent_id": 0, + "depth": 0, + "state": "open", + "title": "openEuler-20.03-LTS-SP1 Update 2021/7/29 release", + "body": "版本目标:CVE、软件包引入升级和Bugfix修复\n版本: openEuler-20.03-LTS-SP1\n例行CVE冻结:20210420\n代码冻结: 20210420\n\n版本发布负责人\n版本经理:@Mary \n开发人员:@Mary \n安全委员会:@Mary\n测试人员:@Mary @ci-bot \n\n", + "user": { + "id": 2234080, + "login": "Many", + "name": "胖胖", + "avatar_url": "https://portrait.gitee.com/uploads/avatars/user/744/2234080_Many_1578969378.png", + "url": "https://gitee.com/api/v5/users/Many", + "html_url": "https://gitee.com/Many", + "followers_url": "https://gitee.com/api/v5/users/Many/followers", + "following_url": "https://gitee.com/api/v5/users/Many/following_url{/other_user}", + "gists_url": "https://gitee.com/api/v5/users/Many/gists{/gist_id}", + "starred_url": "https://gitee.com/api/v5/users/Many/starred{/owner}{/repo}", + "subscriptions_url": "https://gitee.com/api/v5/users/Many/subscriptions", + "organizations_url": "https://gitee.com/api/v5/users/Many/orgs", + "repos_url": "https://gitee.com/api/v5/users/Many/repos", + "events_url": "https://gitee.com/api/v5/users/Many/events{/privacy}", + "received_events_url": "https://gitee.com/api/v5/users/Many/received_events", + "type": "User" + }, + "labels": [ + { + "id": 107655399, + "name": "sig/sig-EasyLife", + "color": "7512f2", + "repository_id": 5292411, + "url": "https://gitee.com/api/v5/enterprises/open_euler/labels/sig/sig-EasyLife", + "created_at": "2021-04-29T16:37:18+08:00", + "updated_at": "2021-07-29T10:52:14+08:00" + } + ], + "assignee": null, + "collaborators": [], + "repository": { + "id": 16532326, + "full_name": "openeuler/release-tools", + "human_name": "openEuler/release-tools", + "url": "https://gitee.com/api/v5/repos/openeuler/release-tools", + "namespace": { + "id": 5161228, + "type": "group", + "name": "openEuler", + "path": "openeuler", + "html_url": "https://gitee.com/openeuler" + }, + "path": "release-tools", + "name": "release-tools", + "owner": { + "id": 5441867, + "login": "georgecao", + "name": "George.Cao", + "avatar_url": "https://portrait.gitee.com/uploads/avatars/user/1813/5441867_georgecao_1586834388.png", + "url": "https://gitee.com/api/v5/users/georgecao", + "html_url": "https://gitee.com/georgecao", + "followers_url": "https://gitee.com/api/v5/users/georgecao/followers", + "following_url": "https://gitee.com/api/v5/users/georgecao/following_url{/other_user}", + "gists_url": "https://gitee.com/api/v5/users/georgecao/gists{/gist_id}", + "starred_url": "https://gitee.com/api/v5/users/georgecao/starred{/owner}{/repo}", + "subscriptions_url": "https://gitee.com/api/v5/users/georgecao/subscriptions", + "organizations_url": "https://gitee.com/api/v5/users/georgecao/orgs", + "repos_url": "https://gitee.com/api/v5/users/georgecao/repos", + "events_url": "https://gitee.com/api/v5/users/georgecao/events{/privacy}", + "received_events_url": "https://gitee.com/api/v5/users/georgecao/received_events", + "type": "User" + }, + "description": "Tools for version release", + "private": false, + "public": true, + "internal": false, + "fork": false, + "html_url": "https://gitee.com/openeuler/release-tools.git", + "ssh_url": "git@gitee.com:openeuler/release-tools.git", + "forks_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/forks", + "keys_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/keys{/key_id}", + "collaborators_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/collaborators{/collaborator}", + "hooks_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/hooks", + "branches_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/branches{/branch}", + "tags_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/tags", + "blobs_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/blobs{/sha}", + "stargazers_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/stargazers", + "contributors_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/contributors", + "commits_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/commits{/sha}", + "comments_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/comments{/number}", + "issue_comment_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/issues/comments{/number}", + "issues_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/issues{/number}", + "pulls_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/pulls{/number}", + "milestones_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/milestones{/number}", + "notifications_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/notifications{?since,all,participating}", + "labels_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/labels{/name}", + "releases_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/releases{/id}", + "recommend": false, + "homepage": null, + "language": null, + "forks_count": 12, + "stargazers_count": 1, + "watchers_count": 8, + "default_branch": "master", + "open_issues_count": 5, + "has_issues": true, + "has_wiki": true, + "issue_comment": null, + "can_comment": true, + "pull_requests_enabled": true, + "has_page": false, + "license": "MulanPSL-2.0", + "outsourced": false, + "project_creator": "openeuler-ci-bot", + "members": [ + "shin", + "soul", + "hua", + "chenHW", + "init", + "myer", + "ci-bot" + ], + "pushed_at": "2021-07-27T22:30:24+08:00", + "created_at": "2021-06-21T16:33:45+08:00", + "updated_at": "2021-07-29T10:52:10+08:00", + "parent": null, + "paas": null, + "assignees_number": 0, + "testers_number": 0, + "assignee": [], + "testers": [] + }, + "milestone": null, + "created_at": "2021-07-29T10:52:10+08:00", + "updated_at": "2021-07-29T14:52:49+08:00", + "plan_started_at": null, + "deadline": null, + "finished_at": null, + "scheduled_time": 0.0, + "comments": 1, + "priority": 0, + "issue_type": "任务", + "program": null, + "security_hole": false, + "issue_state": "待办的", + "branch": null +} \ No newline at end of file diff --git a/release-assistant/test/test_start/mock_data/mock_cve_data.xlsx b/release-assistant/test/test_start/mock_data/mock_cve_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..75058aee9e31a41b746969b72f923fb8f9ece28c GIT binary patch literal 9638 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 Ee_oPcyZ`_I literal 0 HcmV?d00001 diff --git a/release-assistant/test/test_start/mock_data/mock_obs_data.json b/release-assistant/test/test_start/mock_data/mock_obs_data.json new file mode 100644 index 0000000..c5b2d3a --- /dev/null +++ b/release-assistant/test/test_start/mock_data/mock_obs_data.json @@ -0,0 +1,31 @@ + +{"commonPrefixs": [], + "contents": [{"etag": "d41d8cd98f00b204e9800998ecf8427e", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 0, + "storageClass": "STANDARD"}, + {"etag": "395628cc294b46dba7cd9f319b6de393", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/openEuler-20.03-LTS-SP1_updateinfo.xlsx", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 7230, + "storageClass": "STANDARD"}, + {"etag": "22168585eb84ae60d21e10f1f6ecc866", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/openEuler-20.03-LTS-SP1_updateinfo.xml", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 35474, + "storageClass": "STANDARD"}, + {"etag": "f1427526416e64b2afa6a08d4bce9e86", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/openEuler-20.03-LTS-SP2_updateinfo.xlsx", + "lastModified": "2021/07/30 09:51:43", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 7476, + "storageClass": "STANDARD"}] + } diff --git a/release-assistant/test/test_start/test_start_cli.py b/release-assistant/test/test_start/test_start_cli.py index 726d914..28e114d 100644 --- a/release-assistant/test/test_start/test_start_cli.py +++ b/release-assistant/test/test_start/test_start_cli.py @@ -13,4 +13,131 @@ # -*- coding:utf-8 -*- """ TestStart -""" \ No newline at end of file +""" +import os +import requests +import pandas as pd +from pathlib import Path +from javcra.cli.commands.startpart import StartCommand +from test.base.basetest import TestMixin +from test.base.basetest import dict2obj +from unittest.mock import PropertyMock +from requests.exceptions import RequestException + +EXPECT_DATA_FILE = os.path.join(os.path.abspath(os.path.dirname(__file__)), "mock_data") + + +class TestStart(TestMixin): + """ + class for test TestStart + """ + cmd_class = StartCommand + + def setUp(self) -> None: + """ + setUp + """ + super(TestStart, self).setUp() + r = requests.Response() + r.status_code = 200 + self._to_update_kw_and_make_mock( + "requests.Response.text", + new_callable=PropertyMock, + return_value=self.read_file_content('startpart.txt', is_json=False), + ) + self.mock_requests_request(return_value=r) + + def test_success(self): + """ + test success + """ + self.expect_str = """ +[INFO] start update successfully. + """ + self.command_params = ["--giteeid=Mary", "--repo=release-tools", "I40***"] + con = self.read_file_content('mock_obs_data.json', folder=EXPECT_DATA_FILE) + r = requests.Response() + r.status = 200 + r.body = dict2obj(con) + self.mock_obs_cloud_listObjects(return_value=r) + self.mock_obs_cloud_getObjects(return_value=r) + read_excel = pd.read_excel(Path(EXPECT_DATA_FILE, "mock_cve_data.xlsx"), sheet_name="cve_list") + self.mock_pandas_read_excel(return_value=read_excel) + self.assert_result() + + def test_failed(self): + """ + test failed + """ + self._to_update_kw_and_make_mock( + "javcra.application.modifypart.modifyentrance.IssueOperation.operate_release_issue", + return_value=False, + ) + self.expect_str = """ +[ERROR] failed to start update. + """ + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40***"] + self.assert_result() + + def test_request_status_408(self): + """test_request_status_408""" + r = requests.Response() + # 状态码408表示为超时异常 + r.status_code = 408 + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +[ERROR] no personnel authority +""" + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40***"] + self.mock_requests_request(return_value=r) + self.assert_result() + + def test_request_raise_requestexception(self): + """test_request_raise_requestexception""" + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40***"] + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +[ERROR] no personnel authority +""" + self.mock_requests_request(side_effect=[RequestException]) + self.assert_result() + + def test_no_permission(self): + """ + test no permission + """ + self.expect_str = """ +[ERROR] The current user does not have relevant operation permissions + """ + self.command_params = ["--giteeid=onetwothree", "--token=xxx", "I40***"] + self.assert_result() + + def test_no_personnel_authority(self): + """ + test no personnel authority + """ + self.expect_str = """ +[ERROR] no personnel authority + """ + # parsing_body的返回值为字典,若未获取到相应的数据,则返回为空字典 + self.command_params = ["--giteeid=Chengxx", "--token=xxx", "I40***"] + self._to_update_kw_and_make_mock( + "javcra.application.checkpart.checktest.CheckTest.parsing_body", + return_value={}, + ) + self.assert_result() + + def test_issue_body_is_none(self): + """ + test issue body is none + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +[ERROR] no personnel authority + """ + self.command_params = ["--giteeid=Chengxx", "--repo=xxx", "I40***"] + self._to_update_kw_and_make_mock( + "javcra.api.gitee_api.Issue.get_issue_info", + return_value={"title": "just for test"}, + ) + self.assert_result() -- Gitee From 3e9596cae35716abef3cbb2bddfdd210ad255c54 Mon Sep 17 00:00:00 2001 From: MementoMori <1003350679@qq.com> Date: Tue, 3 Aug 2021 16:43:22 +0800 Subject: [PATCH 2/3] =?UTF-8?q?modifypart=E9=83=A8=E5=88=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/mock_data/modifypart.txt | 153 ++++++++++++++ .../test_modify/mock_data/add_bugfix.json | 5 + .../test/test_modify/mock_data/add_cve.json | 8 + .../test_modify/mock_data/add_remain.json | 6 + .../test_modify/mock_data/mock_cve_data.xlsx | Bin 0 -> 9638 bytes .../test_modify/mock_data/mock_obs_data.json | 31 +++ .../test/test_modify/test_modify_cli.py | 196 +++++++++++++++++- 7 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 release-assistant/test/mock_data/modifypart.txt create mode 100644 release-assistant/test/test_modify/mock_data/add_bugfix.json create mode 100644 release-assistant/test/test_modify/mock_data/add_cve.json create mode 100644 release-assistant/test/test_modify/mock_data/add_remain.json create mode 100644 release-assistant/test/test_modify/mock_data/mock_cve_data.xlsx create mode 100644 release-assistant/test/test_modify/mock_data/mock_obs_data.json diff --git a/release-assistant/test/mock_data/modifypart.txt b/release-assistant/test/mock_data/modifypart.txt new file mode 100644 index 0000000..536bf4d --- /dev/null +++ b/release-assistant/test/mock_data/modifypart.txt @@ -0,0 +1,153 @@ +{ + "id": 6853820, + "url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW", + "repository_url": "https://gitee.com/api/v5/enterprises/open_euler", + "labels_url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW/labels", + "comments_url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW/comments", + "html_url": "https://gitee.com/openeuler/release-tools/issues/I42WFW", + "parent_url": null, + "number": "I42WFW", + "parent_id": 0, + "depth": 0, + "state": "open", + "title": "openEuler-20.03-LTS-SP1 Update 2021/7/29 release", + "body": "版本目标:CVE、软件包引入升级和Bugfix修复\n 版本: openEuler-20.03-LTS-SP1\n 例行CVE冻结:20210420\n 代码冻结: 20210420\n 版本发布负责人\n 版本经理:@Mary \n开发人员:@Mary@Jerry \n安全委员会:@Mary@Ben \n测试人员:@Mary@Harry@Robin \n\n# 1、发布范围\n## 1、CVE\n修复CVE 2个\n|CVE|仓库|status|score|version|abi是否变化|\n|-|-|-|-|-|-|\n|#I3V9IG|mariadb|遗留|9.0|10.3.9|否|\n|#I3OC6A|hadoop|遗留|9.8|3.2.1|否|\n\n\n\n## 2、bugfix\n修复bugfix 3个\n|issue|仓库|status|\n|-|-|-|\n|#I3J655|i40e|进行中|\n|#I3AHLY|grub2|进行中|\n|#I3SZRJ|grub2|进行中|\n\n\n## 3、requires\n|仓库|引入原因|\n|-|-|\n|#I3X2Q8|测试仓库2|未完成|2|2.3|否|\n\n# 2、测试repo源\n|architecture|url|\n|-|-|\n|aarch64|http://121.36.84.172/repo.openeuler.org/test/update_20210710/aarch64/|\n|x86|http://121.36.84.172/repo.openeuler.org/test/update_20210710/x86_64/|\n\n# 3、安装、自编译问题\n|issue|仓库|status|\n|-|-|-|\n\n\n# 4、遗留问题\n|issue|仓库|status|type|\n|-|-|-|-|\n|#I3V9IG|mariadb|遗留|CVE和安全问题|\n|#I3J655|i40e|遗留|缺陷|\n|#I3AHLY|grub2|遗留|CVE和安全问题|\n|#I3OC6A|hadoop|遗留|CVE和安全问题|\n|#I3SZRJ|qemu|遗留|自定义|\n\n", + "user": { + "id": 2234080, + "login": "Many", + "name": "胖胖", + "avatar_url": "https://portrait.gitee.com/uploads/avatars/user/744/2234080_Many_1578969378.png", + "url": "https://gitee.com/api/v5/users/Many", + "html_url": "https://gitee.com/Many", + "followers_url": "https://gitee.com/api/v5/users/Many/followers", + "following_url": "https://gitee.com/api/v5/users/Many/following_url{/other_user}", + "gists_url": "https://gitee.com/api/v5/users/Many/gists{/gist_id}", + "starred_url": "https://gitee.com/api/v5/users/Many/starred{/owner}{/repo}", + "subscriptions_url": "https://gitee.com/api/v5/users/Many/subscriptions", + "organizations_url": "https://gitee.com/api/v5/users/Many/orgs", + "repos_url": "https://gitee.com/api/v5/users/Many/repos", + "events_url": "https://gitee.com/api/v5/users/Many/events{/privacy}", + "received_events_url": "https://gitee.com/api/v5/users/Many/received_events", + "type": "User" + }, + "labels": [ + { + "id": 107655399, + "name": "sig/sig-EasyLife", + "color": "7512f2", + "repository_id": 5292411, + "url": "https://gitee.com/api/v5/enterprises/open_euler/labels/sig/sig-EasyLife", + "created_at": "2021-04-29T16:37:18+08:00", + "updated_at": "2021-07-29T10:52:14+08:00" + } + ], + "assignee": null, + "collaborators": [], + "repository": { + "id": 16532326, + "full_name": "openeuler/release-tools", + "human_name": "openEuler/release-tools", + "url": "https://gitee.com/api/v5/repos/openeuler/release-tools", + "namespace": { + "id": 5161228, + "type": "group", + "name": "openEuler", + "path": "openeuler", + "html_url": "https://gitee.com/openeuler" + }, + "path": "release-tools", + "name": "release-tools", + "owner": { + "id": 5441867, + "login": "georgecao", + "name": "George.Cao", + "avatar_url": "https://portrait.gitee.com/uploads/avatars/user/1813/5441867_georgecao_1586834388.png", + "url": "https://gitee.com/api/v5/users/georgecao", + "html_url": "https://gitee.com/georgecao", + "followers_url": "https://gitee.com/api/v5/users/georgecao/followers", + "following_url": "https://gitee.com/api/v5/users/georgecao/following_url{/other_user}", + "gists_url": "https://gitee.com/api/v5/users/georgecao/gists{/gist_id}", + "starred_url": "https://gitee.com/api/v5/users/georgecao/starred{/owner}{/repo}", + "subscriptions_url": "https://gitee.com/api/v5/users/georgecao/subscriptions", + "organizations_url": "https://gitee.com/api/v5/users/georgecao/orgs", + "repos_url": "https://gitee.com/api/v5/users/georgecao/repos", + "events_url": "https://gitee.com/api/v5/users/georgecao/events{/privacy}", + "received_events_url": "https://gitee.com/api/v5/users/georgecao/received_events", + "type": "User" + }, + "description": "Tools for version release", + "private": false, + "public": true, + "internal": false, + "fork": false, + "html_url": "https://gitee.com/openeuler/release-tools.git", + "ssh_url": "git@gitee.com:openeuler/release-tools.git", + "forks_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/forks", + "keys_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/keys{/key_id}", + "collaborators_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/collaborators{/collaborator}", + "hooks_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/hooks", + "branches_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/branches{/branch}", + "tags_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/tags", + "blobs_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/blobs{/sha}", + "stargazers_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/stargazers", + "contributors_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/contributors", + "commits_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/commits{/sha}", + "comments_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/comments{/number}", + "issue_comment_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/issues/comments{/number}", + "issues_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/issues{/number}", + "pulls_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/pulls{/number}", + "milestones_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/milestones{/number}", + "notifications_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/notifications{?since,all,participating}", + "labels_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/labels{/name}", + "releases_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/releases{/id}", + "recommend": false, + "homepage": null, + "language": null, + "forks_count": 12, + "stargazers_count": 1, + "watchers_count": 8, + "default_branch": "master", + "open_issues_count": 5, + "has_issues": true, + "has_wiki": true, + "issue_comment": null, + "can_comment": true, + "pull_requests_enabled": true, + "has_page": false, + "license": "MulanPSL-2.0", + "outsourced": false, + "project_creator": "openeuler-ci-bot", + "members": [ + "shin", + "soul", + "hua", + "chenHW", + "init", + "myer", + "ci-bot" + ], + "pushed_at": "2021-07-27T22:30:24+08:00", + "created_at": "2021-06-21T16:33:45+08:00", + "updated_at": "2021-07-29T10:52:10+08:00", + "parent": null, + "paas": null, + "assignees_number": 0, + "testers_number": 0, + "assignee": [], + "testers": [] + }, + "milestone": null, + "created_at": "2021-07-29T10:52:10+08:00", + "updated_at": "2021-07-29T14:52:49+08:00", + "plan_started_at": null, + "deadline": null, + "finished_at": null, + "scheduled_time": 0.0, + "comments": 1, + "priority": 0, + "issue_type": "任务", + "program": null, + "security_hole": false, + "issue_state": "待办的", + "branch": null +} \ No newline at end of file diff --git a/release-assistant/test/test_modify/mock_data/add_bugfix.json b/release-assistant/test/test_modify/mock_data/add_bugfix.json new file mode 100644 index 0000000..850abf0 --- /dev/null +++ b/release-assistant/test/test_modify/mock_data/add_bugfix.json @@ -0,0 +1,5 @@ +{ +"issue": "#I39***", +"仓库": "just", +"status": "closed" +} \ No newline at end of file diff --git a/release-assistant/test/test_modify/mock_data/add_cve.json b/release-assistant/test/test_modify/mock_data/add_cve.json new file mode 100644 index 0000000..0d810ed --- /dev/null +++ b/release-assistant/test/test_modify/mock_data/add_cve.json @@ -0,0 +1,8 @@ +{ +"CVE": "#I39***", +"仓库": "just", +"status": "closed", +"score": "9.9", +"version": "no version info", +"abi是否变化": "否" +} \ No newline at end of file diff --git a/release-assistant/test/test_modify/mock_data/add_remain.json b/release-assistant/test/test_modify/mock_data/add_remain.json new file mode 100644 index 0000000..9729dfe --- /dev/null +++ b/release-assistant/test/test_modify/mock_data/add_remain.json @@ -0,0 +1,6 @@ +{ +"issue": "#I39***", +"仓库": "justtest", +"status": "closed", +"type": "无type信息" +} \ No newline at end of file diff --git a/release-assistant/test/test_modify/mock_data/mock_cve_data.xlsx b/release-assistant/test/test_modify/mock_data/mock_cve_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..75058aee9e31a41b746969b72f923fb8f9ece28c GIT binary patch literal 9638 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 Ee_oPcyZ`_I literal 0 HcmV?d00001 diff --git a/release-assistant/test/test_modify/mock_data/mock_obs_data.json b/release-assistant/test/test_modify/mock_data/mock_obs_data.json new file mode 100644 index 0000000..c5b2d3a --- /dev/null +++ b/release-assistant/test/test_modify/mock_data/mock_obs_data.json @@ -0,0 +1,31 @@ + +{"commonPrefixs": [], + "contents": [{"etag": "d41d8cd98f00b204e9800998ecf8427e", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 0, + "storageClass": "STANDARD"}, + {"etag": "395628cc294b46dba7cd9f319b6de393", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/openEuler-20.03-LTS-SP1_updateinfo.xlsx", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 7230, + "storageClass": "STANDARD"}, + {"etag": "22168585eb84ae60d21e10f1f6ecc866", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/openEuler-20.03-LTS-SP1_updateinfo.xml", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 35474, + "storageClass": "STANDARD"}, + {"etag": "f1427526416e64b2afa6a08d4bce9e86", + "isAppendable": false, + "key": "cve-manager-updateinfo/2021-07-30/openEuler-20.03-LTS-SP2_updateinfo.xlsx", + "lastModified": "2021/07/30 09:51:43", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 7476, + "storageClass": "STANDARD"}] + } diff --git a/release-assistant/test/test_modify/test_modify_cli.py b/release-assistant/test/test_modify/test_modify_cli.py index 7ca644d..47d04ff 100644 --- a/release-assistant/test/test_modify/test_modify_cli.py +++ b/release-assistant/test/test_modify/test_modify_cli.py @@ -13,4 +13,198 @@ # -*- coding:utf-8 -*- """ TestModify -""" \ No newline at end of file +""" +import os +import json +import requests +from requests import RequestException +from unittest.mock import PropertyMock +from test.base.basetest import TestMixin +from javcra.cli.commands.modifypart import ModifyCommand + +EXPECT_DATA_FILE = os.path.join(os.path.abspath(os.path.dirname(__file__)), "mock_data") + + +class TestModify(TestMixin): + """ + class for test TestModify + """ + cmd_class = ModifyCommand + + def setUp(self) -> None: + """ + setUp + """ + super(TestModify, self).setUp() + r = requests.Response() + r.status_code = 200 + self._to_update_kw_and_make_mock( + "requests.Response.text", + new_callable=PropertyMock, + return_value=self.read_file_content('modifypart.txt', is_json=False), + ) + self.mock_requests_request(return_value=r) + + def test_add_cve(self): + """ + test add cve + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I39***'] +[INFO] add I39*** in cve successfully. + """ + mock_data = self.read_file_content('add_cve.json', folder=EXPECT_DATA_FILE, is_json=False) + self._to_update_kw_and_make_mock( + "javcra.application.modifypart.modifyentrance.CveIssue.get_single_issue_info", + return_value=[json.loads(mock_data)], + ) + self.command_params = ["I40***", "--giteeid=Mary", "--add=cve", "--id=I39***"] + self.assert_result() + + def test_add_bugfix(self): + """ + test add bugfix + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I39***'] +[INFO] add I39*** in bugfix successfully. + """ + mock_data = self.read_file_content('add_bugfix.json', folder=EXPECT_DATA_FILE, is_json=False) + self._to_update_kw_and_make_mock( + "javcra.application.modifypart.modifyentrance.BugFixIssue.get_single_issue_info", + return_value=[json.loads(mock_data)], + ) + self.command_params = ["I40***", "--giteeid=Mary", "--add=bugfix", "--id=I39***"] + self.assert_result() + + def test_add_remain(self): + """ + test add remain + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I3V9IG'] +[INFO] add I3V9IG in remain successfully. +update remain issues successfully. + """ + mock_data = self.read_file_content('add_remain.json', folder=EXPECT_DATA_FILE, is_json=False) + self._to_update_kw_and_make_mock( + "javcra.application.modifypart.modifyentrance.RemainIssue.get_single_issue_info", + return_value=[json.loads(mock_data)], + ) + self.command_params = ["I40***", "--giteeid=Mary", "--add=remain", "--id=I3V9IG"] + self.assert_result() + + def test_delete_cve(self): + """ + test delete cve + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I3V9IG'] +[INFO] delete I3V9IG in cve successfully. + """ + self.command_params = ["I40***", "--giteeid=Mary", "--delete=cve", "--id=I3V9IG"] + self.assert_result() + + def test_delete_bugfix(self): + """ + test delete bugfix + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I3J655'] +[INFO] delete I3J655 in bugfix successfully. + """ + self.command_params = ["I40***", "--giteeid=Mary", "--delete=bugfix", "--id=I3J655"] + self.assert_result() + + def test_delete_remain(self): + """ + test delete remain + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I3SZRJ'] +[INFO] delete I3SZRJ in remain successfully. +update remain issues successfully. + """ + self.command_params = ["I40***", "--giteeid=Mary", "--delete=remain", "--id=I3SZRJ"] + self.assert_result() + + def test_parameter_validation_failed(self): + """ + test parameter validation failed + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +Parameter validation failed + """ + self.command_params = ["I40***", "--giteeid=Mary", "--delete=remain", "--id"] + self.assert_result() + + def test_no_personnel_authority(self): + """test_no_personnel_authority""" + self.command_params = ["I40***", "--giteeid=Mary", "--delete=remain", "--id=I39***"] + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I39***'] +[ERROR] The current user does not have relevant operation permissions +""" + self._to_update_kw_and_make_mock( + "javcra.application.checkpart.checktest.CheckTest.parsing_body", + return_value={}, + ) + self.assert_result() + + def test_request_raise_requestexception(self): + """ + test_request_raise_requestexception + """ + + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I39***'] +[ERROR] The current user does not have relevant operation permissions + """ + self.command_params = ["I40***", "--giteeid=Mary", "--delete=remain", "--id=I39***"] + self.mock_requests_request(side_effect=[RequestException]) + self.assert_result() + + def test_update_remain_failed(self): + """ + test_update_remain_failed + """ + + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I39***'] +[INFO] delete I39*** in remain successfully. +failed to update remain issues, please check whether the issue exist in cve and bugfix part. + """ + self.command_params = ["I40***", "--giteeid=Mary", "--delete=remain", "--id=I39***"] + self._to_update_kw_and_make_mock( + "javcra.application.modifypart.modifyentrance.IssueOperation.update_remain_issue_state", + return_value=False, + ) + self.assert_result() + + def test_update_remain_issue_state_is_error(self): + """ + test_update_remain_issue_state_is_error + """ + + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +modify part start! I40*** Mary ['I39***'] +[INFO] delete I39*** in remain successfully. +failed to update remain issues, please check whether the issue exist in cve and bugfix part. + """ + self.command_params = ["I40***", "--giteeid=Mary", "--delete=remain", "--id=I39***"] + self._to_update_kw_and_make_mock( + "javcra.application.modifypart.modifyentrance.IssueOperation._get_install_build_bugfix_issue_id", + return_value=("one", "two"), + ) + self.assert_result() -- Gitee From 655c22b5927d01791e950e119df08606d70aca09 Mon Sep 17 00:00:00 2001 From: MementoMori <1003350679@qq.com> Date: Thu, 5 Aug 2021 17:58:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?checkypart=E9=83=A8=E5=88=86=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- release-assistant/test/base/basetest.py | 102 +++++++++++- .../test/mock_data/checkpart.txt | 153 ++++++++++++++++++ .../test_check/mock_data/mock_obs_data.json | 31 ++++ .../test/test_check/test_check_cli.py | 103 +++++++++++- 4 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 release-assistant/test/mock_data/checkpart.txt create mode 100644 release-assistant/test/test_check/mock_data/mock_obs_data.json diff --git a/release-assistant/test/base/basetest.py b/release-assistant/test/base/basetest.py index bf31359..130d26f 100644 --- a/release-assistant/test/base/basetest.py +++ b/release-assistant/test/base/basetest.py @@ -287,19 +287,117 @@ class TestMixin(TestBase): ) def mock_obs_cloud_listObjects(self, **kwargs): - """mock_requests_listObjects""" + """mock_obs_cloud_listObjects""" self._to_update_kw_and_make_mock( "obs.ObsClient.listObjects", **kwargs, ) def mock_obs_cloud_getObjects(self, **kwargs): - """mock_requests_getObjects""" + """mock_obs_cloud_getObjects""" self._to_update_kw_and_make_mock( "obs.ObsClient.getObject", **kwargs, ) + def mock_obs_cloud_headBucket(self, **kwargs): + """mock_obs_cloud_headBucket""" + self._to_update_kw_and_make_mock( + "obs.ObsClient.headBucket", + **kwargs, + ) + + def mock_obs_cloud_deleteObject(self, **kwargs): + """mock_obs_cloud_deleteObject""" + self._to_update_kw_and_make_mock( + "obs.ObsClient.deleteObject", + **kwargs, + ) + + def mock_obs_cloud_putFile(self, **kwargs): + """mock_obs_cloud_putFile""" + self._to_update_kw_and_make_mock( + "obs.ObsClient.putFile", + **kwargs, + ) + + def mock_jenkins_build_job(self, **kwargs): + """mock_jenkins_build_job""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.build_job", + **kwargs, + ) + + def mock_jenkins_create_job(self, **kwargs): + """mock_jenkins_create_job""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.create_job", + **kwargs, + ) + + def mock_jenkins_create_folder(self, **kwargs): + """mock_jenkins_create_folder""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.create_folder", + **kwargs, + ) + + def mock_jenkins_get_job_info(self, **kwargs): + """mock_jenkins_get_job_info""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.get_job_info", + **kwargs, + ) + + def mock_jenkins_get_build_info(self, **kwargs): + """mock_jenkins_get_build_info""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.get_build_info", + **kwargs, + ) + + def mock_jenkins_get_build_console_output(self, **kwargs): + """mock_jenkins_get_build_console_output""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.get_build_console_output", + **kwargs, + ) + + def mock_jenkins_get_queue_item(self, **kwargs): + """mock_jenkins_get_queue_item""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.get_queue_item", + **kwargs, + ) + + def mock_jenkins_get_job_config(self, **kwargs): + """mock_jenkins_get_job_config""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.get_job_config", + **kwargs, + ) + + def mock_jenkins_build_job_url(self, **kwargs): + """mock_jenkins_build_job_url""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.build_job_url", + **kwargs, + ) + + def mock_jenkins_job_exists(self, **kwargs): + """mock_jenkins_job_exists""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.job_exists", + **kwargs, + ) + + def mock_jenkins_delete_job(self, **kwargs): + """mock_jenkins_delete_job""" + self._to_update_kw_and_make_mock( + "jenkins.Jenkins.delete_job", + **kwargs, + ) + def mock_pandas_read_excel(self, **kwargs): """mock_pandas_read_excel""" self._to_update_kw_and_make_mock( diff --git a/release-assistant/test/mock_data/checkpart.txt b/release-assistant/test/mock_data/checkpart.txt new file mode 100644 index 0000000..c1ecf31 --- /dev/null +++ b/release-assistant/test/mock_data/checkpart.txt @@ -0,0 +1,153 @@ +{ + "id": 6853820, + "url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW", + "repository_url": "https://gitee.com/api/v5/enterprises/open_euler", + "labels_url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW/labels", + "comments_url": "https://gitee.com/api/v5/enterprises/open_euler/issues/I42WFW/comments", + "html_url": "https://gitee.com/openeuler/release-tools/issues/I42WFW", + "parent_url": null, + "number": "I42WFW", + "parent_id": 0, + "depth": 0, + "state": "open", + "title": "openEuler-20.03-LTS-SP1 Update 2021/7/29 release", + "body": "版本目标:CVE、软件包引入升级和Bugfix修复\n 版本: openEuler-20.03-LTS-SP1\n 例行CVE冻结:20210420\n 代码冻结: 20210420\n 版本发布负责人\n 版本经理:@Mary \n开发人员:@Mary@Jerry \n安全委员会:@Mary@Ben \n测试人员:@Mary@Harry@Robin \n\n# 1、发布范围\n## 1、CVE\n修复CVE 2个\n|CVE|仓库|status|score|version|abi是否变化|\n|-|-|-|-|-|-|\n|#I3V9IG|mariadb|遗留|9.0|10.3.9|否|\n|#I3OC6A|hadoop|遗留|9.8|3.2.1|否|\n\n\n\n## 2、bugfix\n修复bugfix 2个\n|issue|仓库|status|\n|-|-|-|\n|#I3J655|i40e|遗留|\n|#I3AHLY|grub2|遗留|\n\n\n## 3、requires\n|仓库|引入原因|\n|-|-|\n|bluez|接口变更|\n|edk2|升级|\n\n# 2、测试repo源\n|repo_type|architecture|url|\n|-|-|-|\n\n\n# 3、安装、自编译问题\n|issue|仓库|status|\n|-|-|-|\n|#I3TFOK|gupnp|已完成|\n|#I3HUPJ|kf5-kconfig|已完成|\n\n# 4、遗留问题\n|issue|仓库|status|type|\n|-|-|-|-|\n|#I3V9IG|mariadb|遗留|CVE和安全问题|\n|#I3J655|i40e|遗留|缺陷|\n|#I3AHLY|grub2|遗留|CVE和安全问题|\n|#I3OC6A|hadoop|遗留|CVE和安全问题|\n|#I3SZRJ|qemu|遗留|自定义|\n\n", + "user": { + "id": 2234080, + "login": "Many", + "name": "胖胖", + "avatar_url": "https://portrait.gitee.com/uploads/avatars/user/744/2234080_Many_1578969378.png", + "url": "https://gitee.com/api/v5/users/Many", + "html_url": "https://gitee.com/Many", + "followers_url": "https://gitee.com/api/v5/users/Many/followers", + "following_url": "https://gitee.com/api/v5/users/Many/following_url{/other_user}", + "gists_url": "https://gitee.com/api/v5/users/Many/gists{/gist_id}", + "starred_url": "https://gitee.com/api/v5/users/Many/starred{/owner}{/repo}", + "subscriptions_url": "https://gitee.com/api/v5/users/Many/subscriptions", + "organizations_url": "https://gitee.com/api/v5/users/Many/orgs", + "repos_url": "https://gitee.com/api/v5/users/Many/repos", + "events_url": "https://gitee.com/api/v5/users/Many/events{/privacy}", + "received_events_url": "https://gitee.com/api/v5/users/Many/received_events", + "type": "User" + }, + "labels": [ + { + "id": 107655399, + "name": "sig/sig-EasyLife", + "color": "7512f2", + "repository_id": 5292411, + "url": "https://gitee.com/api/v5/enterprises/open_euler/labels/sig/sig-EasyLife", + "created_at": "2021-04-29T16:37:18+08:00", + "updated_at": "2021-07-29T10:52:14+08:00" + } + ], + "assignee": null, + "collaborators": [], + "repository": { + "id": 16532326, + "full_name": "openeuler/release-tools", + "human_name": "openEuler/release-tools", + "url": "https://gitee.com/api/v5/repos/openeuler/release-tools", + "namespace": { + "id": 5161228, + "type": "group", + "name": "openEuler", + "path": "openeuler", + "html_url": "https://gitee.com/openeuler" + }, + "path": "release-tools", + "name": "release-tools", + "owner": { + "id": 5441867, + "login": "georgecao", + "name": "George.Cao", + "avatar_url": "https://portrait.gitee.com/uploads/avatars/user/1813/5441867_georgecao_1586834388.png", + "url": "https://gitee.com/api/v5/users/georgecao", + "html_url": "https://gitee.com/georgecao", + "followers_url": "https://gitee.com/api/v5/users/georgecao/followers", + "following_url": "https://gitee.com/api/v5/users/georgecao/following_url{/other_user}", + "gists_url": "https://gitee.com/api/v5/users/georgecao/gists{/gist_id}", + "starred_url": "https://gitee.com/api/v5/users/georgecao/starred{/owner}{/repo}", + "subscriptions_url": "https://gitee.com/api/v5/users/georgecao/subscriptions", + "organizations_url": "https://gitee.com/api/v5/users/georgecao/orgs", + "repos_url": "https://gitee.com/api/v5/users/georgecao/repos", + "events_url": "https://gitee.com/api/v5/users/georgecao/events{/privacy}", + "received_events_url": "https://gitee.com/api/v5/users/georgecao/received_events", + "type": "User" + }, + "description": "Tools for version release", + "private": false, + "public": true, + "internal": false, + "fork": false, + "html_url": "https://gitee.com/openeuler/release-tools.git", + "ssh_url": "git@gitee.com:openeuler/release-tools.git", + "forks_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/forks", + "keys_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/keys{/key_id}", + "collaborators_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/collaborators{/collaborator}", + "hooks_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/hooks", + "branches_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/branches{/branch}", + "tags_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/tags", + "blobs_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/blobs{/sha}", + "stargazers_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/stargazers", + "contributors_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/contributors", + "commits_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/commits{/sha}", + "comments_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/comments{/number}", + "issue_comment_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/issues/comments{/number}", + "issues_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/issues{/number}", + "pulls_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/pulls{/number}", + "milestones_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/milestones{/number}", + "notifications_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/notifications{?since,all,participating}", + "labels_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/labels{/name}", + "releases_url": "https://gitee.com/api/v5/repos/openeuler/release-tools/releases{/id}", + "recommend": false, + "homepage": null, + "language": null, + "forks_count": 12, + "stargazers_count": 1, + "watchers_count": 8, + "default_branch": "master", + "open_issues_count": 5, + "has_issues": true, + "has_wiki": true, + "issue_comment": null, + "can_comment": true, + "pull_requests_enabled": true, + "has_page": false, + "license": "MulanPSL-2.0", + "outsourced": false, + "project_creator": "openeuler-ci-bot", + "members": [ + "shin", + "soul", + "hua", + "chenHW", + "init", + "myer", + "ci-bot" + ], + "pushed_at": "2021-07-27T22:30:24+08:00", + "created_at": "2021-06-21T16:33:45+08:00", + "updated_at": "2021-07-29T10:52:10+08:00", + "parent": null, + "paas": null, + "assignees_number": 0, + "testers_number": 0, + "assignee": [], + "testers": [] + }, + "milestone": null, + "created_at": "2021-07-29T10:52:10+08:00", + "updated_at": "2021-07-29T14:52:49+08:00", + "plan_started_at": null, + "deadline": null, + "finished_at": null, + "scheduled_time": 0.0, + "comments": 1, + "priority": 0, + "issue_type": "任务", + "program": null, + "security_hole": false, + "issue_state": "待办的", + "branch": null +} \ No newline at end of file diff --git a/release-assistant/test/test_check/mock_data/mock_obs_data.json b/release-assistant/test/test_check/mock_data/mock_obs_data.json new file mode 100644 index 0000000..d27bdcd --- /dev/null +++ b/release-assistant/test/test_check/mock_data/mock_obs_data.json @@ -0,0 +1,31 @@ + +{"commonPrefixs": [], + "contents": [{"etag": "d41d8cd98f00b204e9800998ecf8427e", + "isAppendable": false, + "key": "release-tools/install-build-log/build-result/a-test", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 0, + "storageClass": "STANDARD"}, + {"etag": "395628cc294b46dba7cd9f319b6de393", + "isAppendable": false, + "key": "release-tools/install-build-log/build-result/b-test", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 7230, + "storageClass": "STANDARD"}, + {"etag": "22168585eb84ae60d21e10f1f6ecc866", + "isAppendable": false, + "key": "release-tools/install-build-log/install-result/c-test", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 35474, + "storageClass": "STANDARD"}, + {"etag": "f1427526416e64b2afa6a08d4bce9e86", + "isAppendable": false, + "key": "release-tools/install-build-log/install-result/d-test", + "lastModified": "2021/07/30 09:51:43", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 7476, + "storageClass": "STANDARD"}] + } \ No newline at end of file diff --git a/release-assistant/test/test_check/test_check_cli.py b/release-assistant/test/test_check/test_check_cli.py index ad852f4..31eaa53 100644 --- a/release-assistant/test/test_check/test_check_cli.py +++ b/release-assistant/test/test_check/test_check_cli.py @@ -13,4 +13,105 @@ # -*- coding:utf-8 -*- """ TestCheck -""" \ No newline at end of file +""" +import json +import os +import requests +from requests import RequestException +from unittest.mock import PropertyMock +from test.base.basetest import dict2obj +from test.base.basetest import TestMixin +from javcra.cli.commands.checkpart import CheckCommand + +EXPECT_DATA_FILE = os.path.join(os.path.abspath(os.path.dirname(__file__)), "mock_data") + + +class TestCheck(TestMixin): + """ + class for test TestCheck + """ + cmd_class = CheckCommand + + def setUp(self) -> None: + """ + setUp + """ + super(TestCheck, self).setUp() + r = requests.Response() + r.status_code = 200 + self._to_update_kw_and_make_mock( + "requests.Response.text", + new_callable=PropertyMock, + return_value=self.read_file_content('checkpart.txt', is_json=False), + ) + self.mock_requests_request(return_value=r) + + def test_check_status(self): + """ + test check status + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +check part start I40*** Mary +[INFO] successfully check issue state. + """ + self.command_params = ["--giteeid=Mary", "--type=status", "I40***"] + self.assert_result() + + def test_check_status_failed(self): + """ + test check status failed + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +check part start I40*** Mary +[ERROR] failed to check issue state. + """ + self._to_update_kw_and_make_mock( + "javcra.application.modifypart.modifyentrance.IssueOperation._get_install_build_bugfix_issue_id", + return_value=("one", "two"), + ) + self.command_params = ["--giteeid=Mary", "--type=status", "I40***"] + self.assert_result() + + def test_people_review(self): + """ + test people review + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +check part start I40*** Mary +[INFO] check successfully. + """ + self.command_params = ["--giteeid=Mary", "--type=test", "I40***"] + self.assert_result() + + def test_people_review_failed(self): + """ + test people review personnel access failed + """ + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +check part start I40*** Mary +[ERROR] failed to check. + """ + self.command_params = ["--giteeid=Mary", "--type=test", "I40***"] + self._to_update_kw_and_make_mock( + "javcra.application.checkpart.checktest.CheckTest.people_review", + return_value=False, + ) + self.assert_result() + + def test_no_personnel_authority(self): + """test_no_personnel_authority""" + self.command_params = ["--giteeid=Mary", "--type=status", "I40***"] + # 命令行打印信息暂未确定,后期确定之后统一修改 + self.expect_str = """ +check part start I40*** Mary +[ERROR] The current user does not have relevant operation permissions +""" + self._to_update_kw_and_make_mock( + "javcra.application.checkpart.checktest.CheckTest.parsing_body", + return_value={}, + ) + self.assert_result() -- Gitee