1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Closes #5016: assertHttpStatus() should report form validation errors

This commit is contained in:
Jeremy Stretch
2020-08-18 17:02:47 -04:00
parent 0d9fc309d5
commit 3ebef04a11
3 changed files with 32 additions and 29 deletions

View File

@ -16,14 +16,6 @@
<input type="checkbox" name="_nullify" value="{{ field.name }}" /> Set null <input type="checkbox" name="_nullify" value="{{ field.name }}" /> Set null
</label> </label>
{% endif %} {% endif %}
{% if field.errors %}
<ul>
{% for error in field.errors %}
<li class="text-danger">{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% elif field|widget_type == 'textarea' and not field.label %} {% elif field|widget_type == 'textarea' and not field.label %}
<div class="col-md-12"> <div class="col-md-12">
{{ field }} {{ field }}
@ -35,14 +27,6 @@
{% if field.help_text %} {% if field.help_text %}
<span class="help-block">{{ field.help_text|safe }}</span> <span class="help-block">{{ field.help_text|safe }}</span>
{% endif %} {% endif %}
{% if field.errors %}
<ul>
{% for error in field.errors %}
<li class="text-danger">{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% else %} {% else %}
<label class="col-md-3 control-label{% if field.field.required %} required{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label> <label class="col-md-3 control-label{% if field.field.required %} required{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
<div class="col-md-9"> <div class="col-md-9">
@ -55,13 +39,15 @@
{% if field.help_text %} {% if field.help_text %}
<span class="help-block">{{ field.help_text|safe }}</span> <span class="help-block">{{ field.help_text|safe }}</span>
{% endif %} {% endif %}
{% endif %}
{% if field.errors %} {% if field.errors %}
<ul> <ul>
{% for error in field.errors %} {% for error in field.errors %}
{# Embed an HTML comment indicating the error for extraction by tests #}
<!-- FORM-ERROR {{ field.name }}: {{ error }} -->
<li class="text-danger">{{ error }}</li> <li class="text-danger">{{ error }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
{% endif %} {% endif %}
</div> </div>
{% endif %}
</div> </div>

View File

@ -1,4 +1,5 @@
import logging import logging
import re
from contextlib import contextmanager from contextlib import contextmanager
from django.contrib.auth.models import Permission, User from django.contrib.auth.models import Permission, User
@ -43,6 +44,14 @@ def create_test_user(username='testuser', permissions=None):
return user return user
def extract_form_failures(content):
"""
Given raw HTML content from an HTTP response, return a list of form errors.
"""
FORM_ERROR_REGEX = r'<!-- FORM-ERROR (.*) -->'
return re.findall(FORM_ERROR_REGEX, str(content))
@contextmanager @contextmanager
def disable_warnings(logger_name): def disable_warnings(logger_name):
""" """

View File

@ -13,7 +13,7 @@ from taggit.managers import TaggableManager
from extras.models import Tag from extras.models import Tag
from users.models import ObjectPermission from users.models import ObjectPermission
from utilities.permissions import resolve_permission_ct from utilities.permissions import resolve_permission_ct
from .utils import disable_warnings, post_data from .utils import disable_warnings, extract_form_failures, post_data
__all__ = ( __all__ = (
@ -113,10 +113,18 @@ class TestCase(_TestCase):
""" """
TestCase method. Provide more detail in the event of an unexpected HTTP response. TestCase method. Provide more detail in the event of an unexpected HTTP response.
""" """
err_message = "Expected HTTP status {}; received {}: {}" err_message = None
self.assertEqual(response.status_code, expected_status, err_message.format( # Construct an error message only if we know the test is going to fail
expected_status, response.status_code, getattr(response, 'data', response.content) if response.status_code != expected_status:
)) if hasattr(response, 'data'):
# REST API response; pass the response data through directly
err = response.data
else:
# Attempt to extract form validation errors from the response HTML
form_errors = extract_form_failures(response.content)
err = form_errors or response.content or 'No data'
err_message = f"Expected HTTP status {expected_status}; received {response.status_code}: {err}"
self.assertEqual(response.status_code, expected_status, err_message)
def assertInstanceEqual(self, instance, data, api=False): def assertInstanceEqual(self, instance, data, api=False):
""" """