1
"""Tests for assess_multi_series_charms module."""
12
from assess_min_version import JujuAssertionError
13
from assess_multi_series_charms import (
15
assess_multi_series_charms,
24
from utility import temp_dir
27
class TestParseArgs(TestCase):
28
def test_common_args(self):
29
args = parse_args(["an-env", "/bin/juju", "/tmp/logs", "an-env-mod"])
30
self.assertEqual("an-env", args.env)
31
self.assertEqual("/bin/juju", args.juju_bin)
32
self.assertEqual("/tmp/logs", args.logs)
33
self.assertEqual("an-env-mod", args.temp_env_name)
34
self.assertEqual(False, args.debug)
37
fake_stdout = StringIO.StringIO()
38
with parse_error(self) as fake_stderr:
39
with patch("sys.stdout", fake_stdout):
40
parse_args(["--help"])
41
self.assertEqual("", fake_stderr.getvalue())
42
self.assertNotIn("TODO", fake_stdout.getvalue())
45
class TestMain(TestCase):
47
argv = ["an-env", "/bin/juju", "/tmp/logs", "an-env-mod", "--verbose"]
49
client = Mock(spec=["is_jes_enabled"])
50
with patch("assess_multi_series_charms.configure_logging",
51
autospec=True) as mock_cl:
52
with patch("assess_multi_series_charms.BootstrapManager."
54
autospec=True) as mock_bc:
55
with patch("jujupy.SimpleEnvironment.from_config",
56
return_value=env) as mock_e:
57
with patch("jujupy.EnvJujuClient.by_version",
58
return_value=client) as mock_c:
59
with patch("assess_multi_series_charms."
60
"assess_multi_series_charms",
61
autospec=True) as mock_assess:
63
mock_cl.assert_called_once_with(logging.DEBUG)
64
mock_e.assert_called_once_with("an-env")
65
mock_c.assert_called_once_with(env, "/bin/juju", debug=False)
66
self.assertEqual(mock_bc.call_count, 1)
67
mock_assess.assert_called_once_with(client)
70
class TestAssess(TestCase):
72
def test_assess_multi_series_charms(self):
74
spec=["deploy", "get_juju_output", "wait_for_started"])
75
mock_client.get_juju_output.return_value = "Codename: trusty"
76
mock_client.deploy.side_effect = [
77
subprocess.CalledProcessError(None, None),
83
with temp_dir() as charm_dir:
84
with patch('assess_multi_series_charms.temp_dir',
85
autospec=True) as td_mock:
86
td_mock.return_value.__enter__.return_value = charm_dir
87
with patch('assess_multi_series_charms.check_series',
88
autospec=True) as cs_mock:
89
assess_multi_series_charms(mock_client)
90
self.assertEqual(mock_client.wait_for_started.call_count, 4)
92
call(charm=charm_dir, force=False, series='precise',
94
call(charm=charm_dir, force=False, series=None, service='test1'),
95
call(charm=charm_dir, force=False, series='trusty',
97
call(charm=charm_dir, force=False, series='xenial',
99
call(charm=charm_dir, force=True, series='precise',
102
self.assertEqual(mock_client.deploy.mock_calls, calls)
103
td_mock.assert_called_once_with()
105
call(mock_client, machine='0', series=None),
106
call(mock_client, machine='1', series='trusty'),
107
call(mock_client, machine='2', series='xenial'),
108
call(mock_client, machine='3', series='precise')]
109
self.assertEqual(cs_mock.mock_calls, cs_calls)
111
def test_assert_deploy(self):
112
test = Test(series='trusty', service='test1', force=False,
113
success=True, machine='0')
115
spec=["deploy", "get_juju_output", "wait_for_started"])
116
assert_deploy(mock_client, test, '/tmp/foo')
117
mock_client.deploy.assert_called_once_with(
118
charm='/tmp/foo', force=False, series='trusty', service='test1')
120
def test_assert_deploy_success_false(self):
121
test = Test(series='trusty', service='test1', force=False,
122
success=False, machine='0')
124
spec=["deploy", "get_juju_output", "wait_for_started"])
125
mock_client.deploy.side_effect = subprocess.CalledProcessError(
127
assert_deploy(mock_client, test, '/tmp/foo')
128
mock_client.deploy.assert_called_once_with(
129
charm='/tmp/foo', force=False, series='trusty', service='test1')
131
def test_assert_deploy_success_false_raises_exception(self):
132
test = Test(series='trusty', service='test1', force=False,
133
success=False, machine='0')
135
spec=["deploy", "get_juju_output", "wait_for_started"])
136
with self.assertRaisesRegexp(
137
JujuAssertionError, 'Assert deploy failed for'):
138
assert_deploy(mock_client, test, '/tmp/foo')
139
mock_client.deploy.assert_called_once_with(
140
charm='/tmp/foo', force=False, series='trusty', service='test1')