Beispiel #1
0
    def getZCMLLayer(self, filepath, marker):
        """Create a ZCML layer out of a test marker.
        """
        zcml_file = get_marker_from_file(marker, filepath)
        if zcml_file is None:
            return
        try:
            # Late import. Some environments don't have
            # ``zope.app.testing`` available.
            from z3c.testsetup.functional.layer import DefaultZCMLLayer
        except ImportError:
            warn(
                """You specified `%s` in
    %s
but there seems to be no `zope.app.testing` package available.
Please include `zope.app.testing` in your project setup to run this testfile.
"""
                % (marker, name)
            )
        layer = DefaultZCMLLayer(
            os.path.join(os.path.dirname(filepath), zcml_file),
            DefaultZCMLLayer.__module__,
            "%s [%s]" % (DefaultZCMLLayer.__name__, os.path.join(os.path.dirname(filepath), zcml_file)),
            allow_teardown=self.allow_teardown,
        )
        return layer
 def test_get_marker_from_file_non_utf8(self):
     # even files incompatible with UTF-8 can be parsed
     path = os.path.join(self.workdir, "myfile")
     content = b"Line1\n :some-layer:   foo \n Strange: \xff\xfeW[ \n"
     with open(path, "wb") as fd:
         fd.write(content)
     result = get_marker_from_file("some-layer", path)
     self.assertEqual(result, "foo")
 def test_get_marker_from_file(self):
     # we can find markers in files
     path = os.path.join(self.workdir, "myfile")
     content = "Some text\n :TeSt-lAyEr:   foo \n\nSome other text\n"
     with open(path, "w") as fd:
         fd.write(content)
     result = get_marker_from_file("test-layer", path)
     self.assertEqual(result, "foo")
 def test_get_marker_from_file_utf8(self):
     #  we can get markers from files with non-ascii encodings
     path = os.path.join(self.workdir, "myfile")
     content = u"Line1\n :some-layer:   foo \n Umlauts: äöü\n"
     content = content.encode("utf-8")  # transform to binary stream
     with open(path, "wb") as fd:
         fd.write(content)
     result = get_marker_from_file("some-layer", path)
     self.assertEqual(result, "foo")
 def isTestFile(self, filepath):
     """Return ``True`` if a file matches our expectations for a
     doctest file.
     """
     if os.path.splitext(filepath)[1].lower() not in self.extensions:
         return False
     if os.path.basename(filepath).startswith('.'):
         # Ignore *nix hidden files
         return False
     if get_marker_from_file('doctest', filepath) is None:
         return False
     return True
Beispiel #6
0
 def suiteFromFile(self, name):
     suite = unittest.TestSuite()
     layer = get_marker_from_file('Test-Layerdef', name)
     if os.path.isabs(name):
         # We get absolute pathnames, but we need relative ones...
         common_prefix = os.path.commonprefix([self.package.__file__, name])
         name = name[len(common_prefix):]
     test = FunctionalDocFileSuite(
         name, package=self.package,
         setUp=self.setUp, tearDown=self.tearDown,
         globs=self.globs,
         optionflags=self.optionflags,
         encoding=self.encoding,
         checker=self.checker,
         **self.additional_options
         )
     test.layer = self.layer
     if layer is not None:
         test.layer = layer
     suite.addTest(test)
     return suite
Beispiel #7
0
 def getTestSuite(self):
     docfiles = self.getDocTestFiles(package=self.package)
     suite = unittest.TestSuite()
     for name in docfiles:
         layerdef = get_marker_from_file("Test-Layerdef", name)
         if os.path.isabs(name):
             # We get absolute pathnames, but we need relative ones...
             common_prefix = os.path.commonprefix([self.package.__file__, name])
             name = name[len(common_prefix) :]
         test = doctest.DocFileSuite(
             name,
             package=self.package,
             setUp=self.setUp,
             tearDown=self.tearDown,
             globs=self.globs,
             optionflags=self.optionflags,
             checker=self.checker,
             **self.additional_options
         )
         if layerdef is not None:
             test.layer = layerdef
         suite.addTest(test)
     return suite
    def isTestModule(self, module_info):
        """Return ``True`` if a module matches our expectations for a
        test file.

        This is the case if it got a module docstring which matches
        each of our regular expressions.
        """
        # Do not even try to load modules, that have no marker string.
        if not self.fileContains(module_info.path):
            # No ":test-layer: python" marker, so check for :unittest:.
            if get_marker_from_file('unittest', module_info.path) is None:
                # Neither the old nor the new marker: this is no test module.
                return False
        module = None
        try:
            module = module_info.getModule()
        except ImportError:
            # Broken module that is probably a test.  We absolutely have to
            # warn about this!
            print("Import error in %s" % module_info.path)
        docstr = getattr(module, '__doc__', '')
        if not self.docstrContains(docstr):
            return False
        return True
    def getTestSuite(self):
        docfiles = self.getDocTestFiles(package=self.package)
        suite = unittest.TestSuite()
        for name in docfiles:
            layerdef = get_marker_from_file('layer', name)
            if layerdef is not None:
                layerdef = get_attribute(layerdef)

            zcml_layer = self.getZCMLLayer(name, 'zcml-layer')
            if zcml_layer is not None:
                layerdef = zcml_layer

            functional_zcml_layer = self.getZCMLLayer(
                name, 'functional-zcml-layer')
            if functional_zcml_layer is not None:
                layerdef = functional_zcml_layer

            setup = get_marker_from_file('setup', name) or self.setUp
            if setup is not None and isinstance(setup, string_types):
                setup = get_attribute(setup)

            teardown = get_marker_from_file('teardown', name) or self.tearDown
            if teardown is not None and isinstance(teardown, string_types):
                teardown = get_attribute(teardown)

            if os.path.isabs(name):
                # We get absolute pathnames, but we need relative ones...
                common_prefix = os.path.commonprefix([self.package.__file__,
                                                      name])
                name = name[len(common_prefix):]

            suite_creator = doctest.DocFileSuite
            if functional_zcml_layer is not None:
                try:
                    from zope.app.testing.functional import (
                        FunctionalDocFileSuite)
                except ImportError:
                    warn("""You specified `:functional-zcml-layer:` in
    %s
but there seems to be no `zope.app.testing` package available.
Please include `zope.app.testing` in your project setup to run this testfile.
""" % (os.path.join(common_prefix, name),))
                    continue
                suite_creator = FunctionalDocFileSuite

            # If the defined layer is a ZCMLLayer, we also enable the
            # functional test setup.
            if layerdef is not None:
                try:
                    from zope.app.testing.functional import (
                        ZCMLLayer, FunctionalDocFileSuite)
                    if isinstance(layerdef, ZCMLLayer):
                        suite_creator = FunctionalDocFileSuite
                except ImportError:
                    # If zope.app.testing is not available, the layer
                    # cannot be a ZCML layer.
                    pass

            test = suite_creator(
                name,
                package=self.package,
                setUp=setup,
                tearDown=teardown,
                globs=self.globs,
                optionflags=self.optionflags,
                checker=self.checker,
                **self.additional_options
                )
            if layerdef is not None:
                test.layer = layerdef
            suite.addTest(test)
        return suite