summaryrefslogtreecommitdiff
path: root/git/test/test_config.py
blob: dc4b52dcfea3521ead6188a20496125cda2a1f7e (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
# test_config.py
# Copyright (C) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors
#
# This module is part of GitPython and is released under
# the BSD License: http://www.opensource.org/licenses/bsd-license.php

from git.test.lib import TestBase, fixture_path
import StringIO
from git.config import *
from copy import copy
from ConfigParser import NoSectionError


class TestConfig(TestBase):

    def _to_memcache(self, file_path):
        fp = open(file_path, "r")
        sio = StringIO.StringIO(fp.read())
        sio.name = file_path
        return sio

    def _parsers_equal_or_raise(self, lhs, rhs):
        pass

    def test_read_write(self):
        # writer must create the exact same file as the one read before
        for filename in ("git_config", "git_config_global"):
            file_obj = self._to_memcache(fixture_path(filename))
            file_obj_orig = copy(file_obj)
            w_config = GitConfigParser(file_obj, read_only=False)
            w_config.read()                 # enforce reading
            assert w_config._sections
            w_config.write()                # enforce writing

            # we stripped lines when reading, so the results differ
            assert file_obj.getvalue() != file_obj_orig.getvalue()

            # creating an additional config writer must fail due to exclusive access
            self.failUnlessRaises(IOError, GitConfigParser, file_obj, read_only=False)

            # should still have a lock and be able to make changes
            assert w_config._lock._has_lock()

            # changes should be written right away
            sname = "my_section"
            oname = "mykey"
            val = "myvalue"
            w_config.add_section(sname)
            assert w_config.has_section(sname)
            w_config.set(sname, oname, val)
            assert w_config.has_option(sname, oname)
            assert w_config.get(sname, oname) == val

            sname_new = "new_section"
            oname_new = "new_key"
            ival = 10
            w_config.set_value(sname_new, oname_new, ival)
            assert w_config.get_value(sname_new, oname_new) == ival

            file_obj.seek(0)
            r_config = GitConfigParser(file_obj, read_only=True)
            # print file_obj.getvalue()
            assert r_config.has_section(sname)
            assert r_config.has_option(sname, oname)
            assert r_config.get(sname, oname) == val
        # END for each filename

    def test_base(self):
        path_repo = fixture_path("git_config")
        path_global = fixture_path("git_config_global")
        r_config = GitConfigParser([path_repo, path_global], read_only=True)
        assert r_config.read_only
        num_sections = 0
        num_options = 0

        # test reader methods
        assert r_config._is_initialized == False
        for section in r_config.sections():
            num_sections += 1
            if section != 'filter "indent"':
                for option in r_config.options(section):
                    num_options += 1
                    val = r_config.get(section, option)
                    val_typed = r_config.get_value(section, option)
                    assert isinstance(val_typed, (bool, long, float, basestring))
                    assert val
                    assert "\n" not in option
                    assert "\n" not in val

                    # writing must fail
                    self.failUnlessRaises(IOError, r_config.set, section, option, None)
                    self.failUnlessRaises(IOError, r_config.remove_option, section, option)
            else:
                val = r_config.get(section, 'required')
                assert val is None
            # END for each option
            self.failUnlessRaises(IOError, r_config.remove_section, section)
        # END for each section
        assert num_sections and num_options
        assert r_config._is_initialized == True

        # get value which doesnt exist, with default
        default = "my default value"
        assert r_config.get_value("doesnt", "exist", default) == default

        # it raises if there is no default though
        self.failUnlessRaises(NoSectionError, r_config.get_value, "doesnt", "exist")

    def test_values(self):
        file_obj = self._to_memcache(fixture_path("git_config_values"))
        w_config = GitConfigParser(file_obj, read_only=False)
        w_config.write()  # enforce writing
        orig_value = file_obj.getvalue()

        # Reading must unescape backslashes
        backslash = w_config.get('values', 'backslash')
        assert backslash == r'some\data'

        # Reading must unescape quotes
        quote = w_config.get('values', 'quote')
        assert quote == 'this is a "quoted value"'

        # Reading must remove surrounding quotes
        quoted = w_config.get('values', 'quoted')
        assert quoted == 'all your "quotes" are belong to us'

        # Writing must escape backslashes and quotes
        w_config.set('values', 'backslash', backslash)
        w_config.set('values', 'quote', quote)
        w_config.write()  # enforce writing

        # Contents shouldn't differ
        assert file_obj.getvalue() == orig_value