Skip to content

Commit c2ab5b2

Browse files
committed
Add unit tests for coriolisclient.cli.utils module
1 parent cd42d86 commit c2ab5b2

File tree

2 files changed

+327
-0
lines changed

2 files changed

+327
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"mock_script1"
2+
"mock_script2"
Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
# Copyright 2024 Cloudbase Solutions Srl
2+
# All Rights Reserved.
3+
4+
import argparse
5+
import ddt
6+
import os
7+
from unittest import mock
8+
9+
from coriolisclient.cli import utils
10+
from coriolisclient.tests import test_base
11+
12+
13+
@ddt.ddt
14+
class UtilsTestCase(test_base.CoriolisBaseTestCase):
15+
"""Test suite for the Coriolis Utils."""
16+
17+
def test_add_storage_mappings_arguments_to_parser(self):
18+
parser = argparse.ArgumentParser()
19+
20+
utils.add_storage_mappings_arguments_to_parser(parser)
21+
args = parser.parse_args(
22+
['--storage-backend-mapping', 'mock_source=mock_destination',
23+
'--disk-storage-mapping', 'mock_disk_id=mock_destination',
24+
'--default-storage-backend', 'mock_default_storage_backend'])
25+
26+
self.assertEqual(
27+
[{'disk_id': 'mock_disk_id', 'destination': 'mock_destination'}],
28+
args.disk_storage_mappings
29+
)
30+
self.assertEqual(
31+
[{'source': 'mock_source', 'destination': 'mock_destination'}],
32+
args.storage_backend_mappings
33+
)
34+
self.assertEqual(
35+
'mock_default_storage_backend',
36+
args.default_storage_backend
37+
)
38+
39+
def test_get_storage_mappings_dict_from_args(self):
40+
args = mock.Mock()
41+
args.default_storage_backend = mock.sentinel.default_storage_backend
42+
args.disk_storage_mappings = mock.sentinel.disk_storage_mappings
43+
args.storage_backend_mappings = mock.sentinel.storage_backend_mappings
44+
45+
result = utils.get_storage_mappings_dict_from_args(args)
46+
47+
self.assertEqual(
48+
{
49+
"backend_mappings": mock.sentinel.storage_backend_mappings,
50+
"default": mock.sentinel.default_storage_backend,
51+
"disk_mappings": mock.sentinel.disk_storage_mappings
52+
},
53+
result
54+
)
55+
56+
def test_format_mapping(self):
57+
mapping = {
58+
"mapping1": "mock_mapping1",
59+
"mapping2": "mock_mapping2",
60+
"mapping3": "mock_mapping3"
61+
}
62+
63+
result = utils.format_mapping(mapping)
64+
65+
self.assertEqual(
66+
(
67+
"'mapping1'='mock_mapping1', "
68+
"'mapping2'='mock_mapping2', "
69+
"'mapping3'='mock_mapping3'"
70+
),
71+
result
72+
)
73+
74+
def test_parse_storage_mappings(self):
75+
storage_mappings = {
76+
"default": "mock_default",
77+
"backend_mappings": [
78+
{
79+
"source": "mock_source",
80+
"destination": "mock_destination"
81+
}
82+
],
83+
"disk_mappings": [
84+
{
85+
"disk_id": "mock_disk_id",
86+
"destination": "mock_destination"
87+
}
88+
]
89+
}
90+
91+
result = utils.parse_storage_mappings(storage_mappings)
92+
93+
self.assertEqual(
94+
(
95+
'mock_default',
96+
{'mock_source': 'mock_destination'},
97+
{'mock_disk_id': 'mock_destination'}
98+
),
99+
result
100+
)
101+
102+
def test_parse_storage_mappings_none(self):
103+
result = utils.parse_storage_mappings(None)
104+
105+
self.assertEqual(
106+
(None, {}, {}),
107+
result
108+
)
109+
110+
def test_format_json_for_object_property(self):
111+
obj = mock.Mock()
112+
obj.prop_name = {"key1": "value1", "key2": "value2"}
113+
114+
result = utils.format_json_for_object_property(obj, "prop_name")
115+
116+
self.assertEqual(
117+
'{\n "key1": "value1",\n "key2": "value2"\n}',
118+
result
119+
)
120+
121+
def test_format_json_for_object_property_to_dict(self):
122+
obj = mock.Mock()
123+
obj.prop_name.to_dict.return_value = \
124+
{"key1": "value1", "key2": "value2"}
125+
126+
result = utils.format_json_for_object_property(obj, "prop_name")
127+
128+
self.assertEqual(
129+
'{\n "key1": "value1",\n "key2": "value2"\n}',
130+
result
131+
)
132+
133+
def test_format_json_for_object_property_none(self):
134+
obj = mock.Mock()
135+
obj.prop_name = None
136+
137+
result = utils.format_json_for_object_property(obj, "prop_name")
138+
139+
self.assertEqual(
140+
'{}',
141+
result
142+
)
143+
144+
def test_validate_uuid_string(self):
145+
result = utils.validate_uuid_string(
146+
"12345678-9ABC-DEF1-2345-6789abcdef12")
147+
148+
self.assertEqual(
149+
True,
150+
result
151+
)
152+
153+
result = utils.validate_uuid_string(
154+
"123456789ABCDEF")
155+
156+
self.assertEqual(
157+
False,
158+
result
159+
)
160+
161+
@mock.patch.object(argparse, 'FileType')
162+
def test_add_args_for_json_option_to_parser(self, mock_file_type):
163+
parser = argparse.ArgumentParser()
164+
165+
utils.add_args_for_json_option_to_parser(
166+
parser, "option_name")
167+
168+
args = parser.parse_args(
169+
['--option-name', 'mock_option'])
170+
171+
args_file = parser.parse_args(
172+
['--option-name-file', 'mock_option_file'])
173+
174+
self.assertEqual(
175+
('mock_option', mock_file_type.return_value.return_value),
176+
(args.option_name, args_file.option_name_file)
177+
)
178+
179+
def test_get_option_value_from_args(self):
180+
args = mock.MagicMock()
181+
args.option_name = '{"option": "raw_value"}'
182+
args.option_name_file.__enter__.return_value.read.return_value = \
183+
'{"option": "file_value"}'
184+
185+
result = utils.get_option_value_from_args(args, "option-name")
186+
187+
self.assertEqual(
188+
{'option': 'raw_value'},
189+
result
190+
)
191+
192+
args.option_name = None
193+
194+
result = utils.get_option_value_from_args(args, "option-name")
195+
196+
self.assertEqual(
197+
{'option': 'file_value'},
198+
result
199+
)
200+
201+
def test_get_option_value_from_args_no_value(self):
202+
args = mock.Mock()
203+
args.option_name = None
204+
args.option_name_file = None
205+
206+
result = utils.get_option_value_from_args(
207+
args, "option-name", error_on_no_value=False)
208+
209+
self.assertEqual(
210+
None,
211+
result
212+
)
213+
214+
self.assertRaises(
215+
ValueError,
216+
utils.get_option_value_from_args,
217+
args,
218+
"option-name"
219+
)
220+
221+
def test_get_option_value_from_args_json_value_error(self):
222+
args = mock.Mock()
223+
args.option_name = "invalid"
224+
args.option_name_file = None
225+
226+
self.assertRaises(
227+
ValueError,
228+
utils.get_option_value_from_args,
229+
args,
230+
"option-name"
231+
)
232+
233+
@ddt.data(
234+
{
235+
"global_scripts": None,
236+
"instance_scripts": None,
237+
"expected_result":
238+
{
239+
"global": {},
240+
"instances": {}
241+
}
242+
},
243+
{
244+
"global_scripts": ["linux="],
245+
"instance_scripts": ["instance_1="],
246+
"expected_result":
247+
{
248+
"global": {"linux": None},
249+
"instances": {"instance_1": None}
250+
}
251+
},
252+
{
253+
"global_scripts": ["linux script"],
254+
"instance_scripts": ["linux script"],
255+
"expected_result":
256+
{
257+
"global": {},
258+
"instances": {}
259+
}
260+
},
261+
{
262+
"global_scripts": ["invalid_os=scrips"],
263+
"instance_scripts": None,
264+
"expected_result": None
265+
},
266+
{
267+
"global_scripts": ["linux='invalid/file/path'"],
268+
"instance_scripts": None,
269+
"expected_result": None
270+
},
271+
{
272+
"global_scripts": None,
273+
"instance_scripts": ["linux='invalid/file/path'"],
274+
"expected_result": None
275+
},
276+
)
277+
def test_compose_user_scripts(self, data):
278+
global_scripts = data["global_scripts"]
279+
instance_scripts = data["instance_scripts"]
280+
expected_result = data["expected_result"]
281+
282+
if expected_result:
283+
result = utils.compose_user_scripts(
284+
global_scripts, instance_scripts)
285+
286+
self.assertEqual(
287+
expected_result,
288+
result
289+
)
290+
else:
291+
self.assertRaises(
292+
ValueError,
293+
utils.compose_user_scripts,
294+
global_scripts,
295+
instance_scripts
296+
)
297+
298+
def test_compose_user_scripts_from_file(self):
299+
script_path = os.path.dirname(os.path.realpath(__file__))
300+
script_path = os.path.join(script_path, 'data/user_scripts.yml')
301+
global_scripts = ["linux=%s" % script_path]
302+
instance_scripts = ["linux=%s" % script_path]
303+
304+
result = utils.compose_user_scripts(global_scripts, instance_scripts)
305+
306+
self.assertEqual(
307+
{
308+
'global': {'linux': '"mock_script1"\n"mock_script2"\n'},
309+
'instances': {'linux': '"mock_script1"\n"mock_script2"\n'}
310+
},
311+
result
312+
)
313+
314+
def test_add_minion_pool_args_to_parser(self):
315+
parser = argparse.ArgumentParser()
316+
317+
utils.add_minion_pool_args_to_parser(parser)
318+
args = parser.parse_args(
319+
['--osmorphing-minion-pool-mapping',
320+
'mock_instance_id=mock_pool_id'])
321+
322+
self.assertEqual(
323+
[{'instance_id': 'mock_instance_id', 'pool_id': 'mock_pool_id'}],
324+
args.instance_osmorphing_minion_pool_mappings
325+
)

0 commit comments

Comments
 (0)