Skip to content

Commit 01529cf

Browse files
Update unit tests, covering paging
1 parent 51f6d3e commit 01529cf

12 files changed

Lines changed: 184 additions & 20 deletions

coriolisclient/cli/deployments.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,11 @@ def get_parser(self, prog_name):
287287
return parser
288288

289289
def take_action(self, args):
290+
sort_keys, sort_dirs = cli_utils.parse_sort_arg(args.sort)
290291
obj_list = self.app.client_manager.coriolis.deployments.list(
291292
marker=args.marker,
292293
limit=args.limit,
293-
sort_keys=args.sort_keys,
294-
sort_dirs=args.sort_dirs)
294+
sort_keys=sort_keys,
295+
sort_dirs=sort_dirs,
296+
)
295297
return DeploymentFormatter().list_objects(obj_list)

coriolisclient/cli/transfer_executions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,11 +195,11 @@ def get_parser(self, prog_name):
195195
return parser
196196

197197
def take_action(self, args):
198-
sort_keys, sort_dirs = cli_utils.parse_sort_args(args.sort)
198+
sort_keys, sort_dirs = cli_utils.parse_sort_arg(args.sort)
199199
obj_list = self.app.client_manager.coriolis.transfer_executions.list(
200200
args.transfer,
201201
marker=args.marker,
202202
limit=args.limit,
203-
sort_keys=args.sort_keys,
204-
sort_dirs=args.sort_dirs)
203+
sort_keys=sort_keys,
204+
sort_dirs=sort_dirs)
205205
return TransferExecutionFormatter().list_objects(obj_list)

coriolisclient/cli/transfers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,11 +334,13 @@ def get_parser(self, prog_name):
334334
return parser
335335

336336
def take_action(self, args):
337+
sort_keys, sort_dirs = cli_utils.parse_sort_arg(args.sort)
337338
obj_list = self.app.client_manager.coriolis.transfers.list(
338339
marker=args.marker,
339340
limit=args.limit,
340-
sort_keys=args.sort_keys,
341-
sort_dirs=args.sort_dirs)
341+
sort_keys=sort_keys,
342+
sort_dirs=sort_dirs,
343+
)
342344
return TransferFormatter().list_objects(obj_list)
343345

344346

coriolisclient/cli/utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ def _split_pool_mapping_arg(arg):
267267
'be of the form "INSTANCE_IDENTIFIER=MINION_POOL_ID".')
268268

269269

270-
def parse_sort_arg(sort: str) -> tuple[list, list]:
270+
def parse_sort_arg(sort: str | None) -> tuple[list, list]:
271271
"""Parse sort CLI argument.
272272
273273
:param sort: Comma-separated list of sort keys and directions in the form
@@ -277,6 +277,9 @@ def parse_sort_arg(sort: str) -> tuple[list, list]:
277277
"""
278278
sort_keys = []
279279
sort_dirs = []
280+
if not sort:
281+
return sort_keys, sort_dirs
282+
280283
for sort_entry in sort.split(','):
281284
sort_key, _sep, sort_dir = sort_entry.partition(':')
282285
if not sort_dir:

coriolisclient/tests/cli/test_deployments.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,12 +329,23 @@ def test_get_parser(self):
329329
parser = self.cli.get_parser('coriolis')
330330
self.assertIsInstance(parser, argparse.ArgumentParser)
331331

332-
def test_take_action(self):
332+
@mock.patch("coriolisclient.cli.utils.parse_sort_arg")
333+
def test_take_action(self, mock_parse_sort_arg):
334+
mock_parse_sort_arg.return_value = (
335+
mock.sentinel.sort_keys, mock.sentinel.sort_dirs)
336+
337+
mock_args = mock.MagicMock()
333338
mock_fun = self.mock_app.client_manager.coriolis.deployments.list
334339
mock_fun.return_value = [
335340
v1_deployments.Deployment(mock.MagicMock(), DEPLOYMENT_LIST_DATA)]
336341

337-
columns, data = self.cli.take_action(mock.ANY)
342+
columns, data = self.cli.take_action(mock_args)
338343

339344
self.assertEqual(deployments.DeploymentFormatter().columns, columns)
340345
self.assertEqual([DEPLOYMENT_LIST_FORMATTED_DATA], list(data))
346+
mock_fun.assert_called_once_with(
347+
marker=mock_args.marker,
348+
limit=mock_args.limit,
349+
sort_keys=mock.sentinel.sort_keys,
350+
sort_dirs=mock.sentinel.sort_dirs,
351+
)

coriolisclient/tests/cli/test_transfer_executions.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,10 +419,15 @@ def test_get_parser(
419419

420420
@mock.patch.object(transfer_executions.TransferExecutionFormatter,
421421
'list_objects')
422+
@mock.patch("coriolisclient.cli.utils.parse_sort_arg")
422423
def test_take_action(
423424
self,
425+
mock_parse_sort_arg,
424426
mock_list_objects
425427
):
428+
mock_parse_sort_arg.return_value = (
429+
mock.sentinel.sort_keys, mock.sentinel.sort_dirs)
430+
426431
args = mock.Mock()
427432
args.transfer = mock.sentinel.transfer
428433
mock_transfer_list = mock.Mock()
@@ -435,6 +440,12 @@ def test_take_action(
435440
mock_list_objects.return_value,
436441
result
437442
)
438-
mock_transfer_list.assert_called_once_with(mock.sentinel.transfer)
443+
mock_transfer_list.assert_called_once_with(
444+
mock.sentinel.transfer,
445+
marker=args.marker,
446+
limit=args.limit,
447+
sort_keys=mock.sentinel.sort_keys,
448+
sort_dirs=mock.sentinel.sort_dirs,
449+
)
439450
mock_list_objects.assert_called_once_with(
440451
mock_transfer_list.return_value)

coriolisclient/tests/cli/test_transfers.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,18 +470,31 @@ def test_get_parser(self, mock_get_parser):
470470
mock_get_parser.assert_called_once_with(mock.sentinel.prog_name)
471471

472472
@mock.patch.object(transfers.TransferFormatter, 'list_objects')
473-
def test_take_action(self, mock_list_objects):
473+
@mock.patch("coriolisclient.cli.utils.parse_sort_arg")
474+
def test_take_action(self, mock_parse_sort_arg, mock_list_objects):
475+
mock_parse_sort_arg.return_value = (
476+
mock.sentinel.sort_keys, mock.sentinel.sort_dirs)
477+
474478
args = mock.Mock()
475-
mock_transfer = mock.Mock()
476-
self.mock_app.client_manager.coriolis.transfers.list = mock_transfer
479+
args.sort = None
480+
mock_transfer_list = mock.Mock()
481+
self.mock_app.client_manager.coriolis.transfers.list = (
482+
mock_transfer_list)
477483

478484
result = self.transfer.take_action(args)
479485

480486
self.assertEqual(
481487
mock_list_objects.return_value,
482488
result
483489
)
484-
mock_list_objects.assert_called_once_with(mock_transfer.return_value)
490+
mock_list_objects.assert_called_once_with(
491+
mock_transfer_list.return_value)
492+
mock_transfer_list.assert_called_once_with(
493+
marker=args.marker,
494+
limit=args.limit,
495+
sort_keys=mock.sentinel.sort_keys,
496+
sort_dirs=mock.sentinel.sort_dirs,
497+
)
485498

486499

487500
class UpdateTransferTestCase(test_base.CoriolisBaseTestCase):

coriolisclient/tests/cli/test_utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,3 +323,13 @@ def test_add_minion_pool_args_to_parser(self):
323323
[{'instance_id': 'mock_instance_id', 'pool_id': 'mock_pool_id'}],
324324
args.instance_osmorphing_minion_pool_mappings
325325
)
326+
327+
@ddt.data(
328+
(None, ([], [])),
329+
("key0:asc,key1:desc,key2",
330+
(["key0", "key1", "key2"], ["asc", "desc", "desc"]))
331+
)
332+
@ddt.unpack
333+
def test_parse_sort_arg(self, sort_arg, exp_ret):
334+
ret = utils.parse_sort_arg(sort_arg)
335+
self.assertEqual(exp_ret, ret)

coriolisclient/tests/test_base.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ def setUp(self):
279279
self.manager = base.BaseManager(mock_client)
280280

281281
def test_list(self):
282-
self.manager.client.get(mock.sentinel.url).json.return_value = {
282+
self.manager.client.get.return_value.json.return_value = {
283283
"mock_response_key": {
284284
"data": [mock.sentinel.data1, mock.sentinel.data2]}
285285
}
@@ -294,6 +294,7 @@ def test_list(self):
294294
values_key="data"
295295
)
296296

297+
self.manager.client.get.assert_called_once_with(mock.sentinel.url)
297298
self.assertEqual(
298299
[obj_class.return_value] * 2,
299300
result
@@ -303,6 +304,46 @@ def test_list(self):
303304
mock.call(self.manager, mock.sentinel.data2, loaded=True)
304305
])
305306

307+
def test_list_with_dict_query(self):
308+
self.manager.client.get.return_value.json.return_value = {
309+
"mock_response_key": {"data": []}
310+
}
311+
testutils.get_wrapped_function(self.manager._list)(
312+
self.manager,
313+
url="test-url",
314+
response_key="mock_response_key",
315+
obj_class=mock.Mock(),
316+
json=None,
317+
values_key="data",
318+
query={
319+
"some_filter": "some_value",
320+
"some_other_filter": "some_other_value"
321+
}
322+
)
323+
self.manager.client.get.assert_called_once_with(
324+
"test-url?some_filter=some_value&"
325+
"some_other_filter=some_other_value")
326+
327+
def test_list_with_tuple_list_query(self):
328+
self.manager.client.get.return_value.json.return_value = {
329+
"mock_response_key": {"data": []}
330+
}
331+
testutils.get_wrapped_function(self.manager._list)(
332+
self.manager,
333+
url="test-url",
334+
response_key="mock_response_key",
335+
obj_class=mock.Mock(),
336+
json=None,
337+
values_key="data",
338+
query=[
339+
("some_filter", "some_value"),
340+
("some_other_filter", "some_other_value"),
341+
]
342+
)
343+
self.manager.client.get.assert_called_once_with(
344+
"test-url?some_filter=some_value&"
345+
"some_other_filter=some_other_value")
346+
306347
def test_list_json(self):
307348
(self.manager.client.post(mock.sentinel.url, json=True).json.
308349
return_value) = [mock.sentinel.data]

coriolisclient/tests/v1/test_deployments.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,28 @@ def test_list(self):
7575
result = self.deployments.list(detail=True)
7676
self.assertEqual(mock_list.return_value, result)
7777
mock_list.assert_called_once_with(
78-
'/deployments/detail', 'deployments')
78+
'/deployments/detail', 'deployments', query=[])
79+
80+
def test_list_with_pagination(self):
81+
with mock.patch.object(self.deployments, '_list') as mock_list:
82+
result = self.deployments.list(
83+
detail=True,
84+
marker=mock.sentinel.marker,
85+
limit=mock.sentinel.limit,
86+
sort_keys=[mock.sentinel.sort_key0, mock.sentinel.sort_key1],
87+
sort_dirs=[mock.sentinel.sort_dir0, mock.sentinel.sort_dir1],
88+
)
89+
exp_query = [
90+
("marker", mock.sentinel.marker),
91+
("limit", mock.sentinel.limit),
92+
("sort_key", mock.sentinel.sort_key0),
93+
("sort_key", mock.sentinel.sort_key1),
94+
("sort_dir", mock.sentinel.sort_dir0),
95+
("sort_dir", mock.sentinel.sort_dir1),
96+
]
97+
self.assertEqual(mock_list.return_value, result)
98+
mock_list.assert_called_once_with(
99+
'/deployments/detail', 'deployments', query=exp_query)
79100

80101
def test_get(self):
81102
deployment = mock.Mock(uuid=DEPLOYMENT_ID)

0 commit comments

Comments
 (0)