1 #
2 # Copyright (c) 2003 Richard Jones, richard@commonground.com.au
3 # This module is free software, and you may redistribute it and/or modify
4 # under the same terms as Python, so long as this copyright message and
5 # disclaimer are retained in their original form.
6 #
7 # This module is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 #
11 # $Id: test_hyperdbvals.py,v 1.3 2006-08-18 01:26:19 richard Exp $
13 import unittest, os, shutil, errno, sys, difflib, cgi, re, sha
15 from roundup import init, instance, password, hyperdb, date
17 class TestClass:
18 def getprops(self):
19 return {
20 'string': hyperdb.String(),
21 'number': hyperdb.Number(),
22 'boolean': hyperdb.Boolean(),
23 'password': hyperdb.Password(),
24 'date': hyperdb.Date(),
25 'interval': hyperdb.Interval(),
26 'link': hyperdb.Link('test'),
27 'link2': hyperdb.Link('test2'),
28 'multilink': hyperdb.Multilink('test'),
29 'multilink2': hyperdb.Multilink('test2'),
30 }
31 def getkey(self):
32 return 'string'
33 def lookup(self, value):
34 if value == 'valid':
35 return '1'
36 raise KeyError
37 def get(self, nodeid, propname):
38 assert propname.startswith('multilink')
39 assert nodeid is not None
40 return ['2', '3']
42 class TestClass2:
43 def properties(self):
44 return {
45 'string': hyperdb.String(),
46 }
47 def getkey(self):
48 return None
49 def labelprop(self, default_to_id=1):
50 return 'id'
52 class TestDatabase:
53 classes = {'test': TestClass(), 'test2': TestClass2()}
54 def getUserTimezone(self):
55 return 0
57 class RawToHyperdbTest(unittest.TestCase):
58 def _test(self, propname, value, itemid=None):
59 return hyperdb.rawToHyperdb(TestDatabase(), TestClass(), itemid,
60 propname, value)
61 def testString(self):
62 self.assertEqual(self._test('password', ''), None)
63 self.assertEqual(self._test('string', ' a string '), 'a string')
64 def testNumber(self):
65 self.assertEqual(self._test('password', ''), None)
66 self.assertEqual(self._test('number', ' 10 '), 10)
67 self.assertEqual(self._test('number', ' 1.5 '), 1.5)
68 def testBoolean(self):
69 self.assertEqual(self._test('password', ''), None)
70 for true in 'yes true on 1'.split():
71 self.assertEqual(self._test('boolean', ' %s '%true), 1)
72 for false in 'no false off 0'.split():
73 self.assertEqual(self._test('boolean', ' %s '%false), 0)
74 def testPassword(self):
75 self.assertEqual(self._test('password', ''), None)
76 self.assertEqual(self._test('password', ' a string '), 'a string')
77 val = self._test('password', ' a string ')
78 self.assert_(isinstance(val, password.Password))
79 val = self._test('password', '{plaintext}a string')
80 self.assert_(isinstance(val, password.Password))
81 val = self._test('password', '{crypt}a string')
82 self.assert_(isinstance(val, password.Password))
83 s = sha.sha('a string').hexdigest()
84 val = self._test('password', '{SHA}'+s)
85 self.assert_(isinstance(val, password.Password))
86 self.assertEqual(val, 'a string')
87 self.assertRaises(hyperdb.HyperdbValueError, self._test,
88 'password', '{fubar}a string')
89 def testDate(self):
90 self.assertEqual(self._test('password', ''), None)
91 val = self._test('date', ' 2003-01-01 ')
92 self.assert_(isinstance(val, date.Date))
93 val = self._test('date', ' 2003/01/01 ')
94 self.assert_(isinstance(val, date.Date))
95 val = self._test('date', ' 2003/1/1 ')
96 self.assert_(isinstance(val, date.Date))
97 val = self._test('date', ' 2003-1-1 ')
98 self.assert_(isinstance(val, date.Date))
99 self.assertRaises(hyperdb.HyperdbValueError, self._test, 'date',
100 'fubar')
101 def testInterval(self):
102 self.assertEqual(self._test('password', ''), None)
103 val = self._test('interval', ' +1d ')
104 self.assert_(isinstance(val, date.Interval))
105 self.assertRaises(hyperdb.HyperdbValueError, self._test, 'interval',
106 'fubar')
107 def testLink(self):
108 self.assertEqual(self._test('password', ''), None)
109 self.assertEqual(self._test('link', '1'), '1')
110 self.assertEqual(self._test('link', 'valid'), '1')
111 self.assertRaises(hyperdb.HyperdbValueError, self._test, 'link',
112 'invalid')
113 def testMultilink(self):
114 self.assertEqual(self._test('multilink', '', '1'), [])
115 self.assertEqual(self._test('multilink', '1', '1'), ['1'])
116 self.assertEqual(self._test('multilink', 'valid', '1'), ['1'])
117 self.assertRaises(hyperdb.HyperdbValueError, self._test, 'multilink',
118 'invalid', '1')
119 self.assertEqual(self._test('multilink', '+1', '1'), ['1', '2', '3'])
120 self.assertEqual(self._test('multilink', '+valid', '1'), ['1', '2',
121 '3'])
122 self.assertEqual(self._test('multilink', '+1,-2', '1'), ['1', '3'])
123 self.assertEqual(self._test('multilink', '+valid,-3', '1'), ['1', '2'])
124 self.assertEqual(self._test('multilink', '+1', None), ['1'])
125 self.assertEqual(self._test('multilink', '+valid', None), ['1'])
126 self.assertEqual(self._test('multilink', '', None), [])
128 def test_suite():
129 suite = unittest.TestSuite()
130 suite.addTest(unittest.makeSuite(RawToHyperdbTest))
131 return suite
133 if __name__ == '__main__':
134 runner = unittest.TextTestRunner()
135 unittest.main(testRunner=runner)
136 # vim: set filetype=python ts=4 sw=4 et si