diff options
| author | Stefan Behnel <stefan_ml@behnel.de> | 2014-03-15 10:12:24 +0100 |
|---|---|---|
| committer | Stefan Behnel <stefan_ml@behnel.de> | 2014-03-15 10:12:24 +0100 |
| commit | 2e6a1b6f25701b83a776131f4e8d0820531cfa00 (patch) | |
| tree | be8ca2b00a4bb1fbeae923b053513105e9fa73bd /src/lxml | |
| parent | 0c905beeb1bd2dc47d2712a7d28a376d8c0a424b (diff) | |
| download | python-lxml-2e6a1b6f25701b83a776131f4e8d0820531cfa00.tar.gz | |
add test for recursive XInclude processing
Diffstat (limited to 'src/lxml')
| -rw-r--r-- | src/lxml/tests/test_etree.py | 45 |
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): |
