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