From a0cd6086a2de444f6fad3edf89f6de6459b4eb8a Mon Sep 17 00:00:00 2001 From: thuva4 Date: Tue, 13 Mar 2018 23:57:01 +0530 Subject: Add tests for projects in testapiclient Change-Id: Id32dc102f4cc594496cb72949bc6ce1cf6bad86b Signed-off-by: thuva4 --- .../testapi-client/testapiclient/cli/projects.py | 11 +- .../testapiclient/tests/unit/test_projects.py | 230 +++++++++++++++++++++ 2 files changed, 233 insertions(+), 8 deletions(-) create mode 100644 testapi/testapi-client/testapiclient/tests/unit/test_projects.py (limited to 'testapi/testapi-client/testapiclient') diff --git a/testapi/testapi-client/testapiclient/cli/projects.py b/testapi/testapi-client/testapiclient/cli/projects.py index 5fa6894..0d5eb77 100644 --- a/testapi/testapi-client/testapiclient/cli/projects.py +++ b/testapi/testapi-client/testapiclient/cli/projects.py @@ -19,7 +19,6 @@ class ProjectGet(command.Lister): def get_parser(self, prog_name): parser = super(ProjectGet, self).get_parser(prog_name) parser.add_argument('-name', - default='', help='Search projects by name') return parser @@ -38,9 +37,7 @@ class ProjectGetOne(command.ShowOne): def get_parser(self, prog_name): parser = super(ProjectGetOne, self).get_parser(prog_name) - parser.add_argument('-name', - default='', - required=True, + parser.add_argument('name', help='Search project by name') return parser @@ -69,9 +66,8 @@ class ProjectDelete(command.Command): def get_parser(self, prog_name): parser = super(ProjectDelete, self).get_parser(prog_name) - parser.add_argument('-name', + parser.add_argument('name', type=str, - required=True, help='Delete project by name') return parser @@ -84,9 +80,8 @@ class ProjectPut(command.ShowOne): def get_parser(self, prog_name): parser = super(ProjectPut, self).get_parser(prog_name) - parser.add_argument('-name', + parser.add_argument('name', type=str, - required=True, help='Update project by name') parser.add_argument('project', type=json.loads, diff --git a/testapi/testapi-client/testapiclient/tests/unit/test_projects.py b/testapi/testapi-client/testapiclient/tests/unit/test_projects.py new file mode 100644 index 0000000..6e11329 --- /dev/null +++ b/testapi/testapi-client/testapiclient/tests/unit/test_projects.py @@ -0,0 +1,230 @@ +import StringIO +import httplib +import json + +from mock import mock +import requests +from six.moves.urllib import parse +import testtools + +from testapiclient.cli import projects +from testapiclient.tests.unit import utils +from testapiclient.utils import http_client +from testapiclient.utils import user + + +class ProjectTest(utils.TestCommand): + def setUp(self): + super(ProjectTest, self).setUp() + user.User.session = requests.session() + self.base_url = parse.urljoin(self.api_url, 'projects') + self.project_json = { + 'name': 'test_project', + 'description': '' + } + self.project_string = json.dumps(self.project_json) + + +class ProjectGetTest(ProjectTest): + + def setUp(self): + super(ProjectGetTest, self).setUp() + self.get_mock = mock.patch('requests.get').start() + self.get_mock.return_value.status_code = httplib.OK + + def test_get(self): + project_get = projects.ProjectGet(mock.Mock(), mock.Mock()) + args = ['-name', 'dfs'] + verifies = [('name', 'dfs')] + parsed_args = self.check_parser(project_get, args, verifies) + project_get.take_action(parsed_args) + self.get_mock.assert_called_once_with( + self.base_url + '?name=dfs') + + def test_get_all(self): + project_get = projects.ProjectGet(mock.Mock(), mock.Mock()) + args = [] + verifies = [] + parsed_args = self.check_parser(project_get, args, verifies) + project_get.take_action(parsed_args) + self.get_mock.assert_called_once_with( + self.base_url) + + def test_get_one(self): + project_get_one = projects.ProjectGetOne(mock.Mock(), mock.Mock()) + args = ['def'] + verifies = [('name', 'def')] + parsed_args = self.check_parser(project_get_one, args, verifies) + project_get_one.take_action(parsed_args) + self.get_mock.assert_called_once_with( + self.base_url + '/def') + + +class ProjectCreateTest(ProjectTest): + + def setUp(self): + super(ProjectCreateTest, self).setUp() + self.post_mock = mock.patch( + 'testapiclient.utils.user.User.session.post').start() + self.post_mock.return_value.status_code = httplib.OK + + def test_create_success(self): + project_create = projects.ProjectCreate(mock.Mock(), mock.Mock()) + args = [self.project_string] + verifies = [('project', self.project_json)] + parsed_args = self.check_parser(project_create, args, verifies) + project_create.take_action(parsed_args) + self.post_mock.assert_called_once() + + def test_create_failure(self): + with testtools.ExpectedException(Exception, 'Create failed: Error'): + project_create = projects.ProjectCreate(mock.Mock(), mock.Mock()) + self.post_mock.return_value.status_code = httplib.BAD_REQUEST + self.post_mock.return_value.reason = "Error" + args = [self.project_string] + verifies = [('project', self.project_json)] + parsed_args = self.check_parser(project_create, args, verifies) + project_create.take_action(parsed_args) + + def test_create_unauthorized(self): + self.mock_unautherized() + with mock.patch('sys.stdout', new=StringIO.StringIO()) as mock_stdout: + with mock.patch('requests.Session') as mock_sessions: + mock_sessions().post.return_value.text = "login" + project_create = projects.ProjectCreate( + mock.Mock(), mock.Mock()) + args = ['-u', 'user', '-p', 'password', self.project_string] + verifies = [ + ('u', 'user'), + ('p', 'password'), + ('project', self.project_json)] + parsed_args = self.check_parser(project_create, args, verifies) + project_create.take_action(parsed_args) + self.assertEqual(mock_stdout.getvalue(), + "Authentication has failed.\n") + + def test_create_authorized(self): + project_create = projects.ProjectCreate(mock.Mock(), mock.Mock()) + args = ['-u', 'user', '-p', 'password', self.project_string] + verifies = [ + ('u', 'user'), + ('p', 'password'), + ('project', self.project_json) + ] + parsed_args = self.check_parser(project_create, args, verifies) + project_create.take_action(parsed_args) + self.post_mock.assert_called_once() + + +class ProjectDeleteTest(ProjectTest): + + def setUp(self): + super(ProjectDeleteTest, self).setUp() + self.delete_mock = mock.patch( + 'testapiclient.utils.user.User.session.delete').start() + self.delete_mock.return_value.status_code = httplib.OK + + def test_delete_success(self): + project_delete = projects.ProjectDelete(mock.Mock(), mock.Mock()) + args = ['def'] + verifies = [('name', 'def')] + parsed_args = self.check_parser(project_delete, args, verifies) + project_delete.take_action(parsed_args) + self.delete_mock.assert_called_once_with( + self.base_url + '/def', + data='null', + headers=http_client.HTTPClient.headers) + + def test_delete_failure(self): + with testtools.ExpectedException(Exception, 'Delete failed: Error'): + project_delete = projects.ProjectDelete(mock.Mock(), mock.Mock()) + self.delete_mock.return_value.status_code = httplib.FORBIDDEN + self.delete_mock.return_value.reason = "Error" + args = ['def'] + verifies = [('name', 'def')] + parsed_args = self.check_parser(project_delete, args, verifies) + project_delete.take_action(parsed_args) + + def test_delete_authorized(self): + project_delete = projects.ProjectDelete(mock.Mock(), mock.Mock()) + args = ['-u', 'user', '-p', 'password', 'def'] + verifies = [('u', 'user'), ('p', 'password'), ('name', 'def')] + + parsed_args = self.check_parser(project_delete, args, verifies) + project_delete.take_action(parsed_args) + self.delete_mock.assert_called_once_with( + self.base_url + '/def', + data='null', + headers=http_client.HTTPClient.headers) + + def test_delete_unauthorized(self): + self.mock_unautherized() + with mock.patch('sys.stdout', new=StringIO.StringIO()) as mock_stdout: + with mock.patch('requests.Session') as mock_sessions: + mock_sessions().post.return_value.text = "login" + project_delete = projects.ProjectDelete( + mock.Mock(), mock.Mock()) + args = ['-u', 'user', '-p', 'password', 'def'] + verifies = [('u', 'user'), ('p', 'password'), ('name', 'def')] + parsed_args = self.check_parser(project_delete, args, verifies) + project_delete.take_action(parsed_args) + self.assertEqual(mock_stdout.getvalue(), + "Authentication has failed.\n") + + +class ProjectPutTest(ProjectTest): + + def setUp(self): + super(ProjectPutTest, self).setUp() + self.put_mock = mock.patch( + 'testapiclient.utils.user.User.session.put').start() + self.put_mock.return_value.status_code = httplib.OK + + def test_put_success(self): + project_put = projects.ProjectPut(mock.Mock(), mock.Mock()) + args = ['def', self.project_string] + verifies = [('name', 'def'), ('project', self.project_json)] + parsed_args = self.check_parser(project_put, args, verifies) + project_put.take_action(parsed_args) + self.put_mock.assert_called_once() + + def test_put_failure(self): + with testtools.ExpectedException(Exception, 'Update failed: Error'): + project_put = projects.ProjectPut(mock.Mock(), mock.Mock()) + self.put_mock.return_value.status_code = httplib.BAD_REQUEST + self.put_mock.return_value.reason = "Error" + args = ['def', self.project_string] + verifies = [('name', 'def'), ('project', self.project_json)] + parsed_args = self.check_parser(project_put, args, verifies) + project_put.take_action(parsed_args) + + def test_put_unauthorized(self): + self.mock_unautherized() + with mock.patch('sys.stdout', new=StringIO.StringIO()) as mock_stdout: + with mock.patch('requests.Session') as mock_sessions: + mock_sessions().post.return_value.text = "login" + project_put = projects.ProjectPut(mock.Mock(), mock.Mock()) + args = ['-u', 'user', '-p', 'password', 'def', + self.project_string] + verifies = [ + ('u', 'user'), + ('p', 'password'), + ('name', 'def'), + ('project', self.project_json)] + parsed_args = self.check_parser(project_put, args, verifies) + project_put.take_action(parsed_args) + self.assertEqual(mock_stdout.getvalue(), + "Authentication has failed.\n") + + def test_create_authorized(self): + project_put = projects.ProjectPut(mock.Mock(), mock.Mock()) + args = ['-u', 'user', '-p', 'password', 'def', self.project_string] + verifies = [ + ('u', 'user'), + ('p', 'password'), + ('name', 'def'), + ('project', self.project_json) + ] + parsed_args = self.check_parser(project_put, args, verifies) + project_put.take_action(parsed_args) + self.put_mock.assert_called_once() -- cgit 1.2.3-korg