Browse Source

Fixed #31250 -- Ignored processing instructions in assertXMLEqual()/assertXMLNotEqual().

yura 5 years ago
parent
commit
54b7af7eb4
3 changed files with 24 additions and 5 deletions
  1. 7 3
      django/test/utils.py
  2. 2 2
      docs/topics/testing/tools.txt
  3. 15 0
      tests/test_utils/tests.py

+ 7 - 3
django/test/utils.py

@@ -537,8 +537,8 @@ def compare_xml(want, got):
     """
     Try to do a 'xml-comparison' of want and got. Plain string comparison
     doesn't always work because, for example, attribute ordering should not be
-    important. Ignore comment nodes, document type node, and leading and
-    trailing whitespaces.
+    important. Ignore comment nodes, processing instructions, document type
+    node, and leading and trailing whitespaces.
 
     Based on https://github.com/lxml/lxml/blob/master/src/lxml/doctestcompare.py
     """
@@ -576,7 +576,11 @@ def compare_xml(want, got):
 
     def first_node(document):
         for node in document.childNodes:
-            if node.nodeType not in (Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE):
+            if node.nodeType not in (
+                Node.COMMENT_NODE,
+                Node.DOCUMENT_TYPE_NODE,
+                Node.PROCESSING_INSTRUCTION_NODE,
+            ):
                 return node
 
     want = want.strip().replace('\\n', '\n')

+ 2 - 2
docs/topics/testing/tools.txt

@@ -1613,8 +1613,8 @@ your test suite.
     syntax differences. When invalid XML is passed in any parameter, an
     ``AssertionError`` is always raised, even if both string are identical.
 
-    XML declaration, document type, and comments are ignored. Only the root
-    element and its children are compared.
+    XML declaration, document type, processing instructions, and comments are
+    ignored. Only the root element and its children are compared.
 
     Output in case of error can be customized with the ``msg`` argument.
 

+ 15 - 0
tests/test_utils/tests.py

@@ -926,6 +926,21 @@ class XMLEqualTests(SimpleTestCase):
         xml2 = '<?xml version="1.0"?><!DOCTYPE root SYSTEM "example2.dtd"><root />'
         self.assertXMLEqual(xml1, xml2)
 
+    def test_processing_instruction(self):
+        xml1 = (
+            '<?xml version="1.0"?>'
+            '<?xml-model href="http://www.example1.com"?><root />'
+        )
+        xml2 = (
+            '<?xml version="1.0"?>'
+            '<?xml-model href="http://www.example2.com"?><root />'
+        )
+        self.assertXMLEqual(xml1, xml2)
+        self.assertXMLEqual(
+            '<?xml-stylesheet href="style1.xslt" type="text/xsl"?><root />',
+            '<?xml-stylesheet href="style2.xslt" type="text/xsl"?><root />',
+        )
+
 
 class SkippingExtraTests(TestCase):
     fixtures = ['should_not_be_loaded.json']