203
200
mock_juju.assert_called_once_with('status', '--format', 'json')
206
@mock.patch('subprocess.check_output')
207
class TestJujuVersion(unittest.TestCase):
209
error = subprocess.CalledProcessError(2, 'invalid flag', 'output')
211
def test_pyjuju(self, mock_check_output):
212
# The pyJuju version is correctly retrieved.
213
mock_check_output.return_value = '0.7.2'
214
version = juju_version()
215
self.assertEqual(Version(0, 7, 2), version)
216
mock_check_output.assert_called_once_with(
217
['juju', '--version'], stderr=subprocess.STDOUT,
220
def test_juju_core(self, mock_check_output):
221
# The juju-core version is correctly retrieved.
222
mock_check_output.side_effect = (self.error, '1.12.3')
223
version = juju_version()
224
self.assertEqual(Version(1, 12, 3), version)
225
self.assertEqual(2, mock_check_output.call_count)
226
first_call, second_call = mock_check_output.call_args_list
228
mock.call(['juju', '--version'], stderr=subprocess.STDOUT),
231
self.assertEqual(mock.call(['juju', 'version']), second_call)
233
def test_not_semantic_versioning(self, mock_check_output):
234
# If the patch number is missing, it is set to zero.
235
mock_check_output.return_value = '0.7'
236
version = juju_version()
237
self.assertEqual(Version(0, 7, 0), version)
239
def test_prefix(self, mock_check_output):
240
# The function handles versions returned as "juju x.y.z".
241
mock_check_output.return_value = 'juju 0.8.3'
242
version = juju_version()
243
self.assertEqual(Version(0, 8, 3), version)
245
def test_suffix(self, mock_check_output):
246
# The function handles versions returned as "x.y.z-series-arch".
247
mock_check_output.return_value = '1.10.3-raring-amd64'
248
version = juju_version()
249
self.assertEqual(Version(1, 10, 3), version)
251
def test_all(self, mock_check_output):
252
# Additional information is correctly handled.
253
mock_check_output.side_effect = (self.error, 'juju 1.234-precise-i386')
254
version = juju_version()
255
self.assertEqual(Version(1, 234, 0), version)
256
self.assertEqual(2, mock_check_output.call_count)
258
def test_invalid_version(self, mock_check_output):
259
# A ValueError is raised if the returned version is not valid.
260
mock_check_output.return_value = '42'
261
with self.assertRaises(ValueError) as info:
263
self.assertEqual("invalid juju version: '42'", str(info.exception))
265
def test_failure(self, mock_check_output):
266
# A CalledProcessError is raised if the Juju version cannot be found.
267
mock_check_output.side_effect = (self.error, self.error)
268
with self.assertRaises(subprocess.CalledProcessError) as info:
270
self.assertIs(self.error, info.exception)
271
self.assertEqual(2, mock_check_output.call_count)
274
203
class TestProcessError(unittest.TestCase):
276
205
def test_str(self):