From 0185af784fe89bbd46ed5f106700a6d0e3dc7865 Mon Sep 17 00:00:00 2001 From: MementoMori <1003350679@qq.com> Date: Fri, 6 Aug 2021 14:34:12 +0800 Subject: [PATCH] =?UTF-8?q?startpart=E9=83=A8=E5=88=86=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=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/__init__.py | 3 + release-assistant/test/base/basetest.py | 178 ++++++++++++++++- .../test/mock_data/mock_incorrect_issue.txt | 153 +++++++++++++++ .../test/mock_data/startpart.txt | 153 +++++++++++++++ .../test_start/mock_data/already_operated.txt | 153 +++++++++++++++ .../mock_data/init_success_data.txt | 153 +++++++++++++++ .../test_start/mock_data/mock_cve_data.xlsx | Bin 0 -> 9300 bytes .../mock_data/mock_issue_is_none.txt | 153 +++++++++++++++ .../test_start/mock_data/mock_obs_data.json | 30 +++ .../test/test_start/test_start_cli.py | 179 +++++++++++++++++- 10 files changed, 1150 insertions(+), 5 deletions(-) create mode 100644 release-assistant/test/mock_data/mock_incorrect_issue.txt create mode 100644 release-assistant/test/mock_data/startpart.txt create mode 100644 release-assistant/test/test_start/mock_data/already_operated.txt create mode 100644 release-assistant/test/test_start/mock_data/init_success_data.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_issue_is_none.txt create mode 100644 release-assistant/test/test_start/mock_data/mock_obs_data.json diff --git a/release-assistant/test/base/__init__.py b/release-assistant/test/base/__init__.py index 6851032..38f148d 100644 --- a/release-assistant/test/base/__init__.py +++ b/release-assistant/test/base/__init__.py @@ -10,3 +10,6 @@ # PURPOSE. # See the Mulan PSL v2 for more details. # ******************************************************************************/ +import os + +os.environ['user_email'] = "guoxiaoqi2@huawei.com" diff --git a/release-assistant/test/base/basetest.py b/release-assistant/test/base/basetest.py index 02114e2..68be8f9 100644 --- a/release-assistant/test/base/basetest.py +++ b/release-assistant/test/base/basetest.py @@ -13,15 +13,39 @@ """ The test base class contains some public methods """ +import sys import argparse import json -import sys import unittest +from unittest.mock import PropertyMock from io import StringIO - +from unittest import mock +from pathlib import Path +from javcra.cli.base import BaseCommand import requests -from javcra.cli.base import BaseCommand +MOCK_DATA_FOLDER = str(Path(Path(__file__).parents[1], "mock_data")) + + +class MakeObject(object): + """ + class for object + """ + + def __init__(self, dict_): + self.__dict__.update(dict_) + + +def dict_2_object(content): + """ + dict to object + Args: + content: content type:dict + + Returns: + + """ + return json.loads(json.dumps(content), object_hook=MakeObject) class TestBase(unittest.TestCase): @@ -81,6 +105,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 single_patcher in self._to_clean_patchers: + self.addCleanup(single_patcher.stop) + self._to_clean_patchers.clear() + def tearDown(self) -> None: """ The last to run after each test case is run @@ -93,10 +123,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 +223,142 @@ 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_request(self, **kwargs): + """mock_request""" + self._to_update_kw_and_make_mock( + "requests.request", + **kwargs, + ) + + def mock_requests_get(self, **kwargs): + """mock_requests_get""" + self._to_update_kw_and_make_mock( + "requests.get", + **kwargs, + ) + + def mock_obs_cloud_list_objects(self, **kwargs): + """mock_obs_cloud_list_objects""" + self._to_update_kw_and_make_mock( + "obs.ObsClient.listObjects", + **kwargs, + ) + + def mock_obs_cloud_get_objects(self, **kwargs): + """mock_obs_cloud_get_objects""" + 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, + ) + + def make_expect_data(self, status_code, file_name, folder=MOCK_DATA_FOLDER): + """ + make expected data + Args: + status_code: status code + folder: folder + file_name: file of expected data + Returns: + """ + mock_r = requests.Response() + mock_r.status_code = status_code + self._to_update_kw_and_make_mock( + "requests.Response.text", + new_callable=PropertyMock, + return_value=self.read_file_content(file_name, folder=folder, is_json=False), + ) + return mock_r + + @staticmethod + def make_object_data(status_code, text=""): + """ + make object data + Args: + status_code: status code + text: text + Returns: + """ + object_r = dict_2_object({}) + object_r.status = status_code + object_r.status_code = status_code + object_r.text = text + return object_r + + @staticmethod + def make_obs_cloud_data(status, body=""): + """ + make obs cloud data + Args: + status: status code + body: body + Returns: + """ + mock_r = requests.Response() + mock_r.status = status + mock_r.status_code = status + mock_r.body = dict_2_object(body) + return mock_r diff --git a/release-assistant/test/mock_data/mock_incorrect_issue.txt b/release-assistant/test/mock_data/mock_incorrect_issue.txt new file mode 100644 index 0000000..746e48a --- /dev/null +++ b/release-assistant/test/mock_data/mock_incorrect_issue.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": "I3AQ2G", + "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", + "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/mock_data/startpart.txt b/release-assistant/test/mock_data/startpart.txt new file mode 100644 index 0000000..15dc96a --- /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": "I40321", + "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/already_operated.txt b/release-assistant/test/test_start/mock_data/already_operated.txt new file mode 100644 index 0000000..bf59570 --- /dev/null +++ b/release-assistant/test/test_start/mock_data/already_operated.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 0个\n|CVE|仓库|status|score|version|abi是否变化|\n|-|-|-|-|-|-|\n\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/init_success_data.txt b/release-assistant/test/test_start/mock_data/init_success_data.txt new file mode 100644 index 0000000..2cbf176 --- /dev/null +++ b/release-assistant/test/test_start/mock_data/init_success_data.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": "I40321", + "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# 1、发布范围\n## 1、CVE\n修复CVE 1个\n|CVE|仓库|status|score|version|abi是否变化|\n|-|-|-|-|-|-|\n|#I3AQ2G:CVE-2020-8020|obs-server|已完成|6.1|2.10.1|否|\n\n\n## 2、bugfix\n修复bugfix 0个\n|issue|仓库|status|\n|-|-|-|\n\n\n## 3、requires\n|仓库|引入原因|\n|-|-|\n\n# 2、测试repo源\n|architecture|url|\n|-|-|\n\n# 3、安装、自编译问题\n|issue|仓库|status|\n|-|-|-|\n\n\n# 4、遗留问题\n|issue|仓库|status|type|\n|-|-|-|-|\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..3c73bc8adc8fc5c316cfbcf78d785a552eb74a5a GIT binary patch literal 9300 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 literal 0 HcmV?d00001 diff --git a/release-assistant/test/test_start/mock_data/mock_issue_is_none.txt b/release-assistant/test/test_start/mock_data/mock_issue_is_none.txt new file mode 100644 index 0000000..751f402 --- /dev/null +++ b/release-assistant/test/test_start/mock_data/mock_issue_is_none.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": "", + "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_obs_data.json b/release-assistant/test/test_start/mock_data/mock_obs_data.json new file mode 100644 index 0000000..8724ab1 --- /dev/null +++ b/release-assistant/test/test_start/mock_data/mock_obs_data.json @@ -0,0 +1,30 @@ +{"commonPrefixs": [], + "contents": [{"etag": "d41d8cd98f00b204e9800998ecf8427e", + "isAppendable": false, + "key": "", + "lastModified": "2021/07/30 09:51:42", + "owner": {"owner_id": "060600ffbe00251e0f6fc0176531c800"}, + "size": 0, + "storageClass": "STANDARD"}, + {"etag": "395628cc294b46dba7cd9f319b6de393", + "isAppendable": false, + "key": "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": "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": "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..9308fe8 100644 --- a/release-assistant/test/test_start/test_start_cli.py +++ b/release-assistant/test/test_start/test_start_cli.py @@ -13,4 +13,181 @@ # -*- coding:utf-8 -*- """ TestStart -""" \ No newline at end of file +""" +import os +import datetime +from pathlib import Path +from test.base.basetest import TestMixin +from requests.exceptions import RequestException +from javcra.cli.commands.startpart import StartCommand +import pandas as pd + +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 test_success(self): + """ + test success + """ + self.expect_str = """ +[INFO] start update successfully. + """ + resp = self.make_expect_data(200, 'startpart.txt') + mock_init_success_data = self.read_file_content('init_success_data.txt', folder=EXPECT_DATA_FILE, + is_json=False) + mock_init_r = self.make_object_data(200, mock_init_success_data) + self.command_params = ["--giteeid=Mary", "--token=release-tools", "I40321"] + con = self.read_file_content('mock_obs_data.json', folder=EXPECT_DATA_FILE) + for con_key in con['contents']: + con_key["key"] = "cve-manager-updateinfo/{}/{}".format( + datetime.date(datetime.date.today().year, datetime.date.today().month, + datetime.date.today().day).strftime('%Y-%m-%d'), con_key["key"]) + mock_r = self.make_obs_cloud_data(200, con) + self.mock_obs_cloud_list_objects(return_value=mock_r) + self.mock_obs_cloud_get_objects(return_value=mock_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.mock_request(side_effect=[resp, resp, resp, resp, resp, mock_init_r]) + mock_get_r = self.make_object_data(200) + self.mock_requests_get(side_effect=[mock_get_r]) + self.assert_result() + + def test_failed(self): + """ + test failed + """ + self.expect_str = """ +[ERROR] failed to start update. + """ + resp = self.make_expect_data(200, 'startpart.txt') + self.command_params = ["--giteeid=Mary", "--token=release-tools", "I40321"] + con = self.read_file_content('mock_obs_data.json', folder=EXPECT_DATA_FILE) + for con_key in con['contents']: + con_key["key"] = "cve-manager-updateinfo/{}/{}".format( + datetime.date(datetime.date.today().year, datetime.date.today().month, + datetime.date.today().day).strftime('%Y-%m-%d'), con_key["key"]) + mock_r = self.make_obs_cloud_data(200, con) + self.mock_obs_cloud_list_objects(return_value=mock_r) + self.mock_obs_cloud_get_objects(return_value=mock_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.mock_request(side_effect=[resp, resp, resp, resp, resp, RequestException]) + mock_get_r = self.make_object_data(200) + self.mock_requests_get(side_effect=[mock_get_r]) + self.assert_result() + + def test_validate_failed(self): + """ + test validate failed + """ + self.expect_str = """ +Parameter validation failed + """ + self.command_params = ["--giteeid=Mary", "--token=release-tools", ""] + self.assert_result() + + def test_request_status_408(self): + """test_request_status_408""" + self.expect_str = """ +[ERROR] no personnel authority +""" + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40321"] + mock_r = self.make_object_data(408) + self.mock_request(return_value=mock_r) + self.assert_result() + + def test_request_raise_requestexception(self): + """test_request_raise_requestexception""" + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40321"] + self.expect_str = """ +[ERROR] no personnel authority +""" + self.mock_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", "I40321"] + resp = self.make_expect_data(200, 'startpart.txt') + self.mock_request(side_effect=[resp]) + self.assert_result() + + def test_no_personnel_authority(self): + """ + test no personnel authority + """ + self.expect_str = """ +[ERROR] no personnel authority + """ + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40321"] + resp = self.make_expect_data(200, 'mock_incorrect_issue.txt') + self.mock_request(side_effect=[resp]) + self.assert_result() + + def test_resp_body_is_none(self): + """ + test resp body is none + """ + self.expect_str = """ +[ERROR] failed to start update. + """ + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40321"] + resp = self.make_expect_data(200, 'startpart.txt') + issue_body_is_none_data = self.read_file_content('mock_issue_is_none.txt', folder=EXPECT_DATA_FILE, + is_json=False) + mock_issue_body_is_none_r = self.make_object_data(200, issue_body_is_none_data) + self.mock_request(side_effect=[resp, mock_issue_body_is_none_r]) + self.assert_result() + + def test_already_operated(self): + """ + test already operated + """ + self.expect_str = """ +Issue has CVE content, have you already operated start update command +[ERROR] failed to start update. + """ + self.command_params = ["--giteeid=Mary", "--token=xxx", "I40321"] + resp = self.make_expect_data(200, 'startpart.txt') + already_operated_data = self.read_file_content('already_operated.txt', folder=EXPECT_DATA_FILE, + is_json=False) + mock_already_operated_r = self.make_object_data(200, already_operated_data) + self.mock_request(side_effect=[resp, mock_already_operated_r]) + self.assert_result() + + def test_download_file_failed(self): + """ + test download file failed + """ + self.expect_str = """ +[ERROR] failed to start update. + """ + resp = self.make_expect_data(200, 'startpart.txt') + self.command_params = ["--giteeid=Mary", "--token=release-tools", "I40321"] + con = self.read_file_content('mock_obs_data.json', folder=EXPECT_DATA_FILE) + for con_key in con['contents']: + con_key["key"] = "cve-manager-updateinfo/{}/{}".format( + datetime.date(datetime.date.today().year, datetime.date.today().month, + datetime.date.today().day).strftime('%Y-%m-%d'), con_key["key"]) + mock_listobjects_r = self.make_obs_cloud_data(200, con) + self.mock_obs_cloud_list_objects(return_value=mock_listobjects_r) + mock_getobjects_r = self.make_object_data(400) + self.mock_obs_cloud_get_objects(return_value=mock_getobjects_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.mock_request(side_effect=[resp, resp, resp, resp, resp, resp, resp]) + mock_get_r = self.make_object_data(200) + self.mock_requests_get(side_effect=[mock_get_r]) + self.assert_result() -- Gitee