Added unit tests for REST API client. Fixed pep8.

This commit is contained in:
Timur Nurlygayanov 2013-03-20 16:35:47 +04:00
parent 998b210043
commit 3c641a3828
6 changed files with 210 additions and 35 deletions

View File

@ -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:

View File

@ -22,7 +22,6 @@ import prettytable
from portasclient.openstack.common import importutils
# Decorator for cli-args
def arg(*args, **kwargs):
def _decorator(func):

View File

@ -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()

View File

@ -50,8 +50,8 @@ 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,
active_directory_id=service_id),
return self._delete(path.format(id=environment_id,
active_directory_id=service_id),
headers=headers)

View 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 == []

View File

@ -1,5 +1,7 @@
distribute>=0.6.24
mock
anyjson
mox
nose
nose-exclude