mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-18 13:38:16 -06:00
Add bulk edit M2M validation test
This commit is contained in:
parent
d592285b98
commit
ce08e8d437
@ -2,20 +2,16 @@ import datetime
|
|||||||
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.test import override_settings
|
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.timezone import make_aware
|
from django.utils.timezone import make_aware
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
||||||
from circuits.api.serializers import ProviderSerializer
|
|
||||||
from core.choices import ManagedFileRootPathChoices
|
from core.choices import ManagedFileRootPathChoices
|
||||||
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Rack, Location, RackRole, Site
|
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Rack, Location, RackRole, Site
|
||||||
from extras.models import *
|
from extras.models import *
|
||||||
from extras.reports import Report
|
from extras.reports import Report
|
||||||
from extras.scripts import BooleanVar, IntegerVar, Script, StringVar
|
from extras.scripts import BooleanVar, IntegerVar, Script, StringVar
|
||||||
from ipam.models import ASN, RIR
|
from utilities.testing import APITestCase, APIViewTestCases
|
||||||
from utilities.testing import APITestCase, APIViewTestCases, create_tags
|
|
||||||
|
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
@ -832,53 +828,3 @@ class ContentTypeTest(APITestCase):
|
|||||||
|
|
||||||
url = reverse('extras-api:contenttype-detail', kwargs={'pk': contenttype.pk})
|
url = reverse('extras-api:contenttype-detail', kwargs={'pk': contenttype.pk})
|
||||||
self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_200_OK)
|
self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
class CustomValidationTest(APITestCase):
|
|
||||||
|
|
||||||
@override_settings(CUSTOM_VALIDATORS={
|
|
||||||
'circuits.provider': [
|
|
||||||
{'tags': {'required': True}}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
def test_tags_validation(self):
|
|
||||||
"""
|
|
||||||
Check that custom validation rules work for tag assignment.
|
|
||||||
"""
|
|
||||||
data = {
|
|
||||||
'name': 'Provider 1',
|
|
||||||
'slug': 'provider-1',
|
|
||||||
}
|
|
||||||
serializer = ProviderSerializer(data=data)
|
|
||||||
self.assertFalse(serializer.is_valid())
|
|
||||||
|
|
||||||
tags = create_tags('Tag1', 'Tag2', 'Tag3')
|
|
||||||
data['tags'] = [tag.pk for tag in tags]
|
|
||||||
serializer = ProviderSerializer(data=data)
|
|
||||||
self.assertTrue(serializer.is_valid())
|
|
||||||
|
|
||||||
@override_settings(CUSTOM_VALIDATORS={
|
|
||||||
'circuits.provider': [
|
|
||||||
{'asns': {'required': True}}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
def test_m2m_validation(self):
|
|
||||||
"""
|
|
||||||
Check that custom validation rules work for many-to-many fields.
|
|
||||||
"""
|
|
||||||
data = {
|
|
||||||
'name': 'Provider 1',
|
|
||||||
'slug': 'provider-1',
|
|
||||||
}
|
|
||||||
serializer = ProviderSerializer(data=data)
|
|
||||||
self.assertFalse(serializer.is_valid())
|
|
||||||
|
|
||||||
rir = RIR.objects.create(name='RIR 1', slug='rir-1')
|
|
||||||
asns = ASN.objects.bulk_create((
|
|
||||||
ASN(rir=rir, asn=65001),
|
|
||||||
ASN(rir=rir, asn=65002),
|
|
||||||
ASN(rir=rir, asn=65003),
|
|
||||||
))
|
|
||||||
data['asns'] = [asn.pk for asn in asns]
|
|
||||||
serializer = ProviderSerializer(data=data)
|
|
||||||
self.assertTrue(serializer.is_valid())
|
|
||||||
|
190
netbox/extras/tests/test_custom_validation.py
Normal file
190
netbox/extras/tests/test_custom_validation.py
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
from django.test import override_settings
|
||||||
|
|
||||||
|
from circuits.api.serializers import ProviderSerializer
|
||||||
|
from circuits.forms import ProviderForm, ProviderImportForm
|
||||||
|
from circuits.models import Provider
|
||||||
|
from extras.models import Tag
|
||||||
|
from ipam.models import ASN, RIR
|
||||||
|
from utilities.testing import APITestCase, ModelViewTestCase, create_tags, post_data
|
||||||
|
|
||||||
|
|
||||||
|
class ModelFormCustomValidationTest(TestCase):
|
||||||
|
|
||||||
|
@override_settings(CUSTOM_VALIDATORS={
|
||||||
|
'circuits.provider': [
|
||||||
|
{'tags': {'required': True}}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
def test_tags_validation(self):
|
||||||
|
"""
|
||||||
|
Check that custom validation rules work for tag assignment.
|
||||||
|
"""
|
||||||
|
data = {
|
||||||
|
'name': 'Provider 1',
|
||||||
|
'slug': 'provider-1',
|
||||||
|
}
|
||||||
|
form = ProviderForm(data)
|
||||||
|
self.assertFalse(form.is_valid())
|
||||||
|
|
||||||
|
tags = create_tags('Tag1', 'Tag2', 'Tag3')
|
||||||
|
data['tags'] = [tag.pk for tag in tags]
|
||||||
|
form = ProviderForm(data)
|
||||||
|
self.assertTrue(form.is_valid())
|
||||||
|
|
||||||
|
@override_settings(CUSTOM_VALIDATORS={
|
||||||
|
'circuits.provider': [
|
||||||
|
{'asns': {'required': True}}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
def test_m2m_validation(self):
|
||||||
|
"""
|
||||||
|
Check that custom validation rules work for many-to-many fields.
|
||||||
|
"""
|
||||||
|
data = {
|
||||||
|
'name': 'Provider 1',
|
||||||
|
'slug': 'provider-1',
|
||||||
|
}
|
||||||
|
form = ProviderForm(data)
|
||||||
|
self.assertFalse(form.is_valid())
|
||||||
|
|
||||||
|
rir = RIR.objects.create(name='RIR 1', slug='rir-1')
|
||||||
|
asns = ASN.objects.bulk_create((
|
||||||
|
ASN(rir=rir, asn=65001),
|
||||||
|
ASN(rir=rir, asn=65002),
|
||||||
|
ASN(rir=rir, asn=65003),
|
||||||
|
))
|
||||||
|
data['asns'] = [asn.pk for asn in asns]
|
||||||
|
form = ProviderForm(data)
|
||||||
|
self.assertTrue(form.is_valid())
|
||||||
|
|
||||||
|
|
||||||
|
class BulkEditCustomValidationTest(ModelViewTestCase):
|
||||||
|
model = Provider
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
rir = RIR.objects.create(name='RIR 1', slug='rir-1')
|
||||||
|
asns = ASN.objects.bulk_create((
|
||||||
|
ASN(rir=rir, asn=65001),
|
||||||
|
ASN(rir=rir, asn=65002),
|
||||||
|
ASN(rir=rir, asn=65003),
|
||||||
|
))
|
||||||
|
tags = create_tags('Tag1', 'Tag2', 'Tag3')
|
||||||
|
|
||||||
|
providers = (
|
||||||
|
Provider(name='Provider 1', slug='provider-1'),
|
||||||
|
Provider(name='Provider 2', slug='provider-2'),
|
||||||
|
Provider(name='Provider 3', slug='provider-3'),
|
||||||
|
)
|
||||||
|
Provider.objects.bulk_create(providers)
|
||||||
|
for provider in providers:
|
||||||
|
provider.asns.set(asns)
|
||||||
|
provider.tags.set(tags)
|
||||||
|
|
||||||
|
@override_settings(CUSTOM_VALIDATORS={
|
||||||
|
'circuits.provider': [
|
||||||
|
{'asns': {'required': True}}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
def test_m2m_validation(self):
|
||||||
|
"""
|
||||||
|
Check that custom validation rules work for many-to-many fields.
|
||||||
|
"""
|
||||||
|
providers = Provider.objects.all()
|
||||||
|
data = {
|
||||||
|
'pk': [provider.pk for provider in providers],
|
||||||
|
'_apply': '',
|
||||||
|
'description': 'New description',
|
||||||
|
}
|
||||||
|
self.add_permissions(
|
||||||
|
'circuits.view_provider',
|
||||||
|
'circuits.change_provider',
|
||||||
|
'ipam.view_asn',
|
||||||
|
)
|
||||||
|
|
||||||
|
# Bulk edit the description without changing ASN assignments
|
||||||
|
request = {
|
||||||
|
'path': self._get_url('bulk_edit'),
|
||||||
|
'data': post_data(data),
|
||||||
|
}
|
||||||
|
response = self.client.post(**request)
|
||||||
|
self.assertHttpStatus(response, 302)
|
||||||
|
self.assertEqual(
|
||||||
|
Provider.objects.filter(description=data['description']).count(),
|
||||||
|
len(providers)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Change the ASN assignments
|
||||||
|
asn = ASN.objects.first()
|
||||||
|
data['asns'] = [asn.pk]
|
||||||
|
request = {
|
||||||
|
'path': self._get_url('bulk_edit'),
|
||||||
|
'data': post_data(data),
|
||||||
|
}
|
||||||
|
response = self.client.post(**request)
|
||||||
|
self.assertHttpStatus(response, 302)
|
||||||
|
for provider in Provider.objects.all():
|
||||||
|
self.assertEqual(len(provider.asns.all()), 1)
|
||||||
|
|
||||||
|
# Attempt to remove the ASN assignments
|
||||||
|
data.pop('asns')
|
||||||
|
data['_nullify'] = 'asns'
|
||||||
|
request = {
|
||||||
|
'path': self._get_url('bulk_edit'),
|
||||||
|
'data': post_data(data),
|
||||||
|
}
|
||||||
|
response = self.client.post(**request)
|
||||||
|
self.assertHttpStatus(response, 200)
|
||||||
|
for provider in Provider.objects.all():
|
||||||
|
self.assertTrue(provider.asns.exists())
|
||||||
|
|
||||||
|
|
||||||
|
class APISerializerCustomValidationTest(APITestCase):
|
||||||
|
|
||||||
|
@override_settings(CUSTOM_VALIDATORS={
|
||||||
|
'circuits.provider': [
|
||||||
|
{'tags': {'required': True}}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
def test_tags_validation(self):
|
||||||
|
"""
|
||||||
|
Check that custom validation rules work for tag assignment.
|
||||||
|
"""
|
||||||
|
data = {
|
||||||
|
'name': 'Provider 1',
|
||||||
|
'slug': 'provider-1',
|
||||||
|
}
|
||||||
|
serializer = ProviderSerializer(data=data)
|
||||||
|
self.assertFalse(serializer.is_valid())
|
||||||
|
|
||||||
|
tags = create_tags('Tag1', 'Tag2', 'Tag3')
|
||||||
|
data['tags'] = [tag.pk for tag in tags]
|
||||||
|
serializer = ProviderSerializer(data=data)
|
||||||
|
self.assertTrue(serializer.is_valid())
|
||||||
|
|
||||||
|
@override_settings(CUSTOM_VALIDATORS={
|
||||||
|
'circuits.provider': [
|
||||||
|
{'asns': {'required': True}}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
def test_m2m_validation(self):
|
||||||
|
"""
|
||||||
|
Check that custom validation rules work for many-to-many fields.
|
||||||
|
"""
|
||||||
|
data = {
|
||||||
|
'name': 'Provider 1',
|
||||||
|
'slug': 'provider-1',
|
||||||
|
}
|
||||||
|
serializer = ProviderSerializer(data=data)
|
||||||
|
self.assertFalse(serializer.is_valid())
|
||||||
|
|
||||||
|
rir = RIR.objects.create(name='RIR 1', slug='rir-1')
|
||||||
|
asns = ASN.objects.bulk_create((
|
||||||
|
ASN(rir=rir, asn=65001),
|
||||||
|
ASN(rir=rir, asn=65002),
|
||||||
|
ASN(rir=rir, asn=65003),
|
||||||
|
))
|
||||||
|
data['asns'] = [asn.pk for asn in asns]
|
||||||
|
serializer = ProviderSerializer(data=data)
|
||||||
|
self.assertTrue(serializer.is_valid())
|
@ -1,14 +1,11 @@
|
|||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase
|
||||||
|
|
||||||
from circuits.forms import ProviderForm
|
|
||||||
from dcim.forms import SiteForm
|
from dcim.forms import SiteForm
|
||||||
from dcim.models import Site
|
from dcim.models import Site
|
||||||
from extras.choices import CustomFieldTypeChoices
|
from extras.choices import CustomFieldTypeChoices
|
||||||
from extras.forms import SavedFilterForm
|
from extras.forms import SavedFilterForm
|
||||||
from extras.models import CustomField, CustomFieldChoiceSet
|
from extras.models import *
|
||||||
from ipam.models import ASN, RIR
|
|
||||||
from utilities.testing import create_tags
|
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldModelFormTest(TestCase):
|
class CustomFieldModelFormTest(TestCase):
|
||||||
@ -112,53 +109,3 @@ class SavedFilterFormTest(TestCase):
|
|||||||
})
|
})
|
||||||
self.assertTrue(form.is_valid())
|
self.assertTrue(form.is_valid())
|
||||||
form.save()
|
form.save()
|
||||||
|
|
||||||
|
|
||||||
class CustomValidationTest(TestCase):
|
|
||||||
|
|
||||||
@override_settings(CUSTOM_VALIDATORS={
|
|
||||||
'circuits.provider': [
|
|
||||||
{'tags': {'required': True}}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
def test_tags_validation(self):
|
|
||||||
"""
|
|
||||||
Check that custom validation rules work for tag assignment.
|
|
||||||
"""
|
|
||||||
data = {
|
|
||||||
'name': 'Provider 1',
|
|
||||||
'slug': 'provider-1',
|
|
||||||
}
|
|
||||||
form = ProviderForm(data)
|
|
||||||
self.assertFalse(form.is_valid())
|
|
||||||
|
|
||||||
tags = create_tags('Tag1', 'Tag2', 'Tag3')
|
|
||||||
data['tags'] = [tag.pk for tag in tags]
|
|
||||||
form = ProviderForm(data)
|
|
||||||
self.assertTrue(form.is_valid())
|
|
||||||
|
|
||||||
@override_settings(CUSTOM_VALIDATORS={
|
|
||||||
'circuits.provider': [
|
|
||||||
{'asns': {'required': True}}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
def test_m2m_validation(self):
|
|
||||||
"""
|
|
||||||
Check that custom validation rules work for many-to-many fields.
|
|
||||||
"""
|
|
||||||
data = {
|
|
||||||
'name': 'Provider 1',
|
|
||||||
'slug': 'provider-1',
|
|
||||||
}
|
|
||||||
form = ProviderForm(data)
|
|
||||||
self.assertFalse(form.is_valid())
|
|
||||||
|
|
||||||
rir = RIR.objects.create(name='RIR 1', slug='rir-1')
|
|
||||||
asns = ASN.objects.bulk_create((
|
|
||||||
ASN(rir=rir, asn=65001),
|
|
||||||
ASN(rir=rir, asn=65002),
|
|
||||||
ASN(rir=rir, asn=65003),
|
|
||||||
))
|
|
||||||
data['asns'] = [asn.pk for asn in asns]
|
|
||||||
form = ProviderForm(data)
|
|
||||||
self.assertTrue(form.is_valid())
|
|
||||||
|
Loading…
Reference in New Issue
Block a user