Add tests for multi-value ScriptVariables

This commit is contained in:
Sander Steffann 2020-05-22 20:44:38 +02:00
parent 32094643f9
commit 5e77ea4bce

View File

@ -1,5 +1,7 @@
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.http import QueryDict
from django.test import TestCase from django.test import TestCase
from django.utils.datastructures import MultiValueDict
from netaddr import IPAddress, IPNetwork from netaddr import IPAddress, IPNetwork
from dcim.models import DeviceRole from dcim.models import DeviceRole
@ -145,6 +147,33 @@ class ScriptVariablesTest(TestCase):
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
self.assertEqual(form.cleaned_data['var1'].pk, data['var1']) self.assertEqual(form.cleaned_data['var1'].pk, data['var1'])
def test_objectvar_initial(self):
class TestScript(Script):
var1 = ObjectVar(
queryset=DeviceRole.objects.all()
)
# Populate some objects
for i in range(1, 6):
DeviceRole(
name='Device Role {}'.format(i),
slug='device-role-{}'.format(i)
).save()
# Validate valid initial data
keys = list(DeviceRole.objects.values_list('pk', flat=True)[:2])
initial = QueryDict(f"var1={keys[0]}&var1={keys[1]}")
form = TestScript().as_form(initial=initial)
# For a single-value field the initial value must be the LAST value in the query-string
self.assertIn(
form.get_initial_for_field(form.fields['var1'], 'var1'),
[keys[1], str(keys[1])] # Accept both numeric and string values
)
def test_multiobjectvar(self): def test_multiobjectvar(self):
class TestScript(Script): class TestScript(Script):
@ -168,6 +197,37 @@ class ScriptVariablesTest(TestCase):
self.assertEqual(form.cleaned_data['var1'][1].pk, data['var1'][1]) self.assertEqual(form.cleaned_data['var1'][1].pk, data['var1'][1])
self.assertEqual(form.cleaned_data['var1'][2].pk, data['var1'][2]) self.assertEqual(form.cleaned_data['var1'][2].pk, data['var1'][2])
def test_multiobjectvar_initial(self):
class TestScript(Script):
var1 = MultiObjectVar(
queryset=DeviceRole.objects.all()
)
# Populate some objects
for i in range(1, 6):
DeviceRole(
name='Device Role {}'.format(i),
slug='device-role-{}'.format(i)
).save()
# Validate valid initial data
keys = list(DeviceRole.objects.values_list('pk', flat=True)[:2])
initial = QueryDict(f"var1={keys[0]}&var1={keys[1]}")
form = TestScript().as_form(initial=initial)
self.assertEqual(len(form.get_initial_for_field(form.fields['var1'], 'var1')), 2)
self.assertIn(
form.get_initial_for_field(form.fields['var1'], 'var1')[0],
[keys[0], str(keys[0])] # Accept both numeric and string values
)
self.assertIn(
form.get_initial_for_field(form.fields['var1'], 'var1')[1],
[keys[1], str(keys[1])] # Accept both numeric and string values
)
def test_filevar(self): def test_filevar(self):
class TestScript(Script): class TestScript(Script):