summaryrefslogtreecommitdiff
path: root/repoze/bfg/tests
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-30 21:02:00 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-30 21:02:00 +0000
commitd809ac74d19342bcc84e4fe043697709b2001cc0 (patch)
tree9973b531b90336bf6ecf3811aa3b9ba753f4e6d8 /repoze/bfg/tests
parentf9e73ea5a9d5a4210e3a346aa2f9483d70d22ab9 (diff)
downloadpyramid-d809ac74d19342bcc84e4fe043697709b2001cc0.tar.gz
pyramid-d809ac74d19342bcc84e4fe043697709b2001cc0.tar.bz2
pyramid-d809ac74d19342bcc84e4fe043697709b2001cc0.zip
- Add a ``reload_resources`` configuration file setting (aka the
``BFG_RELOAD_RESOURCES`` environment variable). When this is set to true, the server never needs to be restarted when moving files between directory resource overrides (esp. for templates currently). - Add a ``reload_all`` configuration file setting (aka the ``BFG_RELOAD_ALL`` environment variable) that implies both ``reload_resources`` and ``reload_templates``. - The ``static`` helper view class now uses a ``PackageURLParser`` in order to allow for the overriding of static resources (CSS / logo files, etc) using the ``resource`` ZCML directive. The ``PackageURLParser`` class was added to a (new) ``static`` module in BFG; it is a subclass of the ``StaticURLParser`` class in ``paste.urlparser``. - The ``repoze.bfg.templating.renderer_from_cache`` function now checks for the ``reload_resources`` setting; if it's true, it does not register a template renderer (it won't use the registry as a template renderer cache). - Add ``pkg_resources`` to the glossary. - Update the "Environment" docs to note the existence of ``reload_resources`` and ``reload_all``. - Use a colon instead of a tab as the separator between package name and relpath to form the "spec" when register a ITemplateRenderer.
Diffstat (limited to 'repoze/bfg/tests')
-rw-r--r--repoze/bfg/tests/fixtures/static/index.html1
-rw-r--r--repoze/bfg/tests/fixtures/static/subdir/index.html1
-rw-r--r--repoze/bfg/tests/test_settings.py36
-rw-r--r--repoze/bfg/tests/test_static.py157
-rw-r--r--repoze/bfg/tests/test_templating.py31
-rw-r--r--repoze/bfg/tests/test_view.py26
6 files changed, 246 insertions, 6 deletions
diff --git a/repoze/bfg/tests/fixtures/static/index.html b/repoze/bfg/tests/fixtures/static/index.html
new file mode 100644
index 000000000..6498787a5
--- /dev/null
+++ b/repoze/bfg/tests/fixtures/static/index.html
@@ -0,0 +1 @@
+<html>static</html>
diff --git a/repoze/bfg/tests/fixtures/static/subdir/index.html b/repoze/bfg/tests/fixtures/static/subdir/index.html
new file mode 100644
index 000000000..bb84fad04
--- /dev/null
+++ b/repoze/bfg/tests/fixtures/static/subdir/index.html
@@ -0,0 +1 @@
+<html>subdir</html>
diff --git a/repoze/bfg/tests/test_settings.py b/repoze/bfg/tests/test_settings.py
index 903a23f5d..8319a302d 100644
--- a/repoze/bfg/tests/test_settings.py
+++ b/repoze/bfg/tests/test_settings.py
@@ -61,6 +61,42 @@ class TestGetOptions(unittest.TestCase):
{'BFG_RELOAD_TEMPLATES':'1'})
self.assertEqual(result['reload_templates'], True)
+ def test_reload_resources(self):
+ result = self._callFUT({})
+ self.assertEqual(result['reload_resources'], False)
+ result = self._callFUT({'reload_resources':'false'})
+ self.assertEqual(result['reload_resources'], False)
+ result = self._callFUT({'reload_resources':'t'})
+ self.assertEqual(result['reload_resources'], True)
+ result = self._callFUT({'reload_resources':'1'})
+ self.assertEqual(result['reload_resources'], True)
+ result = self._callFUT({}, {'BFG_RELOAD_RESOURCES':'1'})
+ self.assertEqual(result['reload_resources'], True)
+ result = self._callFUT({'reload_resources':'false'},
+ {'BFG_RELOAD_RESOURCES':'1'})
+ self.assertEqual(result['reload_resources'], True)
+
+ def test_reload_all(self):
+ result = self._callFUT({})
+ self.assertEqual(result['reload_templates'], False)
+ self.assertEqual(result['reload_resources'], False)
+ result = self._callFUT({'reload_all':'false'})
+ self.assertEqual(result['reload_templates'], False)
+ self.assertEqual(result['reload_resources'], False)
+ result = self._callFUT({'reload_all':'t'})
+ self.assertEqual(result['reload_templates'], True)
+ self.assertEqual(result['reload_resources'], True)
+ result = self._callFUT({'reload_all':'1'})
+ self.assertEqual(result['reload_templates'], True)
+ self.assertEqual(result['reload_resources'], True)
+ result = self._callFUT({}, {'BFG_RELOAD_ALL':'1'})
+ self.assertEqual(result['reload_templates'], True)
+ self.assertEqual(result['reload_resources'], True)
+ result = self._callFUT({'reload_all':'false'},
+ {'BFG_RELOAD_ALL':'1'})
+ self.assertEqual(result['reload_templates'], True)
+ self.assertEqual(result['reload_resources'], True)
+
def test_debug_authorization(self):
result = self._callFUT({})
self.assertEqual(result['debug_authorization'], False)
diff --git a/repoze/bfg/tests/test_static.py b/repoze/bfg/tests/test_static.py
new file mode 100644
index 000000000..7c7b5627c
--- /dev/null
+++ b/repoze/bfg/tests/test_static.py
@@ -0,0 +1,157 @@
+import unittest
+
+class TestPackageURLParser(unittest.TestCase):
+ def _getTargetClass(self):
+ from repoze.bfg.static import PackageURLParser
+ return PackageURLParser
+
+ def _makeOne(self, *arg, **kw):
+ return self._getTargetClass()(*arg, **kw)
+
+
+ def _makeEnviron(self, **kw):
+ environ = {
+ 'wsgi.url_scheme':'http',
+ 'wsgi.version':(1,0),
+ 'SERVER_NAME':'example.com',
+ 'SERVER_PORT':'6543',
+ 'PATH_INFO':'/',
+ 'SCRIPT_NAME':'',
+ 'REQUEST_METHOD':'GET',
+ }
+ environ.update(kw)
+ return environ
+
+ def test_ctor_allargs(self):
+ inst = self._makeOne('package', 'resource/name', root_resource='root',
+ cache_max_age=100)
+ self.assertEqual(inst.package_name, 'package')
+ self.assertEqual(inst.resource_name, 'resource/name')
+ self.assertEqual(inst.root_resource, 'root')
+ self.assertEqual(inst.cache_max_age, 100)
+
+ def test_ctor_defaultargs(self):
+ inst = self._makeOne('package', 'resource/name')
+ self.assertEqual(inst.package_name, 'package')
+ self.assertEqual(inst.resource_name, 'resource/name')
+ self.assertEqual(inst.root_resource, 'resource/name')
+ self.assertEqual(inst.cache_max_age, None)
+
+ def test_call_adds_slash_path_info_empty(self):
+ environ = self._makeEnviron(PATH_INFO='')
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('301 Moved Permanently' in body)
+ self.failUnless('http://example.com:6543/' in body)
+
+ def test_path_info_slash_means_index_html(self):
+ environ = self._makeEnviron()
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('<html>static</html>' in body)
+
+ def test_resource_out_of_bounds(self):
+ environ = self._makeEnviron()
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ inst.root_resource = 'abcdef'
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('404 Not Found' in body)
+ self.failUnless('http://example.com:6543/' in body)
+
+ def test_resource_doesnt_exist(self):
+ environ = self._makeEnviron(PATH_INFO='/notthere')
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('404 Not Found' in body)
+ self.failUnless('http://example.com:6543/' in body)
+
+ def test_resource_isdir(self):
+ environ = self._makeEnviron(PATH_INFO='/subdir/')
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('<html>subdir</html>' in body)
+
+ def test_resource_is_file(self):
+ environ = self._makeEnviron(PATH_INFO='/index.html')
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('<html>static</html>' in body)
+
+ def test_resource_is_file_with_cache_max_age(self):
+ environ = self._makeEnviron(PATH_INFO='/index.html')
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static',
+ cache_max_age=600)
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('<html>static</html>' in body)
+ self.assertEqual(len(sr.headerlist), 8)
+ header_names = [ x[0] for x in sr.headerlist ]
+ header_names.sort()
+ self.assertEqual(header_names,
+ ['Accept-Ranges', 'Cache-Control',
+ 'Content-Length', 'Content-Range',
+ 'Content-Type', 'ETag', 'Expires', 'Last-Modified'])
+
+ def test_resource_is_file_with_no_cache_max_age(self):
+ environ = self._makeEnviron(PATH_INFO='/index.html')
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ body = response[0]
+ self.failUnless('<html>static</html>' in body)
+ self.assertEqual(len(sr.headerlist), 6)
+ header_names = [ x[0] for x in sr.headerlist ]
+ header_names.sort()
+ self.assertEqual(header_names,
+ ['Accept-Ranges', 'Content-Length', 'Content-Range',
+ 'Content-Type', 'ETag', 'Last-Modified'])
+
+ def test_if_none_match(self):
+ class DummyEq(object):
+ def __eq__(self, other):
+ return True
+ dummy_eq = DummyEq()
+ environ = self._makeEnviron(HTTP_IF_NONE_MATCH=dummy_eq)
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ sr = DummyStartResponse()
+ response = inst(environ, sr)
+ self.assertEqual(len(sr.headerlist), 1)
+ self.assertEqual(sr.status, '304 Not Modified')
+ self.assertEqual(sr.headerlist[0][0], 'ETag')
+ self.assertEqual(response[0], '')
+
+ def test_repr(self):
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ self.failUnless(
+ repr(inst).startswith(
+ '<PackageURLParser repoze.bfg.tests:fixtures/static at'))
+
+ def test_not_found(self):
+ inst = self._makeOne('repoze.bfg.tests', 'fixtures/static')
+ environ = self._makeEnviron()
+ sr = DummyStartResponse()
+ response = inst.not_found(environ, sr, 'debug_message')
+ body = response[0]
+ self.failUnless('404 Not Found' in body)
+ self.assertEqual(sr.status, '404 Not Found')
+
+class DummyStartResponse:
+ def __call__(self, status, headerlist, exc_info=None):
+ self.status = status
+ self.headerlist = headerlist
+ self.exc_info = exc_info
+
+
diff --git a/repoze/bfg/tests/test_templating.py b/repoze/bfg/tests/test_templating.py
index d413acc2e..361cf6f7e 100644
--- a/repoze/bfg/tests/test_templating.py
+++ b/repoze/bfg/tests/test_templating.py
@@ -57,7 +57,7 @@ class TestRendererFromCache(unittest.TestCase):
from repoze.bfg import tests
module_name = tests.__name__
relpath = 'test_templating.py'
- spec = '%s\t%s' % (module_name, relpath)
+ spec = '%s:%s' % (module_name, relpath)
renderer = {}
testing.registerUtility(renderer, ITemplateRenderer, name=spec)
result = self._callFUT('test_templating.py', None)
@@ -68,7 +68,6 @@ class TestRendererFromCache(unittest.TestCase):
from repoze.bfg.tests import test_templating
module_name = test_templating.__name__
relpath = 'test_templating.py'
- spec = '%s\t%s' % (module_name, relpath)
renderer = {}
factory = DummyFactory(renderer)
result = self._callFUT('test_templating.py', factory)
@@ -79,6 +78,34 @@ class TestRendererFromCache(unittest.TestCase):
self.assertEqual(factory.path, path)
self.assertEqual(factory.kw, {})
+ def test_relpath_notyetregistered_reload_resources_true(self):
+ from zope.component import queryUtility
+ from repoze.bfg.interfaces import ISettings
+ from repoze.bfg.interfaces import ITemplateRenderer
+ settings = {'reload_resources':True}
+ testing.registerUtility(settings, ISettings)
+ renderer = {}
+ factory = DummyFactory(renderer)
+ result = self._callFUT('test_templating.py', factory)
+ self.failUnless(result is renderer)
+ spec = '%s:%s' % ('repoze.bfg.tests', 'test_templating.py')
+ self.assertEqual(queryUtility(ITemplateRenderer, name=spec),
+ None)
+
+ def test_relpath_notyetregistered_reload_resources_false(self):
+ from zope.component import queryUtility
+ from repoze.bfg.interfaces import ISettings
+ from repoze.bfg.interfaces import ITemplateRenderer
+ settings = {'reload_resources':False}
+ testing.registerUtility(settings, ISettings)
+ renderer = {}
+ factory = DummyFactory(renderer)
+ result = self._callFUT('test_templating.py', factory)
+ self.failUnless(result is renderer)
+ spec = '%s:%s' % ('repoze.bfg.tests', 'test_templating.py')
+ self.assertNotEqual(queryUtility(ITemplateRenderer, name=spec),
+ None)
+
class DummyFactory:
def __init__(self, renderer):
self.renderer = renderer
diff --git a/repoze/bfg/tests/test_view.py b/repoze/bfg/tests/test_view.py
index 55e9ecffa..5b870fa7d 100644
--- a/repoze/bfg/tests/test_view.py
+++ b/repoze/bfg/tests/test_view.py
@@ -317,8 +317,8 @@ class TestStaticView(unittest.TestCase, BaseTest):
from repoze.bfg.view import static
return static
- def _makeOne(self, path):
- return self._getTargetClass()(path)
+ def _makeOne(self, path, package_name=None):
+ return self._getTargetClass()(path, package_name=package_name)
def test_abspath(self):
import os
@@ -343,8 +343,26 @@ class TestStaticView(unittest.TestCase, BaseTest):
response = view(context, request)
self.assertEqual(request.copied, True)
here = os.path.abspath(os.path.dirname(__file__))
- abspath = os.path.join(here, 'fixtures')
- self.assertEqual(response.directory, abspath)
+ self.assertEqual(response.root_resource, 'fixtures')
+ self.assertEqual(response.resource_name, 'fixtures')
+ self.assertEqual(response.package_name, 'repoze.bfg.tests')
+ self.assertEqual(response.cache_max_age, 3600)
+
+ def test_relpath_withpackage(self):
+ import os
+ path = 'fixtures'
+ view = self._makeOne(path, package_name='another')
+ context = DummyContext()
+ request = DummyRequest()
+ request.subpath = ['__init__.py']
+ request.environ = self._makeEnviron()
+ response = view(context, request)
+ self.assertEqual(request.copied, True)
+ here = os.path.abspath(os.path.dirname(__file__))
+ self.assertEqual(response.root_resource, 'fixtures')
+ self.assertEqual(response.resource_name, 'fixtures')
+ self.assertEqual(response.package_name, 'another')
+ self.assertEqual(response.cache_max_age, 3600)
class TestBFGViewDecorator(unittest.TestCase):
def setUp(self):