diff options
author | Marcel Hellkamp <marc@gsites.de> | 2009-12-08 08:47:12 +0100 |
---|---|---|
committer | Marcel Hellkamp <marc@gsites.de> | 2009-12-08 08:47:12 +0100 |
commit | 5bc132db68b5efdd5160a056127f9dc582bd1e26 (patch) | |
tree | ea67a4f8ad4975de692f1337c7c9998956993feb /test | |
parent | 66ccf95229e41db8e236e86e77b86bb6aea84c24 (diff) | |
download | bottle-5bc132db68b5efdd5160a056127f9dc582bd1e26.tar.gz |
Optimized test setup and minor changes
Diffstat (limited to 'test')
-rw-r--r-- | test/doctest_router.txt | 110 | ||||
-rw-r--r-- | test/doctest_securecookies.txt | 14 | ||||
-rw-r--r-- | test/test_environ.py | 6 | ||||
-rw-r--r-- | test/test_jinja2.py | 7 | ||||
-rw-r--r-- | test/test_mako.py | 4 | ||||
-rw-r--r-- | test/test_router.py | 45 | ||||
-rw-r--r-- | test/test_securecookies.py | 21 | ||||
-rw-r--r-- | test/test_sendfile.py | 4 | ||||
-rw-r--r-- | test/test_stpl.py | 9 | ||||
-rw-r--r-- | test/test_templates.py | 3 | ||||
-rw-r--r-- | test/test_wsgi.py | 4 | ||||
-rw-r--r-- | test/testall.py | 25 |
12 files changed, 80 insertions, 172 deletions
diff --git a/test/doctest_router.txt b/test/doctest_router.txt deleted file mode 100644 index 71f0fab..0000000 --- a/test/doctest_router.txt +++ /dev/null @@ -1,110 +0,0 @@ -This is a test file for Router docstring tests. - - >>> import bottle - >>> r = bottle.Router() - >>> r.add('/static', 'static') - >>> r.add('/\\:its/:#.+#/:test/:name#[a-z]+#/', 'handler') - >>> r.add('/:test', 'notail') - >>> r.add(':test/', 'nohead') - >>> r.add(':test', 'fullmatch') - >>> r.add('/:#anon#/match', 'anon') - >>> r.match('/static') - ('static', None) - >>> r.match('/:its/a/cruel/world/') - ('handler', {'test': 'cruel', 'name': 'world'}) - >>> r.match('/test') - ('notail', {'test': 'test'}) - >>> r.match('test/') - ('nohead', {'test': 'test'}) - >>> r.match('test') - ('fullmatch', {'test': 'test'}) - >>> r.match('/anon/match') - ('anon', None) - >>> r.match('//no/m/at/ch/') - (None, None) - -Buggy regular expressions should produce useful error messages - - >>> r = bottle.Router() - >>> r.add('/:bug#(#/', 'buggy') - Traceback (most recent call last): - RouteSyntaxError: Syntax error in '/:bug#(#/' offset 6: error('unbalanced parenthesis',) - -Tests for the route builder and named routes. - - >>> r = bottle.Router() - >>> r.add('/:test/:name#[a-z]+#/', 'handler', name='testroute') - >>> r.add('/anon/:#.#', 'handler', name='anonroute') - >>> r.build('testroute', test='hello', name='world') - '/hello/world/' - -Many thinks can go wrong. Here is a complete list of possible exceptions when building routes. - - >>> r.build('test') - Traceback (most recent call last): - RouteBuildError: No route found with name 'test'. - - >>> r.build('testroute') - Traceback (most recent call last): - RouteBuildError: Missing parameter 'test' in route 'testroute' - - >>> r.build('testroute', test='hello', name='1234') - Traceback (most recent call last): - RouteBuildError: Parameter 'name' does not match pattern for route 'testroute': '[a-z]+' - - >>> r.build('anonroute') - Traceback (most recent call last): - RouteBuildError: Anonymous pattern found. Can't generate the route 'anonroute'. - -Mismatches: This are way to much tests, most of them redundant or useless. But tests are cheap :) - - >>> r = bottle.Router() - >>> r.add('some/:path', 1) - >>> r.match('some/test') - (1, {'path': 'test'}) - >>> r.match('some/') - (None, None) - >>> r.match('some/test/') - (None, None) - >>> r.match('somee/test') - (None, None) - - >>> r = bottle.Router() - >>> r.add('some/:path/', 2) - >>> r.match('some/test/') - (2, {'path': 'test'}) - >>> r.match('some//') - (None, None) - >>> r.match('some/') - (None, None) - >>> r.match('some/test') - (None, None) - >>> r.match('some/test//') - (None, None) - - >>> r = bottle.Router() - >>> r.add(':path/some', 3) - >>> r.match('test/some') - (3, {'path': 'test'}) - >>> r.match('/some') - (None, None) - >>> r.match('some') - (None, None) - - >>> r = bottle.Router() - >>> r.add('/hey:foo/:bar', 4) - >>> r.match('/hey1/2') - (4, {'foo': '1', 'bar': '2'}) - >>> r.match('/hey/1/2') - (None, None) - - >>> r = bottle.Router() - >>> r.add('some/:path#with([ a-z]+)[0-9]#', 1) - >>> r.match('some/withnumbers 4') - (1, {'path': 'withnumbers 4'}) - >>> r.match('some/with 4') - (1, {'path': 'with 4'}) - >>> r.match('some/number 4') - (None, None) - >>> r.match('some/letters') - (None, None) diff --git a/test/doctest_securecookies.txt b/test/doctest_securecookies.txt deleted file mode 100644 index c955c6f..0000000 --- a/test/doctest_securecookies.txt +++ /dev/null @@ -1,14 +0,0 @@ -Secure cookies are signed, but not encrypted. They support pickle-able objects as values. - - >>> import bottle - >>> test = dict(a=5, b=u'unicode', c=[1,2,3,4,'5']) - >>> key = 'secret' - >>> cookie = bottle.cookie_encode(test, key) - >>> cookie - '!RidFXtwOzjhv4wGg/P2gTA==?gAJ9cQEoVQFhSwVVAWNdcQIoSwFLAksDSwRVATVlVQFiWAcAAAB1bmljb2RlcQN1Lg==' - >>> test == bottle.cookie_decode(cookie, key) - True - >>> bottle.cookie_is_encoded(cookie) - True - >>> bottle.cookie_is_encoded('some cookie') - False diff --git a/test/test_environ.py b/test/test_environ.py index f492dd2..f8e118a 100644 --- a/test/test_environ.py +++ b/test/test_environ.py @@ -5,7 +5,6 @@ from bottle import request, response import tools import wsgiref.util - class TestEnviron(unittest.TestCase): def test_path(self): """ Environ: PATH_INFO """ @@ -156,10 +155,5 @@ class TestMultipart(unittest.TestCase): self.assertTrue('value2' in request.POST['field2']) self.assertTrue('value3' in request.POST['field2']) - -suite = unittest.TestSuite() -suite.addTest(unittest.makeSuite(TestEnviron)) -suite.addTest(unittest.makeSuite(TestMultipart)) - if __name__ == '__main__': unittest.main() diff --git a/test/test_jinja2.py b/test/test_jinja2.py index 4572bcd..2a578db 100644 --- a/test/test_jinja2.py +++ b/test/test_jinja2.py @@ -2,6 +2,7 @@ import unittest from bottle import Jinja2Template class TestJinja2Template(unittest.TestCase): + def test_string(self): """ Templates: Jinja2 string""" t = Jinja2Template('start {{var}} end').render(var='var') @@ -30,13 +31,11 @@ class TestJinja2Template(unittest.TestCase): t = Jinja2Template(name='jinja2_inherit', lookup=['./views/']).render() self.assertEqual('begin abc end', ''.join(t)) -suite = unittest.TestSuite() try: - import jinja2; del jinja2 - suite.addTest(unittest.makeSuite(TestJinja2Template)) + import jinja2 except ImportError: print "WARNING: No Jinja2 template support. Skipping tests." - + del TestJinja2Template if __name__ == '__main__': unittest.main() diff --git a/test/test_mako.py b/test/test_mako.py index 1a1a7f7..32caa65 100644 --- a/test/test_mako.py +++ b/test/test_mako.py @@ -34,13 +34,11 @@ class TestMakoTemplate(unittest.TestCase): t = MakoTemplate('<%inherit file="views/mako_base.tpl"/>\nc${var}c\n', lookup=['./']).render(var='v') self.assertEqual('o\ncvc\no\n', ''.join(t)) -suite = unittest.TestSuite() try: import mako - suite.addTest(unittest.makeSuite(TestMakoTemplate)) except ImportError: print "WARNING: No Mako template support. Skipping tests." - + del TestMakoTemplate if __name__ == '__main__': unittest.main() diff --git a/test/test_router.py b/test/test_router.py new file mode 100644 index 0000000..c7abdba --- /dev/null +++ b/test/test_router.py @@ -0,0 +1,45 @@ +import unittest +import bottle + +class TestRouter(unittest.TestCase): + def setUp(self): + self.r = r = bottle.Router() + + def testBasic(self): + add = self.r.add + match = self.r.match + add('/static', 'static') + self.assertEqual(('static', None), match('/static')) + add('/\\:its/:#.+#/:test/:name#[a-z]+#/', 'handler') + self.assertEqual(('handler', {'test': 'cruel', 'name': 'world'}), match('/:its/a/cruel/world/')) + add('/:test', 'notail') + self.assertEqual(('notail', {'test': 'test'}), match('/test')) + add(':test/', 'nohead') + self.assertEqual(('nohead', {'test': 'test'}), match('test/')) + add(':test', 'fullmatch') + self.assertEqual(('fullmatch', {'test': 'test'}), match('test')) + add('/:#anon#/match', 'anon') + self.assertEqual(('anon', None), match('/anon/match')) + self.assertEqual((None, None), match('//no/m/at/ch/')) + + def testErrorInPattern(self): + self.assertRaises(bottle.RouteSyntaxError, self.r.add, '/:bug#(#/', 'buggy') + + def testBuild(self): + add = self.r.add + build = self.r.build + add('/:test/:name#[a-z]+#/', 'handler', name='testroute') + add('/anon/:#.#', 'handler', name='anonroute') + url = build('testroute', test='hello', name='world') + self.assertEqual('/hello/world/', url) + self.assertRaises(bottle.RouteBuildError, build, 'test') + # RouteBuildError: No route found with name 'test'. + self.assertRaises(bottle.RouteBuildError, build, 'testroute') + # RouteBuildError: Missing parameter 'test' in route 'testroute' + self.assertRaises(bottle.RouteBuildError, build, 'testroute', test='hello', name='1234') + # RouteBuildError: Parameter 'name' does not match pattern for route 'testroute': '[a-z]+' + self.assertRaises(bottle.RouteBuildError, build, 'anonroute') + # RouteBuildError: Anonymous pattern found. Can't generate the route 'anonroute'. + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_securecookies.py b/test/test_securecookies.py new file mode 100644 index 0000000..57a4298 --- /dev/null +++ b/test/test_securecookies.py @@ -0,0 +1,21 @@ +import unittest +import bottle + +class TestSecureCookies(unittest.TestCase): + def setUp(self): + self.data = dict(a=5, b=u'unicode', c=[1,2,3,4,'5']) + self.key = u'secret'.encode('utf8') + + def testDeEncode(self): + cookie = bottle.cookie_encode(self.data, self.key) + self.assertEqual('!RidFXtwOzjhv4wGg/P2gTA==?gAJ9cQEoVQFhSwVVAWNdcQIoSwFLAksDSwRVATVlVQFiWAcAAAB1bmljb2RlcQN1Lg==', cookie) + decoded = bottle.cookie_decode(cookie, self.key) + self.assertEqual(self.data, decoded) + + def testIsEncoded(self): + cookie = bottle.cookie_encode(self.data, self.key) + self.assertTrue(bottle.cookie_is_encoded(cookie)) + self.assertFalse(bottle.cookie_is_encoded('some string')) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_sendfile.py b/test/test_sendfile.py index d226ebe..f2e4fdf 100644 --- a/test/test_sendfile.py +++ b/test/test_sendfile.py @@ -89,10 +89,6 @@ class TestSendFile(unittest.TestCase): -suite = unittest.TestSuite() -suite.addTest(unittest.makeSuite(TestSendFile)) -suite.addTest(unittest.makeSuite(TestDateParser)) - if __name__ == '__main__': unittest.main() diff --git a/test/test_stpl.py b/test/test_stpl.py index b9156a9..e2403d9 100644 --- a/test/test_stpl.py +++ b/test/test_stpl.py @@ -67,10 +67,13 @@ class TestSimpleTemplate(unittest.TestCase): """ Templates: Exceptions""" self.assertRaises(SyntaxError, SimpleTemplate, '%for badsyntax') self.assertRaises(IndexError, SimpleTemplate('{{i[5]}}').render, i=[0]) + + def test_winbreaks(self): + """ Templates: Test windows line breaks """ + t = SimpleTemplate('%var+=1\r\n{{var}}\n\r').render(var=5) + self.assertEqual('6', ''.join(t)) - -suite = unittest.TestSuite() -suite.addTest(unittest.makeSuite(TestSimpleTemplate)) + if __name__ == '__main__': unittest.main() diff --git a/test/test_templates.py b/test/test_templates.py index 560b207..a33caeb 100644 --- a/test/test_templates.py +++ b/test/test_templates.py @@ -5,9 +5,6 @@ from bottle import SimpleTemplate, TemplateError class TestSimpleTemplate(unittest.TestCase): pass -suite = unittest.TestSuite() -suite.addTest(unittest.makeSuite(TestSimpleTemplate)) - if __name__ == '__main__': unittest.main() diff --git a/test/test_wsgi.py b/test/test_wsgi.py index 1773f01..98bb387 100644 --- a/test/test_wsgi.py +++ b/test/test_wsgi.py @@ -181,9 +181,5 @@ class TestDecorators(ServerTestBase): self.assertEqual(u'xxx'.encode('utf8'), self.urlopen('/3').read()) -suite = unittest.TestSuite() -suite.addTest(unittest.makeSuite(TestWsgi)) -suite.addTest(unittest.makeSuite(TestDecorators)) - if __name__ == '__main__': unittest.main() diff --git a/test/testall.py b/test/testall.py index b3dc192..c48c932 100644 --- a/test/testall.py +++ b/test/testall.py @@ -7,29 +7,12 @@ import doctest import glob import sys -import test_templates -import test_stpl -import test_mako -import test_jinja2 -import test_environ -import test_wsgi -import test_sendfile - - -suite = unittest.TestSuite() -suite.addTest(test_stpl.suite) -suite.addTest(test_mako.suite) -suite.addTest(test_jinja2.suite) -suite.addTest(test_templates.suite) -suite.addTest(test_environ.suite) -suite.addTest(test_wsgi.suite) -suite.addTest(test_sendfile.suite) - -doctests = doctest.DocFileSuite(*glob.glob('./doctest_*.txt')) -suite.addTest(doctests) - if __name__ == '__main__': bottle.debug(True) + unittests = [name[2:-3] for name in glob.glob('./test_*.py')] + doctests = glob.glob('./doctest_*.txt') + suite = unittest.defaultTestLoader.loadTestsFromNames(unittests) + suite.addTest(doctest.DocFileSuite(*doctests)) result = unittest.TextTestRunner(verbosity=0).run(suite) sys.exit((result.errors or result.failures) and 1 or 0) |