summaryrefslogtreecommitdiffstats
path: root/tests/cmd/test_config.py
blob: ecae8a9affcd3820ac797f32a3b586cd9e5583bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import io
import os

from mock import patch
from tests.base import mock
from tests.cmd.test_cmd import CmdTestsBase

from jenkins_jobs.cli import entry
from jenkins_jobs import builder


@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)