Add tests for pods testapiclient 55/53455/8
authorthuva4 <tharma.thuva@gmail.com>
Sat, 10 Mar 2018 18:51:36 +0000 (00:21 +0530)
committerSerenaFeng <feng.xiaowei@zte.com.cn>
Tue, 13 Mar 2018 10:26:18 +0000 (18:26 +0800)
Add tests to check the functionality of the
pods in testapiclient

Change-Id: Iae6b0b96d31b72ba701684300e10c69d8c5306b4
Signed-off-by: thuva4 <tharma.thuva@gmail.com>
testapi/testapi-client/test-requirements.txt
testapi/testapi-client/testapiclient/tests/unit/test_pods.py [new file with mode: 0644]
testapi/testapi-client/testapiclient/tests/unit/utils.py [new file with mode: 0644]

index 4c62871..69ec0b1 100644 (file)
@@ -1,2 +1,5 @@
 stestr>=1.0.0 # Apache-2.0
-testtools>=2.2.0 # MIT
\ No newline at end of file
+testtools>=2.2.0 # MIT
+mock
+requests
+six>=1.10.0 # MIT
\ No newline at end of file
diff --git a/testapi/testapi-client/testapiclient/tests/unit/test_pods.py b/testapi/testapi-client/testapiclient/tests/unit/test_pods.py
new file mode 100644 (file)
index 0000000..f531f9f
--- /dev/null
@@ -0,0 +1,172 @@
+import StringIO
+import httplib
+import json
+
+from mock import mock
+import requests
+from six.moves.urllib import parse
+import testtools
+
+from testapiclient.cli import pods
+from testapiclient.tests.unit import utils
+from testapiclient.utils import http_client
+from testapiclient.utils import user
+
+
+class PodTest(utils.TestCommand):
+    def setUp(self):
+        super(PodTest, self).setUp()
+        user.User.session = requests.session()
+        self.base_url = parse.urljoin(self.api_url, 'pods')
+        self.pod_json = {
+            'role': 'community-ci',
+            'name': 'test_pod',
+            'details': '',
+            'mode': 'metal'
+        }
+        self.pod_string = json.dumps(self.pod_json)
+
+
+class PodGetTest(PodTest):
+
+    def setUp(self):
+        super(PodGetTest, self).setUp()
+        self.get_mock = mock.patch('requests.get').start()
+        self.get_mock.return_value.status_code = httplib.OK
+
+    def test_get(self):
+        pod_get = pods.PodGet(mock.Mock(), mock.Mock())
+        args = ['-name', 'dfs']
+        verifies = [('name', 'dfs')]
+        parsed_args = self.check_parser(pod_get, args, verifies)
+        pod_get.take_action(parsed_args)
+        self.get_mock.assert_called_once_with(
+            self.base_url + '?name=dfs')
+
+    def test_get_all(self):
+        pod_get = pods.PodGet(mock.Mock(), mock.Mock())
+        args = []
+        verifies = []
+        parsed_args = self.check_parser(pod_get, args, verifies)
+        pod_get.take_action(parsed_args)
+        self.get_mock.assert_called_once_with(
+            self.base_url)
+
+    def test_get_one(self):
+        pod_get_one = pods.PodGetOne(mock.Mock(), mock.Mock())
+        args = ['def']
+        verifies = [('name', 'def')]
+        parsed_args = self.check_parser(pod_get_one, args, verifies)
+        pod_get_one.take_action(parsed_args)
+        self.get_mock.assert_called_once_with(
+            self.base_url + '/def')
+
+
+class PodCreateTest(PodTest):
+
+    def setUp(self):
+        super(PodCreateTest, 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):
+        pod_create = pods.PodCreate(mock.Mock(), mock.Mock())
+        args = [self.pod_string]
+        verifies = [('pod', self.pod_json)]
+        parsed_args = self.check_parser(pod_create, args, verifies)
+        pod_create.take_action(parsed_args)
+        self.post_mock.assert_called_once()
+
+    def test_create_failure(self):
+        with testtools.ExpectedException(Exception, 'Create failed: Error'):
+            pod_create = pods.PodCreate(mock.Mock(), mock.Mock())
+            self.post_mock.return_value.status_code = httplib.BAD_REQUEST
+            self.post_mock.return_value.reason = "Error"
+            args = [self.pod_string]
+            verifies = [('pod', self.pod_json)]
+            parsed_args = self.check_parser(pod_create, args, verifies)
+            pod_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"
+                pod_create = pods.PodCreate(mock.Mock(), mock.Mock())
+                args = ['-u', 'user', '-p', 'password', self.pod_string]
+                verifies = [
+                    ('u', 'user'),
+                    ('p', 'password'),
+                    ('pod', self.pod_json)]
+                parsed_args = self.check_parser(pod_create, args, verifies)
+                pod_create.take_action(parsed_args)
+                self.assertEqual(mock_stdout.getvalue(),
+                                 "Authentication has failed.\n")
+
+    def test_create_authorized(self):
+        pod_create = pods.PodCreate(mock.Mock(), mock.Mock())
+        args = ['-u', 'user', '-p', 'password', self.pod_string]
+        verifies = [
+            ('u', 'user'),
+            ('p', 'password'),
+            ('pod', self.pod_json)
+        ]
+        parsed_args = self.check_parser(pod_create, args, verifies)
+        pod_create.take_action(parsed_args)
+        self.post_mock.assert_called_once()
+
+
+class PodDeleteTest(PodTest):
+
+    def setUp(self):
+        super(PodDeleteTest, 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):
+        pod_delete = pods.PodDelete(mock.Mock(), mock.Mock())
+        args = ['def']
+        verifies = [('name', 'def')]
+        parsed_args = self.check_parser(pod_delete, args, verifies)
+        pod_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'):
+            pod_delete = pods.PodDelete(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(pod_delete, args, verifies)
+            pod_delete.take_action(parsed_args)
+
+    def test_delete_authorized(self):
+        pod_delete = pods.PodDelete(mock.Mock(), mock.Mock())
+        args = ['-u', 'user', '-p', 'password', 'def']
+        verifies = [('u', 'user'), ('p', 'password'), ('name', 'def')]
+
+        parsed_args = self.check_parser(pod_delete, args, verifies)
+        pod_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_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"
+                pod_delete = pods.PodDelete(mock.Mock(), mock.Mock())
+                args = ['-u', 'user', '-p', 'password', 'def']
+                verifies = [('u', 'user'), ('p', 'password'), ('name', 'def')]
+                parsed_args = self.check_parser(pod_delete, args, verifies)
+                pod_delete.take_action(parsed_args)
+                self.assertEqual(mock_stdout.getvalue(),
+                                 "Authentication has failed.\n")
diff --git a/testapi/testapi-client/testapiclient/tests/unit/utils.py b/testapi/testapi-client/testapiclient/tests/unit/utils.py
new file mode 100644 (file)
index 0000000..596b7e4
--- /dev/null
@@ -0,0 +1,42 @@
+import testtools
+from mock import mock
+
+from testapiclient.utils.user import User
+
+
+class ParserException(Exception):
+    pass
+
+
+class TestCommand(testtools.TestCase):
+    api_url = 'http://localhost:8000/api/v1/'
+
+    def setUp(self):
+        super(TestCommand, self).setUp()
+        env_variables = {
+            'testapi_url': 'http://localhost:8000/api/v1',
+            'testapi_cas_auth_url':
+            (
+                'https://identity.linuxfoundation.org/user' +
+                '/login?destination=cas/login%3Fservice%3D'
+            ),
+            'testapi_cas_signin_return': '/auth/signin_return'
+        }
+        self.config_mock = mock.patch.dict(
+            'os.environ', env_variables).start()
+
+    def check_parser(self, cmd, args, verify_args):
+        cmd_parser = cmd.get_parser('check_parser')
+        try:
+            parsed_args = cmd_parser.parse_args(args)
+        except SystemExit:
+            raise ParserException("Argument parse failed")
+        for av in verify_args:
+            attr, value = av
+            if attr:
+                self.assertIn(attr, parsed_args)
+                self.assertEqual(value, getattr(parsed_args, attr))
+        return parsed_args
+
+    def mock_unautherized(self):
+        User.session = None