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): def __init__(self, api):
self.api = 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) resp, body = self.api.json_request('GET', url, headers=headers)
if obj_class is None: if obj_class is None:
obj_class = self.resource_class obj_class = self.resource_class
if response_key: if response_key:
if not body.has_key(response_key): if not response_key in body:
body[response_key] = [] body[response_key] = []
data = body[response_key] data = body[response_key]
else: else:
@@ -74,9 +76,12 @@ class Manager(object):
return self.resource_class(self, body[response_key]) return self.resource_class(self, body[response_key])
return self.resource_class(self, body) 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: 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: else:
resp, body = self.api.json_request('POST', url, headers=headers) resp, body = self.api.json_request('POST', url, headers=headers)
if return_raw: if return_raw:

View File

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

View File

@@ -41,8 +41,7 @@ class PortasShell(object):
# Global arguments # Global arguments
parser.add_argument('-h', '--help', parser.add_argument('-h', '--help',
action='store_true', action='store_true',
help=argparse.SUPPRESS, help=argparse.SUPPRESS,)
)
parser.add_argument('-d', '--debug', parser.add_argument('-d', '--debug',
default=bool(utils.env('PORTASCLIENT_DEBUG')), default=bool(utils.env('PORTASCLIENT_DEBUG')),
@@ -60,24 +59,24 @@ class PortasShell(object):
"\"insecure\" SSL (https) requests. " "\"insecure\" SSL (https) requests. "
"The server's certificate will " "The server's certificate will "
"not be verified against any certificate " "not be verified against any certificate "
"authorities. This option should be used with " "authorities. This option should be used "
"caution.") "with caution.")
parser.add_argument('--cert-file', parser.add_argument('--cert-file',
help='Path of certificate file to use in SSL ' help='Path of certificate file to use in SSL '
'connection. This file can optionally be prepended' 'connection. This file can optionally be '
' with the private key.') 'prepended with the private key.')
parser.add_argument('--key-file', parser.add_argument('--key-file',
help='Path of client key to use in SSL connection.' help='Path of client key to use in SSL connection.'
' This option is not necessary if your key is ' ' This option is not necessary if your '
'prepended to your cert file.') 'key is prepended to your cert file.')
parser.add_argument('--ca-file', parser.add_argument('--ca-file',
help='Path of CA SSL certificate(s) used to verify' help='Path of CA SSL certificate(s) used to verify'
' the remote server certificate. Without this ' ' the remote server certificate. Without '
'option glance looks for the default system ' 'this option glance looks for the default '
'CA certificates.') 'system CA certificates.')
parser.add_argument('--timeout', parser.add_argument('--timeout',
default=600, default=600,
@@ -226,24 +225,24 @@ class PortasShell(object):
endpoint = args.portas_url endpoint = args.portas_url
else: else:
if not args.os_username: if not args.os_username:
raise exceptions.CommandError("You must provide a username via " raise exceptions.CommandError("You must provide a username "
"either --os-username or via " "via either --os-username "
"env[OS_USERNAME]") "or via env[OS_USERNAME]")
if not args.os_password: if not args.os_password:
raise exceptions.CommandError("You must provide a password via " raise exceptions.CommandError("You must provide a password "
"either --os-password or via " "via either --os-password "
"env[OS_PASSWORD]") "or via env[OS_PASSWORD]")
if not (args.os_tenant_id or args.os_tenant_name): if not (args.os_tenant_id or args.os_tenant_name):
raise exceptions.CommandError("You must provide a tenant_id via " raise exceptions.CommandError("You must provide a tenant_id "
"either --os-tenant-id or via " "via either --os-tenant-id "
"env[OS_TENANT_ID]") "or via env[OS_TENANT_ID]")
if not args.os_auth_url: if not args.os_auth_url:
raise exceptions.CommandError("You must provide an auth url via " raise exceptions.CommandError("You must provide an auth url "
"either --os-auth-url or via " "via either --os-auth-url or "
"env[OS_AUTH_URL]") "via env[OS_AUTH_URL]")
kwargs = { kwargs = {
'username': args.os_username, 'username': args.os_username,
'password': args.os_password, 'password': args.os_password,
@@ -257,8 +256,8 @@ class PortasShell(object):
_ksclient = self._get_ksclient(**kwargs) _ksclient = self._get_ksclient(**kwargs)
token = args.os_auth_token or _ksclient.auth_token token = args.os_auth_token or _ksclient.auth_token
endpoint = args.portas_url or \ url = args.portas_url
self._get_endpoint(_ksclient, **kwargs) endpoint = url or self._get_endpoint(_ksclient, **kwargs)
kwargs = { kwargs = {
'token': token, 'token': token,
@@ -274,7 +273,8 @@ class PortasShell(object):
try: try:
args.func(client, args) args.func(client, args)
except exceptions.Unauthorized: 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='?', @utils.arg('command', metavar='<subcommand>', nargs='?',
help='Display help for <subcommand>') help='Display help for <subcommand>')
@@ -286,8 +286,8 @@ class PortasShell(object):
if args.command in self.subcommands: if args.command in self.subcommands:
self.subcommands[args.command].print_help() self.subcommands[args.command].print_help()
else: else:
raise exceptions.CommandError("'%s' is not a valid subcommand" % msg = "'%s' is not a valid subcommand"
args.command) raise exceptions.CommandError(msg % args.command)
else: else:
self.parser.print_help() self.parser.print_help()

View File

@@ -50,7 +50,7 @@ class ActiveDirectoryManager(base.Manager):
headers = {'X-Configuration-Session': session_id} headers = {'X-Configuration-Session': session_id}
path = 'environments/{id}/activeDirectories/{active_directory_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), active_directory_id=service_id),
headers=headers) 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 distribute>=0.6.24
mock
anyjson
mox mox
nose nose
nose-exclude nose-exclude