|
14 | 14 | import copy |
15 | 15 | import mock |
16 | 16 |
|
| 17 | +from mock import call |
17 | 18 | from openstackclient.common import exceptions |
18 | 19 | from openstackclient.common import utils |
19 | 20 | from openstackclient.network.v2 import network |
@@ -323,33 +324,88 @@ def test_create_with_domain_identityv2(self): |
323 | 324 |
|
324 | 325 | class TestDeleteNetwork(TestNetwork): |
325 | 326 |
|
326 | | - # The network to delete. |
327 | | - _network = network_fakes.FakeNetwork.create_one_network() |
328 | | - |
329 | 327 | def setUp(self): |
330 | 328 | super(TestDeleteNetwork, self).setUp() |
331 | 329 |
|
| 330 | + # The networks to delete |
| 331 | + self._networks = network_fakes.FakeNetwork.create_networks(count=3) |
| 332 | + |
332 | 333 | self.network.delete_network = mock.Mock(return_value=None) |
333 | 334 |
|
334 | | - self.network.find_network = mock.Mock(return_value=self._network) |
| 335 | + self.network.find_network = network_fakes.FakeNetwork.get_networks( |
| 336 | + networks=self._networks) |
335 | 337 |
|
336 | 338 | # Get the command object to test |
337 | 339 | self.cmd = network.DeleteNetwork(self.app, self.namespace) |
338 | 340 |
|
339 | | - def test_delete(self): |
| 341 | + def test_delete_one_network(self): |
340 | 342 | arglist = [ |
341 | | - self._network.name, |
| 343 | + self._networks[0].name, |
342 | 344 | ] |
343 | 345 | verifylist = [ |
344 | | - ('network', [self._network.name]), |
| 346 | + ('network', [self._networks[0].name]), |
345 | 347 | ] |
| 348 | + parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 349 | + |
| 350 | + result = self.cmd.take_action(parsed_args) |
346 | 351 |
|
| 352 | + self.network.delete_network.assert_called_once_with(self._networks[0]) |
| 353 | + self.assertIsNone(result) |
| 354 | + |
| 355 | + def test_delete_multiple_networks(self): |
| 356 | + arglist = [] |
| 357 | + for n in self._networks: |
| 358 | + arglist.append(n.id) |
| 359 | + verifylist = [ |
| 360 | + ('network', arglist), |
| 361 | + ] |
347 | 362 | parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 363 | + |
348 | 364 | result = self.cmd.take_action(parsed_args) |
349 | 365 |
|
350 | | - self.network.delete_network.assert_called_once_with(self._network) |
| 366 | + calls = [] |
| 367 | + for n in self._networks: |
| 368 | + calls.append(call(n)) |
| 369 | + self.network.delete_network.assert_has_calls(calls) |
351 | 370 | self.assertIsNone(result) |
352 | 371 |
|
| 372 | + def test_delete_multiple_networks_exception(self): |
| 373 | + arglist = [ |
| 374 | + self._networks[0].id, |
| 375 | + 'xxxx-yyyy-zzzz', |
| 376 | + self._networks[1].id, |
| 377 | + ] |
| 378 | + verifylist = [ |
| 379 | + ('network', arglist), |
| 380 | + ] |
| 381 | + parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 382 | + |
| 383 | + # Fake exception in find_network() |
| 384 | + ret_find = [ |
| 385 | + self._networks[0], |
| 386 | + exceptions.NotFound('404'), |
| 387 | + self._networks[1], |
| 388 | + ] |
| 389 | + self.network.find_network = mock.Mock(side_effect=ret_find) |
| 390 | + |
| 391 | + # Fake exception in delete_network() |
| 392 | + ret_delete = [ |
| 393 | + None, |
| 394 | + exceptions.NotFound('404'), |
| 395 | + ] |
| 396 | + self.network.delete_network = mock.Mock(side_effect=ret_delete) |
| 397 | + |
| 398 | + self.assertRaises(exceptions.CommandError, self.cmd.take_action, |
| 399 | + parsed_args) |
| 400 | + |
| 401 | + # The second call of find_network() should fail. So delete_network() |
| 402 | + # was only called twice. |
| 403 | + calls = [ |
| 404 | + call(self._networks[0]), |
| 405 | + call(self._networks[1]), |
| 406 | + ] |
| 407 | + self.network.delete_network.assert_has_calls(calls) |
| 408 | + |
353 | 409 |
|
354 | 410 | class TestListNetwork(TestNetwork): |
355 | 411 |
|
@@ -752,36 +808,97 @@ def test_create_default_options(self): |
752 | 808 |
|
753 | 809 | class TestDeleteNetworkCompute(TestNetworkCompute): |
754 | 810 |
|
755 | | - # The network to delete. |
756 | | - _network = compute_fakes.FakeNetwork.create_one_network() |
757 | | - |
758 | 811 | def setUp(self): |
759 | 812 | super(TestDeleteNetworkCompute, self).setUp() |
760 | 813 |
|
761 | 814 | self.app.client_manager.network_endpoint_enabled = False |
762 | 815 |
|
| 816 | + # The networks to delete |
| 817 | + self._networks = compute_fakes.FakeNetwork.create_networks(count=3) |
| 818 | + |
763 | 819 | self.compute.networks.delete.return_value = None |
764 | 820 |
|
765 | 821 | # Return value of utils.find_resource() |
766 | | - self.compute.networks.get.return_value = self._network |
| 822 | + self.compute.networks.get = \ |
| 823 | + compute_fakes.FakeNetwork.get_networks(networks=self._networks) |
767 | 824 |
|
768 | 825 | # Get the command object to test |
769 | 826 | self.cmd = network.DeleteNetwork(self.app, None) |
770 | 827 |
|
771 | | - def test_network_delete(self): |
| 828 | + def test_delete_one_network(self): |
772 | 829 | arglist = [ |
773 | | - self._network.label, |
| 830 | + self._networks[0].label, |
774 | 831 | ] |
775 | 832 | verifylist = [ |
776 | | - ('network', [self._network.label]), |
| 833 | + ('network', [self._networks[0].label]), |
777 | 834 | ] |
| 835 | + parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 836 | + |
| 837 | + result = self.cmd.take_action(parsed_args) |
778 | 838 |
|
| 839 | + self.compute.networks.delete.assert_called_once_with( |
| 840 | + self._networks[0].id) |
| 841 | + self.assertIsNone(result) |
| 842 | + |
| 843 | + def test_delete_multiple_networks(self): |
| 844 | + arglist = [] |
| 845 | + for n in self._networks: |
| 846 | + arglist.append(n.label) |
| 847 | + verifylist = [ |
| 848 | + ('network', arglist), |
| 849 | + ] |
779 | 850 | parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 851 | + |
780 | 852 | result = self.cmd.take_action(parsed_args) |
781 | 853 |
|
782 | | - self.compute.networks.delete.assert_called_once_with(self._network.id) |
| 854 | + calls = [] |
| 855 | + for n in self._networks: |
| 856 | + calls.append(call(n.id)) |
| 857 | + self.compute.networks.delete.assert_has_calls(calls) |
783 | 858 | self.assertIsNone(result) |
784 | 859 |
|
| 860 | + def test_delete_multiple_networks_exception(self): |
| 861 | + arglist = [ |
| 862 | + self._networks[0].id, |
| 863 | + 'xxxx-yyyy-zzzz', |
| 864 | + self._networks[1].id, |
| 865 | + ] |
| 866 | + verifylist = [ |
| 867 | + ('network', arglist), |
| 868 | + ] |
| 869 | + parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 870 | + |
| 871 | + # Fake exception in utils.find_resource() |
| 872 | + # In compute v2, we use utils.find_resource() to find a network. |
| 873 | + # It calls get() several times, but find() only one time. So we |
| 874 | + # choose to fake get() always raise exception, then pass through. |
| 875 | + # And fake find() to find the real network or not. |
| 876 | + self.compute.networks.get.side_effect = Exception() |
| 877 | + ret_find = [ |
| 878 | + self._networks[0], |
| 879 | + Exception(), |
| 880 | + self._networks[1], |
| 881 | + ] |
| 882 | + self.compute.networks.find.side_effect = ret_find |
| 883 | + |
| 884 | + # Fake exception in delete() |
| 885 | + ret_delete = [ |
| 886 | + None, |
| 887 | + Exception(), |
| 888 | + ] |
| 889 | + self.compute.networks.delete = mock.Mock(side_effect=ret_delete) |
| 890 | + |
| 891 | + self.assertRaises(exceptions.CommandError, self.cmd.take_action, |
| 892 | + parsed_args) |
| 893 | + |
| 894 | + # The second call of utils.find_resource() should fail. So delete() |
| 895 | + # was only called twice. |
| 896 | + calls = [ |
| 897 | + call(self._networks[0].id), |
| 898 | + call(self._networks[1].id), |
| 899 | + ] |
| 900 | + self.compute.networks.delete.assert_has_calls(calls) |
| 901 | + |
785 | 902 |
|
786 | 903 | class TestListNetworkCompute(TestNetworkCompute): |
787 | 904 |
|
|
0 commit comments