Code

use config.DATABASE in cases where 'db' was still hard-coded
[roundup.git] / test / test_templating.py
index 12ad0e2e2a4e8eadaba3ca755eaecf9a330d63bb..ad6d7585ac94ee37522bc94d37b4f3edefc0462d 100644 (file)
@@ -12,23 +12,30 @@ class TemplatingTestCase(unittest.TestCase):
     def setUp(self):
         self.form = FieldStorage()
         self.client = MockNull()
-        self.client.db = MockDatabase()
+        self.client.db = db = MockDatabase()
+        db.security.hasPermission = lambda *args, **kw: True
         self.client.form = self.form
 
 class HTMLDatabaseTestCase(TemplatingTestCase):
     def test_HTMLDatabase___getitem__(self):
         db = HTMLDatabase(self.client)
         self.assert_(isinstance(db['issue'], HTMLClass))
-        self.assert_(isinstance(db['user'], HTMLUserClass))
-        self.assert_(isinstance(db['issue1'], HTMLItem))
-        self.assert_(isinstance(db['user1'], HTMLUser))
+        # following assertions are invalid
+        # since roundup/cgi/templating.py r1.173.
+        # HTMLItem is function, not class,
+        # but HTMLUserClass and HTMLUser are passed on.
+        # these classes are no more.  they have ceased to be.
+        #self.assert_(isinstance(db['user'], HTMLUserClass))
+        #self.assert_(isinstance(db['issue1'], HTMLItem))
+        #self.assert_(isinstance(db['user1'], HTMLUser))
 
     def test_HTMLDatabase___getattr__(self):
         db = HTMLDatabase(self.client)
         self.assert_(isinstance(db.issue, HTMLClass))
-        self.assert_(isinstance(db.user, HTMLUserClass))
-        self.assert_(isinstance(db.issue1, HTMLItem))
-        self.assert_(isinstance(db.user1, HTMLUser))
+        # see comment in test_HTMLDatabase___getitem__
+        #self.assert_(isinstance(db.user, HTMLUserClass))
+        #self.assert_(isinstance(db.issue1, HTMLItem))
+        #self.assert_(isinstance(db.user1, HTMLUser))
 
     def test_HTMLDatabase_classes(self):
         db = HTMLDatabase(self.client)
@@ -43,6 +50,7 @@ class FunctionsTestCase(TemplatingTestCase):
                 return '1'
             if key == 'fail':
                 raise KeyError, 'fail'
+            return key
         db._db.classes = {'issue': MockNull(lookup=lookup)}
         prop = MockNull(classname='issue')
         self.assertEqual(lookupIds(db._db, prop, ['1','2']), ['1','2'])
@@ -62,6 +70,88 @@ class FunctionsTestCase(TemplatingTestCase):
         self.assertEqual(lookupKeys(shrubbery, 'spam', ['ok','2']), ['ok',
             'eggs'])
 
+class HTMLClassTestCase(TemplatingTestCase) :
+
+    def test_link(self):
+        """Make sure lookup of a Link property works even in the
+        presence of multiple values in the form."""
+        def lookup(key) :
+            self.assertEqual(key, key.strip())
+            return "Status%s"%key
+        self.form.list.append(MiniFieldStorage("status", "1"))
+        self.form.list.append(MiniFieldStorage("status", "2"))
+        status = hyperdb.Link("status")
+        self.client.db.classes = dict \
+            ( issue = MockNull(getprops = lambda : dict(status = status))
+            , status  = MockNull(get = lambda id, name : id, lookup = lookup)
+            )
+        cls = HTMLClass(self.client, "issue")
+        cls["status"]
+
+    def test_multilink(self):
+        """`lookup` of an item will fail if leading or trailing whitespace
+           has not been stripped.
+        """
+        def lookup(key) :
+            self.assertEqual(key, key.strip())
+            return "User%s"%key
+        self.form.list.append(MiniFieldStorage("nosy", "1, 2"))
+        nosy = hyperdb.Multilink("user")
+        self.client.db.classes = dict \
+            ( issue = MockNull(getprops = lambda : dict(nosy = nosy))
+            , user  = MockNull(get = lambda id, name : id, lookup = lookup)
+            )
+        cls = HTMLClass(self.client, "issue")
+        cls["nosy"]
+
+    def test_url_match(self):
+        '''Test the URL regular expression in StringHTMLProperty.
+        '''
+        def t(s, nothing=False, **groups):
+            m = StringHTMLProperty.hyper_re.search(s)
+            if nothing:
+                if m:
+                    self.assertEquals(m, None, '%r matched (%r)'%(s, m.groupdict()))
+                return
+            else:
+                self.assertNotEquals(m, None, '%r did not match'%s)
+            d = m.groupdict()
+            for g in groups:
+                self.assertEquals(d[g], groups[g], '%s %r != %r in %r'%(g, d[g],
+                    groups[g], s))
+
+        #t('123.321.123.321', 'url')
+        t('http://localhost/', url='http://localhost/')
+        t('http://roundup.net/', url='http://roundup.net/')
+        t('http://richard@localhost/', url='http://richard@localhost/')
+        t('http://richard:sekrit@localhost/',
+            url='http://richard:sekrit@localhost/')
+        t('<HTTP://roundup.net/>', url='HTTP://roundup.net/')
+        t('www.a.ex', url='www.a.ex')
+        t('foo.a.ex', nothing=True)
+        t('StDevValidTimeSeries.GetObservation', nothing=True)
+        t('http://a.ex', url='http://a.ex')
+        t('http://a.ex/?foo&bar=baz\\.@!$%()qwerty',
+            url='http://a.ex/?foo&bar=baz\\.@!$%()qwerty')
+        t('www.foo.net', url='www.foo.net')
+        t('richard@com.example', email='richard@com.example')
+        t('r@a.com', email='r@a.com')
+        t('i1', **{'class':'i', 'id':'1'})
+        t('item123', **{'class':'item', 'id':'123'})
+        t('www.user:pass@host.net', email='pass@host.net')
+        t('user:pass@www.host.net', url='user:pass@www.host.net')
+        t('123.35', nothing=True)
+        t('-.3535', nothing=True)
+
+    def test_url_replace(self):
+        p = StringHTMLProperty(self.client, 'test', '1', None, 'test', '')
+        def t(s): return p.hyper_re.sub(p._hyper_repl, s)
+        ae = self.assertEquals
+        ae(t('http://roundup.net/'), '<a href="http://roundup.net/">http://roundup.net/</a>')
+        ae(t('&lt;HTTP://roundup.net/&gt;'), '&lt;<a href="HTTP://roundup.net/">HTTP://roundup.net/</a>&gt;')
+        ae(t('&lt;www.roundup.net&gt;'), '&lt;<a href="http://www.roundup.net">www.roundup.net</a>&gt;')
+        ae(t('item123123123123'), 'item123123123123')
+
 '''
 class HTMLPermissions:
     def is_edit_ok(self):
@@ -236,9 +326,11 @@ def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(HTMLDatabaseTestCase))
     suite.addTest(unittest.makeSuite(FunctionsTestCase))
+    suite.addTest(unittest.makeSuite(HTMLClassTestCase))
     return suite
 
 if __name__ == '__main__':
     runner = unittest.TextTestRunner()
     unittest.main(testRunner=runner)
 
+# vim: set et sts=4 sw=4 :