Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "Fix BeatifulSoup 4 warnings" #720

Merged
merged 1 commit into from
Apr 24, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 35 additions & 109 deletions tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,22 +29,15 @@ def test_show_help(self):
res = render_form_field("subject")
self.assertIn("my_help_text", res)
self.assertNotIn("<i>my_help_text</i>", res)
res = render_template_with_form(
"{% bootstrap_field form.subject show_help=0 %}"
)
res = render_template_with_form("{% bootstrap_field form.subject show_help=0 %}")
self.assertNotIn("my_help_text", res)

def test_help_with_quotes(self):
# Checkboxes get special handling, so test a checkbox and something else
res = render_form_field("sender")
self.assertIn(
'title="{}"'.format(escape(TestForm.base_fields["sender"].help_text)), res
)
self.assertIn('title="{}"'.format(escape(TestForm.base_fields["sender"].help_text)), res)
res = render_form_field("cc_myself")
self.assertIn(
'title="{}"'.format(escape(TestForm.base_fields["cc_myself"].help_text)),
res,
)
self.assertIn('title="{}"'.format(escape(TestForm.base_fields["cc_myself"].help_text)), res)

def test_subject(self):
res = render_form_field("subject")
Expand All @@ -61,12 +54,7 @@ def test_xss_field(self):
),
res,
)
self.assertIn(
(
'placeholder="XSS&quot; onmouseover=&quot;alert(&#x27;Hello, XSS&#x27;)&quot; foo=&quot;"'
),
res,
)
self.assertIn(('placeholder="XSS&quot; onmouseover=&quot;alert(&#x27;Hello, XSS&#x27;)&quot; foo=&quot;"'), res)

def test_password(self):
res = render_form_field("password")
Expand Down Expand Up @@ -97,8 +85,7 @@ def test_radio_select(self):
)
if DJANGO_VERSION >= 4:
expected_html = expected_html.replace(
'<label for="id_category1_0">Category1</label>',
"<label>Category1</label>",
'<label for="id_category1_0">Category1</label>', "<label>Category1</label>"
)
self.assertHTMLEqual(res, expected_html)

Expand All @@ -108,49 +95,23 @@ def test_checkbox(self):
# strip out newlines and spaces around newlines
res = "".join(line.strip() for line in res.split("\n"))
res = BeautifulSoup(res, "html.parser")
form_group = self._select_one_element(
res, ".form-group", "Checkbox should be rendered inside a .form-group."
)
form_group = self._select_one_element(res, ".form-group", "Checkbox should be rendered inside a .form-group.")
form_check = self._select_one_element(
form_group,
".form-check",
"There should be a .form-check inside .form-group",
form_group, ".form-check", "There should be a .form-check inside .form-group"
)
checkbox = self._select_one_element(
form_check, "input", "The checkbox should be inside the .form-check"
)
self.assertIn(
"form-check-input",
checkbox["class"],
"The checkbox should have the class 'form-check-input'.",
)
label = checkbox.next_sibling
checkbox = self._select_one_element(form_check, "input", "The checkbox should be inside the .form-check")
self.assertIn("form-check-input", checkbox["class"], "The checkbox should have the class 'form-check-input'.")
label = checkbox.nextSibling
self.assertIsNotNone(label, "The label should be rendered after the checkbox.")
self.assertEqual(label.name, "label", "After the checkbox there should be a label.")
self.assertEqual(
label.name, "label", "After the checkbox there should be a label."
)
self.assertEqual(
label["for"],
checkbox["id"],
"The for attribute of the label should be the id of the checkbox.",
)
help_text = label.next_sibling
self.assertIsNotNone(
help_text, "The help text should be rendered after the label."
)
self.assertEqual(
help_text.name, "small", "The help text should be rendered as <small> tag."
)
self.assertIn(
"form-text",
help_text["class"],
"The help text should have the class 'form-text'.",
)
self.assertIn(
"text-muted",
help_text["class"],
"The help text should have the class 'text-muted'.",
label["for"], checkbox["id"], "The for attribute of the label should be the id of the checkbox."
)
help_text = label.nextSibling
self.assertIsNotNone(help_text, "The help text should be rendered after the label.")
self.assertEqual(help_text.name, "small", "The help text should be rendered as <small> tag.")
self.assertIn("form-text", help_text["class"], "The help text should have the class 'form-text'.")
self.assertIn("text-muted", help_text["class"], "The help text should have the class 'text-muted'.")

def test_checkbox_multiple_select(self):
res = render_form_field("category2")
Expand Down Expand Up @@ -187,9 +148,7 @@ def test_required_field(self):
# Required settings in field
form_field = "form.subject"
rendered = render_template_with_form(
"{% bootstrap_field "
+ form_field
+ ' required_css_class="test-required" %}'
"{% bootstrap_field " + form_field + ' required_css_class="test-required" %}'
)
self.assertIn("test-required", rendered)

Expand All @@ -204,16 +163,10 @@ def test_empty_permitted(self):
self.assertNotIn(required_css_class, res)

def test_input_group(self):
res = render_template_with_form(
'{% bootstrap_field form.subject addon_before="$" addon_after=".00" %}'
)
res = render_template_with_form('{% bootstrap_field form.subject addon_before="$" addon_after=".00" %}')
self.assertIn('class="input-group"', res)
self.assertIn(
'class="input-group-prepend"><span class="input-group-text">$', res
)
self.assertIn(
'class="input-group-append"><span class="input-group-text">.00', res
)
self.assertIn('class="input-group-prepend"><span class="input-group-text">$', res)
self.assertIn('class="input-group-append"><span class="input-group-text">.00', res)

def test_input_group_addon_button(self):
res = render_template_with_form(
Expand All @@ -227,15 +180,10 @@ def test_input_group_addon_button(self):
self.assertIn('<div class="input-group-append">.00</div>', res)

def test_input_group_addon_empty(self):
res = render_template_with_form(
'{% bootstrap_field form.subject addon_before=None addon_after="after" %}'
) # noqa
res = render_template_with_form('{% bootstrap_field form.subject addon_before=None addon_after="after" %}') # noqa
self.assertIn('class="input-group"', res)
self.assertNotIn("input-group-prepend", res)
self.assertIn(
'<div class="input-group-append"><span class="input-group-text">after</span></div>',
res,
)
self.assertIn('<div class="input-group-append"><span class="input-group-text">after</span></div>', res)

def test_input_group_addon_validation(self):
"""
Expand All @@ -246,8 +194,7 @@ def test_input_group_addon_validation(self):
# invalid form data:
data = {"subject": ""}
res = render_template_with_form(
'{% bootstrap_field form.subject addon_before=None addon_after="after" %}',
data=data,
'{% bootstrap_field form.subject addon_before=None addon_after="after" %}', data=data
) # noqa
res = BeautifulSoup(res, "html.parser")
self._select_one_element(
Expand All @@ -257,34 +204,26 @@ def test_input_group_addon_validation(self):
"required, must be placed inside the input-group",
)
self._select_one_element(
res,
".form-group > .form-text",
"The form-text message must be placed inside the form-group",
res, ".form-group > .form-text", "The form-text message must be placed inside the form-group"
)
self.assertEqual(
len(res.select(".form-group > .invalid-feedback")),
0,
"The invalid-feedback message must be placed inside the "
"input-group and not inside the form-group",
"The invalid-feedback message must be placed inside the " "input-group and not inside the form-group",
)
self.assertEqual(
len(res.select(".input-group > .form-text")),
0,
"The form-text message must be placed inside the form-group and "
"not inside the input-group",
"The form-text message must be placed inside the form-group and " "not inside the input-group",
)

def test_size(self):
def _test_size(param, klass):
res = render_template_with_form(
'{% bootstrap_field form.subject size="' + param + '" %}'
)
res = render_template_with_form('{% bootstrap_field form.subject size="' + param + '" %}')
self.assertIn(klass, res)

def _test_size_medium(param):
res = render_template_with_form(
'{% bootstrap_field form.subject size="' + param + '" %}'
)
res = render_template_with_form('{% bootstrap_field form.subject size="' + param + '" %}')
self.assertNotIn("form-control-lg", res)
self.assertNotIn("form-control-sm", res)
self.assertNotIn("form-control-md", res)
Expand All @@ -309,9 +248,7 @@ def test_field_same_render(self):
self.assertEqual(rendered_a, rendered_b)

def test_label(self):
res = render_template_with_form(
'{% bootstrap_label "foobar" label_for="subject" %}'
)
res = render_template_with_form('{% bootstrap_label "foobar" label_for="subject" %}')
self.assertEqual('<label for="subject">foobar</label>', res)

def test_attributes_consistency(self):
Expand All @@ -322,9 +259,7 @@ def test_attributes_consistency(self):

class ComponentsTest(TestCase):
def test_bootstrap_alert(self):
res = render_template_with_form(
'{% bootstrap_alert "content" alert_type="danger" %}'
)
res = render_template_with_form('{% bootstrap_alert "content" alert_type="danger" %}')
self.assertEqual(
res.strip(),
'<div class="alert alert-danger alert-dismissible" role="alert">'
Expand All @@ -337,30 +272,21 @@ def test_bootstrap_alert(self):
class ShowLabelTest(TestCase):
def test_show_label_false(self):
form = CharFieldTestForm()
res = render_template_with_form(
"{% bootstrap_form form show_label=False %}", {"form": form}
)
res = render_template_with_form("{% bootstrap_form form show_label=False %}", {"form": form})
self.assertIn("sr-only", res)

def test_show_label_sr_only(self):
form = CharFieldTestForm()
res = render_template_with_form(
"{% bootstrap_form form show_label='sr-only' %}", {"form": form}
)
res = render_template_with_form("{% bootstrap_form form show_label='sr-only' %}", {"form": form})
self.assertIn("sr-only", res)

def test_show_label_skip(self):
form = CharFieldTestForm()
res = render_template_with_form(
"{% bootstrap_form form show_label='skip' %}", {"form": form}
)
res = render_template_with_form("{% bootstrap_form form show_label='skip' %}", {"form": form})
self.assertNotIn("<label>", res)

def test_for_formset(self):
TestFormSet = formset_factory(CharFieldTestForm, extra=1)
test_formset = TestFormSet()
res = render_template_with_form(
"{% bootstrap_formset formset show_label=False %}",
{"formset": test_formset},
)
res = render_template_with_form("{% bootstrap_formset formset show_label=False %}", {"formset": test_formset})
self.assertIn("sr-only", res)
Loading