1
# Copyright (C) 2008-2011, 2016 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Tests for finding, parsing and searching rule-based preferences."""
28
class TestIniBasedRulesSearcher(tests.TestCase):
30
def make_searcher(self, text):
31
"""Make a _RulesSearcher from a string"""
35
lines = text.splitlines()
36
return rules._IniBasedRulesSearcher(lines)
38
def test_unknown_namespace(self):
39
self.assertRaises(errors.UnknownRules, rules._IniBasedRulesSearcher,
40
["[junk]", "foo=bar"])
42
def test_get_items_file_missing(self):
43
rs = self.make_searcher(None)
44
self.assertEqual((), rs.get_items('a.txt'))
45
self.assertEqual((), rs.get_selected_items('a.txt', ['foo']))
46
self.assertEqual(None, rs.get_single_value('a.txt', 'foo'))
48
def test_get_items_file_empty(self):
49
rs = self.make_searcher("")
50
self.assertEqual((), rs.get_items('a.txt'))
51
self.assertEqual((), rs.get_selected_items('a.txt', ['foo']))
52
self.assertEqual(None, rs.get_single_value('a.txt', 'foo'))
54
def test_get_items_from_extension_match(self):
55
rs = self.make_searcher("[name *.txt]\nfoo=bar\na=True\n")
56
self.assertEqual((), rs.get_items('a.py'))
57
self.assertEqual((('foo', 'bar'), ('a', 'True')),
58
rs.get_items('a.txt'))
59
self.assertEqual((('foo', 'bar'), ('a', 'True')),
60
rs.get_items('dir/a.txt'))
61
self.assertEqual((('foo', 'bar'),),
62
rs.get_selected_items('a.txt', ['foo']))
63
self.assertEqual('bar', rs.get_single_value('a.txt', 'foo'))
65
def test_get_items_from_multiple_glob_match(self):
66
rs = self.make_searcher(
67
"[name *.txt *.py 'x x' \"y y\"]\nfoo=bar\na=True\n")
68
self.assertEqual((), rs.get_items('NEWS'))
69
self.assertEqual((('foo', 'bar'), ('a', 'True')),
71
self.assertEqual((('foo', 'bar'), ('a', 'True')),
72
rs.get_items('a.txt'))
73
self.assertEqual((('foo', 'bar'), ('a', 'True')),
75
self.assertEqual((('foo', 'bar'), ('a', 'True')),
77
self.assertEqual('bar', rs.get_single_value('a.txt', 'foo'))
79
def test_get_items_pathname_match(self):
80
rs = self.make_searcher("[name ./a.txt]\nfoo=baz\n")
81
self.assertEqual((('foo', 'baz'),),
82
rs.get_items('a.txt'))
83
self.assertEqual('baz', rs.get_single_value('a.txt', 'foo'))
84
self.assertEqual((), rs.get_items('dir/a.txt'))
85
self.assertEqual(None, rs.get_single_value('dir/a.txt', 'foo'))
87
def test_get_items_match_first(self):
88
rs = self.make_searcher(
89
"[name ./a.txt]\nfoo=baz\n"
90
"[name *.txt]\nfoo=bar\na=True\n")
91
self.assertEqual((('foo', 'baz'),),
92
rs.get_items('a.txt'))
93
self.assertEqual('baz', rs.get_single_value('a.txt', 'foo'))
94
self.assertEqual((('foo', 'bar'), ('a', 'True')),
95
rs.get_items('dir/a.txt'))
96
self.assertEqual('bar', rs.get_single_value('dir/a.txt', 'foo'))
99
class TestStackedRulesSearcher(tests.TestCase):
101
def make_searcher(self, text1=None, text2=None):
102
"""Make a _StackedRulesSearcher with 0, 1 or 2 items"""
104
if text1 is not None:
105
searchers.append(rules._IniBasedRulesSearcher(
107
if text2 is not None:
108
searchers.append(rules._IniBasedRulesSearcher(
110
return rules._StackedRulesSearcher(searchers)
112
def test_stack_searching(self):
113
rs = self.make_searcher(
114
"[name ./a.txt]\nfoo=baz\n",
115
"[name *.txt]\nfoo=bar\na=True\n")
116
self.assertEqual((('foo', 'baz'),),
117
rs.get_items('a.txt'))
118
self.assertEqual('baz', rs.get_single_value('a.txt', 'foo'))
119
self.assertEqual(None, rs.get_single_value('a.txt', 'a'))
120
self.assertEqual((('foo', 'bar'), ('a', 'True')),
121
rs.get_items('dir/a.txt'))
122
self.assertEqual('bar', rs.get_single_value('dir/a.txt', 'foo'))
123
self.assertEqual('True', rs.get_single_value('dir/a.txt', 'a'))
126
class TestRulesPath(tests.TestCase):
129
super(TestRulesPath, self).setUp()
130
self.overrideEnv('HOME', '/home/bogus')
131
if sys.platform == 'win32':
133
'BZR_HOME', r'C:\Documents and Settings\bogus\Application Data')
135
'C:/Documents and Settings/bogus/Application Data/bazaar/2.0'
137
self.bzr_home = '/home/bogus/.bazaar'
139
def test_rules_filename(self):
140
self.assertEqual(rules.rules_filename(),
141
self.bzr_home + '/rules')