1
"""Tests for assess_multi_series_charms module."""
13
from assess_multi_series_charms import (
15
assess_multi_series_charms,
30
class TestParseArgs(TestCase):
31
def test_common_args(self):
32
args = parse_args(["an-env", "/bin/juju", "/tmp/logs", "an-env-mod"])
33
self.assertEqual("an-env", args.env)
34
self.assertEqual("/bin/juju", args.juju_bin)
35
self.assertEqual("/tmp/logs", args.logs)
36
self.assertEqual("an-env-mod", args.temp_env_name)
37
self.assertEqual(False, args.debug)
40
fake_stdout = StringIO.StringIO()
41
with parse_error(self) as fake_stderr:
42
with patch("sys.stdout", fake_stdout):
43
parse_args(["--help"])
44
self.assertEqual("", fake_stderr.getvalue())
45
self.assertNotIn("TODO", fake_stdout.getvalue())
48
class TestMain(TestCase):
50
argv = ["an-env", "/bin/juju", "/tmp/logs", "an-env-mod", "--verbose"]
51
client = Mock(spec=["is_jes_enabled"])
52
with patch("assess_multi_series_charms.configure_logging",
53
autospec=True) as mock_cl:
54
with patch("assess_multi_series_charms.BootstrapManager."
56
autospec=True) as mock_bc:
57
with patch("deploy_stack.client_from_config",
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_c.assert_called_once_with('an-env', "/bin/juju", debug=False)
65
self.assertEqual(mock_bc.call_count, 1)
66
mock_assess.assert_called_once_with(client)
69
class TestAssess(TestCase):
71
def test_assess_multi_series_charms(self):
73
spec=["deploy", "get_juju_output", "wait_for_started",
75
mock_client.version = '2.0.0'
76
mock_client.is_juju1x.return_value = False
77
mock_client.get_juju_output.return_value = "Codename: trusty"
78
mock_client.deploy.side_effect = [
79
subprocess.CalledProcessError(None, None),
85
with temp_dir() as charm_dir:
86
with patch('assess_multi_series_charms.temp_dir',
87
autospec=True) as td_mock:
88
td_mock.return_value.__enter__.return_value = charm_dir
89
with patch('assess_multi_series_charms.check_series',
90
autospec=True) as cs_mock:
91
assess_multi_series_charms(mock_client)
92
self.assertEqual(mock_client.wait_for_started.call_count, 4)
93
charm = os.path.join(charm_dir, 'trusty', 'dummy')
95
call(charm=charm, force=False, repository=charm_dir,
96
series='precise', service='test0'),
97
call(charm=charm, force=False, repository=charm_dir,
98
series=None, service='test1'),
99
call(charm=charm, force=False, repository=charm_dir,
100
series='trusty', service='test2'),
101
call(charm=charm, force=False, repository=charm_dir,
102
series='xenial', service='test3'),
103
call(charm=charm, force=True, repository=charm_dir,
104
series='precise', service='test4')
106
self.assertEqual(mock_client.deploy.mock_calls, calls)
107
td_mock.assert_called_once_with()
109
call(mock_client, machine='0', series=None),
110
call(mock_client, machine='1', series='trusty'),
111
call(mock_client, machine='2', series='xenial'),
112
call(mock_client, machine='3', series='precise')]
113
self.assertEqual(cs_mock.mock_calls, cs_calls)
115
def test_assess_multi_series_charms_juju1x(self):
118
"deploy", "get_juju_output", "wait_for_started", "is_juju1x"])
119
mock_client.version = '1.25.5'
120
mock_client.is_juju1x.return_value = True
121
mock_client.get_juju_output.return_value = "Codename: trusty"
122
mock_client.deploy.return_value = None
123
with temp_dir() as charm_dir:
124
with patch('assess_multi_series_charms.temp_dir',
125
autospec=True) as td_mock:
126
td_mock.return_value.__enter__.return_value = charm_dir
127
with patch('assess_multi_series_charms.check_series',
128
autospec=True) as cs_mock:
129
assess_multi_series_charms(mock_client)
130
self.assertEqual(mock_client.wait_for_started.call_count, 2)
131
charm = os.path.join('local:trusty', 'dummy')
133
call(charm=charm, force=False, repository=charm_dir,
134
series=None, service='test1'),
135
call(charm=charm, force=False, repository=charm_dir,
136
series='trusty', service='test2')
138
self.assertEqual(mock_client.deploy.mock_calls, calls)
139
td_mock.assert_called_once_with()
141
call(mock_client, machine='0', series=None),
142
call(mock_client, machine='1', series='trusty')]
143
self.assertEqual(cs_mock.mock_calls, cs_calls)
145
def test_assert_deploy(self):
146
test = Test(series='trusty', service='test1', force=False,
147
success=True, machine='0', juju1x_supported=False)
149
spec=["deploy", "get_juju_output", "wait_for_started"])
150
assert_deploy(mock_client, test, '/tmp/foo')
151
mock_client.deploy.assert_called_once_with(
152
charm='/tmp/foo', force=False, repository=None, series='trusty',
155
def test_assert_deploy_success_false(self):
156
test = Test(series='trusty', service='test1', force=False,
157
success=False, machine='0', juju1x_supported=False)
159
spec=["deploy", "get_juju_output", "wait_for_started"])
160
mock_client.deploy.side_effect = subprocess.CalledProcessError(
162
assert_deploy(mock_client, test, '/tmp/foo')
163
mock_client.deploy.assert_called_once_with(
164
charm='/tmp/foo', force=False, repository=None, series='trusty',
167
def test_assert_deploy_success_false_raises_exception(self):
168
test = Test(series='trusty', service='test1', force=False,
169
success=False, machine='0', juju1x_supported=False)
171
spec=["deploy", "get_juju_output", "wait_for_started"])
172
with self.assertRaisesRegexp(
173
JujuAssertionError, 'Assert deploy failed for'):
174
assert_deploy(mock_client, test, '/tmp/foo')
175
mock_client.deploy.assert_called_once_with(
176
charm='/tmp/foo', force=False, repository=None, series='trusty',