[Checkins] SVN: zope.configuration/branches/tseaver-test_cleanup/src/zope/configuration/tests/test_xmlconfig.py Full coverage for z.c.xmlconfig.include.

Tres Seaver cvs-admin at zope.org
Thu May 10 23:26:26 UTC 2012


Log message for revision 125829:
  Full coverage for z.c.xmlconfig.include.

Changed:
  U   zope.configuration/branches/tseaver-test_cleanup/src/zope/configuration/tests/test_xmlconfig.py

-=-
Modified: zope.configuration/branches/tseaver-test_cleanup/src/zope/configuration/tests/test_xmlconfig.py
===================================================================
--- zope.configuration/branches/tseaver-test_cleanup/src/zope/configuration/tests/test_xmlconfig.py	2012-05-10 23:26:18 UTC (rev 125828)
+++ zope.configuration/branches/tseaver-test_cleanup/src/zope/configuration/tests/test_xmlconfig.py	2012-05-10 23:26:23 UTC (rev 125829)
@@ -451,107 +451,132 @@
         self.assertEqual(exc.errno, errno.ENOENT)
 
 
-class Test_include(unittest.TestCase):
+class Test_include(_Catchable, unittest.TestCase):
 
     def _callFUT(self, *args, **kw):
         from zope.configuration.xmlconfig import include
         return include(*args, **kw)
 
-    def test_include_by_package(self):
+    def test_both_file_and_files_passed(self):
+        context = FauxContext()
+        exc = self.assertRaises(ValueError,
+                                self._callFUT, context, 'tests//sample.zcml',
+                                files=['tests/*.zcml'])
+        self.assertEqual(str(exc), "Must specify only one of file or files")
+
+    def test_neither_file_nor_files_passed_already_seen(self):
+        from zope.configuration import xmlconfig
         from zope.configuration.config import ConfigurationMachine
         from zope.configuration.xmlconfig import registerCommonDirectives
-        from zope.configuration._compat import b
-        from zope.configuration.tests.samplepackage import foo
-        import zope.configuration.tests.samplepackage as package
+        from zope.configuration.tests import samplepackage
         context = ConfigurationMachine()
         registerCommonDirectives(context)
-        self._callFUT(context, 'configure.zcml', package)
-        context.execute_actions()
-        data = foo.data.pop()
-        self.assertEqual(data.args, (('x', b('blah')), ('y', 0)))
-        self.assertEqual(clean_info_path(repr(data.info)),
-                'File "tests/samplepackage/configure.zcml", line 12.2-12.29')
-        self.assertEqual(clean_info_path(str(data.info)),
-                'File "tests/samplepackage/configure.zcml", line 12.2-12.29\n'
-                + '    <test:foo x="blah" y="0" />')
-        self.assertTrue(data.package is package)
-        self.assertEqual(data.basepath[-13:], 'samplepackage')
-        self.assertEqual([clean_path(p) for p in data.includepath],
-                         ['tests/samplepackage/configure.zcml'])
+        context.package = samplepackage
+        fqn = _packageFile(samplepackage, 'configure.zcml')
+        context._seen_files.add(fqn)
+        logger = LoggerStub()
+        with _Monkey(xmlconfig, logger=logger):
+            self._callFUT(context) #skips
+        self.assertEqual(len(logger.debugs), 0)
+        self.assertEqual(len(context.actions), 0)
 
-    # Not any more
-    ##     Including the same file more than once produces an error:
-
-    ##     >>> try:
-    ##     ...   xmlconfig.include(context, 'configure.zcml', package)
-    ##     ... except xmlconfig.ConfigurationError, e:
-    ##     ...   'OK'
-    ##     ...
-    ##     'OK'
-
-    def test_include_by_file(self):
-        import os
+    def test_neither_file_nor_files_passed(self):
+        from zope.configuration import xmlconfig
         from zope.configuration.config import ConfigurationMachine
         from zope.configuration.xmlconfig import registerCommonDirectives
-        from zope.configuration._compat import b
+        from zope.configuration.tests import samplepackage
         from zope.configuration.tests.samplepackage import foo
         context = ConfigurationMachine()
         registerCommonDirectives(context)
-        here = os.path.dirname(__file__)
-        path = os.path.join(here, "samplepackage", "foo.zcml")
-        self._callFUT(context, path)
-        context.execute_actions()
-        data = foo.data.pop()
-        self.assertEqual(data.args, (('x', b('foo')), ('y', 2)))
-        self.assertEqual(clean_info_path(repr(data.info)),
-                    'File "tests/samplepackage/foo.zcml.in", line 12.2-12.28')
-        self.assertEqual(clean_info_path(str(data.info)),
-                    'File "tests/samplepackage/foo.zcml.in", line 12.2-12.28\n'
-                    + '    <test:foo x="foo" y="2" />')
-        self.assertEqual(data.package, None)
-        self.assertEqual(data.basepath[-13:], 'samplepackage')
-        self.assertEqual([clean_path(p) for p in data.includepath],
-                         ['tests/samplepackage/foo.zcml.in'])
+        before_stack = context.stack[:]
+        context.package = samplepackage
+        fqn = _packageFile(samplepackage, 'configure.zcml')
+        logger = LoggerStub()
+        with _Monkey(xmlconfig, logger=logger):
+            self._callFUT(context)
+        self.assertEqual(len(logger.debugs), 1)
+        self.assertEqual(logger.debugs[0], ('include %s' % fqn, (), {}))
+        self.assertEqual(len(context.actions), 1)
+        action = context.actions[0]
+        self.assertEqual(action['callable'], foo.data.append)
+        self.assertEqual(action['includepath'], (fqn,))
+        self.assertEqual(context.stack, before_stack)
+        self.assertEqual(len(context._seen_files), 1)
+        self.assertTrue(fqn in context._seen_files)
 
-    def test_include_by_file_glob(self):
-        import os
+    def test_w_file_passed(self):
+        from zope.configuration import xmlconfig
         from zope.configuration.config import ConfigurationMachine
         from zope.configuration.xmlconfig import registerCommonDirectives
-        from zope.configuration._compat import b
+        from zope.configuration import tests
+        from zope.configuration.tests import simple
+        context = ConfigurationMachine()
+        registerCommonDirectives(context)
+        before_stack = context.stack[:]
+        context.package = tests
+        fqn = _packageFile(tests, 'simple.zcml')
+        logger = LoggerStub()
+        with _Monkey(xmlconfig, logger=logger):
+            self._callFUT(context, 'simple.zcml')
+        self.assertEqual(len(logger.debugs), 1)
+        self.assertEqual(logger.debugs[0], ('include %s' % fqn, (), {}))
+        self.assertEqual(len(context.actions), 3)
+        action = context.actions[0]
+        self.assertEqual(action['callable'], simple.file_registry.append)
+        self.assertEqual(action['includepath'], (fqn,))
+        self.assertEqual(action['args'][0].path,
+                         _packageFile(tests, 'simple.py'))
+        action = context.actions[1]
+        self.assertEqual(action['callable'], simple.file_registry.append)
+        self.assertEqual(action['includepath'], (fqn,))
+        self.assertEqual(action['args'][0].path,
+                         _packageFile(tests, 'simple.zcml'))
+        action = context.actions[2]
+        self.assertEqual(action['callable'], simple.file_registry.append)
+        self.assertEqual(action['includepath'], (fqn,))
+        self.assertEqual(action['args'][0].path,
+                         _packageFile(tests, '__init__.py'))
+        self.assertEqual(context.stack, before_stack)
+        self.assertEqual(len(context._seen_files), 1)
+        self.assertTrue(fqn in context._seen_files)
+
+    def test_w_files_passed_and_package(self):
+        from zope.configuration import xmlconfig
+        from zope.configuration.config import ConfigurationMachine
+        from zope.configuration.xmlconfig import registerCommonDirectives
+        from zope.configuration.tests import samplepackage
         from zope.configuration.tests.samplepackage import foo
         context = ConfigurationMachine()
         registerCommonDirectives(context)
-        here = os.path.dirname(__file__)
-        path = os.path.join(here, "samplepackage/baz*.zcml")
-        self._callFUT(context, files=path)
-        context.execute_actions()
+        before_stack = context.stack[:]
+        fqn1 = _packageFile(samplepackage, 'baz1.zcml')
+        fqn2 = _packageFile(samplepackage, 'baz2.zcml')
+        fqn3 = _packageFile(samplepackage, 'baz3.zcml')
+        logger = LoggerStub()
+        with _Monkey(xmlconfig, logger=logger):
+            self._callFUT(context, package=samplepackage, files='baz*.zcml')
+        self.assertEqual(len(logger.debugs), 3)
+        self.assertEqual(logger.debugs[0], ('include %s' % fqn1, (), {}))
+        self.assertEqual(logger.debugs[1], ('include %s' % fqn2, (), {}))
+        self.assertEqual(logger.debugs[2], ('include %s' % fqn3, (), {}))
+        self.assertEqual(len(context.actions), 2)
+        action = context.actions[0]
+        self.assertEqual(action['callable'], foo.data.append)
+        self.assertEqual(action['includepath'], (fqn2,))
+        self.assertTrue(isinstance(action['args'][0], foo.stuff))
+        self.assertEqual(action['args'][0].args, (('x', 'foo'), ('y', 2)))
+        action = context.actions[1]
+        self.assertEqual(action['callable'], foo.data.append)
+        self.assertEqual(action['includepath'], (fqn3,))
+        self.assertTrue(isinstance(action['args'][0], foo.stuff))
+        self.assertEqual(action['args'][0].args, (('x', 'foo'), ('y', 3)))
+        self.assertEqual(context.stack, before_stack)
+        self.assertEqual(len(context._seen_files), 3)
+        self.assertTrue(fqn1 in context._seen_files)
+        self.assertTrue(fqn2 in context._seen_files)
+        self.assertTrue(fqn3 in context._seen_files)
 
-        data = foo.data.pop()
-        self.assertEqual(data.args, (('x', b('foo')), ('y', 3)))
-        self.assertEqual(clean_info_path(repr(data.info)),
-                        'File "tests/samplepackage/baz3.zcml", line 5.2-5.28')
 
-        self.assertEqual(clean_info_path(str(data.info)), 
-                        'File "tests/samplepackage/baz3.zcml", line 5.2-5.28\n'
-                        + '    <test:foo x="foo" y="3" />')
-        self.assertEqual(data.package, None)
-        self.assertEqual(data.basepath[-13:], 'samplepackage')
-        self.assertEqual([clean_path(p) for p in data.includepath],
-                         ['tests/samplepackage/baz3.zcml'])
-
-        data = foo.data.pop()
-        self.assertEqual(data.args, (('x', b('foo')), ('y', 2)))
-        self.assertEqual(clean_info_path(repr(data.info)),
-                        'File "tests/samplepackage/baz2.zcml", line 5.2-5.28')
-        self.assertEqual(clean_info_path(str(data.info)),
-                        'File "tests/samplepackage/baz2.zcml", line 5.2-5.28\n'
-                        + '    <test:foo x="foo" y="2" />')
-        self.assertEqual(data.package, None)
-        self.assertEqual(data.basepath[-13:], 'samplepackage')
-        self.assertEqual([clean_path(p) for p in data.includepath],
-                        ['tests/samplepackage/baz2.zcml'])
-
-
 class Test_exclude(unittest.TestCase):
 
     def _callFUT(self, *args, **kw):
@@ -689,6 +714,7 @@
 
 
 class FauxContext(object):
+    includepath = ()
     _features = ()
     _end_called = False
     def setInfo(self, info):
@@ -745,6 +771,53 @@
     return '\n'.join(r)
 
 
+def _packageFile(package, filename):
+    import os
+    return os.path.join(os.path.dirname(package.__file__), filename)
+
+class _Monkey(object):
+
+    def __init__(self, module, **replacements):
+        self.module = module
+        self.orig = {}
+        self.replacements = replacements
+        
+    def __enter__(self):
+        for k, v in self.replacements.items():
+            orig = getattr(self.module, k, self)
+            if orig is not self:
+                self.orig[k] = orig
+            setattr(self.module, k, v)
+
+    def __exit__(self, *exc_info):
+        for k, v in self.replacements.items():
+            if k in self.orig:
+                setattr(self.module, k, self.orig[k])
+            else: #pragma NO COVERSGE
+                delattr(self.module, k)
+
+
+class LoggerStub(object):
+
+    def __init__(self):
+        self.errors = []
+        self.warnings = []
+        self.infos = []
+        self.debugs = []
+
+    def error(self, msg, *args, **kwargs):
+        self.errors.append((msg, args, kwargs))
+
+    def warning(self, msg, *args, **kwargs):
+        self.warnings.append((msg, args, kwargs))
+
+    def info(self, msg, *args, **kwargs):
+        self.infos.append((msg, args, kwargs))
+
+    def debug(self, msg, *args, **kwargs):
+        self.debugs.append((msg, args, kwargs))
+
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(ZopeXMLConfigurationErrorTests),



More information about the checkins mailing list