Fixed bug with password prompt, added tests

Fixes: bug #1131237

Change-Id: Ifcd9543ed5ac9526e32025ff3acd51d36b27a224
This commit is contained in:
Vasyl Khomenko 2013-02-21 11:15:50 -05:00 committed by Gerrit Code Review
parent 39b6e00eed
commit 8ac304f7f5
2 changed files with 93 additions and 11 deletions
novaclient
tests

@ -143,7 +143,7 @@ class SecretsHelper(object):
return self.args.os_password
if self._validate_string(self.args.apikey):
return self.args.apikey
verify_pass = utils.bool_from_str(utils.getenv("OS_VERIFY_PASSWORD"))
verify_pass = utils.bool_from_str(utils.env("OS_VERIFY_PASSWORD"))
return self._prompt_password(verify_pass)
@property

@ -3,27 +3,35 @@ import re
import sys
import fixtures
import mock
from testtools import matchers
import novaclient.client
from novaclient import exceptions
import novaclient.shell
from tests import utils
FAKE_ENV = {'OS_USERNAME': 'username',
'OS_PASSWORD': 'password',
'OS_TENANT_NAME': 'tenant_name',
'OS_AUTH_URL': 'http://no.where'}
class ShellTest(utils.TestCase):
FAKE_ENV = {
'OS_USERNAME': 'username',
'OS_PASSWORD': 'password',
'OS_TENANT_NAME': 'tenant_name',
'OS_AUTH_URL': 'http://no.where',
}
def make_env(self, exclude=None):
for var, val in FAKE_ENV.items():
if var == exclude:
continue
self.useFixture(fixtures.EnvironmentVariable(var, val))
def setUp(self):
super(ShellTest, self).setUp()
for var in self.FAKE_ENV:
self.useFixture(fixtures.EnvironmentVariable(var,
self.FAKE_ENV[var]))
self.useFixture(fixtures.MonkeyPatch(
'novaclient.client.get_client_class',
mock.MagicMock))
self.nc_util = mock.patch('novaclient.utils.isunauthenticated').start()
self.nc_util.return_value = False
def shell(self, argstr, exitcodes=(0,)):
orig = sys.stdout
@ -43,7 +51,6 @@ class ShellTest(utils.TestCase):
stderr = sys.stderr.getvalue()
sys.stderr.close()
sys.stderr = orig_stderr
return (stdout, stderr)
def test_help_unknown_command(self):
@ -80,3 +87,78 @@ class ShellTest(utils.TestCase):
for r in required:
self.assertThat((stdout + stderr),
matchers.MatchesRegex(r, re.DOTALL | re.MULTILINE))
def test_help_no_options(self):
required = [
'.*?^usage: ',
'.*?^\s+root-password\s+Change the root password',
'.*?^See "nova help COMMAND" for help on a specific command',
]
stdout, stderr = self.shell('')
for r in required:
self.assertThat((stdout + stderr),
matchers.MatchesRegex(r, re.DOTALL | re.MULTILINE))
def test_bash_completion(self):
stdout, stderr = self.shell('bash-completion')
# just check we have some output
required = ['--matching help secgroup-delete-rule --priority']
for r in required:
self.assertThat((stdout + stderr),
matchers.MatchesRegex(r, re.DOTALL | re.MULTILINE))
def test_no_username(self):
required = ('You must provide a username'
' via either --os-username or env[OS_USERNAME]',)
self.make_env(exclude='OS_USERNAME')
try:
self.shell('list')
except exceptions.CommandError, message:
self.assertEqual(required, message.args)
else:
self.fail('CommandError not raised')
def test_no_tenant_name(self):
required = ('You must provide a tenant name'
' via either --os-tenant-name or env[OS_TENANT_NAME]',)
self.make_env(exclude='OS_TENANT_NAME')
try:
self.shell('list')
except exceptions.CommandError, message:
self.assertEqual(required, message.args)
else:
self.fail('CommandError not raised')
def test_no_auth_url(self):
required = ('You must provide an auth url'
' via either --os-auth-url or env[OS_AUTH_URL] or'
' specify an auth_system which defines a default url'
' with --os-auth-system or env[OS_AUTH_SYSTEM',)
self.make_env(exclude='OS_AUTH_URL')
try:
self.shell('list')
except exceptions.CommandError, message:
self.assertEqual(required, message.args)
else:
self.fail('CommandError not raised')
@mock.patch('sys.stdin', side_effect=mock.MagicMock)
@mock.patch('getpass.getpass', return_value='password')
def test_password(self, mock_getpass, mock_stdin):
self.make_env(exclude='OS_PASSWORD')
stdout, stderr = self.shell('list')
self.assertEqual((stdout + stderr), '\n')
@mock.patch('sys.stdin', side_effect=mock.MagicMock)
@mock.patch('getpass.getpass', side_effect=EOFError)
def test_no_password(self, mock_getpass, mock_stdin):
required = ('Expecting a password provided'
' via either --os-password, env[OS_PASSWORD],'
' or prompted response',)
self.make_env(exclude='OS_PASSWORD')
try:
self.shell('list')
except exceptions.CommandError, message:
self.assertEqual(required, message.args)
else:
self.fail('CommandError not raised')