Added unit tests for REST API client. Fixed pep8.
This commit is contained in:
		@@ -49,14 +49,16 @@ class Manager(object):
 | 
			
		||||
    def __init__(self, api):
 | 
			
		||||
        self.api = api
 | 
			
		||||
 | 
			
		||||
    def _list(self, url, response_key=None, obj_class=None, body=None, headers={}):
 | 
			
		||||
    def _list(self, url, response_key=None, obj_class=None,
 | 
			
		||||
              body=None, headers={}):
 | 
			
		||||
 | 
			
		||||
        resp, body = self.api.json_request('GET', url, headers=headers)
 | 
			
		||||
 | 
			
		||||
        if obj_class is None:
 | 
			
		||||
            obj_class = self.resource_class
 | 
			
		||||
 | 
			
		||||
        if response_key:
 | 
			
		||||
            if not body.has_key(response_key):
 | 
			
		||||
            if not response_key in body:
 | 
			
		||||
                body[response_key] = []
 | 
			
		||||
            data = body[response_key]
 | 
			
		||||
        else:
 | 
			
		||||
@@ -74,9 +76,12 @@ class Manager(object):
 | 
			
		||||
                return self.resource_class(self, body[response_key])
 | 
			
		||||
            return self.resource_class(self, body)
 | 
			
		||||
 | 
			
		||||
    def _create(self, url, body=None, response_key=None, return_raw=False, headers={}):
 | 
			
		||||
    def _create(self, url, body=None, response_key=None,
 | 
			
		||||
                return_raw=False, headers={}):
 | 
			
		||||
 | 
			
		||||
        if body:
 | 
			
		||||
            resp, body = self.api.json_request('POST', url, body=body, headers=headers)
 | 
			
		||||
            resp, body = self.api.json_request('POST', url,
 | 
			
		||||
                                               body=body, headers=headers)
 | 
			
		||||
        else:
 | 
			
		||||
            resp, body = self.api.json_request('POST', url, headers=headers)
 | 
			
		||||
        if return_raw:
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,6 @@ import prettytable
 | 
			
		||||
from portasclient.openstack.common import importutils
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Decorator for cli-args
 | 
			
		||||
def arg(*args, **kwargs):
 | 
			
		||||
    def _decorator(func):
 | 
			
		||||
 
 | 
			
		||||
@@ -41,8 +41,7 @@ class PortasShell(object):
 | 
			
		||||
        # Global arguments
 | 
			
		||||
        parser.add_argument('-h', '--help',
 | 
			
		||||
                            action='store_true',
 | 
			
		||||
                            help=argparse.SUPPRESS,
 | 
			
		||||
        )
 | 
			
		||||
                            help=argparse.SUPPRESS,)
 | 
			
		||||
 | 
			
		||||
        parser.add_argument('-d', '--debug',
 | 
			
		||||
                            default=bool(utils.env('PORTASCLIENT_DEBUG')),
 | 
			
		||||
@@ -60,24 +59,24 @@ class PortasShell(object):
 | 
			
		||||
                                 "\"insecure\" SSL (https) requests. "
 | 
			
		||||
                                 "The server's certificate will "
 | 
			
		||||
                                 "not be verified against any certificate "
 | 
			
		||||
                                 "authorities. This option should be used with "
 | 
			
		||||
                                 "caution.")
 | 
			
		||||
                                 "authorities. This option should be used "
 | 
			
		||||
                                 "with caution.")
 | 
			
		||||
 | 
			
		||||
        parser.add_argument('--cert-file',
 | 
			
		||||
                            help='Path of certificate file to use in SSL '
 | 
			
		||||
                                 'connection. This file can optionally be prepended'
 | 
			
		||||
                                 ' with the private key.')
 | 
			
		||||
                                 'connection. This file can optionally be '
 | 
			
		||||
                                 'prepended with the private key.')
 | 
			
		||||
 | 
			
		||||
        parser.add_argument('--key-file',
 | 
			
		||||
                            help='Path of client key to use in SSL connection.'
 | 
			
		||||
                                 ' This option is not necessary if your key is '
 | 
			
		||||
                                 'prepended to your cert file.')
 | 
			
		||||
                                 ' This option is not necessary if your '
 | 
			
		||||
                                 'key is prepended to your cert file.')
 | 
			
		||||
 | 
			
		||||
        parser.add_argument('--ca-file',
 | 
			
		||||
                            help='Path of CA SSL certificate(s) used to verify'
 | 
			
		||||
                                 ' the remote server certificate. Without this '
 | 
			
		||||
                                 'option glance looks for the default system '
 | 
			
		||||
                                 'CA certificates.')
 | 
			
		||||
                                 ' the remote server certificate. Without '
 | 
			
		||||
                                 'this option glance looks for the default '
 | 
			
		||||
                                 'system CA certificates.')
 | 
			
		||||
 | 
			
		||||
        parser.add_argument('--timeout',
 | 
			
		||||
                            default=600,
 | 
			
		||||
@@ -226,24 +225,24 @@ class PortasShell(object):
 | 
			
		||||
            endpoint = args.portas_url
 | 
			
		||||
        else:
 | 
			
		||||
            if not args.os_username:
 | 
			
		||||
                raise exceptions.CommandError("You must provide a username via "
 | 
			
		||||
                                              "either --os-username or via "
 | 
			
		||||
                                              "env[OS_USERNAME]")
 | 
			
		||||
                raise exceptions.CommandError("You must provide a username "
 | 
			
		||||
                                              "via either --os-username "
 | 
			
		||||
                                              "or via env[OS_USERNAME]")
 | 
			
		||||
 | 
			
		||||
            if not args.os_password:
 | 
			
		||||
                raise exceptions.CommandError("You must provide a password via "
 | 
			
		||||
                                              "either --os-password or via "
 | 
			
		||||
                                              "env[OS_PASSWORD]")
 | 
			
		||||
                raise exceptions.CommandError("You must provide a password "
 | 
			
		||||
                                              "via either --os-password "
 | 
			
		||||
                                              "or via env[OS_PASSWORD]")
 | 
			
		||||
 | 
			
		||||
            if not (args.os_tenant_id or args.os_tenant_name):
 | 
			
		||||
                raise exceptions.CommandError("You must provide a tenant_id via "
 | 
			
		||||
                                              "either --os-tenant-id or via "
 | 
			
		||||
                                              "env[OS_TENANT_ID]")
 | 
			
		||||
                raise exceptions.CommandError("You must provide a tenant_id "
 | 
			
		||||
                                              "via either --os-tenant-id "
 | 
			
		||||
                                              "or via env[OS_TENANT_ID]")
 | 
			
		||||
 | 
			
		||||
            if not args.os_auth_url:
 | 
			
		||||
                raise exceptions.CommandError("You must provide an auth url via "
 | 
			
		||||
                                              "either --os-auth-url or via "
 | 
			
		||||
                                              "env[OS_AUTH_URL]")
 | 
			
		||||
                raise exceptions.CommandError("You must provide an auth url "
 | 
			
		||||
                                              "via either --os-auth-url or "
 | 
			
		||||
                                              "via env[OS_AUTH_URL]")
 | 
			
		||||
            kwargs = {
 | 
			
		||||
                'username': args.os_username,
 | 
			
		||||
                'password': args.os_password,
 | 
			
		||||
@@ -257,8 +256,8 @@ class PortasShell(object):
 | 
			
		||||
            _ksclient = self._get_ksclient(**kwargs)
 | 
			
		||||
            token = args.os_auth_token or _ksclient.auth_token
 | 
			
		||||
 | 
			
		||||
            endpoint = args.portas_url or \
 | 
			
		||||
                       self._get_endpoint(_ksclient, **kwargs)
 | 
			
		||||
            url = args.portas_url
 | 
			
		||||
            endpoint = url or self._get_endpoint(_ksclient, **kwargs)
 | 
			
		||||
 | 
			
		||||
        kwargs = {
 | 
			
		||||
            'token': token,
 | 
			
		||||
@@ -274,7 +273,8 @@ class PortasShell(object):
 | 
			
		||||
        try:
 | 
			
		||||
            args.func(client, args)
 | 
			
		||||
        except exceptions.Unauthorized:
 | 
			
		||||
            raise exceptions.CommandError("Invalid OpenStack Identity credentials.")
 | 
			
		||||
            msg = "Invalid OpenStack Identity credentials."
 | 
			
		||||
            raise exceptions.CommandError(msg)
 | 
			
		||||
 | 
			
		||||
    @utils.arg('command', metavar='<subcommand>', nargs='?',
 | 
			
		||||
               help='Display help for <subcommand>')
 | 
			
		||||
@@ -286,8 +286,8 @@ class PortasShell(object):
 | 
			
		||||
            if args.command in self.subcommands:
 | 
			
		||||
                self.subcommands[args.command].print_help()
 | 
			
		||||
            else:
 | 
			
		||||
                raise exceptions.CommandError("'%s' is not a valid subcommand" %
 | 
			
		||||
                                              args.command)
 | 
			
		||||
                msg = "'%s' is not a valid subcommand"
 | 
			
		||||
                raise exceptions.CommandError(msg % args.command)
 | 
			
		||||
        else:
 | 
			
		||||
            self.parser.print_help()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@ class ActiveDirectoryManager(base.Manager):
 | 
			
		||||
        headers = {'X-Configuration-Session': session_id}
 | 
			
		||||
        path = 'environments/{id}/activeDirectories/{active_directory_id}'
 | 
			
		||||
 | 
			
		||||
        return self._delete(patch.format(id=environment_id,
 | 
			
		||||
        return self._delete(path.format(id=environment_id,
 | 
			
		||||
                                        active_directory_id=service_id),
 | 
			
		||||
                            headers=headers)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										169
									
								
								python-portasclient/tests/test_sanity.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								python-portasclient/tests/test_sanity.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,169 @@
 | 
			
		||||
import unittest
 | 
			
		||||
import logging
 | 
			
		||||
from mock import MagicMock
 | 
			
		||||
 | 
			
		||||
from portasclient.v1 import Client
 | 
			
		||||
import portasclient.v1.environments as environments
 | 
			
		||||
import portasclient.v1.services as services
 | 
			
		||||
import portasclient.v1.sessions as sessions
 | 
			
		||||
 | 
			
		||||
LOG = logging.getLogger('Unit tests')
 | 
			
		||||
 | 
			
		||||
def my_mock(*a, **b):
 | 
			
		||||
    return [a, b]
 | 
			
		||||
 | 
			
		||||
api = MagicMock(json_request=my_mock)
 | 
			
		||||
 | 
			
		||||
class SanityUnitTests(unittest.TestCase):
 | 
			
		||||
    
 | 
			
		||||
    def test_create_client_instance(self):
 | 
			
		||||
 | 
			
		||||
        endpoint =  'http://localhost:8001'
 | 
			
		||||
        test_client = Client(endpoint=endpoint, token='1', timeout=10)
 | 
			
		||||
 | 
			
		||||
        assert test_client.environments is not None
 | 
			
		||||
        assert test_client.sessions is not None
 | 
			
		||||
        assert test_client.activeDirectories is not None
 | 
			
		||||
        assert test_client.webServers is not None
 | 
			
		||||
 | 
			
		||||
    def test_env_manager_list(self):
 | 
			
		||||
 | 
			
		||||
        manager = environments.EnvironmentManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.list()
 | 
			
		||||
 | 
			
		||||
        assert result == []
 | 
			
		||||
 | 
			
		||||
    def test_env_manager_create(self):
 | 
			
		||||
 | 
			
		||||
        manager = environments.EnvironmentManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.create('test')
 | 
			
		||||
 | 
			
		||||
        assert result.headers == {}
 | 
			
		||||
        assert result.body == {'name': 'test'}
 | 
			
		||||
 | 
			
		||||
    def test_env_manager_delete(self):
 | 
			
		||||
 | 
			
		||||
        manager = environments.EnvironmentManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.delete('test')
 | 
			
		||||
 | 
			
		||||
        assert result is None
 | 
			
		||||
 | 
			
		||||
    def test_env_manager_update(self):
 | 
			
		||||
 | 
			
		||||
        manager = environments.EnvironmentManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.update('1', 'test')
 | 
			
		||||
 | 
			
		||||
        assert result.body == {'name': 'test'}
 | 
			
		||||
 | 
			
		||||
    def test_env_manager_get(self):
 | 
			
		||||
 | 
			
		||||
        manager = environments.EnvironmentManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.get('test')
 | 
			
		||||
        ## WTF?
 | 
			
		||||
        assert result.manager is not None
 | 
			
		||||
 | 
			
		||||
    def test_ad_manager_list(self):
 | 
			
		||||
 | 
			
		||||
        manager = services.ActiveDirectoryManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.list('datacenter1')
 | 
			
		||||
 | 
			
		||||
        assert result == []
 | 
			
		||||
 | 
			
		||||
    def test_ad_manager_create(self):
 | 
			
		||||
 | 
			
		||||
        manager = services.ActiveDirectoryManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.create('datacenter1', 'session1', 'test')
 | 
			
		||||
 | 
			
		||||
        assert result.headers == {'X-Configuration-Session': 'session1'}
 | 
			
		||||
        assert result.body == 'test'
 | 
			
		||||
 | 
			
		||||
    #@unittest.skip("https://mirantis.jira.com/browse/KEERO-218")
 | 
			
		||||
    def test_ad_manager_delete(self):
 | 
			
		||||
 | 
			
		||||
        manager = services.ActiveDirectoryManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.delete('datacenter1', 'session1', 'test')
 | 
			
		||||
 | 
			
		||||
        assert result is None
 | 
			
		||||
        
 | 
			
		||||
    def test_iis_manager_list(self):
 | 
			
		||||
 | 
			
		||||
        manager = services.WebServerManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.list('datacenter1')
 | 
			
		||||
 | 
			
		||||
        assert result == []
 | 
			
		||||
 | 
			
		||||
    def test_iis_manager_create(self):
 | 
			
		||||
 | 
			
		||||
        manager = services.WebServerManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.create('datacenter1', 'session1', 'test')
 | 
			
		||||
 | 
			
		||||
        assert result.headers == {'X-Configuration-Session': 'session1'}
 | 
			
		||||
        assert result.body == 'test'
 | 
			
		||||
 | 
			
		||||
    #@unittest.skip("https://mirantis.jira.com/browse/KEERO-218")
 | 
			
		||||
    def test_iis_manager_delete(self):
 | 
			
		||||
 | 
			
		||||
        manager = services.WebServerManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.delete('datacenter1', 'session1', 'test')
 | 
			
		||||
 | 
			
		||||
        assert result is None
 | 
			
		||||
        
 | 
			
		||||
    def test_session_manager_list(self):
 | 
			
		||||
 | 
			
		||||
        manager = sessions.SessionManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.list('datacenter1')
 | 
			
		||||
 | 
			
		||||
        assert result == []
 | 
			
		||||
 | 
			
		||||
    def test_session_manager_delete(self):
 | 
			
		||||
 | 
			
		||||
        manager = sessions.SessionManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.delete('datacenter1', 'session1')
 | 
			
		||||
 | 
			
		||||
        assert result is None
 | 
			
		||||
        
 | 
			
		||||
    def test_session_manager_get(self):
 | 
			
		||||
 | 
			
		||||
        manager = sessions.SessionManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.get('datacenter1', 'session1')
 | 
			
		||||
        # WTF?
 | 
			
		||||
        assert result.manager is not None
 | 
			
		||||
        
 | 
			
		||||
    def test_session_manager_configure(self):
 | 
			
		||||
 | 
			
		||||
        manager = sessions.SessionManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.configure('datacenter1')
 | 
			
		||||
 | 
			
		||||
        assert result.headers == {}
 | 
			
		||||
        
 | 
			
		||||
    def test_session_manager_deploy(self):
 | 
			
		||||
 | 
			
		||||
        manager = sessions.SessionManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.deploy('datacenter1', '1')
 | 
			
		||||
 | 
			
		||||
        assert result is None
 | 
			
		||||
    
 | 
			
		||||
    @unittest.skip("https://mirantis.jira.com/browse/KEERO-219")
 | 
			
		||||
    def test_session_manager_reports(self):
 | 
			
		||||
 | 
			
		||||
        manager = sessions.SessionManager(api)
 | 
			
		||||
 | 
			
		||||
        result = manager.reports('datacenter1', '1')
 | 
			
		||||
 | 
			
		||||
        assert result == []
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
distribute>=0.6.24
 | 
			
		||||
 | 
			
		||||
mock
 | 
			
		||||
anyjson
 | 
			
		||||
mox
 | 
			
		||||
nose
 | 
			
		||||
nose-exclude
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user