Skip to content

Commit

Permalink
Add ignore_attrs to assertHTMLEqual
Browse files Browse the repository at this point in the history
  • Loading branch information
dyve committed Dec 26, 2023
1 parent e55a0ea commit 840dab1
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 5 deletions.
40 changes: 35 additions & 5 deletions src/django_marina/test/test_cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from django.contrib.messages import get_messages
from django.test import TestCase

from django_marina.html import remove_attrs

from .clients import ExtendedClient


Expand Down Expand Up @@ -48,7 +50,10 @@ def assertResponseStatusCode(self, response, status_code, msg_prefix=None):
self.assertEqual(
response.status_code,
status_code,
_msg_prefix_add(msg_prefix, f"Invalid response code {response.status_code} (expected {status_code})."),
_msg_prefix_add(
msg_prefix,
f"Invalid response code {response.status_code} (expected {status_code}).",
),
)

def assertResponseOk(self, response):
Expand Down Expand Up @@ -153,7 +158,16 @@ def _get_soup_num_results(self, response, soup_method, soup_args, soup_kwargs):

return len(results)

def _assert_soup(self, response, soup_method, soup_args, soup_kwargs, status_code, count, msg_prefix):
def _assert_soup(
self,
response,
soup_method,
soup_args,
soup_kwargs,
status_code,
count,
msg_prefix,
):
"""Handle assertions that use BeautifulSoup, with interface similar to assertContains and assertNotContains."""
self.assertEqual(
response.status_code,
Expand All @@ -168,15 +182,23 @@ def _assert_soup(self, response, soup_method, soup_args, soup_kwargs, status_cod
num_results = self._get_soup_num_results(response, soup_method, soup_args, soup_kwargs)

if count == 0:
self.assertEqual(num_results, 0, _msg_prefix_add(msg_prefix, f"Response should not contain {soup_query}"))
self.assertEqual(
num_results,
0,
_msg_prefix_add(msg_prefix, f"Response should not contain {soup_query}"),
)
elif count is None:
self.assertTrue(num_results != 0, _msg_prefix_add(msg_prefix, f"Couldn't find {soup_query} in response"))
self.assertTrue(
num_results != 0,
_msg_prefix_add(msg_prefix, f"Couldn't find {soup_query} in response"),
)
else:
self.assertEqual(
num_results,
count,
_msg_prefix_add(
msg_prefix, f"Found {num_results} instances of {soup_query} in response (expected {count})"
msg_prefix,
f"Found {num_results} instances of {soup_query} in response (expected {count})",
),
)

Expand Down Expand Up @@ -242,3 +264,11 @@ def assertNotContainsSelector(self, response, selector, status_code=200, msg_pre
count=0,
msg_prefix=msg_prefix,
)

def assertHTMLEqual(self, html1, html2, msg=None, ignore_attrs=None):
"""
Assert that the strings html1 and html2 are equal, except for certain attributes to ignore.
The comparison is based on HTML semantics.
"""
return super().assertHTMLEqual(remove_attrs(html1, ignore_attrs), remove_attrs(html2, ignore_attrs), msg)
9 changes: 9 additions & 0 deletions tests/test_extended_test_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,3 +177,12 @@ def test_assert_has_message(self):
self.assertHasMessage(response, message)
with self.assertRaises(AssertionError):
self.assertHasMessage(response, partial_message)


class HtmlTestCase(ExtendedTestCase):
def test_assert_html_equal(self):
html1 = '<span aria-foo="bar">foo-bar</span>'
html2 = "<span>foo-bar</span>"
with self.assertRaises(AssertionError):
self.assertHTMLEqual(html1, html2)
self.assertHTMLEqual(html1, html2, ignore_attrs=["aria-foo"])

0 comments on commit 840dab1

Please sign in to comment.