test_scripts.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. from django.core.files.uploadedfile import SimpleUploadedFile
  2. from django.test import TestCase
  3. from netaddr import IPAddress, IPNetwork
  4. from dcim.models import DeviceRole
  5. from extras.scripts import *
  6. class ScriptVariablesTest(TestCase):
  7. def test_stringvar(self):
  8. class TestScript(Script):
  9. var1 = StringVar(
  10. min_length=3,
  11. max_length=3,
  12. regex=r'[a-z]+'
  13. )
  14. # Validate min_length enforcement
  15. data = {'var1': 'xx'}
  16. form = TestScript().as_form(data, None)
  17. self.assertFalse(form.is_valid())
  18. self.assertIn('var1', form.errors)
  19. # Validate max_length enforcement
  20. data = {'var1': 'xxxx'}
  21. form = TestScript().as_form(data, None)
  22. self.assertFalse(form.is_valid())
  23. self.assertIn('var1', form.errors)
  24. # Validate regex enforcement
  25. data = {'var1': 'ABC'}
  26. form = TestScript().as_form(data, None)
  27. self.assertFalse(form.is_valid())
  28. self.assertIn('var1', form.errors)
  29. # Validate valid data
  30. data = {'var1': 'abc'}
  31. form = TestScript().as_form(data, None)
  32. self.assertTrue(form.is_valid())
  33. self.assertEqual(form.cleaned_data['var1'], data['var1'])
  34. def test_textvar(self):
  35. class TestScript(Script):
  36. var1 = TextVar()
  37. # Validate valid data
  38. data = {'var1': 'This is a test string'}
  39. form = TestScript().as_form(data, None)
  40. self.assertTrue(form.is_valid())
  41. self.assertEqual(form.cleaned_data['var1'], data['var1'])
  42. def test_integervar(self):
  43. class TestScript(Script):
  44. var1 = IntegerVar(
  45. min_value=5,
  46. max_value=10
  47. )
  48. # Validate min_value enforcement
  49. data = {'var1': 4}
  50. form = TestScript().as_form(data, None)
  51. self.assertFalse(form.is_valid())
  52. self.assertIn('var1', form.errors)
  53. # Validate max_value enforcement
  54. data = {'var1': 11}
  55. form = TestScript().as_form(data, None)
  56. self.assertFalse(form.is_valid())
  57. self.assertIn('var1', form.errors)
  58. # Validate valid data
  59. data = {'var1': 7}
  60. form = TestScript().as_form(data, None)
  61. self.assertTrue(form.is_valid())
  62. self.assertEqual(form.cleaned_data['var1'], data['var1'])
  63. def test_booleanvar(self):
  64. class TestScript(Script):
  65. var1 = BooleanVar()
  66. # Validate True
  67. data = {'var1': True}
  68. form = TestScript().as_form(data, None)
  69. self.assertTrue(form.is_valid())
  70. self.assertEqual(form.cleaned_data['var1'], True)
  71. # Validate False
  72. data = {'var1': False}
  73. form = TestScript().as_form(data, None)
  74. self.assertTrue(form.is_valid())
  75. self.assertEqual(form.cleaned_data['var1'], False)
  76. def test_choicevar(self):
  77. CHOICES = (
  78. ('ff0000', 'Red'),
  79. ('00ff00', 'Green'),
  80. ('0000ff', 'Blue')
  81. )
  82. class TestScript(Script):
  83. var1 = ChoiceVar(
  84. choices=CHOICES
  85. )
  86. # Validate valid choice
  87. data = {'var1': CHOICES[0][0]}
  88. form = TestScript().as_form(data)
  89. self.assertTrue(form.is_valid())
  90. self.assertEqual(form.cleaned_data['var1'], CHOICES[0][0])
  91. # Validate invalid choices
  92. data = {'var1': 'taupe'}
  93. form = TestScript().as_form(data)
  94. self.assertFalse(form.is_valid())
  95. def test_objectvar(self):
  96. class TestScript(Script):
  97. var1 = ObjectVar(
  98. queryset=DeviceRole.objects.all()
  99. )
  100. # Populate some objects
  101. for i in range(1, 6):
  102. DeviceRole(
  103. name='Device Role {}'.format(i),
  104. slug='device-role-{}'.format(i)
  105. ).save()
  106. # Validate valid data
  107. data = {'var1': DeviceRole.objects.first().pk}
  108. form = TestScript().as_form(data, None)
  109. self.assertTrue(form.is_valid())
  110. self.assertEqual(form.cleaned_data['var1'].pk, data['var1'])
  111. def test_multiobjectvar(self):
  112. class TestScript(Script):
  113. var1 = MultiObjectVar(
  114. queryset=DeviceRole.objects.all()
  115. )
  116. # Populate some objects
  117. for i in range(1, 6):
  118. DeviceRole(
  119. name='Device Role {}'.format(i),
  120. slug='device-role-{}'.format(i)
  121. ).save()
  122. # Validate valid data
  123. data = {'var1': [role.pk for role in DeviceRole.objects.all()[:3]]}
  124. form = TestScript().as_form(data, None)
  125. self.assertTrue(form.is_valid())
  126. self.assertEqual(form.cleaned_data['var1'][0].pk, data['var1'][0])
  127. self.assertEqual(form.cleaned_data['var1'][1].pk, data['var1'][1])
  128. self.assertEqual(form.cleaned_data['var1'][2].pk, data['var1'][2])
  129. def test_filevar(self):
  130. class TestScript(Script):
  131. var1 = FileVar()
  132. # Dummy file
  133. testfile = SimpleUploadedFile(
  134. name='test_file.txt',
  135. content=b'This is a dummy file for testing'
  136. )
  137. # Validate valid data
  138. file_data = {'var1': testfile}
  139. form = TestScript().as_form(None, file_data)
  140. self.assertTrue(form.is_valid())
  141. self.assertEqual(form.cleaned_data['var1'], testfile)
  142. def test_ipaddressvar(self):
  143. class TestScript(Script):
  144. var1 = IPAddressVar()
  145. # Validate IP network enforcement
  146. data = {'var1': '1.2.3'}
  147. form = TestScript().as_form(data, None)
  148. self.assertFalse(form.is_valid())
  149. self.assertIn('var1', form.errors)
  150. # Validate IP mask exclusion
  151. data = {'var1': '192.0.2.0/24'}
  152. form = TestScript().as_form(data, None)
  153. self.assertFalse(form.is_valid())
  154. self.assertIn('var1', form.errors)
  155. # Validate valid data
  156. data = {'var1': '192.0.2.1'}
  157. form = TestScript().as_form(data, None)
  158. self.assertTrue(form.is_valid())
  159. self.assertEqual(form.cleaned_data['var1'], IPAddress(data['var1']))
  160. def test_ipaddresswithmaskvar(self):
  161. class TestScript(Script):
  162. var1 = IPAddressWithMaskVar()
  163. # Validate IP network enforcement
  164. data = {'var1': '1.2.3'}
  165. form = TestScript().as_form(data, None)
  166. self.assertFalse(form.is_valid())
  167. self.assertIn('var1', form.errors)
  168. # Validate IP mask requirement
  169. data = {'var1': '192.0.2.0'}
  170. form = TestScript().as_form(data, None)
  171. self.assertFalse(form.is_valid())
  172. self.assertIn('var1', form.errors)
  173. # Validate valid data
  174. data = {'var1': '192.0.2.0/24'}
  175. form = TestScript().as_form(data, None)
  176. self.assertTrue(form.is_valid())
  177. self.assertEqual(form.cleaned_data['var1'], IPNetwork(data['var1']))
  178. def test_ipnetworkvar(self):
  179. class TestScript(Script):
  180. var1 = IPNetworkVar()
  181. # Validate IP network enforcement
  182. data = {'var1': '1.2.3'}
  183. form = TestScript().as_form(data, None)
  184. self.assertFalse(form.is_valid())
  185. self.assertIn('var1', form.errors)
  186. # Validate host IP check
  187. data = {'var1': '192.0.2.1/24'}
  188. form = TestScript().as_form(data, None)
  189. self.assertFalse(form.is_valid())
  190. self.assertIn('var1', form.errors)
  191. # Validate valid data
  192. data = {'var1': '192.0.2.0/24'}
  193. form = TestScript().as_form(data, None)
  194. self.assertTrue(form.is_valid())
  195. self.assertEqual(form.cleaned_data['var1'], IPNetwork(data['var1']))