[Zope3-checkins] CVS: ZODB3/ZConfig/tests - test_cfgimports.py:1.1.24.1 test_schema.py:1.18.56.1 test_loader.py:1.17.6.1 test_datatypes.py:1.6.70.1 test_config.py:1.5.78.1

Jeremy Hylton jeremy at zope.com
Tue Dec 23 14:06:33 EST 2003


Update of /cvs-repository/ZODB3/ZConfig/tests
In directory cvs.zope.org:/tmp/cvs-serv26665/ZConfig/tests

Modified Files:
      Tag: ZODB3-mvcc-2-branch
	test_schema.py test_loader.py test_datatypes.py test_config.py 
Added Files:
      Tag: ZODB3-mvcc-2-branch
	test_cfgimports.py 
Log Message:
Merge the head to the mvcc branch.

This merge should be the final preparation for merging the branch to
the trunk.


=== Added File ZODB3/ZConfig/tests/test_cfgimports.py ===
##############################################################################
#
# Copyright (c) 2003 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Tests of the %import mechanism.

$Id: test_cfgimports.py,v 1.1.24.1 2003/12/23 19:06:01 jeremy Exp $
"""

import unittest

from StringIO import StringIO

import ZConfig
import ZConfig.tests.support


class TestImportFromConfiguration(ZConfig.tests.support.TestBase):

    def test_simple_import(self):
        schema = self.load_schema_text("<schema/>")
        loader = self.create_config_loader(schema)
        config, _ = loader.loadFile(
            StringIO("%import ZConfig.tests.library.widget\n"))
        # make sure we now have a "private" schema object; the only
        # way to get it is from the loader itself
        self.assert_(schema is not loader.schema)
        # make sure component types are only found on the private schema:
        loader.schema.gettype("widget-b")
        self.assertRaises(ZConfig.SchemaError, schema.gettype, "widget-b")

    def test_repeated_import(self):
        schema = self.load_schema_text("<schema/>")
        loader = self.create_config_loader(schema)
        config, _ = loader.loadFile(
            StringIO("%import ZConfig.tests.library.widget\n"
                     "%import ZConfig.tests.library.widget\n"))

    def test_missing_import(self):
        schema = self.load_schema_text("<schema/>")
        loader = self.create_config_loader(schema)
        self.assertRaises(ZConfig.SchemaError, loader.loadFile,
                          StringIO("%import ZConfig.tests.missing\n"))


def test_suite():
    return unittest.makeSuite(TestImportFromConfiguration)


=== ZODB3/ZConfig/tests/test_schema.py 1.18 => 1.18.56.1 ===
--- ZODB3/ZConfig/tests/test_schema.py:1.18	Thu May  1 15:34:57 2003
+++ ZODB3/ZConfig/tests/test_schema.py	Tue Dec 23 14:06:01 2003
@@ -17,7 +17,7 @@
 
 import ZConfig
 
-from ZConfig.tests.support import TestBase
+from ZConfig.tests.support import TestBase, CONFIG_BASE
 
 
 def uppercase(value):
@@ -44,6 +44,9 @@
 
     def test_simple(self):
         schema, conf = self.load_both("simple.xml", "simple.conf")
+        self._verifySimpleConf(conf)
+
+    def _verifySimpleConf(self,conf):
         eq = self.assertEqual
         eq(conf.var1, 'abc')
         eq(conf.int_var, 12)
@@ -709,6 +712,59 @@
     def test_datatype_casesensitivity(self):
         self.load_schema_text("<schema datatype='NULL'/>")
 
+    def test_simple_extends(self):
+        schema = self.load_schema_text("""\
+           <schema extends="%s/simple.xml %s/library.xml">
+             <section name="A" type="type-a" />
+           </schema>
+           """ % (CONFIG_BASE,CONFIG_BASE))
+        self._verifySimpleConf(self.load_config(schema, "simple.conf"))
+
+    def test_extends_fragment_failure(self):
+       self.assertRaises(ZConfig.SchemaError,
+                          self.load_schema_text, """\
+           <schema extends="%s/library.xml#foo" />
+           """ % CONFIG_BASE)
+
+    def test_multi_extends_implicit_OK(self):
+        schema = self.load_schema_text("""\
+           <schema extends="%s/base.xml %s/library.xml">
+             <section name="A" type="type-a" />
+             <section name="X" type="type-X" />
+           </schema>
+           """ % (CONFIG_BASE,CONFIG_BASE))
+
+    def test_multi_extends_explicit_datatype_OK(self):
+        schema = self.load_schema_text("""\
+           <schema extends="%s/base-datatype1.xml %s/base-datatype2.xml"
+                   datatype="null">
+             <section name="One" type="type-1" />
+             <section name="Two" type="type-2" />
+           </schema>
+           """ % (CONFIG_BASE,CONFIG_BASE))
+
+
+    def test_multi_extends_explicit_keytype_OK(self):
+        schema = self.load_schema_text("""\
+           <schema extends="%s/base-keytype1.xml %s/base-keytype2.xml"
+                   keytype="%s.uppercase">
+             <section name="One" type="type-1" />
+             <section name="Two" type="type-2" />
+           </schema>
+           """ % (CONFIG_BASE,CONFIG_BASE,__name__))
+
+
+    def test_multi_extends_datatype_conflict(self):
+       self.assertRaises(ZConfig.SchemaError,
+                          self.load_schema_text, """\
+           <schema extends="%s/base-datatype1.xml %s/base-datatype2.xml"/>
+           """ % (CONFIG_BASE,CONFIG_BASE))
+
+    def test_multi_extends_keytype_conflict(self):
+       self.assertRaises(ZConfig.SchemaError,
+                          self.load_schema_text, """\
+           <schema extends="%s/base-keytype1.xml %s/base-keytype2.xml"/>
+           """ % (CONFIG_BASE,CONFIG_BASE))
 
 def test_suite():
     return unittest.makeSuite(SchemaTestCase)


=== ZODB3/ZConfig/tests/test_loader.py 1.17 => 1.17.6.1 ===
--- ZODB3/ZConfig/tests/test_loader.py:1.17	Thu Sep 25 10:35:09 2003
+++ ZODB3/ZConfig/tests/test_loader.py	Tue Dec 23 14:06:01 2003
@@ -73,6 +73,12 @@
                                    "  <import src='library.xml'"
                                    "          file='other.xml'/>"
                                    "</schema>"))
+        # cannot specify module as package
+        sio = StringIO("<schema>"
+                       "  <import package='ZConfig.tests.test_loader'/>"
+                       "</schema>")
+        self.assertRaises(ZConfig.SchemaError, ZConfig.loadSchemaFile,
+                          sio)
 
     def test_import_from_package(self):
         loader = ZConfig.loader.SchemaLoader()
@@ -91,6 +97,15 @@
         schema = loader.loadFile(sio)
         self.assert_(schema.gettype("extra-type") is not None)
 
+    def test_import_from_package_extra_directory(self):
+        loader = ZConfig.loader.SchemaLoader()
+        sio = StringIO("<schema>"
+                       "  <import package='ZConfig.tests.library.thing'"
+                       "          file='extras.xml' />"
+                       "</schema>")
+        schema = loader.loadFile(sio)
+        self.assert_(schema.gettype("extra-thing") is not None)
+
     def test_import_from_package_with_missing_file(self):
         loader = ZConfig.loader.SchemaLoader()
         sio = StringIO("<schema>"
@@ -106,6 +121,42 @@
                        "          file='really/notthere.xml' />"
                        "</schema>")
         self.assertRaises(ZConfig.SchemaError, loader.loadFile, sio)
+
+    def test_import_two_components_one_package(self):
+        loader = ZConfig.loader.SchemaLoader()
+        sio = StringIO("<schema>"
+                       "  <import package='ZConfig.tests.library.widget' />"
+                       "  <import package='ZConfig.tests.library.widget'"
+                       "          file='extra.xml' />"
+                       "</schema>")
+        schema = loader.loadFile(sio)
+        schema.gettype("widget-a")
+        schema.gettype("extra-type")
+
+    def test_import_component_twice_1(self):
+        # Make sure we can import a component twice from a schema.
+        # This is most likely to occur when the component is imported
+        # from each of two other components, or from the top-level
+        # schema and a component.
+        loader = ZConfig.loader.SchemaLoader()
+        sio = StringIO("<schema>"
+                       "  <import package='ZConfig.tests.library.widget' />"
+                       "  <import package='ZConfig.tests.library.widget' />"
+                       "</schema>")
+        schema = loader.loadFile(sio)
+        schema.gettype("widget-a")
+
+    def test_import_component_twice_2(self):
+        # Make sure we can import a component from a config file even
+        # if it has already been imported from the schema.
+        loader = ZConfig.loader.SchemaLoader()
+        sio = StringIO("<schema>"
+                       "  <import package='ZConfig.tests.library.widget' />"
+                       "</schema>")
+        schema = loader.loadFile(sio)
+        loader = ZConfig.loader.ConfigLoader(schema)
+        sio = StringIO("%import ZConfig.tests.library.widget")
+        loader.loadFile(sio)
 
     def test_urlsplit_urlunsplit(self):
         # Extracted from Python's test.test_urlparse module:


=== ZODB3/ZConfig/tests/test_datatypes.py 1.6 => 1.6.70.1 ===
--- ZODB3/ZConfig/tests/test_datatypes.py:1.6	Mon Mar 24 15:42:08 2003
+++ ZODB3/ZConfig/tests/test_datatypes.py	Tue Dec 23 14:06:01 2003
@@ -111,6 +111,7 @@
         eq(convert(":80"),                 ("", 80))
         eq(convert("80"),                  ("", 80))
         eq(convert("host.EXAMPLE.com"),    ("host.example.com", None))
+        self.assertRaises(ValueError, convert, "40 # foo")
 
     def test_datatype_integer(self):
         convert = self.types.get("integer")


=== ZODB3/ZConfig/tests/test_config.py 1.5 => 1.5.78.1 ===
--- ZODB3/ZConfig/tests/test_config.py:1.5	Wed Feb 19 10:54:15 2003
+++ ZODB3/ZConfig/tests/test_config.py	Tue Dec 23 14:06:01 2003
@@ -20,195 +20,112 @@
 
 import ZConfig
 
-from ZConfig.Context import Context
-from ZConfig.url import urljoin
-
 from ZConfig.tests.support import CONFIG_BASE
 
 
-class TestBase(unittest.TestCase):
+class ConfigurationTestCase(unittest.TestCase):
+
+    schema = None
+
+    def get_schema(self):
+        if self.schema is None:
+            ConfigurationTestCase.schema = ZConfig.loadSchema(
+                CONFIG_BASE + "simple.xml")
+        return self.schema
 
     def load(self, relurl, context=None):
-        url = urljoin(CONFIG_BASE, relurl)
-        if context is None:
-            context = Context()
-        conf = context.loadURL(url)
-        self.assertEqual(conf.url, url)
-        self.assert_(conf.name is None)
-        self.assert_(conf.type is None)
-        self.assert_(conf.delegate is None)
+        url = CONFIG_BASE + relurl
+        self.conf, self.handlers = ZConfig.loadConfig(self.get_schema(), url)
+        conf = self.conf
+        #self.assertEqual(conf.url, url)
+        self.assert_(conf.getSectionName() is None)
+        self.assert_(conf.getSectionType() is None)
+        #self.assert_(conf.delegate is None)
         return conf
 
     def loadtext(self, text):
         sio = StringIO.StringIO(text)
-        return Context().loadFile(sio)
+        return self.loadfile(sio)
 
-    def check_simple_gets(self, conf):
-        self.assertEqual(conf.get('empty'), '')
-        self.assertEqual(conf.getint('int-var'), 12)
-        self.assertEqual(conf.getint('neg-int'), -2)
-        self.assertEqual(conf.getfloat('float-var'), 12.02)
-        self.assertEqual(conf.get('var1'), 'abc')
-        self.assert_(conf.getbool('true-var-1'))
-        self.assert_(conf.getbool('true-var-2'))
-        self.assert_(conf.getbool('true-var-3'))
-        self.assert_(not conf.getbool('false-var-1'))
-        self.assert_(not conf.getbool('false-var-2'))
-        self.assert_(not conf.getbool('false-var-3'))
-        self.assertEqual(conf.getlist('list-1'), [])
-        self.assertEqual(conf.getlist('list-2'), ['abc'])
-        self.assertEqual(conf.getlist('list-3'), ['abc', 'def', 'ghi'])
-        self.assertEqual(conf.getlist('list-4'), ['[', 'what', 'now?', ']'])
-        self.assert_(conf.getlist('list-0') is None)
-        missing = Thing()
-        self.assert_(conf.getlist('list-0', missing) is missing)
-        self.assertEqual(conf.getlist('list-1', missing), [])
-        self.assertEqual(conf.getlist('list-2', missing), ['abc'])
-        self.assertEqual(conf.getlist('list-3', missing),
-                         ['abc', 'def', 'ghi'])
-        self.assertEqual(conf.getlist('list-4', missing),
-                         ['[', 'what', 'now?', ']'])
+    def loadfile(self, file):
+        schema = self.get_schema()
+        self.conf, self.handlers = ZConfig.loadConfigFile(schema, file)
+        return self.conf
 
-
-class Thing:
-    pass
-
-class ConfigurationTestCase(TestBase):
+    def check_simple_gets(self, conf):
+        self.assertEqual(conf.empty, '')
+        self.assertEqual(conf.int_var, 12)
+        self.assertEqual(conf.neg_int, -2)
+        self.assertEqual(conf.float_var, 12.02)
+        self.assertEqual(conf.var1, 'abc')
+        self.assert_(conf.true_var_1)
+        self.assert_(conf.true_var_2)
+        self.assert_(conf.true_var_3)
+        self.assert_(not conf.false_var_1)
+        self.assert_(not conf.false_var_2)
+        self.assert_(not conf.false_var_3)
+        self.assertEqual(conf.list_1, [])
+        self.assertEqual(conf.list_2, ['abc'])
+        self.assertEqual(conf.list_3, ['abc', 'def', 'ghi'])
+        self.assertEqual(conf.list_4, ['[', 'what', 'now?', ']'])
 
     def test_simple_gets(self):
         conf = self.load("simple.conf")
         self.check_simple_gets(conf)
 
     def test_type_errors(self):
-        conf = self.load("simple.conf")
-        getbool = conf.getbool
-        getint = conf.getint
-        self.assertRaises(ValueError, getbool, 'int-var')
-        self.assertRaises(ValueError, getbool, 'float-var')
-        self.assertRaises(ValueError, getbool, 'neg-int')
-        self.assertRaises(ValueError, getint, 'true-var-1')
-        self.assertRaises(ValueError, getint, 'true-var-2')
-        self.assertRaises(ValueError, getint, 'true-var-3')
-        self.assertRaises(ValueError, getint, 'false-var-1')
-        self.assertRaises(ValueError, getint, 'false-var-2')
-        self.assertRaises(ValueError, getint, 'false-var-3')
-        self.assertRaises(ValueError, getint, 'float-var')
-
-    def test_range_errors(self):
-        conf = self.load("simple.conf")
-        getfloat = conf.getfloat
-        getint = conf.getint
-        self.assertRaises(ValueError, getint, 'int-var', min=20)
-        self.assertRaises(ValueError, getint, 'int-var', max=10)
-        self.assertRaises(ValueError, getint, 'neg-int', min=-1)
-        self.assertRaises(ValueError, getint, 'neg-int', max=-3)
-        self.assertRaises(ValueError, getfloat, 'float-var', min=12.03)
-        self.assertRaises(ValueError, getfloat, 'float-var', max=12.01)
-
-    def test_items(self):
-        conf = self.load("simplesections.conf")
-        self.assertEqual(sorted_items(conf),
-                         [("var", "foo"), ("var-0", "foo-0"),
-                          ("var-1", "foo-1"), ("var-2", "foo-2"),
-                          ("var-3", "foo-3"), ("var-4", "foo-4"),
-                          ("var-5", "foo-5"), ("var-6", "foo-6")])
-        self.assertEqual(sorted_items(conf.getSection("section", "name")),
-                         [("var", "bar"), ("var-one", "splat"),
-                          ("var-two", "stuff")])
-
-    def test_has_key(self):
-        conf = self.load("simplesections.conf")
-        sect = conf.getSection("section", "name")
-        for key in ("var", "var-one", "var-two"):
-            self.assert_(sect.has_key(key))
-            self.assert_(sect.has_key(key.upper()))
-        self.assert_(not sect.has_key("var-three"))
-
-    def test_missing_named_section(self):
-        conf = self.load("simplesections.conf")
-        self.assertRaises(ZConfig.ConfigurationMissingSectionError,
-                          conf.getSection, "section", "does-not-exist")
-
-    def test_keys(self):
-        conf = self.load("simplesections.conf")
-        self.assertEqual(sorted_keys(conf),
-                         ["var", "var-0", "var-1", "var-2", "var-3",
-                          "var-4", "var-5", "var-6"])
-        sect = conf.getSection("section", "Name")
-        self.assertEqual(sorted_keys(sect),
-                         ["var", "var-one", "var-two"])
-        sect = conf.getSection("Section", "delegate")
-        self.assertEqual(sorted_keys(sect), ["var", "var-two"])
-        sect = conf.getSection("SECTION", "ANOTHER")
-        self.assertEqual(sorted_keys(sect), ["var", "var-three"])
-        L = [sect for sect in conf.getChildSections() if not sect.name]
-        self.assertEqual(len(L), 3)
-        section, trivial, minimal = L
-        self.assert_(section.name is None)
-        self.assertEqual(section.type, "section")
-        self.assertEqual(sorted_keys(section), ["var", "var-two"])
-        self.assert_(trivial.name is None)
-        self.assertEqual(trivial.type, "trivial")
-        self.assertEqual(sorted_keys(trivial), ["var"])
-        self.assert_(minimal.name is None)
-        self.assertEqual(minimal.type, "minimal")
-        self.assertEqual(minimal.keys(), [])
+        Error = ZConfig.DataConversionError
+        raises = self.assertRaises
+        raises(Error, self.loadtext, "int-var true")
+        raises(Error, self.loadtext, "float-var true")
+        raises(Error, self.loadtext, "neg-int false")
+        raises(Error, self.loadtext, "true-var-1 0")
+        raises(Error, self.loadtext, "true-var-1 1")
+        raises(Error, self.loadtext, "true-var-1 -1")
 
     def test_simple_sections(self):
+        self.schema = ZConfig.loadSchema(CONFIG_BASE + "simplesections.xml")
         conf = self.load("simplesections.conf")
-        self.assertEqual(conf.get("var"), "foo")
+        self.assertEqual(conf.var, "foo")
         # check each interleaved position between sections
         for c in "0123456":
-            self.assertEqual(conf.get("var-" + c), "foo-" + c)
-        self.assert_(conf.get("var-7") is None)
-        sect = conf.getSection("section", "name")
-        for k, v in [("var", "bar"), ("var-one", "splat"),
-                     ("var-two", "stuff")]:
-            self.assertEqual(sect.get(k), v)
-            self.assertEqual(sect.get(k.upper()), v)
-        self.assert_(sect.get("not-there") is None)
-        sect = conf.getSection("section", "delegate")
-        for k, v in [("var", "spam"), ("var-two", "stuff")]:
-            self.assertEqual(sect.get(k), v)
-            self.assertEqual(sect.get(k.upper()), v)
-        self.assert_(sect.get("Var-One") is None)
-        L = []
-        for sect in conf.getChildSections():
-            if sect.type == "trivial":
-                L.append(sect)
-                self.assertEqual(sect.get("var"), "triv")
-                break
-        L2 = conf.getChildSections("TRIVIAL")
-        self.assertEqual(L, L2)
-
-    def test_no_delegation(self):
-        url = urljoin(CONFIG_BASE, "simplesections.conf")
-        context = NoDelegationContext()
-        self.assertRaises(ZConfig.ConfigurationTypeError,
-                          context.loadURL, url)
+            self.assertEqual(getattr(conf, "var_" +c), "foo-" + c)
+        sect = [sect for sect in conf.sections
+                if sect.getSectionName() == "name"][0]
+        self.assertEqual(sect.var, "bar")
+        self.assertEqual(sect.var_one, "splat")
+        self.assert_(sect.var_three is None)
+        sect = [sect for sect in conf.sections
+                if sect.getSectionName() == "delegate"][0]
+        self.assertEqual(sect.var, "spam")
+        self.assertEqual(sect.var_two, "stuff")
+        self.assert_(sect.var_three is None)
 
     def test_include(self):
         conf = self.load("include.conf")
-        self.assertEqual(conf.get("var1"), "abc")
-        self.assertEqual(conf.get("VAR1"), "abc")
-        self.assertEqual(conf.get("var2"), "value2")
-        self.assertEqual(conf.get("VAR2"), "value2")
-        self.assertEqual(conf.get("var3"), "value3")
-        self.assertEqual(conf.get("VAR3"), "value3")
-        self.assertEqual(conf.get("var4"), "value")
+        self.assertEqual(conf.var1, "abc")
+        self.assertEqual(conf.var2, "value2")
+        self.assertEqual(conf.var3, "value3")
+        self.assertEqual(conf.var4, "value")
 
     def test_includes_with_defines(self):
+        self.schema = ZConfig.loadSchemaFile(StringIO.StringIO("""\
+            <schema>
+              <key name='refinner' />
+              <key name='refouter' />
+            </schema>
+            """))
         conf = self.load("outer.conf")
-        self.assertEqual(conf.get("refinner"), "inner")
-        self.assertEqual(conf.get("refouter"), "outer")
+        self.assertEqual(conf.refinner, "inner")
+        self.assertEqual(conf.refouter, "outer")
 
     def test_define(self):
         conf = self.load("simple.conf")
-        self.assertEqual(conf.get("getname"), "value")
-        self.assertEqual(conf.get("getnametwice"), "valuevalue")
-        self.assertEqual(conf.get("getdollars"), "$$")
-        self.assertEqual(conf.get("getempty"), "xy")
-        self.assertEqual(conf.get("getwords"), "abc two words def")
+        self.assertEqual(conf.getname, "value")
+        self.assertEqual(conf.getnametwice, "valuevalue")
+        self.assertEqual(conf.getdollars, "$$")
+        self.assertEqual(conf.getempty, "xy")
+        self.assertEqual(conf.getwords, "abc two words def")
 
     def test_define_errors(self):
         self.assertRaises(ZConfig.ConfigurationSyntaxError,
@@ -222,6 +139,12 @@
         self.assertRaises(ZConfig.ConfigurationError,
                           self.load, "simplesections.conf#another")
 
+    def test_load_from_fileobj(self):
+        sio = StringIO.StringIO("%define name value\n"
+                                "getname x $name y \n")
+        cf = self.loadfile(sio)
+        self.assertEqual(cf.getname, "x value y")
+
     def test_load_from_abspath(self):
         fn = self.write_tempfile()
         try:
@@ -240,41 +163,16 @@
             os.chdir(pwd)
             os.unlink(fn)
 
-    def test_load_from_fileobj(self):
-        sio = StringIO.StringIO("name value\n"
-                                "<section>\n"
-                                "  name value2\n"
-                                "</section>\n")
-        cf = Context().loadFile(sio)
-        self.assertEqual(cf.get("Name"), "value")
-        self.assertEqual(cf.getSection("Section").get("Name"), "value2")
-
     def write_tempfile(self):
         fn = tempfile.mktemp()
         fp = open(fn, "w")
-        fp.write("key value\n")
+        fp.write("var1 value\n")
         fp.close()
         return fn
 
     def check_load_from_path(self, path):
-        context = Context()
-        context.loadURL(path)
-
-
-class NoDelegationContext(Context):
-    def getDelegateType(self, type):
-        return None
-
-
-def sorted_items(conf):
-    L = conf.items()
-    L.sort()
-    return L
-
-def sorted_keys(conf):
-    L = conf.keys()
-    L.sort()
-    return L
+        schema = self.get_schema()
+        ZConfig.loadConfig(schema, path)
 
 
 def test_suite():




More information about the Zope3-Checkins mailing list