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
|
<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>
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
Reference in New Issue
Block a user