summaryrefslogtreecommitdiff
path: root/src/zope/pagetemplate/tests/test_engine.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/pagetemplate/tests/test_engine.py')
-rw-r--r--src/zope/pagetemplate/tests/test_engine.py140
1 files changed, 116 insertions, 24 deletions
diff --git a/src/zope/pagetemplate/tests/test_engine.py b/src/zope/pagetemplate/tests/test_engine.py
index ab3b5ca..ab61408 100644
--- a/src/zope/pagetemplate/tests/test_engine.py
+++ b/src/zope/pagetemplate/tests/test_engine.py
@@ -18,34 +18,29 @@ import re
import unittest
import zope.pagetemplate.engine
from zope.testing.renormalizing import RENormalizing
+from zope.component.testing import PlacelessSetup
+class EngineTests(PlacelessSetup,
+ unittest.TestCase):
-class DummyNamespace(object):
-
- def __init__(self, context):
- self.context = context
-
-class EngineTests(unittest.TestCase):
-
- def setUp(self):
- from zope.component.testing import setUp
- setUp()
-
- def tearDown(self):
- from zope.component.testing import tearDown
- tearDown()
+ def _makeOne(self):
+ return zope.pagetemplate.engine._Engine()
def test_function_namespaces_return_secured_proxies(self):
# See https://bugs.launchpad.net/zope3/+bug/98323
- from zope.component import provideAdapter
- from zope.traversing.interfaces import IPathAdapter
- from zope.pagetemplate.engine import _Engine
from zope.proxy import isProxy
- provideAdapter(DummyNamespace, (None,), IPathAdapter, name='test')
- engine = _Engine()
+ engine = self._makeOne()
namespace = engine.getFunctionNamespace('test')
self.assertTrue(isProxy(namespace))
+ def test_getContext_namespace(self):
+ engine = self._makeOne()
+ ctx = engine.getContext({'a': 1}, b=2, request=3, context=4)
+ self.assertEqual(ctx.getValue('a'), 1)
+ self.assertEqual(ctx.getValue('b'), 2)
+ self.assertEqual(ctx.getValue('request'), 3)
+ self.assertEqual(ctx.getValue('context'), 4)
+
class DummyEngine(object):
def getTypes(self):
@@ -71,6 +66,8 @@ class ZopePythonExprTests(unittest.TestCase):
DummyEngine())
self.assertEqual(expr(DummyContext()), 'sys')
+ @unittest.skipUnless(zope.pagetemplate.engine.HAVE_UNTRUSTED,
+ "Needs untrusted")
def test_forbidden_module_name(self):
from zope.pagetemplate.engine import ZopePythonExpr
from zope.security.interfaces import Forbidden
@@ -78,12 +75,110 @@ class ZopePythonExprTests(unittest.TestCase):
DummyEngine())
self.assertRaises(Forbidden, expr, DummyContext())
+ @unittest.skipUnless(zope.pagetemplate.engine.HAVE_UNTRUSTED,
+ "Needs untrusted")
def test_disallowed_builtin(self):
from zope.pagetemplate.engine import ZopePythonExpr
expr = ZopePythonExpr('python', 'open("x", "w")', DummyEngine())
self.assertRaises(NameError, expr, DummyContext())
+class TestZopeContext(PlacelessSetup,
+ unittest.TestCase):
+
+ def _makeOne(self):
+ return zope.pagetemplate.engine.ZopeContext(None, {})
+
+ def test_translate(self):
+ ctx = self._makeOne()
+ self.assertEqual(ctx.translate('msgid'), 'msgid')
+
+ def test_evaluate_error(self):
+ ctx = self._makeOne()
+ with self.assertRaisesRegexp(zope.pagetemplate.engine.InlineCodeError,
+ "Inline Code Evaluation is deactivated"):
+ ctx.evaluateCode('lang', 'code')
+
+ def test_evaluate_interpreter_not_importable(self):
+ ctx = self._makeOne()
+ ctx.evaluateInlineCode = True
+ with self.assertRaises(ImportError):
+ ctx.evaluateCode('lang', 'code')
+
+ def test_evaluate_interpreter_not_found(self):
+ get = zope.pagetemplate.engine._get_iinterpreter
+ from zope import interface
+ class IInterpreter(interface.Interface):
+ pass
+ def mock_get():
+ return IInterpreter
+
+ ctx = self._makeOne()
+ ctx.evaluateInlineCode = True
+ zope.pagetemplate.engine._get_iinterpreter = mock_get
+ try:
+ with self.assertRaisesRegexp(zope.pagetemplate.engine.InlineCodeError,
+ "No interpreter named"):
+ ctx.evaluateCode('lang', 'code')
+ finally:
+ zope.pagetemplate.engine._get_iinterpreter = get
+
+ def test_evaluate_interpreter_found(self):
+ get = zope.pagetemplate.engine._get_iinterpreter
+ from zope import interface
+ from zope import component
+ class IInterpreter(interface.Interface):
+ pass
+ def mock_get():
+ return IInterpreter
+
+ @interface.implementer(IInterpreter)
+ class Interpreter(object):
+ def evaluateRawCode(self, code, globs):
+ globs['new'] = code
+ return 42
+
+ component.provideUtility(Interpreter(), name='lang')
+
+ ctx = self._makeOne()
+ ctx.evaluateInlineCode = True
+ zope.pagetemplate.engine._get_iinterpreter = mock_get
+ try:
+ result = ctx.evaluateCode('lang', 'code')
+ finally:
+ zope.pagetemplate.engine._get_iinterpreter = get
+
+ self.assertEqual(result, 42)
+ self.assertEqual('code', ctx.getValue('new'))
+
+
+class TestTraversableModuleImporter(unittest.TestCase):
+
+ def test_traverse_fails(self):
+ from zope.traversing.interfaces import TraversalError
+
+ tmi = zope.pagetemplate.engine.TraversableModuleImporter()
+ with self.assertRaises(TraversalError):
+ tmi.traverse('zope.cannot exist', ())
+
+ with self.assertRaises(TraversalError):
+ tmi.traverse('zope.pagetemplate.engine.DNE', ())
+
+
+ with self.assertRaises(TraversalError):
+ tmi.traverse('pickle.no_sub_module', ())
+
+
+class TestAppPT(unittest.TestCase):
+
+ def test_apppt_engine(self):
+ self.assertIs(zope.pagetemplate.engine.AppPT().pt_getEngine(),
+ zope.pagetemplate.engine.Engine)
+
+ def test_trustedapppt_engine(self):
+ self.assertIs(zope.pagetemplate.engine.TrustedAppPT().pt_getEngine(),
+ zope.pagetemplate.engine.TrustedEngine)
+
def test_suite():
@@ -96,15 +191,12 @@ def test_suite():
(re.compile(r"<class 'list'>"), "<type 'list'>"),
# PyPy/pure-Python implementation
(re.compile(r"<class 'zope.security.proxy.ProxyPy'>"),
- "<type 'zope.security._proxy._Proxy'>"),
+ "<type 'zope.security._proxy._Proxy'>"),
])
- suite = unittest.TestSuite()
+ suite = unittest.defaultTestLoader.loadTestsFromName(__name__)
suite.addTest(doctest.DocTestSuite('zope.pagetemplate.engine',
checker=checker))
- suite.addTest(unittest.makeSuite(EngineTests))
- if zope.pagetemplate.engine.HAVE_UNTRUSTED:
- suite.addTest(unittest.makeSuite(ZopePythonExprTests))
return suite