diff --git a/release-assistant/test/base/__init__.py b/release-assistant/test/base/__init__.py index 6851032853d1af6ec5065266cf9d86c2bd1c0b3c..38f148d31223bbf65bebd9a9276dc55eef0c4f68 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 02114e249fb237029e3c486728bd44c154beb6b7..68be8f981bb761d7e76bb53598718ffc446aa5d4 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 0000000000000000000000000000000000000000..746e48a9f604a77aa1f2d99238e33e0cfde09d08 --- /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 0000000000000000000000000000000000000000..15dc96a9971402d0097a1266447628e6aab1e247 --- /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 0000000000000000000000000000000000000000..bf595709af3696d6f66eb8c0f1b076ada9d7d80b --- /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 0000000000000000000000000000000000000000..2cbf176d05ba60f4025ffd9d0393a99aff6cc8e2 --- /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 Binary files /dev/null and b/release-assistant/test/test_start/mock_data/mock_cve_data.xlsx differ 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 0000000000000000000000000000000000000000..751f40233e40db0a830c905e29226304a451a248 --- /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 0000000000000000000000000000000000000000..8724ab157ae6188f38aa30ca068d116971aa164a --- /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 726d914df623d50b50169498559609efa8b0ef1f..9308fe837c5f0e7c861a6191eb8720a7b4dc34ab 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()