aboutsummaryrefslogtreecommitdiff
blob: 4ad8011d3a64fb6f97e29a31238985b234400575 (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
import textwrap

import pytest
from pkgcheck import cli
from snakeoil.cli import arghparse


class TestConfigFileParser:

    @pytest.fixture(autouse=True)
    def _create_argparser(self, tmp_path):
        self.config_file = str(tmp_path / 'config')
        self.parser = arghparse.ArgumentParser()
        self.namespace = arghparse.Namespace()
        self.config_parser = cli.ConfigFileParser(self.parser)

    def test_no_configs(self):
        config = self.config_parser.parse_config(())
        assert config.sections() == []
        namespace = self.config_parser.parse_config_options(self.namespace)
        assert vars(namespace) == {}

    def test_ignored_configs(self):
        # nonexistent config files are ignored
        config = self.config_parser.parse_config(('foo', 'bar'))
        assert config.sections() == []

    def test_bad_config_format(self, capsys):
        with open(self.config_file, 'w') as f:
            f.write('foobar\n')
        with pytest.raises(SystemExit) as excinfo:
            self.config_parser.parse_config((self.config_file,))
        out, err = capsys.readouterr()
        assert not out
        assert 'parsing config file failed:' in err
        assert excinfo.value.code == 2

    def test_nonexistent_config_options(self, capsys):
        """Nonexistent parser arguments cause errors."""
        with open(self.config_file, 'w') as f:
            f.write(textwrap.dedent("""
                [DEFAULT]
                foo=bar
            """))
        with pytest.raises(SystemExit) as excinfo:
            self.config_parser.parse_config_options(self.namespace, configs=[self.config_file])
        out, err = capsys.readouterr()
        assert not out
        assert 'failed loading config: unknown arguments: --foo=bar' in err
        assert excinfo.value.code == 2

    def test_config_options(self):
        self.parser.add_argument('--foo')
        with open(self.config_file, 'w') as f:
            f.write(textwrap.dedent("""
                [DEFAULT]
                foo=bar
            """))
        namespace = self.parser.parse_args(['--foo', 'foo'])
        assert namespace.foo == 'foo'
        # config args override matching namespace attrs
        namespace = self.config_parser.parse_config_options(namespace, configs=[self.config_file])
        assert namespace.foo == 'bar'

    def test_config_checksets(self):
        namespace = self.parser.parse_args([])
        namespace.config_checksets = {}

        # checksets section exists with no entries
        with open(self.config_file, 'w') as f:
            f.write(textwrap.dedent("""
                [CHECKSETS]
            """))
        namespace = self.config_parser.parse_config_options(namespace, configs=[self.config_file])
        assert namespace.config_checksets == {}

        # checksets section with entries including empty set
        with open(self.config_file, 'w') as f:
            f.write(textwrap.dedent("""
                [CHECKSETS]
                set1=keyword
                set2=check,-keyword
                set3=
            """))
        namespace = self.config_parser.parse_config_options(namespace, configs=[self.config_file])
        assert namespace.config_checksets == {'set1': ['keyword'], 'set2': ['check', '-keyword']}