summaryrefslogtreecommitdiff
path: root/src/lxml
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2014-03-15 10:12:24 +0100
committerStefan Behnel <stefan_ml@behnel.de>2014-03-15 10:12:24 +0100
commit2e6a1b6f25701b83a776131f4e8d0820531cfa00 (patch)
treebe8ca2b00a4bb1fbeae923b053513105e9fa73bd /src/lxml
parent0c905beeb1bd2dc47d2712a7d28a376d8c0a424b (diff)
downloadpython-lxml-2e6a1b6f25701b83a776131f4e8d0820531cfa00.tar.gz
add test for recursive XInclude processing
Diffstat (limited to 'src/lxml')
-rw-r--r--src/lxml/tests/test_etree.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/lxml/tests/test_etree.py b/src/lxml/tests/test_etree.py
index 070ebdf7..e1506185 100644
--- a/src/lxml/tests/test_etree.py
+++ b/src/lxml/tests/test_etree.py
@@ -15,6 +15,7 @@ import re
import gc
import operator
import tempfile
+import textwrap
import zlib
import gzip
@@ -3615,6 +3616,50 @@ class _XIncludeTestCase(HelperTestCase):
[("dtd", True), ("include", True), ("input", True)],
called)
+ def test_xinclude_resolver_recursive(self):
+ data = textwrap.dedent('''
+ <doc xmlns:xi="http://www.w3.org/2001/XInclude">
+ <foo/>
+ <xi:include href="./test.xml" />
+ </doc>
+ ''')
+
+ class Resolver(etree.Resolver):
+ called = {}
+
+ def resolve(self, url, id, context):
+ if url.endswith("test_xinclude.xml"):
+ assert not self.called.get("input")
+ self.called["input"] = True
+ return None # delegate to default resolver
+ elif url.endswith('/test5.xml'):
+ assert not self.called.get("DONE")
+ self.called["DONE"] = True
+ return self.resolve_string('<DONE/>', context)
+ else:
+ _, filename = url.rsplit('/', 1)
+ assert not self.called.get(filename)
+ self.called[filename] = True
+ next_data = data.replace(
+ 'test.xml', 'test%d.xml' % len(self.called))
+ return self.resolve_string(next_data, context)
+
+ res_instance = Resolver()
+ parser = etree.XMLParser(load_dtd=True)
+ parser.resolvers.add(res_instance)
+
+ tree = etree.parse(fileInTestDir('include/test_xinclude.xml'),
+ parser=parser)
+
+ self.include(tree)
+
+ called = list(res_instance.called.items())
+ called.sort()
+ self.assertEqual(
+ [("DONE", True), ("input", True), ("test.xml", True),
+ ("test2.xml", True), ("test3.xml", True), ("test4.xml", True)],
+ called)
+
class ETreeXIncludeTestCase(_XIncludeTestCase):
def include(self, tree):