227 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
from cStringIO import StringIO
 | 
						|
import mock
 | 
						|
import requests
 | 
						|
import sys
 | 
						|
from unittest import TestCase
 | 
						|
 | 
						|
from orm.orm_client.ormcli import imscli
 | 
						|
from orm.orm_client.ormcli.imscli import cmd_data
 | 
						|
from orm.orm_client.ormcli import ormcli
 | 
						|
 | 
						|
 | 
						|
class ImsTests(TestCase):
 | 
						|
    def setUp(self):
 | 
						|
        out, sys.stdout, err, sys.stderr = sys.stdout, StringIO(), \
 | 
						|
            sys.stderr, StringIO()
 | 
						|
        self.mock_response = mock.Mock()
 | 
						|
 | 
						|
    def respond(self, value, code, headers={}):
 | 
						|
        self.mock_response.json.return_value = value
 | 
						|
        self.mock_response.status_code = code
 | 
						|
        self.mock_response.headers = headers
 | 
						|
        return self.mock_response
 | 
						|
 | 
						|
    def test_error_with_empty_args(self):
 | 
						|
        with self.assertRaises(SystemExit) as cm:
 | 
						|
            args = ormcli.main([])
 | 
						|
        self.assertEqual(cm.exception.code, 2)
 | 
						|
        sys.stderr.seek(0)
 | 
						|
        output = sys.stderr.read()
 | 
						|
        self.assertIn('too few arguments', output)
 | 
						|
 | 
						|
    def test_help_command(self):
 | 
						|
        with self.assertRaises(SystemExit) as cm:
 | 
						|
            args = ormcli.main('orm --help'.split())
 | 
						|
        self.assertEqual(cm.exception.code, 0)
 | 
						|
        sys.stdout.seek(0)
 | 
						|
        output = sys.stdout.read()
 | 
						|
        self.assertIn('usage:', output)
 | 
						|
        self.assertIn('optional arguments:', output)
 | 
						|
        self.assertIn('<service>', output)
 | 
						|
        self.assertIn('ims', output)
 | 
						|
        self.assertIn('Image Management', output)
 | 
						|
 | 
						|
    def test_ims_help_command(self):
 | 
						|
        with self.assertRaises(SystemExit) as cm:
 | 
						|
            args = ormcli.main('orm ims --help'.split())
 | 
						|
        self.assertEqual(cm.exception.code, 0)
 | 
						|
        sys.stdout.seek(0)
 | 
						|
        output = sys.stdout.read()
 | 
						|
        self.assertIn('usage:', output)
 | 
						|
        self.assertIn('timeout', output)
 | 
						|
        self.assertIn('optional arguments:', output)
 | 
						|
        self.assertIn('orm ims', output)
 | 
						|
 | 
						|
    def test_cmd_details(self):
 | 
						|
        # Set up the args parameter
 | 
						|
        args = mock.MagicMock()
 | 
						|
        args.imageid = 'test_imageid'
 | 
						|
        args.region = 'test_region'
 | 
						|
        args.visibility = 'test_visibility'
 | 
						|
        args.customer = 'test_customer'
 | 
						|
        args.force_delete is False
 | 
						|
        list_images_url = '/?visibility=%s®ion=%s&customer=%s'
 | 
						|
        subcmd_to_result = {
 | 
						|
            'create_image': (requests.post, '',),
 | 
						|
            'update_image': (requests.put, '/%s' % args.imageid,),
 | 
						|
            'delete_image': (requests.delete, '/%s' % args.imageid,),
 | 
						|
            'enabled': (requests.put, '/%s/enabled' % args.imageid,),
 | 
						|
            # 'disable': (requests.put, '/%s/enabled' % args.imageid,),
 | 
						|
            'add_regions': (requests.post, '/%s/regions' % args.imageid,),
 | 
						|
            'update_regions': (requests.put, '/%s/regions' % args.imageid,),
 | 
						|
            'delete_region': (requests.delete, '/%s/regions/%s/%s'
 | 
						|
                              % (args.imageid, args.regionid,
 | 
						|
                                 args.force_delete),),
 | 
						|
            'add_customers': (requests.post, '/%s/customers'
 | 
						|
                              % args.imageid,),
 | 
						|
            'update_customers': (requests.put, '/%s/customers'
 | 
						|
                                 % args.imageid,),
 | 
						|
            'delete_customer': (requests.delete, '/%s/customers/%s' % (
 | 
						|
                                args.imageid, args.customerid),),
 | 
						|
            'get_image': (requests.get, '/%s' % args.imageid,),
 | 
						|
            'list_images': (requests.get, list_images_url
 | 
						|
                            % (args.visibility, args.region,
 | 
						|
                               args.customer))
 | 
						|
        }
 | 
						|
 | 
						|
        # Assert that each subcommand returns the expected details
 | 
						|
        for subcmd in subcmd_to_result:
 | 
						|
            args.subcmd = subcmd
 | 
						|
            self.assertEqual(subcmd_to_result[subcmd],
 | 
						|
                             imscli.cmd_details(args))
 | 
						|
 | 
						|
    @mock.patch.object(imscli.cli_common, 'get_keystone_ep',
 | 
						|
                       return_value=None)
 | 
						|
    def test_get_token_keystone_ep_not_found(self, mock_get_keystone_ep):
 | 
						|
        args = mock.MagicMock()
 | 
						|
        args.username = 'test'
 | 
						|
        self.assertRaises(imscli.ConnectionError, imscli.get_token,
 | 
						|
                          'a', args, 'c')
 | 
						|
 | 
						|
    @mock.patch.object(imscli.cli_common, 'get_keystone_ep')
 | 
						|
    @mock.patch.object(imscli.requests, 'post')
 | 
						|
    def test_get_token_errors(self, mock_post, mock_get_keystone_ep):
 | 
						|
        # Bad status code
 | 
						|
        my_response = mock.MagicMock()
 | 
						|
        my_response.status_code = 200
 | 
						|
        mock_post.return_value = my_response
 | 
						|
        self.assertRaises(imscli.ConnectionError, imscli.get_token,
 | 
						|
                          3, mock.MagicMock(), 'c')
 | 
						|
 | 
						|
        # Post fails
 | 
						|
        mock_post.side_effect = ValueError('test')
 | 
						|
        self.assertRaises(imscli.ConnectionError, imscli.get_token,
 | 
						|
                          3, mock.MagicMock(), 'c')
 | 
						|
 | 
						|
#    @mock.patch.object(imscli, 'cli_common')
 | 
						|
#    @mock.patch('requests.put')
 | 
						|
#    @mock.patch('requests.post')
 | 
						|
#    @mock.patch.object(imscli, 'get_token')
 | 
						|
#    @mock.patch.object(imscli, 'globals')
 | 
						|
#    def test_timeout(self, mock_globals, mock_get_token,
 | 
						|
#                     mock_post, mock_put, mock_common):
 | 
						|
#        mock_post.side_effect = Exception("timeout boom")
 | 
						|
#        cli = ormcli.Cli()
 | 
						|
#        cli.create_parser()
 | 
						|
#        cli.parse(
 | 
						|
#            'orm ims create_image client1 '
 | 
						|
#            'ormcli/tests/data/ims-create-image.json'.split())
 | 
						|
#        with self.assertRaises(SystemExit) as cm:
 | 
						|
#            cli.logic()
 | 
						|
#        self.assertEqual(cm.exception.code, 1)
 | 
						|
#        sys.stdout.seek(0)
 | 
						|
#        output = sys.stdout.read()
 | 
						|
#        self.assertIn('timeout boom', output)
 | 
						|
#
 | 
						|
#    @mock.patch('requests.post')
 | 
						|
#    @mock.patch.object(imscli, 'get_token')
 | 
						|
#    @mock.patch.object(imscli, 'globals')
 | 
						|
#    def test_no_keystone(self, mock_globals, mock_get_token, mock_post):
 | 
						|
#        mock_post.side_effect = Exception("timeout boom")
 | 
						|
#        cli = ormcli.Cli()
 | 
						|
#        cli.create_parser()
 | 
						|
#        globals()['auth_region'] = 'test'
 | 
						|
#        cli.parse(
 | 
						|
#            'orm ims create_image client1 '
 | 
						|
#            'ormcli/tests/data/ims-create-image.json'.split())
 | 
						|
#        with self.assertRaises(SystemExit) as cm:
 | 
						|
#            cli.logic()
 | 
						|
#
 | 
						|
#    @mock.patch.object(imscli, 'cli_common')
 | 
						|
#    @mock.patch('requests.post')
 | 
						|
#    def test_response_code(self, mock_post, mock_common):
 | 
						|
#        cli = ormcli.Cli()
 | 
						|
#        cli.create_parser()
 | 
						|
#        cli.parse(
 | 
						|
#            'orm ims create_image client1 '
 | 
						|
#            'ormcli/tests/data/ims-create-image.json'.split())
 | 
						|
#        resp = self.respond({"access": {"token": {"id": 989}}}, 400)
 | 
						|
#        mock_post.return_value = resp
 | 
						|
#        with self.assertRaises(SystemExit) as cm:
 | 
						|
#            cli.logic()
 | 
						|
 | 
						|
    @mock.patch.object(imscli, 'cli_common')
 | 
						|
    @mock.patch('requests.get')
 | 
						|
    @mock.patch('requests.post')
 | 
						|
    def test_list_images(self, mock_post, mock_get, mock_common):
 | 
						|
        mock_post.return_value = self.respond(
 | 
						|
            {"access": {"token": {"id": 989}}}, 201)
 | 
						|
        cli = ormcli.Cli()
 | 
						|
        cli.create_parser()
 | 
						|
        cli.parse(
 | 
						|
            'orm ims list_images client1 --visibility public --region a '
 | 
						|
            '--customer b'.split())
 | 
						|
        resp = self.respond({"access": {"token": {"id": 989}}}, 200)
 | 
						|
        mock_get.return_value = self.respond(
 | 
						|
            {"access": {"token": {"id": 989}}}, 200)
 | 
						|
 | 
						|
    @mock.patch.object(imscli, 'cli_common')
 | 
						|
    @mock.patch('requests.get')
 | 
						|
    @mock.patch('requests.post')
 | 
						|
    @mock.patch.object(imscli, 'get_token')
 | 
						|
    @mock.patch.object(imscli, 'globals')
 | 
						|
    def test_list_images_bad_request(self, mock_get_token, mock_globals,
 | 
						|
                                     mock_post, mock_get, mock_common):
 | 
						|
        mock_post.return_value = self.respond(
 | 
						|
            {"access": {"token": {"id": 989}}}, 201)
 | 
						|
        cli = ormcli.Cli()
 | 
						|
        cli.create_parser()
 | 
						|
        cli.parse(
 | 
						|
            'orm ims list_images client1 --visibility public --region a '
 | 
						|
            '--customer b'.split())
 | 
						|
        resp = self.respond({"access": {"token": {"id": 989}}}, 200)
 | 
						|
        with self.assertRaises(SystemExit) as cm:
 | 
						|
            cli.logic()
 | 
						|
        self.assertEqual(cm.exception.code, 1)
 | 
						|
        sys.stdout.seek(0)
 | 
						|
        output = sys.stdout.read()
 | 
						|
        self.assertIn('API error', output)
 | 
						|
 | 
						|
    def test_cmd_data_no_data_file(self):
 | 
						|
        my_args = mock.MagicMock()
 | 
						|
        my_args.subcmd = 'xyz'
 | 
						|
 | 
						|
        my_args.datafile.read.return_value = "123"
 | 
						|
        cm_data = cmd_data(my_args)
 | 
						|
        self.assertEqual("{}", cm_data)
 | 
						|
 | 
						|
    def test_cmd_data_from_data_file(self):
 | 
						|
        my_args = MyDataFile()
 | 
						|
        cm_data = cmd_data(my_args)
 | 
						|
 | 
						|
        self.assertEqual("123", cm_data)
 | 
						|
 | 
						|
 | 
						|
class MyDataFile(object):
 | 
						|
    def __init__(self):
 | 
						|
        self.subcmd = '1'
 | 
						|
        self.datafile = FakeDataFIle()
 | 
						|
 | 
						|
    def __iter__(self):
 | 
						|
        return iter(['datafile'])
 | 
						|
 | 
						|
 | 
						|
class FakeDataFIle(object):
 | 
						|
    def read(self):
 | 
						|
        return '123'
 |