summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMarcel Hellkamp <marc@gsites.de>2009-12-08 08:47:12 +0100
committerMarcel Hellkamp <marc@gsites.de>2009-12-08 08:47:12 +0100
commit5bc132db68b5efdd5160a056127f9dc582bd1e26 (patch)
treeea67a4f8ad4975de692f1337c7c9998956993feb /test
parent66ccf95229e41db8e236e86e77b86bb6aea84c24 (diff)
downloadbottle-5bc132db68b5efdd5160a056127f9dc582bd1e26.tar.gz
Optimized test setup and minor changes
Diffstat (limited to 'test')
-rw-r--r--test/doctest_router.txt110
-rw-r--r--test/doctest_securecookies.txt14
-rw-r--r--test/test_environ.py6
-rw-r--r--test/test_jinja2.py7
-rw-r--r--test/test_mako.py4
-rw-r--r--test/test_router.py45
-rw-r--r--test/test_securecookies.py21
-rw-r--r--test/test_sendfile.py4
-rw-r--r--test/test_stpl.py9
-rw-r--r--test/test_templates.py3
-rw-r--r--test/test_wsgi.py4
-rw-r--r--test/testall.py25
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)