comparison tests/unit2.py @ 140:372315b3bb8e

stubbing
author Jeff Hammel <k0scist@gmail.com>
date Thu, 06 Nov 2014 07:41:05 -0800
parents
children
comparison
equal deleted inserted replaced
139:30abbd61ea5e 140:372315b3bb8e
1 #!/usr/bin/env python
2
3 """
4 unit tests for configuration package
5 """
6
7 import configuration
8 import datetime
9 import json
10 import os
11 import sys
12 import tempfile
13 import unittest
14
15 from example import ExampleConfiguration # example configuration to test
16
17 # globals
18 here = os.path.dirname(os.path.abspath(__file__))
19
20 class ConfigurationUnitTest(unittest.TestCase):
21
22 def test_cli(self):
23 """test command line interface"""
24
25 example = ExampleConfiguration()
26
27 # parse command line arguments
28 options, args = example.parse_args(['-a', 'ts', '--develop', '-e', '/home/jhammel/bin/firefox'])
29
30 # ensure that the options appropriately get set
31 self.assertEqual(bool(args), False) # no arguments
32 self.assertEqual(options.develop, True)
33 self.assertEqual(options.activeTests, ['ts'])
34 self.assertEqual(options.browser_path, '/home/jhammel/bin/firefox')
35
36 # ensure that the configuration appropriately gets updated
37 self.assertEqual(example.config['develop'], True)
38 self.assertEqual(example.config['activeTests'], ['ts'])
39 self.assertEqual(example.config['browser_path'], '/home/jhammel/bin/firefox')
40
41 def test_dict(self):
42 """test dictionary parsing from the "command line" """
43
44
45 # test adding a preference
46 example = ExampleConfiguration()
47 options, args = example.parse_args(['-a', 'ts', '--develop', '-e', '/home/jhammel/bin/firefox',
48 '--pref', 'hangmonitor.timeout=0'])
49 self.assertTrue('hangmonitor.timeout' in options.preferences)
50
51 # test overriding a preference
52 example = ExampleConfiguration()
53 options = example.parse_args(['-a', 'ts', '--develop', '-e', '/home/jhammel/bin/firefox',
54 '--pref', 'browser.bookmarks.max_backups=1'])
55 self.assertTrue(options.preferences['browser.bookmarks.max_backups'] == '1')
56
57
58 def test_configuration_providers(self):
59 """test file-based configuration providers"""
60 # requires json/simplejson to be installed
61
62 example = ExampleConfiguration()
63
64 # see what providers you got
65 json_provider = example.configuration_provider('json')
66 self.assertTrue(isinstance(json_provider, configuration.JSON))
67
68 # serialize to a temporary file
69 filename = tempfile.mktemp(suffix='.json')
70 self.assertEqual(example.filename2format(filename), 'json')
71 self.assertFalse(os.path.exists(filename))
72 config = {'browser_path': '/home/jhammel/bin/firefox',
73 'activeTests': ['ts']}
74 example(config)
75 config['test_timeout'] = 1200 # default
76 config['preferences'] = {"browser.bookmarks.max_backups": 0,
77 "browser.cache.disk.smart_size.enabled": False}
78
79 # ensure they are equal
80 self.assertEqual(config, example.config)
81 example.serialize(filename)
82 self.assertTrue(os.path.exists(filename))
83 serialized = json.loads(file(filename).read())
84 self.assertEqual(serialized, config)
85
86 # deserialize
87 deserialized = example.deserialize(filename)
88 self.assertEqual(deserialized, config)
89
90 # cleanup
91 if os.path.exists(filename):
92 os.remove(filename)
93
94 def test_missing_values(self):
95 """ensure that Configuration raises a missing value exception"""
96
97 example = ExampleConfiguration()
98
99 # monkey-patch the error method from optparse.OptionParser
100 error_msg = []
101 def error(msg):
102 error_msg.append(msg)
103 example.error = error
104
105 # trigger it
106 example.parse_args(args=[])
107 self.assertEqual(error_msg, ['Parameter browser_path is required but not present'])
108
109 def test_required(self):
110 """ensure you have to have required values"""
111
112 example = ExampleConfiguration()
113
114 # ensure you get an exception
115 missingvalueexception = None
116 try:
117 example()
118 except configuration.MissingValueException, e:
119 missingvalueexception = e
120 self.assertTrue(isinstance(e, configuration.MissingValueException))
121
122
123 def test_multiple_configurations(self):
124 """test having multiple configurations"""
125
126 # simple override
127 args1 = ['-e', '/opt/bin/firefox']
128
129 # simple serialized file
130 json_file = os.path.join(here, 'base.json')
131 assert os.path.exists(json_file)
132 json_config = json.loads(file(json_file).read())
133
134 # parse the json file
135 example = ExampleConfiguration()
136 example.parse_args([json_file])
137 self.assertEqual(example.config, json_config)
138
139 # parse the json file with overrides
140 example = ExampleConfiguration()
141 example.parse_args([json_file] + args1)
142 config = json_config.copy()
143 config['browser_path'] = '/opt/bin/firefox'
144 self.assertEqual(example.config, config)
145
146 # it shouldn't matter in which order the arguments are
147 example = ExampleConfiguration()
148 example.parse_args(args1 + [json_file])
149 self.assertEqual(example.config, config)
150
151 # Now a tricky case:
152 # the default value for test_timeout is 1200:
153 example = ExampleConfiguration()
154 self.assertEqual(example.options['test_timeout']['default'], 1200)
155 # The value from base.json is 60:
156 self.assertEqual(json_config['test_timeout'], 60)
157 self.assertEqual(config['test_timeout'], 60)
158 # but we can override it back from the "command line"
159 example.parse_args(args1 + [json_file, '--test_timeout', '1200'])
160 config['test_timeout'] = 1200
161 self.assertEqual(example.config, config)
162
163 def test_extend(self):
164
165 # default preferences
166 example = ExampleConfiguration()
167 default_prefs = {"browser.bookmarks.max_backups": 0,
168 "browser.cache.disk.smart_size.enabled": False}
169 example.parse_args(['-a', 'ts', '-e', '/opt/bin/firefox'])
170 self.assertEqual(example.config['preferences'], default_prefs)
171
172 # now extend them
173 example = ExampleConfiguration()
174 default_prefs['network.dns.ipv4OnlyDomains'] = 'localhost'
175 tf = tempfile.mktemp()
176 f = file(tf, 'w')
177 f.write(json.dumps({'preferences': {'network.dns.ipv4OnlyDomains': 'localhost'}}))
178 f.close()
179 example.parse_args(['-a', 'ts', '-e', '/opt/bin/firefox', tf])
180 self.assertEqual(example.config['preferences'], default_prefs)
181 os.remove(tf)
182
183 def test_typecast(self):
184 """casting example"""
185
186 def todate(string):
187 return datetime.datetime.strptime(string, "%Y%m%d")
188
189 # make an example class
190 class TypecastExample(configuration.Configuration):
191 options = {'datestring': {'type': todate}}
192 example = TypecastExample()
193
194 # parse a date string
195 example({'datestring': "20120704"})
196
197 # ensure it works correctly
198 expected = datetime.datetime(2012, 7, 4, 0, 0)
199 self.assertEqual(example.config['datestring'], expected)
200
201
202 def test_added(self):
203 """test that we keep track of things added to the configuration"""
204
205 # make an example class
206 class AddedExample(configuration.Configuration):
207 options = {'foo': {},
208 'bar': {}}
209
210 # parse it; there should be nothing
211 instance = AddedExample()
212 instance()
213 self.assertEqual(instance.added, set())
214
215 # parse it; there should be one thing
216 instance = AddedExample()
217 instance({'foo': 'foo'})
218 self.assertEqual(instance.added, set(['foo']))
219
220 # parse it; there should be two things
221 instance = AddedExample()
222 instance({'foo': 'foo'}, {'foo': 'FOO', 'bar': 'bar'})
223 self.assertEqual(instance.added, set(['foo', 'bar']))
224
225
226 if __name__ == '__main__':
227 unittest.main()