test_views.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. import datetime
  2. from django.test import override_settings
  3. from django.urls import reverse
  4. from circuits.choices import *
  5. from circuits.models import *
  6. from core.models import ObjectType
  7. from dcim.models import Cable, Interface, Site
  8. from ipam.models import ASN, RIR
  9. from netbox.choices import ImportFormatChoices
  10. from users.models import ObjectPermission
  11. from utilities.testing import ViewTestCases, create_tags, create_test_device
  12. class ProviderTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  13. model = Provider
  14. @classmethod
  15. def setUpTestData(cls):
  16. rir = RIR.objects.create(name='RFC 6996', is_private=True)
  17. asns = [
  18. ASN(asn=65000 + i, rir=rir) for i in range(8)
  19. ]
  20. ASN.objects.bulk_create(asns)
  21. providers = (
  22. Provider(name='Provider 1', slug='provider-1'),
  23. Provider(name='Provider 2', slug='provider-2'),
  24. Provider(name='Provider 3', slug='provider-3'),
  25. )
  26. Provider.objects.bulk_create(providers)
  27. providers[0].asns.set([asns[0], asns[1]])
  28. providers[1].asns.set([asns[2], asns[3]])
  29. providers[2].asns.set([asns[4], asns[5]])
  30. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  31. cls.form_data = {
  32. 'name': 'Provider X',
  33. 'slug': 'provider-x',
  34. 'asns': [asns[6].pk, asns[7].pk],
  35. 'comments': 'Another provider',
  36. 'tags': [t.pk for t in tags],
  37. }
  38. cls.csv_data = (
  39. "name,slug",
  40. "Provider 4,provider-4",
  41. "Provider 5,provider-5",
  42. "Provider 6,provider-6",
  43. )
  44. cls.csv_update_data = (
  45. "id,name,comments",
  46. f"{providers[0].pk},Provider 7,New comment7",
  47. f"{providers[1].pk},Provider 8,New comment8",
  48. f"{providers[2].pk},Provider 9,New comment9",
  49. )
  50. cls.bulk_edit_data = {
  51. 'comments': 'New comments',
  52. }
  53. class CircuitTypeTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
  54. model = CircuitType
  55. @classmethod
  56. def setUpTestData(cls):
  57. circuit_types = (
  58. CircuitType(name='Circuit Type 1', slug='circuit-type-1'),
  59. CircuitType(name='Circuit Type 2', slug='circuit-type-2'),
  60. CircuitType(name='Circuit Type 3', slug='circuit-type-3'),
  61. )
  62. CircuitType.objects.bulk_create(circuit_types)
  63. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  64. cls.form_data = {
  65. 'name': 'Circuit Type X',
  66. 'slug': 'circuit-type-x',
  67. 'description': 'A new circuit type',
  68. 'tags': [t.pk for t in tags],
  69. }
  70. cls.csv_data = (
  71. "name,slug",
  72. "Circuit Type 4,circuit-type-4",
  73. "Circuit Type 5,circuit-type-5",
  74. "Circuit Type 6,circuit-type-6",
  75. )
  76. cls.csv_update_data = (
  77. "id,name,description",
  78. f"{circuit_types[0].pk},Circuit Type 7,New description7",
  79. f"{circuit_types[1].pk},Circuit Type 8,New description8",
  80. f"{circuit_types[2].pk},Circuit Type 9,New description9",
  81. )
  82. cls.bulk_edit_data = {
  83. 'description': 'Foo',
  84. }
  85. class CircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  86. model = Circuit
  87. def setUp(self):
  88. super().setUp()
  89. self.add_permissions(
  90. 'circuits.add_circuittermination',
  91. )
  92. @classmethod
  93. def setUpTestData(cls):
  94. Site.objects.create(name='Site 1', slug='site-1')
  95. providers = (
  96. Provider(name='Provider 1', slug='provider-1'),
  97. Provider(name='Provider 2', slug='provider-2'),
  98. )
  99. Provider.objects.bulk_create(providers)
  100. provider_accounts = (
  101. ProviderAccount(name='Provider Account 1', provider=providers[0], account='1234'),
  102. ProviderAccount(name='Provider Account 2', provider=providers[1], account='2345'),
  103. )
  104. ProviderAccount.objects.bulk_create(provider_accounts)
  105. circuittypes = (
  106. CircuitType(name='Circuit Type 1', slug='circuit-type-1'),
  107. CircuitType(name='Circuit Type 2', slug='circuit-type-2'),
  108. )
  109. CircuitType.objects.bulk_create(circuittypes)
  110. circuits = (
  111. Circuit(cid='Circuit 1', provider=providers[0], provider_account=provider_accounts[0], type=circuittypes[0]),
  112. Circuit(cid='Circuit 2', provider=providers[0], provider_account=provider_accounts[0], type=circuittypes[0]),
  113. Circuit(cid='Circuit 3', provider=providers[0], provider_account=provider_accounts[0], type=circuittypes[0]),
  114. )
  115. Circuit.objects.bulk_create(circuits)
  116. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  117. cls.form_data = {
  118. 'cid': 'Circuit X',
  119. 'provider': providers[1].pk,
  120. 'provider_account': provider_accounts[1].pk,
  121. 'type': circuittypes[1].pk,
  122. 'status': CircuitStatusChoices.STATUS_DECOMMISSIONED,
  123. 'tenant': None,
  124. 'install_date': datetime.date(2020, 1, 1),
  125. 'termination_date': datetime.date(2021, 1, 1),
  126. 'commit_rate': 1000,
  127. 'description': 'A new circuit',
  128. 'comments': 'Some comments',
  129. 'tags': [t.pk for t in tags],
  130. }
  131. cls.csv_data = (
  132. "cid,provider,provider_account,type,status",
  133. "Circuit 4,Provider 1,Provider Account 1,Circuit Type 1,active",
  134. "Circuit 5,Provider 1,Provider Account 1,Circuit Type 1,active",
  135. "Circuit 6,Provider 1,Provider Account 1,Circuit Type 1,active",
  136. )
  137. cls.csv_update_data = (
  138. f"id,cid,description,status",
  139. f"{circuits[0].pk},Circuit 7,New description7,{CircuitStatusChoices.STATUS_DECOMMISSIONED}",
  140. f"{circuits[1].pk},Circuit 8,New description8,{CircuitStatusChoices.STATUS_DECOMMISSIONED}",
  141. f"{circuits[2].pk},Circuit 9,New description9,{CircuitStatusChoices.STATUS_DECOMMISSIONED}",
  142. )
  143. cls.bulk_edit_data = {
  144. 'provider': providers[1].pk,
  145. 'provider_account': provider_accounts[1].pk,
  146. 'type': circuittypes[1].pk,
  147. 'status': CircuitStatusChoices.STATUS_DECOMMISSIONED,
  148. 'tenant': None,
  149. 'commit_rate': 2000,
  150. 'description': 'New description',
  151. 'comments': 'New comments',
  152. }
  153. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[])
  154. def test_bulk_import_objects_with_terminations(self):
  155. json_data = """
  156. [
  157. {
  158. "cid": "Circuit 7",
  159. "provider": "Provider 1",
  160. "type": "Circuit Type 1",
  161. "status": "active",
  162. "description": "Testing Import",
  163. "terminations": [
  164. {
  165. "term_side": "A",
  166. "site": "Site 1"
  167. },
  168. {
  169. "term_side": "Z",
  170. "site": "Site 1"
  171. }
  172. ]
  173. }
  174. ]
  175. """
  176. initial_count = self._get_queryset().count()
  177. data = {
  178. 'data': json_data,
  179. 'format': ImportFormatChoices.JSON,
  180. }
  181. # Assign model-level permission
  182. obj_perm = ObjectPermission(
  183. name='Test permission',
  184. actions=['add']
  185. )
  186. obj_perm.save()
  187. obj_perm.users.add(self.user)
  188. obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model))
  189. # Try GET with model-level permission
  190. self.assertHttpStatus(self.client.get(self._get_url('import')), 200)
  191. # Test POST with permission
  192. self.assertHttpStatus(self.client.post(self._get_url('import'), data), 302)
  193. self.assertEqual(self._get_queryset().count(), initial_count + 1)
  194. class ProviderAccountTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  195. model = ProviderAccount
  196. @classmethod
  197. def setUpTestData(cls):
  198. providers = (
  199. Provider(name='Provider 1', slug='provider-1'),
  200. Provider(name='Provider 2', slug='provider-2'),
  201. )
  202. Provider.objects.bulk_create(providers)
  203. provider_accounts = (
  204. ProviderAccount(name='Provider Account 1', provider=providers[0], account='1234'),
  205. ProviderAccount(name='Provider Account 2', provider=providers[0], account='2345'),
  206. ProviderAccount(name='Provider Account 3', provider=providers[0], account='3456'),
  207. )
  208. ProviderAccount.objects.bulk_create(provider_accounts)
  209. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  210. cls.form_data = {
  211. 'name': 'Provider Account X',
  212. 'provider': providers[1].pk,
  213. 'account': 'XXXX',
  214. 'description': 'A new provider network',
  215. 'comments': 'Longer description goes here',
  216. 'tags': [t.pk for t in tags],
  217. }
  218. cls.csv_data = (
  219. "name,provider,account,description",
  220. "Provider Account 4,Provider 1,4567,Foo",
  221. "Provider Account 5,Provider 1,5678,Bar",
  222. "Provider Account 6,Provider 1,6789,Baz",
  223. )
  224. cls.csv_update_data = (
  225. "id,name,account,description",
  226. f"{provider_accounts[0].pk},Provider Network 7,7890,New description7",
  227. f"{provider_accounts[1].pk},Provider Network 8,8901,New description8",
  228. f"{provider_accounts[2].pk},Provider Network 9,9012,New description9",
  229. )
  230. cls.bulk_edit_data = {
  231. 'provider': providers[1].pk,
  232. 'description': 'New description',
  233. 'comments': 'New comments',
  234. }
  235. class ProviderNetworkTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  236. model = ProviderNetwork
  237. @classmethod
  238. def setUpTestData(cls):
  239. providers = (
  240. Provider(name='Provider 1', slug='provider-1'),
  241. Provider(name='Provider 2', slug='provider-2'),
  242. )
  243. Provider.objects.bulk_create(providers)
  244. provider_networks = (
  245. ProviderNetwork(name='Provider Network 1', provider=providers[0]),
  246. ProviderNetwork(name='Provider Network 2', provider=providers[0]),
  247. ProviderNetwork(name='Provider Network 3', provider=providers[0]),
  248. )
  249. ProviderNetwork.objects.bulk_create(provider_networks)
  250. tags = create_tags('Alpha', 'Bravo', 'Charlie')
  251. cls.form_data = {
  252. 'name': 'Provider Network X',
  253. 'provider': providers[1].pk,
  254. 'description': 'A new provider network',
  255. 'comments': 'Longer description goes here',
  256. 'tags': [t.pk for t in tags],
  257. }
  258. cls.csv_data = (
  259. "name,provider,description",
  260. "Provider Network 4,Provider 1,Foo",
  261. "Provider Network 5,Provider 1,Bar",
  262. "Provider Network 6,Provider 1,Baz",
  263. )
  264. cls.csv_update_data = (
  265. "id,name,description",
  266. f"{provider_networks[0].pk},Provider Network 7,New description7",
  267. f"{provider_networks[1].pk},Provider Network 8,New description8",
  268. f"{provider_networks[2].pk},Provider Network 9,New description9",
  269. )
  270. cls.bulk_edit_data = {
  271. 'provider': providers[1].pk,
  272. 'description': 'New description',
  273. 'comments': 'New comments',
  274. }
  275. class CircuitTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase):
  276. model = CircuitTermination
  277. @classmethod
  278. def setUpTestData(cls):
  279. sites = (
  280. Site(name='Site 1', slug='site-1'),
  281. Site(name='Site 2', slug='site-2'),
  282. Site(name='Site 3', slug='site-3'),
  283. )
  284. Site.objects.bulk_create(sites)
  285. provider = Provider.objects.create(name='Provider 1', slug='provider-1')
  286. circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1')
  287. circuits = (
  288. Circuit(cid='Circuit 1', provider=provider, type=circuittype),
  289. Circuit(cid='Circuit 2', provider=provider, type=circuittype),
  290. Circuit(cid='Circuit 3', provider=provider, type=circuittype),
  291. )
  292. Circuit.objects.bulk_create(circuits)
  293. circuit_terminations = (
  294. CircuitTermination(circuit=circuits[0], term_side='A', site=sites[0]),
  295. CircuitTermination(circuit=circuits[0], term_side='Z', site=sites[1]),
  296. CircuitTermination(circuit=circuits[1], term_side='A', site=sites[0]),
  297. CircuitTermination(circuit=circuits[1], term_side='Z', site=sites[1]),
  298. )
  299. CircuitTermination.objects.bulk_create(circuit_terminations)
  300. cls.form_data = {
  301. 'circuit': circuits[2].pk,
  302. 'term_side': 'A',
  303. 'site': sites[2].pk,
  304. 'description': 'New description',
  305. }
  306. cls.csv_data = (
  307. "circuit,term_side,site,description",
  308. "Circuit 3,A,Site 1,Foo",
  309. "Circuit 3,Z,Site 1,Bar",
  310. )
  311. cls.csv_update_data = (
  312. "id,port_speed,description",
  313. f"{circuit_terminations[0].pk},100,New description7",
  314. f"{circuit_terminations[1].pk},200,New description8",
  315. f"{circuit_terminations[2].pk},300,New description9",
  316. )
  317. cls.bulk_edit_data = {
  318. 'port_speed': 400,
  319. 'description': 'New description',
  320. }
  321. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
  322. def test_trace(self):
  323. device = create_test_device('Device 1')
  324. circuittermination = CircuitTermination.objects.first()
  325. interface = Interface.objects.create(
  326. device=device,
  327. name='Interface 1'
  328. )
  329. Cable(a_terminations=[circuittermination], b_terminations=[interface]).save()
  330. response = self.client.get(reverse('circuits:circuittermination_trace', kwargs={'pk': circuittermination.pk}))
  331. self.assertHttpStatus(response, 200)