#30497: assertXMLEqual chokes on document type declaration
-----------------------------------+--------------------------------------
     Reporter:  Yuri Kanivetsky    |                    Owner:  nobody
         Type:  Bug                |                   Status:  new
    Component:  Testing framework  |                  Version:  2.2
     Severity:  Normal             |               Resolution:
     Keywords:                     |             Triage Stage:  Unreviewed
    Has patch:  0                  |      Needs documentation:  0
  Needs tests:  0                  |  Patch needs improvement:  0
Easy pickings:  0                  |                    UI/UX:  0
-----------------------------------+--------------------------------------
Description changed by Yuri Kanivetsky:

Old description:

> Prepare Django project:
>
> {{{
> $ python -m venv env
> $ . ./env/bin/activate
> $ pip install django
> $ django-admin startproject p1
> $ cd p1
> }}}
>
> Create `p1/tests.py`:
>
> {{{
> #!python
> from django.test import TestCase
>
> class MyTestCase(TestCase):
>     def test_assert_xml_equal(self):
>         xml1 = '''
>             <?xml version="1.0" encoding="UTF-8"?>
>             <!DOCTYPE example SYSTEM "example.dtd">
>             <root />
>         '''
>         xml2 = '''
>             <?xml version="1.0" encoding="UTF-8"?>
>             <!DOCTYPE example SYSTEM "example.dtd">
>             <root />
>         '''
>         self.assertXMLEqual(xml1, xml2)
> }}}
>
> Run the tests:
>
> {{{
> $ ./manage.py test
> Creating test database for alias 'default'...
> F
> ======================================================================
> FAIL: test_assert_xml_equal (p1.tests.MyTestCase)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/home/yuri/_/1/env/lib/python3.7/site-
> packages/django/test/testcases.py", line 843, in assertXMLEqual
>     result = compare_xml(xml1, xml2)
>   File "/home/yuri/_/1/env/lib/python3.7/site-
> packages/django/test/utils.py", line 598, in compare_xml
>     return check_element(want_root, got_root)
> AttributeError: 'DocumentType' object has no attribute 'tagName'
>
> During handling of the above exception, another exception occurred:
>
> Traceback (most recent call last):
>   File "/home/yuri/_/1/p1/p1/tests.py", line 15, in test_assert_xml_equal
>     self.assertXMLEqual(xml1, xml2)
>   File "/home/yuri/_/1/env/lib/python3.7/site-
> packages/django/test/testcases.py", line 846, in assertXMLEqual
>     self.fail(self._formatMessage(msg, standardMsg))
> AssertionError: First or second argument is not valid XML
> 'DocumentType' object has no attribute 'tagName'
>
> ----------------------------------------------------------------------
> Ran 1 test in 0.002s
>
> FAILED (failures=1)
> Destroying test database for alias 'default'...
> System check identified no issues (0 silenced).
> }}}
>
> That happens because `django.utils` expects first
> [https://github.com/django/django/blob/2.2.1/django/test/utils.py#L595-L596
> non-comment] element to be the
> [https://github.com/django/django/blob/2.2.1/django/test/utils.py#L579-L582
> root] element. Which is generally not the case.

New description:

 Prepare Django project:

 {{{
 $ python -m venv env
 $ . ./env/bin/activate
 $ pip install django
 $ django-admin startproject p1
 $ cd p1
 }}}

 Create `p1/tests.py`:

 {{{
 #!python
 from django.test import TestCase

 class MyTestCase(TestCase):
     def test_assert_xml_equal(self):
         xml1 = '''
             <?xml version="1.0" encoding="UTF-8"?>
             <!DOCTYPE root SYSTEM "example.dtd">
             <root />
         '''
         xml2 = '''
             <?xml version="1.0" encoding="UTF-8"?>
             <!DOCTYPE root SYSTEM "example.dtd">
             <root />
         '''
         self.assertXMLEqual(xml1, xml2)
 }}}

 Run the tests:

 {{{
 $ ./manage.py test
 Creating test database for alias 'default'...
 F
 ======================================================================
 FAIL: test_assert_xml_equal (p1.tests.MyTestCase)
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "/home/yuri/_/1/env/lib/python3.7/site-
 packages/django/test/testcases.py", line 843, in assertXMLEqual
     result = compare_xml(xml1, xml2)
   File "/home/yuri/_/1/env/lib/python3.7/site-
 packages/django/test/utils.py", line 598, in compare_xml
     return check_element(want_root, got_root)
 AttributeError: 'DocumentType' object has no attribute 'tagName'

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "/home/yuri/_/1/p1/p1/tests.py", line 15, in test_assert_xml_equal
     self.assertXMLEqual(xml1, xml2)
   File "/home/yuri/_/1/env/lib/python3.7/site-
 packages/django/test/testcases.py", line 846, in assertXMLEqual
     self.fail(self._formatMessage(msg, standardMsg))
 AssertionError: First or second argument is not valid XML
 'DocumentType' object has no attribute 'tagName'

 ----------------------------------------------------------------------
 Ran 1 test in 0.002s

 FAILED (failures=1)
 Destroying test database for alias 'default'...
 System check identified no issues (0 silenced).
 }}}

 That happens because `django.utils` expects first
 [https://github.com/django/django/blob/2.2.1/django/test/utils.py#L595-L596
 non-comment] element to be the
 [https://github.com/django/django/blob/2.2.1/django/test/utils.py#L579-L582
 root] element. Which is generally not the case.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/30497#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/064.c8691261ea2132f47c5677654b7396eb%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to