test_scripts.py 9.0 KB

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