Allow printing playbook output to console
[functest-xtesting.git] / xtesting / tests / unit / core / test_ansible.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2021 Orange and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9
10 # pylint: disable=missing-docstring
11
12 import logging
13 import unittest
14
15 import mock
16 import munch
17
18 from xtesting.core import ansible
19
20
21 class RunTesting(unittest.TestCase):
22
23     def setUp(self):
24         self.test = ansible.Ansible()
25
26     @mock.patch("shutil.which", return_value=None)
27     def test_check1(self, which):
28         self.test.check_requirements()
29         self.assertEqual(self.test.is_skipped, True)
30         which.assert_called_once_with("ansible-playbook")
31
32     @mock.patch("shutil.which", return_value='/usr/bin/ansible-playbook')
33     def test_check2(self, which):
34         self.test.check_requirements()
35         self.assertEqual(self.test.is_skipped, False)
36         which.assert_called_once_with("ansible-playbook")
37
38     @mock.patch("os.path.isdir", return_value=False)
39     def test_fail1(self, isdir):
40         self.assertEqual(self.test.run(), self.test.EX_RUN_ERROR)
41         isdir.assert_not_called()
42
43     @mock.patch("os.path.isdir", return_value=False)
44     def test_fail2(self, isdir):
45         private_data_dir = "titi"
46         self.assertEqual(
47             self.test.run(private_data_dir=private_data_dir),
48             self.test.EX_RUN_ERROR)
49         isdir.assert_called_once_with(private_data_dir)
50
51     @mock.patch("ansible_runner.run", side_effect=Exception)
52     @mock.patch("os.makedirs")
53     @mock.patch("os.path.exists", return_value=True)
54     @mock.patch("os.path.isdir", return_value=True)
55     def test_fail3(self, *args):
56         private_data_dir = "titi"
57         self.assertEqual(
58             self.test.run(private_data_dir=private_data_dir),
59             self.test.EX_RUN_ERROR)
60         args[0].assert_called_once_with(private_data_dir)
61         args[1].assert_called_once_with(self.test.res_dir)
62         args[2].assert_not_called()
63         args[3].assert_called_with(
64             private_data_dir=private_data_dir, quiet=True,
65             artifact_dir=self.test.res_dir)
66
67     @mock.patch("ansible_runner.run", side_effect=Exception)
68     @mock.patch("os.makedirs")
69     @mock.patch("os.path.exists", return_value=False)
70     @mock.patch("os.path.isdir", return_value=True)
71     def test_fail4(self, *args):
72         private_data_dir = "titi"
73         self.assertEqual(
74             self.test.run(private_data_dir=private_data_dir),
75             self.test.EX_RUN_ERROR)
76         args[0].assert_called_once_with(private_data_dir)
77         args[1].assert_called_once_with(self.test.res_dir)
78         args[2].assert_called_once_with(self.test.res_dir)
79         args[3].assert_called_with(
80             private_data_dir=private_data_dir, quiet=True,
81             artifact_dir=self.test.res_dir)
82
83     @mock.patch("ansible_runner.run")
84     @mock.patch("os.makedirs", side_effect=Exception)
85     @mock.patch("os.path.exists", return_value=False)
86     @mock.patch("os.path.isdir", return_value=True)
87     def test_fail5(self, *args):
88         private_data_dir = "titi"
89         self.assertEqual(
90             self.test.run(private_data_dir=private_data_dir),
91             self.test.EX_RUN_ERROR)
92         args[0].assert_called_once_with(private_data_dir)
93         args[1].assert_called_once_with(self.test.res_dir)
94         args[2].assert_called_once_with(self.test.res_dir)
95         args[3].assert_not_called()
96
97     @mock.patch("ansible_runner.run", return_value={})
98     @mock.patch("os.makedirs")
99     @mock.patch("os.path.exists", return_value=False)
100     @mock.patch("os.path.isdir", return_value=True)
101     def test_fail6(self, *args):
102         private_data_dir = "titi"
103         self.assertEqual(
104             self.test.run(
105                 private_data_dir=private_data_dir, quiet=False,
106                 artifact_dir="overridden"),
107             self.test.EX_RUN_ERROR)
108         args[0].assert_called_once_with(private_data_dir)
109         args[1].assert_called_once_with(self.test.res_dir)
110         args[2].assert_called_once_with(self.test.res_dir)
111         args[3].assert_called_with(
112             private_data_dir=private_data_dir, quiet=False,
113             artifact_dir=self.test.res_dir)
114
115     @mock.patch("ansible_runner.run",
116                 return_value=munch.Munch(rc=0, stats={"foo": "bar"}))
117     @mock.patch("os.makedirs")
118     @mock.patch("os.path.exists", return_value=False)
119     @mock.patch("os.path.isdir", return_value=True)
120     def test_res_ok1(self, *args):
121         private_data_dir = "titi"
122         self.assertEqual(
123             self.test.run(
124                 private_data_dir=private_data_dir, quiet=False,
125                 artifact_dir="overridden"),
126             self.test.EX_OK)
127         args[0].assert_called_once_with(private_data_dir)
128         args[1].assert_called_once_with(self.test.res_dir)
129         args[2].assert_called_once_with(self.test.res_dir)
130         args[3].assert_called_with(
131             private_data_dir=private_data_dir, quiet=False,
132             artifact_dir=self.test.res_dir)
133         self.assertEqual(self.test.is_successful(), self.test.EX_OK)
134         self.assertEqual(self.test.details, {"foo": "bar"})
135
136     @mock.patch("ansible_runner.run",
137                 return_value=munch.Munch(rc=0, stats={"foo": "bar"}))
138     @mock.patch("os.makedirs")
139     @mock.patch("os.path.exists", return_value=False)
140     @mock.patch("os.path.isdir", return_value=True)
141     def test_res_ok2(self, *args):
142         private_data_dir = "titi"
143         self.assertEqual(
144             self.test.run(
145                 private_data_dir=private_data_dir, quiet=True,
146                 artifact_dir="overridden"),
147             self.test.EX_OK)
148         args[0].assert_called_once_with(private_data_dir)
149         args[1].assert_called_once_with(self.test.res_dir)
150         args[2].assert_called_once_with(self.test.res_dir)
151         args[3].assert_called_with(
152             private_data_dir=private_data_dir, quiet=True,
153             artifact_dir=self.test.res_dir)
154         self.assertEqual(self.test.is_successful(), self.test.EX_OK)
155         self.assertEqual(self.test.details, {"foo": "bar"})
156
157     @mock.patch("ansible_runner.run",
158                 return_value=munch.Munch(rc=0, stats={"foo": "bar"}))
159     @mock.patch("os.makedirs")
160     @mock.patch("os.path.exists", return_value=False)
161     @mock.patch("os.path.isdir", return_value=True)
162     def test_res_ok3(self, *args):
163         private_data_dir = "titi"
164         self.assertEqual(
165             self.test.run(
166                 private_data_dir=private_data_dir, artifact_dir="overridden"),
167             self.test.EX_OK)
168         args[0].assert_called_once_with(private_data_dir)
169         args[1].assert_called_once_with(self.test.res_dir)
170         args[2].assert_called_once_with(self.test.res_dir)
171         args[3].assert_called_with(
172             private_data_dir=private_data_dir, quiet=True,
173             artifact_dir=self.test.res_dir)
174         self.assertEqual(self.test.is_successful(), self.test.EX_OK)
175         self.assertEqual(self.test.details, {"foo": "bar"})
176
177     @mock.patch("ansible_runner.run",
178                 return_value=munch.Munch(rc=1, stats={"foo": "bar"}))
179     @mock.patch("os.makedirs")
180     @mock.patch("os.path.exists", return_value=False)
181     @mock.patch("os.path.isdir", return_value=True)
182     def test_res_ko(self, *args):
183         private_data_dir = "titi"
184         self.assertEqual(
185             self.test.run(
186                 private_data_dir=private_data_dir, artifact_dir="overridden"),
187             self.test.EX_OK)
188         args[0].assert_called_once_with(private_data_dir)
189         args[1].assert_called_once_with(self.test.res_dir)
190         args[2].assert_called_once_with(self.test.res_dir)
191         args[3].assert_called_with(
192             private_data_dir=private_data_dir, quiet=True,
193             artifact_dir=self.test.res_dir)
194         self.assertEqual(self.test.is_successful(),
195                          self.test.EX_TESTCASE_FAILED)
196         self.assertEqual(self.test.details, {"foo": "bar"})
197
198
199 if __name__ == "__main__":
200     logging.disable(logging.CRITICAL)
201     unittest.main(verbosity=2)