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:
@ -16,14 +16,6 @@
|
||||
<input type="checkbox" name="_nullify" value="{{ field.name }}" /> Set null
|
||||
</label>
|
||||
{% 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 %}
|
||||
<div class="col-md-12">
|
||||
{{ field }}
|
||||
@ -35,14 +27,6 @@
|
||||
{% if field.help_text %}
|
||||
<span class="help-block">{{ field.help_text|safe }}</span>
|
||||
{% endif %}
|
||||
{% if field.errors %}
|
||||
<ul>
|
||||
{% for error in field.errors %}
|
||||
<li class="text-danger">{{ error }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<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">
|
||||
@ -55,13 +39,15 @@
|
||||
{% if field.help_text %}
|
||||
<span class="help-block">{{ field.help_text|safe }}</span>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if field.errors %}
|
||||
<ul>
|
||||
{% 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>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
@ -1,4 +1,5 @@
|
||||
import logging
|
||||
import re
|
||||
from contextlib import contextmanager
|
||||
|
||||
from django.contrib.auth.models import Permission, User
|
||||
@ -43,6 +44,14 @@ def create_test_user(username='testuser', permissions=None):
|
||||
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
|
||||
def disable_warnings(logger_name):
|
||||
"""
|
||||
|
@ -13,7 +13,7 @@ from taggit.managers import TaggableManager
|
||||
from extras.models import Tag
|
||||
from users.models import ObjectPermission
|
||||
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__ = (
|
||||
@ -113,10 +113,18 @@ class TestCase(_TestCase):
|
||||
"""
|
||||
TestCase method. Provide more detail in the event of an unexpected HTTP response.
|
||||
"""
|
||||
err_message = "Expected HTTP status {}; received {}: {}"
|
||||
self.assertEqual(response.status_code, expected_status, err_message.format(
|
||||
expected_status, response.status_code, getattr(response, 'data', response.content)
|
||||
))
|
||||
err_message = None
|
||||
# Construct an error message only if we know the test is going to fail
|
||||
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):
|
||||
"""
|
||||
|
Reference in New Issue
Block a user