1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
"""Bash completion tests
"""
import mock
import os
from cliff import complete
def test_add_command():
sot = complete.CompleteDictionary()
sot.add_command("image delete".split(),
[mock.Mock(option_strings=["1"])])
sot.add_command("image list".split(),
[mock.Mock(option_strings=["2"])])
sot.add_command("image create".split(),
[mock.Mock(option_strings=["3"])])
sot.add_command("volume type create".split(),
[mock.Mock(option_strings=["4"])])
sot.add_command("volume type delete".split(),
[mock.Mock(option_strings=["5"])])
assert "image volume" == sot.get_commands()
result = sot.get_data()
assert "image" == result[0][0]
assert "create delete list" == result[0][1]
assert "image_create" == result[1][0]
assert "3" == result[1][1]
assert "image_delete" == result[2][0]
assert "1" == result[2][1]
assert "image_list" == result[3][0]
assert "2" == result[3][1]
class FakeStdout:
def __init__(self):
self.content = []
def write(self, text):
self.content.append(text)
def make_string(self):
result = ''
for line in self.content:
result = result + line
return result
def create_complete_command_mocks():
app = mock.Mock(name="app")
app_args = mock.Mock(name="app_args")
# actions
action_one = mock.Mock(name="action_one")
action_one.option_strings = ["Eolus"]
action_two = mock.Mock(name="action_two")
action_two.option_strings = ["Wilson", "Sunlight"]
actions = [action_one, action_two]
# get_optional_actions
get_optional_actions = mock.Mock(name="get_optional_actions")
get_optional_actions.return_value = actions
# cmd_parser
cmd_parser = mock.Mock(name="cmd_parser")
cmd_parser._get_optional_actions = get_optional_actions
# get_parser
get_parser = mock.Mock(name="get_parser")
get_parser.return_value = cmd_parser
# cmd_factory_init
cmd_factory_init = mock.Mock("cmd_factory_init")
cmd_factory_init.get_parser = get_parser
# cmd_factory
cmd_factory = mock.Mock(name="cmd_factory")
cmd_factory.return_value = cmd_factory_init
# find_command
cmd_name = "yale"
search_args = "search_args"
find_command = mock.Mock(name="find_command")
find_command.return_value = (cmd_factory, cmd_name, search_args)
# command_manager
commands = [["image create"], ["server meta delete"], ["server ssh"]]
command_manager = mock.MagicMock()
command_manager.__iter__.return_value = iter(commands)
command_manager.find_command = find_command
app.command_manager = command_manager
app.NAME = "openstack"
app.interactive_mode = False
app.stdout = FakeStdout()
return (complete.CompleteCommand(app, app_args), app, actions, cmd_factory_init)
def check_parser(cmd, args, verify_args):
cmd_parser = cmd.get_parser('check_parser')
parsed_args = cmd_parser.parse_args(args)
for av in verify_args:
attr, value = av
if attr:
assert attr in parsed_args
assert getattr(parsed_args, attr) == value
def test_parser_nothing():
sot, app, actions, cmd_factory_init = create_complete_command_mocks()
check_parser(sot, [], [('name', None), ('shell', 'bash')])
def test_parser_no_code():
sot, app, actions, cmd_factory_init = create_complete_command_mocks()
check_parser(sot, ["--shell", "none", "--name", "foo"],
[('name', 'foo'), ('shell', 'none')])
def test_get_actions():
sot, app, actions, cmd_factory_init = create_complete_command_mocks()
result = sot.get_actions("yale")
cmd_factory_init.get_parser.assert_called_with('openstack yale')
assert actions == result
def test_get_actions_interactive():
sot, app, actions, cmd_factory_init = create_complete_command_mocks()
app.interactive_mode = True
result = sot.get_actions("yale")
cmd_factory_init.get_parser.assert_called_with('yale')
assert actions == result
def verify_data(content):
assert " cmds='image server'\n" in content
assert " cmds_image='create'\n" in content
assert " cmds_image_create='Eolus Wilson Sunlight'\n" in content
assert " cmds_server='meta ssh'\n" in content
assert " cmds_server_meta_delete='Eolus Wilson Sunlight'\n" in content
assert " cmds_server_ssh='Eolus Wilson Sunlight'\n" in content
def test_take_action_nocode():
sot, app, actions, cmd_factory_init = create_complete_command_mocks()
parsed_args = mock.Mock()
parsed_args.shell = "none"
sot.take_action(parsed_args)
verify_data(app.stdout.content)
def test_take_action_code():
sot, app, actions, cmd_factory_init = create_complete_command_mocks()
parsed_args = mock.Mock()
parsed_args.name = "openstack"
sot.take_action(parsed_args)
verify_data(app.stdout.content)
assert "_openstack()\n" in app.stdout.content[0]
assert "complete -F _openstack openstack\n" in app.stdout.content[-1]
|