diff --git a/src/jcl/tests/__init__.py b/src/jcl/tests/__init__.py
index 4593063..d5fa219 100644
--- a/src/jcl/tests/__init__.py
+++ b/src/jcl/tests/__init__.py
@@ -7,6 +7,7 @@ import tempfile
import sys
import types
import libxml2
+import logging
from sqlobject.dbconnection import TheURIOpener
import jcl.model
@@ -16,21 +17,30 @@ if sys.platform == "win32":
else:
DB_DIR = "/tmp/"
-def is_xml_equal(xml_ref, xml_test, strict=False, test_sibling=True):
+__logger = logging.getLogger("jcl.tests")
+
+def is_xml_equal(xml_ref, xml_test, strict=False,
+ strict_attribut=False, test_sibling=True):
"""
Test for xml structures equality.
By default (`strict`=False), it only test if `xml_ref` structure is included
in `xml_test` (ie. if all elements of `xml_ref` exists in `xml_test`).
if `strict`=True, it also checks if all elements of `xml_test` are in `xml_ref`.
- siblings are tested only if `test_sibling` is True.
+ siblings are tested only if `test_sibling` is True. Attribut equality is
+ tested only if `strict_attribut`=True.
`xml_ref`.
`xml_ref`: xml node
`xml_test`: xml node
`strict`: boolean
+ `strict_attribut`: boolean
`test_sibling`: boolean
"""
+ __logger.info("Testing xml node equality:\n--\n" + str(xml_ref) + "\n--\n"
+ + str(xml_test) + "\n--\n")
if (xml_ref is None) ^ (xml_test is None):
if strict or xml_test is None:
+ __logger.error("xml_test (" + str(xml_test) + ") or xml_ref ("
+ + str(xml_ref) + ") is None")
return False
else:
return True
@@ -53,7 +63,8 @@ def is_xml_equal(xml_ref, xml_test, strict=False, test_sibling=True):
return False
else:
if test.next is not None:
- return is_xml_equal(ref, test.next, strict, False)
+ return is_xml_equal(ref, test.next, strict,
+ strict_attribut, False)
else:
return False
else:
@@ -61,14 +72,20 @@ def is_xml_equal(xml_ref, xml_test, strict=False, test_sibling=True):
if not check_equality(lambda ref, test: ref.type == test.type,
xml_ref, xml_test, strict):
+ __logger.error("XML node types are different: " + str(xml_ref.type)
+ + " != " + str(xml_test.type))
return False
if not check_equality(lambda ref, test: ref.name == test.name,
xml_ref, xml_test, strict):
+ __logger.error("XML node names are different: " + str(xml_ref.name)
+ + " != " + str(xml_test.name))
return False
if not check_equality(lambda ref, test: str(ref.ns()) == str(test.ns()),
xml_ref, xml_test, strict):
+ __logger.error("XML node namespaces are different: " + str(xml_ref.ns())
+ + " != " + str(xml_test.ns()))
return False
def check_attribut_equality(ref, test):
@@ -81,12 +98,18 @@ def is_xml_equal(xml_ref, xml_test, strict=False, test_sibling=True):
return False
for attr in ref.properties:
if ref.prop(attr.name) != test.prop(attr.name):
+ __logger.error("XML node attributs are different: "
+ + str(attr)
+ + " != " + str(test.prop(attr.name)))
return False
- if strict:
+ if strict_attribut:
for attr in test.properties:
if ref.prop(attr.name) != test.prop(attr.name):
+ __logger.error("XML node attributs are different: "
+ + str(attr)
+ + " != " + str(ref.prop(attr.name)))
return False
- elif strict and test.properties is not None:
+ elif strict_attribut and test.properties is not None:
return False
return True
@@ -95,8 +118,12 @@ def is_xml_equal(xml_ref, xml_test, strict=False, test_sibling=True):
return False
if not check_equality(lambda ref, test: \
- is_xml_equal(ref.children, test.children, strict),
+ is_xml_equal(ref.children, test.children,
+ strict, strict_attribut),
xml_ref, xml_test, strict):
+ __logger.error("XML node children are different: "
+ + str(xml_ref.children)
+ + " != " + str(xml_test.children))
return False
if test_sibling:
@@ -105,8 +132,10 @@ def is_xml_equal(xml_ref, xml_test, strict=False, test_sibling=True):
else:
new_xml_test = xml_test
if not check_equality(lambda ref, test: \
- is_xml_equal(ref, test, strict),
+ is_xml_equal(ref, test, strict,
+ strict_attribut),
xml_ref.next, new_xml_test, strict):
+ __logger.error("XML node siblings are different")
return False
return True
@@ -260,10 +289,18 @@ class JCLTest_TestCase(unittest.TestCase):
Test with only one node (as string) strict equality 2
differents structures (attribut added).
"""
- self.assertFalse(is_xml_equal("", "",
- True))
+ self.assertTrue(is_xml_equal("", "",
+ True))
- def test_is_xml_equal_simple_str_node_strict_different(self):
+ def test_is_xml_equal_simple_str_node_strict_attribut_different(self):
+ """
+ Test with only one node (as string) strict equality 2
+ differents structures (attribut added).
+ """
+ self.assertFalse(is_xml_equal("", "",
+ strict_attribut=True))
+
+ def test_is_xml_equal_simple_str_node_strict_different2(self):
"""
Test with only one node (as string) strict equality 2
differents structures (attribut missing).
@@ -331,13 +368,22 @@ class JCLTest_TestCase(unittest.TestCase):
True))
def test_is_xml_equal_complex_str_node_strict_different(self):
+ """
+ Test 2 complex not strictly equal (attribut added) xml structures
+ (strict equality).
+ """
+ self.assertTrue(is_xml_equal("""""",
+ """""",
+ True))
+
+ def test_is_xml_equal_complex_str_node_strict_attribut_different(self):
"""
Test 2 complex not strictly equal (attribut added) xml structures
(strict equality).
"""
self.assertFalse(is_xml_equal("""""",
"""""",
- True))
+ strict_attribut=True))
def test_is_xml_equal_complex_str_node_strict_different_missing_attribut(self):
"""
@@ -406,4 +452,6 @@ def suite():
return test_suite
if __name__ == '__main__':
+ if "-v" in sys.argv:
+ __logger.setLevel(logging.INFO)
unittest.main(defaultTest='suite')