diff options
Diffstat (limited to 'src/zope/pagetemplate/tests/test_engine.py')
-rw-r--r-- | src/zope/pagetemplate/tests/test_engine.py | 140 |
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 |