|
14 | 14 | # |
15 | 15 |
|
16 | 16 | import mock |
| 17 | +from mock import call |
| 18 | + |
| 19 | +from osc_lib import exceptions |
| 20 | +from osc_lib import utils |
17 | 21 |
|
18 | 22 | from openstackclient.compute.v2 import keypair |
19 | 23 | from openstackclient.tests.compute.v2 import fakes as compute_fakes |
@@ -114,30 +118,78 @@ def test_keypair_create_public_key(self): |
114 | 118 |
|
115 | 119 | class TestKeypairDelete(TestKeypair): |
116 | 120 |
|
117 | | - keypair = compute_fakes.FakeKeypair.create_one_keypair() |
| 121 | + keypairs = compute_fakes.FakeKeypair.create_keypairs(count=2) |
118 | 122 |
|
119 | 123 | def setUp(self): |
120 | 124 | super(TestKeypairDelete, self).setUp() |
121 | 125 |
|
122 | | - self.keypairs_mock.get.return_value = self.keypair |
| 126 | + self.keypairs_mock.get = compute_fakes.FakeKeypair.get_keypairs( |
| 127 | + self.keypairs) |
123 | 128 | self.keypairs_mock.delete.return_value = None |
124 | 129 |
|
125 | 130 | self.cmd = keypair.DeleteKeypair(self.app, None) |
126 | 131 |
|
127 | 132 | def test_keypair_delete(self): |
128 | 133 | arglist = [ |
129 | | - self.keypair.name |
| 134 | + self.keypairs[0].name |
130 | 135 | ] |
131 | 136 | verifylist = [ |
132 | | - ('name', self.keypair.name), |
| 137 | + ('name', [self.keypairs[0].name]), |
133 | 138 | ] |
134 | 139 |
|
135 | 140 | parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
136 | 141 |
|
137 | 142 | ret = self.cmd.take_action(parsed_args) |
138 | 143 |
|
139 | 144 | self.assertIsNone(ret) |
140 | | - self.keypairs_mock.delete.assert_called_with(self.keypair.name) |
| 145 | + self.keypairs_mock.delete.assert_called_with(self.keypairs[0].name) |
| 146 | + |
| 147 | + def test_delete_multiple_keypairs(self): |
| 148 | + arglist = [] |
| 149 | + for k in self.keypairs: |
| 150 | + arglist.append(k.name) |
| 151 | + verifylist = [ |
| 152 | + ('name', arglist), |
| 153 | + ] |
| 154 | + |
| 155 | + parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 156 | + result = self.cmd.take_action(parsed_args) |
| 157 | + |
| 158 | + calls = [] |
| 159 | + for k in self.keypairs: |
| 160 | + calls.append(call(k.name)) |
| 161 | + self.keypairs_mock.delete.assert_has_calls(calls) |
| 162 | + self.assertIsNone(result) |
| 163 | + |
| 164 | + def test_delete_multiple_keypairs_with_exception(self): |
| 165 | + arglist = [ |
| 166 | + self.keypairs[0].name, |
| 167 | + 'unexist_keypair', |
| 168 | + ] |
| 169 | + verifylist = [ |
| 170 | + ('name', arglist), |
| 171 | + ] |
| 172 | + |
| 173 | + parsed_args = self.check_parser(self.cmd, arglist, verifylist) |
| 174 | + |
| 175 | + find_mock_result = [self.keypairs[0], exceptions.CommandError] |
| 176 | + with mock.patch.object(utils, 'find_resource', |
| 177 | + side_effect=find_mock_result) as find_mock: |
| 178 | + try: |
| 179 | + self.cmd.take_action(parsed_args) |
| 180 | + self.fail('CommandError should be raised.') |
| 181 | + except exceptions.CommandError as e: |
| 182 | + self.assertEqual('1 of 2 public keys failed to delete.', |
| 183 | + str(e)) |
| 184 | + |
| 185 | + find_mock.assert_any_call( |
| 186 | + self.keypairs_mock, self.keypairs[0].name) |
| 187 | + find_mock.assert_any_call(self.keypairs_mock, 'unexist_keypair') |
| 188 | + |
| 189 | + self.assertEqual(2, find_mock.call_count) |
| 190 | + self.keypairs_mock.delete.assert_called_once_with( |
| 191 | + self.keypairs[0].name |
| 192 | + ) |
141 | 193 |
|
142 | 194 |
|
143 | 195 | class TestKeypairList(TestKeypair): |
|
0 commit comments