Files
deb-python-cliff/cliff/tests/test_commandmanager.py
Eyal Posener f55e785448 Fix command order
When there are two commands: one 'foo', that expects a positional
argument, and a second command 'foo bar'.
Trying to enter the command 'foo bar' will invoke the command
'foo' with position argument 'bar', and not the second command
'foo bar'.
This is due to the fact that the find command method first
checks for the first word as a command.
By trying first to match all arguments this problem is solved.

Closes-Bug: #1618673
Change-Id: I24ea39813ad30ec095ea18baad3a7b088fa8108f
2017-01-03 16:47:12 +02:00

122 lines
3.6 KiB
Python

import mock
from cliff.commandmanager import CommandManager
from cliff.tests import utils
def test_lookup_and_find():
def check(mgr, argv):
cmd, name, remaining = mgr.find_command(argv)
assert cmd
assert name == ' '.join(argv)
assert not remaining
mgr = utils.TestCommandManager(utils.TEST_NAMESPACE)
for expected in [['one'],
['two', 'words'],
['three', 'word', 'command'],
]:
yield check, mgr, expected
return
def test_lookup_with_remainder():
def check(mgr, argv):
cmd, name, remaining = mgr.find_command(argv)
assert cmd
assert remaining == ['--opt']
mgr = utils.TestCommandManager(utils.TEST_NAMESPACE)
for expected in [['one', '--opt'],
['two', 'words', '--opt'],
['three', 'word', 'command', '--opt'],
]:
yield check, mgr, expected
return
def test_find_invalid_command():
mgr = utils.TestCommandManager(utils.TEST_NAMESPACE)
def check_one(argv):
try:
mgr.find_command(argv)
except ValueError as err:
# make sure err include 'a' when ['a', '-b']
assert argv[0] in ('%s' % err)
assert '-b' in ('%s' % err)
else:
assert False, 'expected a failure'
for argv in [['a', '-b'],
['-b'],
]:
yield check_one, argv
def test_find_unknown_command():
mgr = utils.TestCommandManager(utils.TEST_NAMESPACE)
try:
mgr.find_command(['a', 'b'])
except ValueError as err:
assert "['a', 'b']" in ('%s' % err)
else:
assert False, 'expected a failure'
def test_add_command():
mgr = utils.TestCommandManager(utils.TEST_NAMESPACE)
mock_cmd = mock.Mock()
mgr.add_command('mock', mock_cmd)
found_cmd, name, args = mgr.find_command(['mock'])
assert found_cmd is mock_cmd
def test_intersected_commands():
def foo(arg):
pass
def foo_bar():
pass
mgr = utils.TestCommandManager(utils.TEST_NAMESPACE)
mgr.add_command('foo', foo)
mgr.add_command('foo bar', foo_bar)
assert mgr.find_command(['foo', 'bar'])[0] is foo_bar
assert mgr.find_command(['foo', 'arg0'])[0] is foo
def test_load_commands():
testcmd = mock.Mock(name='testcmd')
testcmd.name.replace.return_value = 'test'
mock_pkg_resources = mock.Mock(return_value=[testcmd])
with mock.patch('pkg_resources.iter_entry_points',
mock_pkg_resources) as iter_entry_points:
mgr = CommandManager('test')
iter_entry_points.assert_called_once_with('test')
names = [n for n, v in mgr]
assert names == ['test']
def test_load_commands_keep_underscores():
testcmd = mock.Mock()
testcmd.name = 'test_cmd'
mock_pkg_resources = mock.Mock(return_value=[testcmd])
with mock.patch('pkg_resources.iter_entry_points',
mock_pkg_resources) as iter_entry_points:
mgr = CommandManager('test', convert_underscores=False)
iter_entry_points.assert_called_once_with('test')
names = [n for n, v in mgr]
assert names == ['test_cmd']
def test_load_commands_replace_underscores():
testcmd = mock.Mock()
testcmd.name = 'test_cmd'
mock_pkg_resources = mock.Mock(return_value=[testcmd])
with mock.patch('pkg_resources.iter_entry_points',
mock_pkg_resources) as iter_entry_points:
mgr = CommandManager('test', convert_underscores=True)
iter_entry_points.assert_called_once_with('test')
names = [n for n, v in mgr]
assert names == ['test cmd']