118ac858c4
The 'mock' package is imported in 'tests.base'. Whenever possible 'tests.base' prefers 'unittest.mock' over 'mock' (which is the case on Python 3.3+). Importing 'mock' together with 'unittest.mock' causes unexpected behavior that results in exceptions when running tests, at least on Python 3.6.12, like: > File "/usr/lib/python3.6/unittest/mock.py", line 1196, in patched > patching.__exit__(*exc_info) > > File "/home/zuul/src/opendev.org/jjb/jenkins-job-builder/.tox/cover/lib/python3.6/site-packages/mock/mock.py", line 1545, in __exit__ > return exit_stack.__exit__(*exc_info) > > File "/usr/lib/python3.6/contextlib.py", line 339, in __exit__ > received_exc = exc_details[0] is not None > > IndexError: tuple index out of range From now on, to avoid similar issues in the future, the 'mock' package is only installed for Python 2.x. Change-Id: Ib3044312f0770735d88d8657d1f953e5a33e771f
161 lines
6.0 KiB
Python
161 lines
6.0 KiB
Python
import io
|
|
import os
|
|
|
|
from tests.base import mock
|
|
from tests.cmd.test_cmd import CmdTestsBase
|
|
|
|
from jenkins_jobs.cli import entry
|
|
from jenkins_jobs import builder
|
|
|
|
patch = mock.patch
|
|
|
|
|
|
@mock.patch("jenkins_jobs.builder.JenkinsManager.get_plugins_info", mock.MagicMock)
|
|
class TestConfigs(CmdTestsBase):
|
|
|
|
global_conf = "/etc/jenkins_jobs/jenkins_jobs.ini"
|
|
user_conf = os.path.join(
|
|
os.path.expanduser("~"), ".config", "jenkins_jobs", "jenkins_jobs.ini"
|
|
)
|
|
local_conf = os.path.join(os.path.dirname(__file__), "jenkins_jobs.ini")
|
|
|
|
def test_use_global_config(self):
|
|
"""
|
|
Verify that JJB uses the global config file by default
|
|
"""
|
|
|
|
args = ["test", "foo"]
|
|
conffp = io.open(self.default_config_file, "r", encoding="utf-8")
|
|
|
|
with patch("os.path.isfile", return_value=True) as m_isfile:
|
|
|
|
def side_effect(path):
|
|
if path == self.global_conf:
|
|
return True
|
|
return False
|
|
|
|
m_isfile.side_effect = side_effect
|
|
|
|
with patch("io.open", return_value=conffp) as m_open:
|
|
entry.JenkinsJobs(args, config_file_required=True)
|
|
m_open.assert_called_with(self.global_conf, "r", encoding="utf-8")
|
|
|
|
def test_use_config_in_user_home(self):
|
|
"""
|
|
Verify that JJB uses config file in user home folder
|
|
"""
|
|
|
|
args = ["test", "foo"]
|
|
|
|
conffp = io.open(self.default_config_file, "r", encoding="utf-8")
|
|
with patch("os.path.isfile", return_value=True) as m_isfile:
|
|
|
|
def side_effect(path):
|
|
if path == self.user_conf:
|
|
return True
|
|
return False
|
|
|
|
m_isfile.side_effect = side_effect
|
|
with patch("io.open", return_value=conffp) as m_open:
|
|
entry.JenkinsJobs(args, config_file_required=True)
|
|
m_open.assert_called_with(self.user_conf, "r", encoding="utf-8")
|
|
|
|
def test_non_existing_config_dir(self):
|
|
"""
|
|
Run test mode and pass a non-existing configuration directory
|
|
"""
|
|
args = ["--conf", self.default_config_file, "test", "foo"]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
self.assertRaises(IOError, jenkins_jobs.execute)
|
|
|
|
def test_non_existing_config_file(self):
|
|
"""
|
|
Run test mode and pass a non-existing configuration file
|
|
"""
|
|
args = ["--conf", self.default_config_file, "test", "non-existing.yaml"]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
self.assertRaises(IOError, jenkins_jobs.execute)
|
|
|
|
def test_config_options_not_replaced_by_cli_defaults(self):
|
|
"""
|
|
Run test mode and check config settings from conf file retained
|
|
when none of the global CLI options are set.
|
|
"""
|
|
config_file = os.path.join(self.fixtures_path, "settings_from_config.ini")
|
|
args = ["--conf", config_file, "test", "dummy.yaml"]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
jjb_config = jenkins_jobs.jjb_config
|
|
self.assertEqual(jjb_config.jenkins["user"], "jenkins_user")
|
|
self.assertEqual(jjb_config.jenkins["password"], "jenkins_password")
|
|
self.assertEqual(jjb_config.builder["ignore_cache"], True)
|
|
self.assertEqual(jjb_config.builder["flush_cache"], True)
|
|
self.assertEqual(jjb_config.builder["update"], "all")
|
|
self.assertEqual(jjb_config.yamlparser["allow_empty_variables"], True)
|
|
|
|
def test_config_options_overriden_by_cli(self):
|
|
"""
|
|
Run test mode and check config settings from conf file retained
|
|
when none of the global CLI options are set.
|
|
"""
|
|
args = [
|
|
"--user",
|
|
"myuser",
|
|
"--password",
|
|
"mypassword",
|
|
"--ignore-cache",
|
|
"--flush-cache",
|
|
"--allow-empty-variables",
|
|
"test",
|
|
"dummy.yaml",
|
|
]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
jjb_config = jenkins_jobs.jjb_config
|
|
self.assertEqual(jjb_config.jenkins["user"], "myuser")
|
|
self.assertEqual(jjb_config.jenkins["password"], "mypassword")
|
|
self.assertEqual(jjb_config.builder["ignore_cache"], True)
|
|
self.assertEqual(jjb_config.builder["flush_cache"], True)
|
|
self.assertEqual(jjb_config.yamlparser["allow_empty_variables"], True)
|
|
|
|
@mock.patch("jenkins_jobs.cli.subcommand.update.JenkinsManager")
|
|
def test_update_timeout_not_set(self, jenkins_mock):
|
|
"""Check that timeout is left unset
|
|
|
|
Test that the Jenkins object has the timeout set on it only when
|
|
provided via the config option.
|
|
"""
|
|
|
|
path = os.path.join(self.fixtures_path, "cmd-002.yaml")
|
|
args = ["--conf", self.default_config_file, "update", path]
|
|
|
|
jenkins_mock.return_value.update_jobs.return_value = ([], 0)
|
|
jenkins_mock.return_value.update_views.return_value = ([], 0)
|
|
self.execute_jenkins_jobs_with_args(args)
|
|
|
|
# validate that the JJBConfig used to initialize builder.Jenkins
|
|
# contains the expected timeout value.
|
|
|
|
jjb_config = jenkins_mock.call_args[0][0]
|
|
self.assertEqual(jjb_config.jenkins["timeout"], builder._DEFAULT_TIMEOUT)
|
|
|
|
@mock.patch("jenkins_jobs.cli.subcommand.update.JenkinsManager")
|
|
def test_update_timeout_set(self, jenkins_mock):
|
|
"""Check that timeout is set correctly
|
|
|
|
Test that the Jenkins object has the timeout set on it only when
|
|
provided via the config option.
|
|
"""
|
|
|
|
path = os.path.join(self.fixtures_path, "cmd-002.yaml")
|
|
config_file = os.path.join(self.fixtures_path, "non-default-timeout.ini")
|
|
args = ["--conf", config_file, "update", path]
|
|
|
|
jenkins_mock.return_value.update_jobs.return_value = ([], 0)
|
|
jenkins_mock.return_value.update_views.return_value = ([], 0)
|
|
self.execute_jenkins_jobs_with_args(args)
|
|
|
|
# validate that the JJBConfig used to initialize builder.Jenkins
|
|
# contains the expected timeout value.
|
|
|
|
jjb_config = jenkins_mock.call_args[0][0]
|
|
self.assertEqual(jjb_config.jenkins["timeout"], 0.2)
|