test_api.py 80 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030
  1. from rest_framework import status
  2. from rest_framework.test import APITestCase
  3. from django.contrib.auth.models import User
  4. from django.urls import reverse
  5. from dcim.models import (
  6. ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
  7. DeviceBayTemplate, DeviceRole, DeviceType, IFACE_FF_LAG, Interface, InterfaceConnection, InterfaceTemplate,
  8. Manufacturer, Module, Platform, PowerPort, PowerPortTemplate, PowerOutlet, PowerOutletTemplate, Rack, RackGroup,
  9. RackReservation, RackRole, Region, Site, SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT,
  10. )
  11. from extras.models import Graph, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_SITE
  12. from users.models import Token
  13. from utilities.tests import HttpStatusMixin
  14. class RegionTest(HttpStatusMixin, APITestCase):
  15. def setUp(self):
  16. user = User.objects.create(username='testuser', is_superuser=True)
  17. token = Token.objects.create(user=user)
  18. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  19. self.region1 = Region.objects.create(name='Test Region 1', slug='test-region-1')
  20. self.region2 = Region.objects.create(name='Test Region 2', slug='test-region-2')
  21. self.region3 = Region.objects.create(name='Test Region 3', slug='test-region-3')
  22. def test_get_region(self):
  23. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  24. response = self.client.get(url, **self.header)
  25. self.assertEqual(response.data['name'], self.region1.name)
  26. def test_list_regions(self):
  27. url = reverse('dcim-api:region-list')
  28. response = self.client.get(url, **self.header)
  29. self.assertEqual(response.data['count'], 3)
  30. def test_create_region(self):
  31. data = {
  32. 'name': 'Test Region 4',
  33. 'slug': 'test-region-4',
  34. }
  35. url = reverse('dcim-api:region-list')
  36. response = self.client.post(url, data, **self.header)
  37. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  38. self.assertEqual(Region.objects.count(), 4)
  39. region4 = Region.objects.get(pk=response.data['id'])
  40. self.assertEqual(region4.name, data['name'])
  41. self.assertEqual(region4.slug, data['slug'])
  42. def test_update_region(self):
  43. data = {
  44. 'name': 'Test Region X',
  45. 'slug': 'test-region-x',
  46. }
  47. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  48. response = self.client.put(url, data, **self.header)
  49. self.assertHttpStatus(response, status.HTTP_200_OK)
  50. self.assertEqual(Region.objects.count(), 3)
  51. region1 = Region.objects.get(pk=response.data['id'])
  52. self.assertEqual(region1.name, data['name'])
  53. self.assertEqual(region1.slug, data['slug'])
  54. def test_delete_region(self):
  55. url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
  56. response = self.client.delete(url, **self.header)
  57. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  58. self.assertEqual(Region.objects.count(), 2)
  59. class SiteTest(HttpStatusMixin, APITestCase):
  60. def setUp(self):
  61. user = User.objects.create(username='testuser', is_superuser=True)
  62. token = Token.objects.create(user=user)
  63. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  64. self.region1 = Region.objects.create(name='Test Region 1', slug='test-region-1')
  65. self.region2 = Region.objects.create(name='Test Region 2', slug='test-region-2')
  66. self.site1 = Site.objects.create(region=self.region1, name='Test Site 1', slug='test-site-1')
  67. self.site2 = Site.objects.create(region=self.region1, name='Test Site 2', slug='test-site-2')
  68. self.site3 = Site.objects.create(region=self.region1, name='Test Site 3', slug='test-site-3')
  69. def test_get_site(self):
  70. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  71. response = self.client.get(url, **self.header)
  72. self.assertEqual(response.data['name'], self.site1.name)
  73. def test_get_site_graphs(self):
  74. self.graph1 = Graph.objects.create(
  75. type=GRAPH_TYPE_SITE, name='Test Graph 1',
  76. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=1'
  77. )
  78. self.graph2 = Graph.objects.create(
  79. type=GRAPH_TYPE_SITE, name='Test Graph 2',
  80. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=2'
  81. )
  82. self.graph3 = Graph.objects.create(
  83. type=GRAPH_TYPE_SITE, name='Test Graph 3',
  84. source='http://example.com/graphs.py?site={{ obj.slug }}&foo=3'
  85. )
  86. url = reverse('dcim-api:site-graphs', kwargs={'pk': self.site1.pk})
  87. response = self.client.get(url, **self.header)
  88. self.assertEqual(len(response.data), 3)
  89. self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?site=test-site-1&foo=1')
  90. def test_list_sites(self):
  91. url = reverse('dcim-api:site-list')
  92. response = self.client.get(url, **self.header)
  93. self.assertEqual(response.data['count'], 3)
  94. def test_create_site(self):
  95. data = {
  96. 'name': 'Test Site 4',
  97. 'slug': 'test-site-4',
  98. 'region': self.region1.pk,
  99. }
  100. url = reverse('dcim-api:site-list')
  101. response = self.client.post(url, data, **self.header)
  102. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  103. self.assertEqual(Site.objects.count(), 4)
  104. site4 = Site.objects.get(pk=response.data['id'])
  105. self.assertEqual(site4.name, data['name'])
  106. self.assertEqual(site4.slug, data['slug'])
  107. self.assertEqual(site4.region_id, data['region'])
  108. def test_update_site(self):
  109. data = {
  110. 'name': 'Test Site X',
  111. 'slug': 'test-site-x',
  112. 'region': self.region2.pk,
  113. }
  114. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  115. response = self.client.put(url, data, **self.header)
  116. self.assertHttpStatus(response, status.HTTP_200_OK)
  117. self.assertEqual(Site.objects.count(), 3)
  118. site1 = Site.objects.get(pk=response.data['id'])
  119. self.assertEqual(site1.name, data['name'])
  120. self.assertEqual(site1.slug, data['slug'])
  121. self.assertEqual(site1.region_id, data['region'])
  122. def test_delete_site(self):
  123. url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
  124. response = self.client.delete(url, **self.header)
  125. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  126. self.assertEqual(Site.objects.count(), 2)
  127. class RackGroupTest(HttpStatusMixin, APITestCase):
  128. def setUp(self):
  129. user = User.objects.create(username='testuser', is_superuser=True)
  130. token = Token.objects.create(user=user)
  131. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  132. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  133. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  134. self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1')
  135. self.rackgroup2 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 2', slug='test-rack-group-2')
  136. self.rackgroup3 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 3', slug='test-rack-group-3')
  137. def test_get_rackgroup(self):
  138. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  139. response = self.client.get(url, **self.header)
  140. self.assertEqual(response.data['name'], self.rackgroup1.name)
  141. def test_list_rackgroups(self):
  142. url = reverse('dcim-api:rackgroup-list')
  143. response = self.client.get(url, **self.header)
  144. self.assertEqual(response.data['count'], 3)
  145. def test_create_rackgroup(self):
  146. data = {
  147. 'name': 'Test Rack Group 4',
  148. 'slug': 'test-rack-group-4',
  149. 'site': self.site1.pk,
  150. }
  151. url = reverse('dcim-api:rackgroup-list')
  152. response = self.client.post(url, data, **self.header)
  153. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  154. self.assertEqual(RackGroup.objects.count(), 4)
  155. rackgroup4 = RackGroup.objects.get(pk=response.data['id'])
  156. self.assertEqual(rackgroup4.name, data['name'])
  157. self.assertEqual(rackgroup4.slug, data['slug'])
  158. self.assertEqual(rackgroup4.site_id, data['site'])
  159. def test_update_rackgroup(self):
  160. data = {
  161. 'name': 'Test Rack Group X',
  162. 'slug': 'test-rack-group-x',
  163. 'site': self.site2.pk,
  164. }
  165. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  166. response = self.client.put(url, data, **self.header)
  167. self.assertHttpStatus(response, status.HTTP_200_OK)
  168. self.assertEqual(RackGroup.objects.count(), 3)
  169. rackgroup1 = RackGroup.objects.get(pk=response.data['id'])
  170. self.assertEqual(rackgroup1.name, data['name'])
  171. self.assertEqual(rackgroup1.slug, data['slug'])
  172. self.assertEqual(rackgroup1.site_id, data['site'])
  173. def test_delete_rackgroup(self):
  174. url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
  175. response = self.client.delete(url, **self.header)
  176. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  177. self.assertEqual(RackGroup.objects.count(), 2)
  178. class RackRoleTest(HttpStatusMixin, APITestCase):
  179. def setUp(self):
  180. user = User.objects.create(username='testuser', is_superuser=True)
  181. token = Token.objects.create(user=user)
  182. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  183. self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
  184. self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00')
  185. self.rackrole3 = RackRole.objects.create(name='Test Rack Role 3', slug='test-rack-role-3', color='0000ff')
  186. def test_get_rackrole(self):
  187. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  188. response = self.client.get(url, **self.header)
  189. self.assertEqual(response.data['name'], self.rackrole1.name)
  190. def test_list_rackroles(self):
  191. url = reverse('dcim-api:rackrole-list')
  192. response = self.client.get(url, **self.header)
  193. self.assertEqual(response.data['count'], 3)
  194. def test_create_rackrole(self):
  195. data = {
  196. 'name': 'Test Rack Role 4',
  197. 'slug': 'test-rack-role-4',
  198. 'color': 'ffff00',
  199. }
  200. url = reverse('dcim-api:rackrole-list')
  201. response = self.client.post(url, data, **self.header)
  202. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  203. self.assertEqual(RackRole.objects.count(), 4)
  204. rackrole1 = RackRole.objects.get(pk=response.data['id'])
  205. self.assertEqual(rackrole1.name, data['name'])
  206. self.assertEqual(rackrole1.slug, data['slug'])
  207. self.assertEqual(rackrole1.color, data['color'])
  208. def test_update_rackrole(self):
  209. data = {
  210. 'name': 'Test Rack Role X',
  211. 'slug': 'test-rack-role-x',
  212. 'color': 'ffff00',
  213. }
  214. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  215. response = self.client.put(url, data, **self.header)
  216. self.assertHttpStatus(response, status.HTTP_200_OK)
  217. self.assertEqual(RackRole.objects.count(), 3)
  218. rackrole1 = RackRole.objects.get(pk=response.data['id'])
  219. self.assertEqual(rackrole1.name, data['name'])
  220. self.assertEqual(rackrole1.slug, data['slug'])
  221. self.assertEqual(rackrole1.color, data['color'])
  222. def test_delete_rackrole(self):
  223. url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
  224. response = self.client.delete(url, **self.header)
  225. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  226. self.assertEqual(RackRole.objects.count(), 2)
  227. class RackTest(HttpStatusMixin, APITestCase):
  228. def setUp(self):
  229. user = User.objects.create(username='testuser', is_superuser=True)
  230. token = Token.objects.create(user=user)
  231. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  232. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  233. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  234. self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1')
  235. self.rackgroup2 = RackGroup.objects.create(site=self.site2, name='Test Rack Group 2', slug='test-rack-group-2')
  236. self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000')
  237. self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00')
  238. self.rack1 = Rack.objects.create(
  239. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 1', u_height=42,
  240. )
  241. self.rack2 = Rack.objects.create(
  242. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 2', u_height=42,
  243. )
  244. self.rack3 = Rack.objects.create(
  245. site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 3', u_height=42,
  246. )
  247. def test_get_rack(self):
  248. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  249. response = self.client.get(url, **self.header)
  250. self.assertEqual(response.data['name'], self.rack1.name)
  251. def test_get_rack_units(self):
  252. url = reverse('dcim-api:rack-units', kwargs={'pk': self.rack1.pk})
  253. response = self.client.get(url, **self.header)
  254. self.assertEqual(response.data['count'], 42)
  255. def test_list_racks(self):
  256. url = reverse('dcim-api:rack-list')
  257. response = self.client.get(url, **self.header)
  258. self.assertEqual(response.data['count'], 3)
  259. def test_create_rack(self):
  260. data = {
  261. 'name': 'Test Rack 4',
  262. 'site': self.site1.pk,
  263. 'group': self.rackgroup1.pk,
  264. 'role': self.rackrole1.pk,
  265. }
  266. url = reverse('dcim-api:rack-list')
  267. response = self.client.post(url, data, **self.header)
  268. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  269. self.assertEqual(Rack.objects.count(), 4)
  270. rack4 = Rack.objects.get(pk=response.data['id'])
  271. self.assertEqual(rack4.name, data['name'])
  272. self.assertEqual(rack4.site_id, data['site'])
  273. self.assertEqual(rack4.group_id, data['group'])
  274. self.assertEqual(rack4.role_id, data['role'])
  275. def test_update_rack(self):
  276. data = {
  277. 'name': 'Test Rack X',
  278. 'site': self.site2.pk,
  279. 'group': self.rackgroup2.pk,
  280. 'role': self.rackrole2.pk,
  281. }
  282. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  283. response = self.client.put(url, data, **self.header)
  284. self.assertHttpStatus(response, status.HTTP_200_OK)
  285. self.assertEqual(Rack.objects.count(), 3)
  286. rack1 = Rack.objects.get(pk=response.data['id'])
  287. self.assertEqual(rack1.name, data['name'])
  288. self.assertEqual(rack1.site_id, data['site'])
  289. self.assertEqual(rack1.group_id, data['group'])
  290. self.assertEqual(rack1.role_id, data['role'])
  291. def test_delete_rack(self):
  292. url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
  293. response = self.client.delete(url, **self.header)
  294. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  295. self.assertEqual(Rack.objects.count(), 2)
  296. class RackReservationTest(HttpStatusMixin, APITestCase):
  297. def setUp(self):
  298. user = User.objects.create(username='testuser', is_superuser=True)
  299. token = Token.objects.create(user=user)
  300. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  301. self.user1 = user
  302. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  303. self.rack1 = Rack.objects.create(site=self.site1, name='Test Rack 1')
  304. self.rackreservation1 = RackReservation.objects.create(
  305. rack=self.rack1, units=[1, 2, 3], user=user, description='First reservation',
  306. )
  307. self.rackreservation2 = RackReservation.objects.create(
  308. rack=self.rack1, units=[4, 5, 6], user=user, description='Second reservation',
  309. )
  310. self.rackreservation3 = RackReservation.objects.create(
  311. rack=self.rack1, units=[7, 8, 9], user=user, description='Third reservation',
  312. )
  313. def test_get_rackreservation(self):
  314. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  315. response = self.client.get(url, **self.header)
  316. self.assertEqual(response.data['id'], self.rackreservation1.pk)
  317. def test_list_rackreservations(self):
  318. url = reverse('dcim-api:rackreservation-list')
  319. response = self.client.get(url, **self.header)
  320. self.assertEqual(response.data['count'], 3)
  321. def test_create_rackreservation(self):
  322. data = {
  323. 'rack': self.rack1.pk,
  324. 'units': [10, 11, 12],
  325. 'user': self.user1.pk,
  326. 'description': 'Fourth reservation',
  327. }
  328. url = reverse('dcim-api:rackreservation-list')
  329. response = self.client.post(url, data, **self.header)
  330. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  331. self.assertEqual(RackReservation.objects.count(), 4)
  332. rackreservation4 = RackReservation.objects.get(pk=response.data['id'])
  333. self.assertEqual(rackreservation4.rack_id, data['rack'])
  334. self.assertEqual(rackreservation4.units, data['units'])
  335. self.assertEqual(rackreservation4.user_id, data['user'])
  336. self.assertEqual(rackreservation4.description, data['description'])
  337. def test_update_rackreservation(self):
  338. data = {
  339. 'rack': self.rack1.pk,
  340. 'units': [10, 11, 12],
  341. 'user': self.user1.pk,
  342. 'description': 'Modified reservation',
  343. }
  344. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  345. response = self.client.put(url, data, **self.header)
  346. self.assertHttpStatus(response, status.HTTP_200_OK)
  347. self.assertEqual(RackReservation.objects.count(), 3)
  348. rackreservation1 = RackReservation.objects.get(pk=response.data['id'])
  349. self.assertEqual(rackreservation1.units, data['units'])
  350. self.assertEqual(rackreservation1.description, data['description'])
  351. def test_delete_rackreservation(self):
  352. url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
  353. response = self.client.delete(url, **self.header)
  354. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  355. self.assertEqual(RackReservation.objects.count(), 2)
  356. class ManufacturerTest(HttpStatusMixin, APITestCase):
  357. def setUp(self):
  358. user = User.objects.create(username='testuser', is_superuser=True)
  359. token = Token.objects.create(user=user)
  360. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  361. self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  362. self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2')
  363. self.manufacturer3 = Manufacturer.objects.create(name='Test Manufacturer 3', slug='test-manufacturer-3')
  364. def test_get_manufacturer(self):
  365. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  366. response = self.client.get(url, **self.header)
  367. self.assertEqual(response.data['name'], self.manufacturer1.name)
  368. def test_list_manufacturers(self):
  369. url = reverse('dcim-api:manufacturer-list')
  370. response = self.client.get(url, **self.header)
  371. self.assertEqual(response.data['count'], 3)
  372. def test_create_manufacturer(self):
  373. data = {
  374. 'name': 'Test Manufacturer 4',
  375. 'slug': 'test-manufacturer-4',
  376. }
  377. url = reverse('dcim-api:manufacturer-list')
  378. response = self.client.post(url, data, **self.header)
  379. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  380. self.assertEqual(Manufacturer.objects.count(), 4)
  381. manufacturer4 = Manufacturer.objects.get(pk=response.data['id'])
  382. self.assertEqual(manufacturer4.name, data['name'])
  383. self.assertEqual(manufacturer4.slug, data['slug'])
  384. def test_update_manufacturer(self):
  385. data = {
  386. 'name': 'Test Manufacturer X',
  387. 'slug': 'test-manufacturer-x',
  388. }
  389. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  390. response = self.client.put(url, data, **self.header)
  391. self.assertHttpStatus(response, status.HTTP_200_OK)
  392. self.assertEqual(Manufacturer.objects.count(), 3)
  393. manufacturer1 = Manufacturer.objects.get(pk=response.data['id'])
  394. self.assertEqual(manufacturer1.name, data['name'])
  395. self.assertEqual(manufacturer1.slug, data['slug'])
  396. def test_delete_manufacturer(self):
  397. url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
  398. response = self.client.delete(url, **self.header)
  399. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  400. self.assertEqual(Manufacturer.objects.count(), 2)
  401. class DeviceTypeTest(HttpStatusMixin, APITestCase):
  402. def setUp(self):
  403. user = User.objects.create(username='testuser', is_superuser=True)
  404. token = Token.objects.create(user=user)
  405. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  406. self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  407. self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2')
  408. self.devicetype1 = DeviceType.objects.create(
  409. manufacturer=self.manufacturer1, model='Test Device Type 1', slug='test-device-type-1'
  410. )
  411. self.devicetype2 = DeviceType.objects.create(
  412. manufacturer=self.manufacturer1, model='Test Device Type 2', slug='test-device-type-2'
  413. )
  414. self.devicetype3 = DeviceType.objects.create(
  415. manufacturer=self.manufacturer1, model='Test Device Type 3', slug='test-device-type-3'
  416. )
  417. def test_get_devicetype(self):
  418. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  419. response = self.client.get(url, **self.header)
  420. self.assertEqual(response.data['model'], self.devicetype1.model)
  421. def test_list_devicetypes(self):
  422. url = reverse('dcim-api:devicetype-list')
  423. response = self.client.get(url, **self.header)
  424. self.assertEqual(response.data['count'], 3)
  425. def test_create_devicetype(self):
  426. data = {
  427. 'manufacturer': self.manufacturer1.pk,
  428. 'model': 'Test Device Type 4',
  429. 'slug': 'test-device-type-4',
  430. }
  431. url = reverse('dcim-api:devicetype-list')
  432. response = self.client.post(url, data, **self.header)
  433. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  434. self.assertEqual(DeviceType.objects.count(), 4)
  435. devicetype4 = DeviceType.objects.get(pk=response.data['id'])
  436. self.assertEqual(devicetype4.manufacturer_id, data['manufacturer'])
  437. self.assertEqual(devicetype4.model, data['model'])
  438. self.assertEqual(devicetype4.slug, data['slug'])
  439. def test_update_devicetype(self):
  440. data = {
  441. 'manufacturer': self.manufacturer2.pk,
  442. 'model': 'Test Device Type X',
  443. 'slug': 'test-device-type-x',
  444. }
  445. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  446. response = self.client.put(url, data, **self.header)
  447. self.assertHttpStatus(response, status.HTTP_200_OK)
  448. self.assertEqual(DeviceType.objects.count(), 3)
  449. devicetype1 = DeviceType.objects.get(pk=response.data['id'])
  450. self.assertEqual(devicetype1.manufacturer_id, data['manufacturer'])
  451. self.assertEqual(devicetype1.model, data['model'])
  452. self.assertEqual(devicetype1.slug, data['slug'])
  453. def test_delete_devicetype(self):
  454. url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
  455. response = self.client.delete(url, **self.header)
  456. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  457. self.assertEqual(DeviceType.objects.count(), 2)
  458. class ConsolePortTemplateTest(HttpStatusMixin, APITestCase):
  459. def setUp(self):
  460. user = User.objects.create(username='testuser', is_superuser=True)
  461. token = Token.objects.create(user=user)
  462. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  463. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  464. self.devicetype = DeviceType.objects.create(
  465. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  466. )
  467. self.consoleporttemplate1 = ConsolePortTemplate.objects.create(
  468. device_type=self.devicetype, name='Test CP Template 1'
  469. )
  470. self.consoleporttemplate2 = ConsolePortTemplate.objects.create(
  471. device_type=self.devicetype, name='Test CP Template 2'
  472. )
  473. self.consoleporttemplate3 = ConsolePortTemplate.objects.create(
  474. device_type=self.devicetype, name='Test CP Template 3'
  475. )
  476. def test_get_consoleporttemplate(self):
  477. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  478. response = self.client.get(url, **self.header)
  479. self.assertEqual(response.data['name'], self.consoleporttemplate1.name)
  480. def test_list_consoleporttemplates(self):
  481. url = reverse('dcim-api:consoleporttemplate-list')
  482. response = self.client.get(url, **self.header)
  483. self.assertEqual(response.data['count'], 3)
  484. def test_create_consoleporttemplate(self):
  485. data = {
  486. 'device_type': self.devicetype.pk,
  487. 'name': 'Test CP Template 4',
  488. }
  489. url = reverse('dcim-api:consoleporttemplate-list')
  490. response = self.client.post(url, data, **self.header)
  491. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  492. self.assertEqual(ConsolePortTemplate.objects.count(), 4)
  493. consoleporttemplate4 = ConsolePortTemplate.objects.get(pk=response.data['id'])
  494. self.assertEqual(consoleporttemplate4.device_type_id, data['device_type'])
  495. self.assertEqual(consoleporttemplate4.name, data['name'])
  496. def test_update_consoleporttemplate(self):
  497. data = {
  498. 'device_type': self.devicetype.pk,
  499. 'name': 'Test CP Template X',
  500. }
  501. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  502. response = self.client.put(url, data, **self.header)
  503. self.assertHttpStatus(response, status.HTTP_200_OK)
  504. self.assertEqual(ConsolePortTemplate.objects.count(), 3)
  505. consoleporttemplate1 = ConsolePortTemplate.objects.get(pk=response.data['id'])
  506. self.assertEqual(consoleporttemplate1.name, data['name'])
  507. def test_delete_consoleporttemplate(self):
  508. url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
  509. response = self.client.delete(url, **self.header)
  510. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  511. self.assertEqual(ConsolePortTemplate.objects.count(), 2)
  512. class ConsoleServerPortTemplateTest(HttpStatusMixin, APITestCase):
  513. def setUp(self):
  514. user = User.objects.create(username='testuser', is_superuser=True)
  515. token = Token.objects.create(user=user)
  516. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  517. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  518. self.devicetype = DeviceType.objects.create(
  519. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  520. )
  521. self.consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.create(
  522. device_type=self.devicetype, name='Test CSP Template 1'
  523. )
  524. self.consoleserverporttemplate2 = ConsoleServerPortTemplate.objects.create(
  525. device_type=self.devicetype, name='Test CSP Template 2'
  526. )
  527. self.consoleserverporttemplate3 = ConsoleServerPortTemplate.objects.create(
  528. device_type=self.devicetype, name='Test CSP Template 3'
  529. )
  530. def test_get_consoleserverporttemplate(self):
  531. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  532. response = self.client.get(url, **self.header)
  533. self.assertEqual(response.data['name'], self.consoleserverporttemplate1.name)
  534. def test_list_consoleserverporttemplates(self):
  535. url = reverse('dcim-api:consoleserverporttemplate-list')
  536. response = self.client.get(url, **self.header)
  537. self.assertEqual(response.data['count'], 3)
  538. def test_create_consoleserverporttemplate(self):
  539. data = {
  540. 'device_type': self.devicetype.pk,
  541. 'name': 'Test CSP Template 4',
  542. }
  543. url = reverse('dcim-api:consoleserverporttemplate-list')
  544. response = self.client.post(url, data, **self.header)
  545. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  546. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 4)
  547. consoleserverporttemplate4 = ConsoleServerPortTemplate.objects.get(pk=response.data['id'])
  548. self.assertEqual(consoleserverporttemplate4.device_type_id, data['device_type'])
  549. self.assertEqual(consoleserverporttemplate4.name, data['name'])
  550. def test_update_consoleserverporttemplate(self):
  551. data = {
  552. 'device_type': self.devicetype.pk,
  553. 'name': 'Test CSP Template X',
  554. }
  555. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  556. response = self.client.put(url, data, **self.header)
  557. self.assertHttpStatus(response, status.HTTP_200_OK)
  558. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 3)
  559. consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.get(pk=response.data['id'])
  560. self.assertEqual(consoleserverporttemplate1.name, data['name'])
  561. def test_delete_consoleserverporttemplate(self):
  562. url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
  563. response = self.client.delete(url, **self.header)
  564. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  565. self.assertEqual(ConsoleServerPortTemplate.objects.count(), 2)
  566. class PowerPortTemplateTest(HttpStatusMixin, APITestCase):
  567. def setUp(self):
  568. user = User.objects.create(username='testuser', is_superuser=True)
  569. token = Token.objects.create(user=user)
  570. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  571. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  572. self.devicetype = DeviceType.objects.create(
  573. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  574. )
  575. self.powerporttemplate1 = PowerPortTemplate.objects.create(
  576. device_type=self.devicetype, name='Test PP Template 1'
  577. )
  578. self.powerporttemplate2 = PowerPortTemplate.objects.create(
  579. device_type=self.devicetype, name='Test PP Template 2'
  580. )
  581. self.powerporttemplate3 = PowerPortTemplate.objects.create(
  582. device_type=self.devicetype, name='Test PP Template 3'
  583. )
  584. def test_get_powerporttemplate(self):
  585. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  586. response = self.client.get(url, **self.header)
  587. self.assertEqual(response.data['name'], self.powerporttemplate1.name)
  588. def test_list_powerporttemplates(self):
  589. url = reverse('dcim-api:powerporttemplate-list')
  590. response = self.client.get(url, **self.header)
  591. self.assertEqual(response.data['count'], 3)
  592. def test_create_powerporttemplate(self):
  593. data = {
  594. 'device_type': self.devicetype.pk,
  595. 'name': 'Test PP Template 4',
  596. }
  597. url = reverse('dcim-api:powerporttemplate-list')
  598. response = self.client.post(url, data, **self.header)
  599. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  600. self.assertEqual(PowerPortTemplate.objects.count(), 4)
  601. powerporttemplate4 = PowerPortTemplate.objects.get(pk=response.data['id'])
  602. self.assertEqual(powerporttemplate4.device_type_id, data['device_type'])
  603. self.assertEqual(powerporttemplate4.name, data['name'])
  604. def test_update_powerporttemplate(self):
  605. data = {
  606. 'device_type': self.devicetype.pk,
  607. 'name': 'Test PP Template X',
  608. }
  609. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  610. response = self.client.put(url, data, **self.header)
  611. self.assertHttpStatus(response, status.HTTP_200_OK)
  612. self.assertEqual(PowerPortTemplate.objects.count(), 3)
  613. powerporttemplate1 = PowerPortTemplate.objects.get(pk=response.data['id'])
  614. self.assertEqual(powerporttemplate1.name, data['name'])
  615. def test_delete_powerporttemplate(self):
  616. url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
  617. response = self.client.delete(url, **self.header)
  618. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  619. self.assertEqual(PowerPortTemplate.objects.count(), 2)
  620. class PowerOutletTemplateTest(HttpStatusMixin, APITestCase):
  621. def setUp(self):
  622. user = User.objects.create(username='testuser', is_superuser=True)
  623. token = Token.objects.create(user=user)
  624. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  625. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  626. self.devicetype = DeviceType.objects.create(
  627. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  628. )
  629. self.poweroutlettemplate1 = PowerOutletTemplate.objects.create(
  630. device_type=self.devicetype, name='Test PO Template 1'
  631. )
  632. self.poweroutlettemplate2 = PowerOutletTemplate.objects.create(
  633. device_type=self.devicetype, name='Test PO Template 2'
  634. )
  635. self.poweroutlettemplate3 = PowerOutletTemplate.objects.create(
  636. device_type=self.devicetype, name='Test PO Template 3'
  637. )
  638. def test_get_poweroutlettemplate(self):
  639. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  640. response = self.client.get(url, **self.header)
  641. self.assertEqual(response.data['name'], self.poweroutlettemplate1.name)
  642. def test_list_poweroutlettemplates(self):
  643. url = reverse('dcim-api:poweroutlettemplate-list')
  644. response = self.client.get(url, **self.header)
  645. self.assertEqual(response.data['count'], 3)
  646. def test_create_poweroutlettemplate(self):
  647. data = {
  648. 'device_type': self.devicetype.pk,
  649. 'name': 'Test PO Template 4',
  650. }
  651. url = reverse('dcim-api:poweroutlettemplate-list')
  652. response = self.client.post(url, data, **self.header)
  653. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  654. self.assertEqual(PowerOutletTemplate.objects.count(), 4)
  655. poweroutlettemplate4 = PowerOutletTemplate.objects.get(pk=response.data['id'])
  656. self.assertEqual(poweroutlettemplate4.device_type_id, data['device_type'])
  657. self.assertEqual(poweroutlettemplate4.name, data['name'])
  658. def test_update_poweroutlettemplate(self):
  659. data = {
  660. 'device_type': self.devicetype.pk,
  661. 'name': 'Test PO Template X',
  662. }
  663. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  664. response = self.client.put(url, data, **self.header)
  665. self.assertHttpStatus(response, status.HTTP_200_OK)
  666. self.assertEqual(PowerOutletTemplate.objects.count(), 3)
  667. poweroutlettemplate1 = PowerOutletTemplate.objects.get(pk=response.data['id'])
  668. self.assertEqual(poweroutlettemplate1.name, data['name'])
  669. def test_delete_poweroutlettemplate(self):
  670. url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
  671. response = self.client.delete(url, **self.header)
  672. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  673. self.assertEqual(PowerOutletTemplate.objects.count(), 2)
  674. class InterfaceTemplateTest(HttpStatusMixin, APITestCase):
  675. def setUp(self):
  676. user = User.objects.create(username='testuser', is_superuser=True)
  677. token = Token.objects.create(user=user)
  678. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  679. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  680. self.devicetype = DeviceType.objects.create(
  681. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  682. )
  683. self.interfacetemplate1 = InterfaceTemplate.objects.create(
  684. device_type=self.devicetype, name='Test Interface Template 1'
  685. )
  686. self.interfacetemplate2 = InterfaceTemplate.objects.create(
  687. device_type=self.devicetype, name='Test Interface Template 2'
  688. )
  689. self.interfacetemplate3 = InterfaceTemplate.objects.create(
  690. device_type=self.devicetype, name='Test Interface Template 3'
  691. )
  692. def test_get_interfacetemplate(self):
  693. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  694. response = self.client.get(url, **self.header)
  695. self.assertEqual(response.data['name'], self.interfacetemplate1.name)
  696. def test_list_interfacetemplates(self):
  697. url = reverse('dcim-api:interfacetemplate-list')
  698. response = self.client.get(url, **self.header)
  699. self.assertEqual(response.data['count'], 3)
  700. def test_create_interfacetemplate(self):
  701. data = {
  702. 'device_type': self.devicetype.pk,
  703. 'name': 'Test Interface Template 4',
  704. }
  705. url = reverse('dcim-api:interfacetemplate-list')
  706. response = self.client.post(url, data, **self.header)
  707. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  708. self.assertEqual(InterfaceTemplate.objects.count(), 4)
  709. interfacetemplate4 = InterfaceTemplate.objects.get(pk=response.data['id'])
  710. self.assertEqual(interfacetemplate4.device_type_id, data['device_type'])
  711. self.assertEqual(interfacetemplate4.name, data['name'])
  712. def test_update_interfacetemplate(self):
  713. data = {
  714. 'device_type': self.devicetype.pk,
  715. 'name': 'Test Interface Template X',
  716. }
  717. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  718. response = self.client.put(url, data, **self.header)
  719. self.assertHttpStatus(response, status.HTTP_200_OK)
  720. self.assertEqual(InterfaceTemplate.objects.count(), 3)
  721. interfacetemplate1 = InterfaceTemplate.objects.get(pk=response.data['id'])
  722. self.assertEqual(interfacetemplate1.name, data['name'])
  723. def test_delete_interfacetemplate(self):
  724. url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
  725. response = self.client.delete(url, **self.header)
  726. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  727. self.assertEqual(InterfaceTemplate.objects.count(), 2)
  728. class DeviceBayTemplateTest(HttpStatusMixin, APITestCase):
  729. def setUp(self):
  730. user = User.objects.create(username='testuser', is_superuser=True)
  731. token = Token.objects.create(user=user)
  732. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  733. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  734. self.devicetype = DeviceType.objects.create(
  735. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  736. )
  737. self.devicebaytemplate1 = DeviceBayTemplate.objects.create(
  738. device_type=self.devicetype, name='Test Device Bay Template 1'
  739. )
  740. self.devicebaytemplate2 = DeviceBayTemplate.objects.create(
  741. device_type=self.devicetype, name='Test Device Bay Template 2'
  742. )
  743. self.devicebaytemplate3 = DeviceBayTemplate.objects.create(
  744. device_type=self.devicetype, name='Test Device Bay Template 3'
  745. )
  746. def test_get_devicebaytemplate(self):
  747. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  748. response = self.client.get(url, **self.header)
  749. self.assertEqual(response.data['name'], self.devicebaytemplate1.name)
  750. def test_list_devicebaytemplates(self):
  751. url = reverse('dcim-api:devicebaytemplate-list')
  752. response = self.client.get(url, **self.header)
  753. self.assertEqual(response.data['count'], 3)
  754. def test_create_devicebaytemplate(self):
  755. data = {
  756. 'device_type': self.devicetype.pk,
  757. 'name': 'Test Device Bay Template 4',
  758. }
  759. url = reverse('dcim-api:devicebaytemplate-list')
  760. response = self.client.post(url, data, **self.header)
  761. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  762. self.assertEqual(DeviceBayTemplate.objects.count(), 4)
  763. devicebaytemplate4 = DeviceBayTemplate.objects.get(pk=response.data['id'])
  764. self.assertEqual(devicebaytemplate4.device_type_id, data['device_type'])
  765. self.assertEqual(devicebaytemplate4.name, data['name'])
  766. def test_update_devicebaytemplate(self):
  767. data = {
  768. 'device_type': self.devicetype.pk,
  769. 'name': 'Test Device Bay Template X',
  770. }
  771. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  772. response = self.client.put(url, data, **self.header)
  773. self.assertHttpStatus(response, status.HTTP_200_OK)
  774. self.assertEqual(DeviceBayTemplate.objects.count(), 3)
  775. devicebaytemplate1 = DeviceBayTemplate.objects.get(pk=response.data['id'])
  776. self.assertEqual(devicebaytemplate1.name, data['name'])
  777. def test_delete_devicebaytemplate(self):
  778. url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
  779. response = self.client.delete(url, **self.header)
  780. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  781. self.assertEqual(DeviceBayTemplate.objects.count(), 2)
  782. class DeviceRoleTest(HttpStatusMixin, APITestCase):
  783. def setUp(self):
  784. user = User.objects.create(username='testuser', is_superuser=True)
  785. token = Token.objects.create(user=user)
  786. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  787. self.devicerole1 = DeviceRole.objects.create(
  788. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  789. )
  790. self.devicerole2 = DeviceRole.objects.create(
  791. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  792. )
  793. self.devicerole3 = DeviceRole.objects.create(
  794. name='Test Device Role 3', slug='test-device-role-3', color='0000ff'
  795. )
  796. def test_get_devicerole(self):
  797. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  798. response = self.client.get(url, **self.header)
  799. self.assertEqual(response.data['name'], self.devicerole1.name)
  800. def test_list_deviceroles(self):
  801. url = reverse('dcim-api:devicerole-list')
  802. response = self.client.get(url, **self.header)
  803. self.assertEqual(response.data['count'], 3)
  804. def test_create_devicerole(self):
  805. data = {
  806. 'name': 'Test Device Role 4',
  807. 'slug': 'test-device-role-4',
  808. 'color': 'ffff00',
  809. }
  810. url = reverse('dcim-api:devicerole-list')
  811. response = self.client.post(url, data, **self.header)
  812. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  813. self.assertEqual(DeviceRole.objects.count(), 4)
  814. devicerole4 = DeviceRole.objects.get(pk=response.data['id'])
  815. self.assertEqual(devicerole4.name, data['name'])
  816. self.assertEqual(devicerole4.slug, data['slug'])
  817. self.assertEqual(devicerole4.color, data['color'])
  818. def test_update_devicerole(self):
  819. data = {
  820. 'name': 'Test Device Role X',
  821. 'slug': 'test-device-role-x',
  822. 'color': '00ffff',
  823. }
  824. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  825. response = self.client.put(url, data, **self.header)
  826. self.assertHttpStatus(response, status.HTTP_200_OK)
  827. self.assertEqual(DeviceRole.objects.count(), 3)
  828. devicerole1 = DeviceRole.objects.get(pk=response.data['id'])
  829. self.assertEqual(devicerole1.name, data['name'])
  830. self.assertEqual(devicerole1.slug, data['slug'])
  831. self.assertEqual(devicerole1.color, data['color'])
  832. def test_delete_devicerole(self):
  833. url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
  834. response = self.client.delete(url, **self.header)
  835. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  836. self.assertEqual(DeviceRole.objects.count(), 2)
  837. class PlatformTest(HttpStatusMixin, APITestCase):
  838. def setUp(self):
  839. user = User.objects.create(username='testuser', is_superuser=True)
  840. token = Token.objects.create(user=user)
  841. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  842. self.platform1 = Platform.objects.create(name='Test Platform 1', slug='test-platform-1')
  843. self.platform2 = Platform.objects.create(name='Test Platform 2', slug='test-platform-2')
  844. self.platform3 = Platform.objects.create(name='Test Platform 3', slug='test-platform-3')
  845. def test_get_platform(self):
  846. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  847. response = self.client.get(url, **self.header)
  848. self.assertEqual(response.data['name'], self.platform1.name)
  849. def test_list_platforms(self):
  850. url = reverse('dcim-api:platform-list')
  851. response = self.client.get(url, **self.header)
  852. self.assertEqual(response.data['count'], 3)
  853. def test_create_platform(self):
  854. data = {
  855. 'name': 'Test Platform 4',
  856. 'slug': 'test-platform-4',
  857. }
  858. url = reverse('dcim-api:platform-list')
  859. response = self.client.post(url, data, **self.header)
  860. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  861. self.assertEqual(Platform.objects.count(), 4)
  862. platform4 = Platform.objects.get(pk=response.data['id'])
  863. self.assertEqual(platform4.name, data['name'])
  864. self.assertEqual(platform4.slug, data['slug'])
  865. def test_update_platform(self):
  866. data = {
  867. 'name': 'Test Platform X',
  868. 'slug': 'test-platform-x',
  869. }
  870. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  871. response = self.client.put(url, data, **self.header)
  872. self.assertHttpStatus(response, status.HTTP_200_OK)
  873. self.assertEqual(Platform.objects.count(), 3)
  874. platform1 = Platform.objects.get(pk=response.data['id'])
  875. self.assertEqual(platform1.name, data['name'])
  876. self.assertEqual(platform1.slug, data['slug'])
  877. def test_delete_platform(self):
  878. url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
  879. response = self.client.delete(url, **self.header)
  880. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  881. self.assertEqual(Platform.objects.count(), 2)
  882. class DeviceTest(HttpStatusMixin, APITestCase):
  883. def setUp(self):
  884. user = User.objects.create(username='testuser', is_superuser=True)
  885. token = Token.objects.create(user=user)
  886. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  887. self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1')
  888. self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2')
  889. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  890. self.devicetype1 = DeviceType.objects.create(
  891. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  892. )
  893. self.devicetype2 = DeviceType.objects.create(
  894. manufacturer=manufacturer, model='Test Device Type 2', slug='test-device-type-2'
  895. )
  896. self.devicerole1 = DeviceRole.objects.create(
  897. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  898. )
  899. self.devicerole2 = DeviceRole.objects.create(
  900. name='Test Device Role 2', slug='test-device-role-2', color='00ff00'
  901. )
  902. self.device1 = Device.objects.create(
  903. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 1', site=self.site1
  904. )
  905. self.device2 = Device.objects.create(
  906. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 2', site=self.site1
  907. )
  908. self.device3 = Device.objects.create(
  909. device_type=self.devicetype1, device_role=self.devicerole1, name='Test Device 3', site=self.site1
  910. )
  911. def test_get_device(self):
  912. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  913. response = self.client.get(url, **self.header)
  914. self.assertEqual(response.data['name'], self.device1.name)
  915. def test_list_devices(self):
  916. url = reverse('dcim-api:device-list')
  917. response = self.client.get(url, **self.header)
  918. self.assertEqual(response.data['count'], 3)
  919. def test_create_device(self):
  920. data = {
  921. 'device_type': self.devicetype1.pk,
  922. 'device_role': self.devicerole1.pk,
  923. 'name': 'Test Device 4',
  924. 'site': self.site1.pk,
  925. }
  926. url = reverse('dcim-api:device-list')
  927. response = self.client.post(url, data, **self.header)
  928. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  929. self.assertEqual(Device.objects.count(), 4)
  930. device4 = Device.objects.get(pk=response.data['id'])
  931. self.assertEqual(device4.device_type_id, data['device_type'])
  932. self.assertEqual(device4.device_role_id, data['device_role'])
  933. self.assertEqual(device4.name, data['name'])
  934. self.assertEqual(device4.site_id, data['site'])
  935. def test_update_device(self):
  936. data = {
  937. 'device_type': self.devicetype2.pk,
  938. 'device_role': self.devicerole2.pk,
  939. 'name': 'Test Device X',
  940. 'site': self.site2.pk,
  941. }
  942. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  943. response = self.client.put(url, data, **self.header)
  944. self.assertHttpStatus(response, status.HTTP_200_OK)
  945. self.assertEqual(Device.objects.count(), 3)
  946. device1 = Device.objects.get(pk=response.data['id'])
  947. self.assertEqual(device1.device_type_id, data['device_type'])
  948. self.assertEqual(device1.device_role_id, data['device_role'])
  949. self.assertEqual(device1.name, data['name'])
  950. self.assertEqual(device1.site_id, data['site'])
  951. def test_delete_device(self):
  952. url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
  953. response = self.client.delete(url, **self.header)
  954. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  955. self.assertEqual(Device.objects.count(), 2)
  956. class ConsolePortTest(HttpStatusMixin, APITestCase):
  957. def setUp(self):
  958. user = User.objects.create(username='testuser', is_superuser=True)
  959. token = Token.objects.create(user=user)
  960. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  961. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  962. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  963. devicetype = DeviceType.objects.create(
  964. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  965. )
  966. devicerole = DeviceRole.objects.create(
  967. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  968. )
  969. self.device = Device.objects.create(
  970. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  971. )
  972. self.consoleport1 = ConsolePort.objects.create(device=self.device, name='Test Console Port 1')
  973. self.consoleport2 = ConsolePort.objects.create(device=self.device, name='Test Console Port 2')
  974. self.consoleport3 = ConsolePort.objects.create(device=self.device, name='Test Console Port 3')
  975. def test_get_consoleport(self):
  976. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  977. response = self.client.get(url, **self.header)
  978. self.assertEqual(response.data['name'], self.consoleport1.name)
  979. def test_list_consoleports(self):
  980. url = reverse('dcim-api:consoleport-list')
  981. response = self.client.get(url, **self.header)
  982. self.assertEqual(response.data['count'], 3)
  983. def test_create_consoleport(self):
  984. data = {
  985. 'device': self.device.pk,
  986. 'name': 'Test Console Port 4',
  987. }
  988. url = reverse('dcim-api:consoleport-list')
  989. response = self.client.post(url, data, **self.header)
  990. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  991. self.assertEqual(ConsolePort.objects.count(), 4)
  992. consoleport4 = ConsolePort.objects.get(pk=response.data['id'])
  993. self.assertEqual(consoleport4.device_id, data['device'])
  994. self.assertEqual(consoleport4.name, data['name'])
  995. def test_update_consoleport(self):
  996. consoleserverport = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1')
  997. data = {
  998. 'device': self.device.pk,
  999. 'name': 'Test Console Port X',
  1000. 'cs_port': consoleserverport.pk,
  1001. }
  1002. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  1003. response = self.client.put(url, data, **self.header)
  1004. self.assertHttpStatus(response, status.HTTP_200_OK)
  1005. self.assertEqual(ConsolePort.objects.count(), 3)
  1006. consoleport1 = ConsolePort.objects.get(pk=response.data['id'])
  1007. self.assertEqual(consoleport1.name, data['name'])
  1008. self.assertEqual(consoleport1.cs_port_id, data['cs_port'])
  1009. def test_delete_consoleport(self):
  1010. url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
  1011. response = self.client.delete(url, **self.header)
  1012. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1013. self.assertEqual(ConsolePort.objects.count(), 2)
  1014. class ConsoleServerPortTest(HttpStatusMixin, APITestCase):
  1015. def setUp(self):
  1016. user = User.objects.create(username='testuser', is_superuser=True)
  1017. token = Token.objects.create(user=user)
  1018. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1019. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1020. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1021. devicetype = DeviceType.objects.create(
  1022. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1023. )
  1024. devicerole = DeviceRole.objects.create(
  1025. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1026. )
  1027. self.device = Device.objects.create(
  1028. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1029. )
  1030. self.consoleserverport1 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1')
  1031. self.consoleserverport2 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 2')
  1032. self.consoleserverport3 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 3')
  1033. def test_get_consoleserverport(self):
  1034. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1035. response = self.client.get(url, **self.header)
  1036. self.assertEqual(response.data['name'], self.consoleserverport1.name)
  1037. def test_list_consoleserverports(self):
  1038. url = reverse('dcim-api:consoleserverport-list')
  1039. response = self.client.get(url, **self.header)
  1040. self.assertEqual(response.data['count'], 3)
  1041. def test_create_consoleserverport(self):
  1042. data = {
  1043. 'device': self.device.pk,
  1044. 'name': 'Test CS Port 4',
  1045. }
  1046. url = reverse('dcim-api:consoleserverport-list')
  1047. response = self.client.post(url, data, **self.header)
  1048. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1049. self.assertEqual(ConsoleServerPort.objects.count(), 4)
  1050. consoleserverport4 = ConsoleServerPort.objects.get(pk=response.data['id'])
  1051. self.assertEqual(consoleserverport4.device_id, data['device'])
  1052. self.assertEqual(consoleserverport4.name, data['name'])
  1053. def test_update_consoleserverport(self):
  1054. data = {
  1055. 'device': self.device.pk,
  1056. 'name': 'Test CS Port X',
  1057. }
  1058. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1059. response = self.client.put(url, data, **self.header)
  1060. self.assertHttpStatus(response, status.HTTP_200_OK)
  1061. self.assertEqual(ConsoleServerPort.objects.count(), 3)
  1062. consoleserverport1 = ConsoleServerPort.objects.get(pk=response.data['id'])
  1063. self.assertEqual(consoleserverport1.name, data['name'])
  1064. def test_delete_consoleserverport(self):
  1065. url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
  1066. response = self.client.delete(url, **self.header)
  1067. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1068. self.assertEqual(ConsoleServerPort.objects.count(), 2)
  1069. class PowerPortTest(HttpStatusMixin, APITestCase):
  1070. def setUp(self):
  1071. user = User.objects.create(username='testuser', is_superuser=True)
  1072. token = Token.objects.create(user=user)
  1073. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1074. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1075. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1076. devicetype = DeviceType.objects.create(
  1077. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1078. )
  1079. devicerole = DeviceRole.objects.create(
  1080. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1081. )
  1082. self.device = Device.objects.create(
  1083. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1084. )
  1085. self.powerport1 = PowerPort.objects.create(device=self.device, name='Test Power Port 1')
  1086. self.powerport2 = PowerPort.objects.create(device=self.device, name='Test Power Port 2')
  1087. self.powerport3 = PowerPort.objects.create(device=self.device, name='Test Power Port 3')
  1088. def test_get_powerport(self):
  1089. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1090. response = self.client.get(url, **self.header)
  1091. self.assertEqual(response.data['name'], self.powerport1.name)
  1092. def test_list_powerports(self):
  1093. url = reverse('dcim-api:powerport-list')
  1094. response = self.client.get(url, **self.header)
  1095. self.assertEqual(response.data['count'], 3)
  1096. def test_create_powerport(self):
  1097. data = {
  1098. 'device': self.device.pk,
  1099. 'name': 'Test Power Port 4',
  1100. }
  1101. url = reverse('dcim-api:powerport-list')
  1102. response = self.client.post(url, data, **self.header)
  1103. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1104. self.assertEqual(PowerPort.objects.count(), 4)
  1105. powerport4 = PowerPort.objects.get(pk=response.data['id'])
  1106. self.assertEqual(powerport4.device_id, data['device'])
  1107. self.assertEqual(powerport4.name, data['name'])
  1108. def test_update_powerport(self):
  1109. poweroutlet = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1')
  1110. data = {
  1111. 'device': self.device.pk,
  1112. 'name': 'Test Power Port X',
  1113. 'power_outlet': poweroutlet.pk,
  1114. }
  1115. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1116. response = self.client.put(url, data, **self.header)
  1117. self.assertHttpStatus(response, status.HTTP_200_OK)
  1118. self.assertEqual(PowerPort.objects.count(), 3)
  1119. powerport1 = PowerPort.objects.get(pk=response.data['id'])
  1120. self.assertEqual(powerport1.name, data['name'])
  1121. self.assertEqual(powerport1.power_outlet_id, data['power_outlet'])
  1122. def test_delete_powerport(self):
  1123. url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
  1124. response = self.client.delete(url, **self.header)
  1125. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1126. self.assertEqual(PowerPort.objects.count(), 2)
  1127. class PowerOutletTest(HttpStatusMixin, APITestCase):
  1128. def setUp(self):
  1129. user = User.objects.create(username='testuser', is_superuser=True)
  1130. token = Token.objects.create(user=user)
  1131. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1132. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1133. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1134. devicetype = DeviceType.objects.create(
  1135. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1136. )
  1137. devicerole = DeviceRole.objects.create(
  1138. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1139. )
  1140. self.device = Device.objects.create(
  1141. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1142. )
  1143. self.poweroutlet1 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1')
  1144. self.poweroutlet2 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 2')
  1145. self.poweroutlet3 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 3')
  1146. def test_get_poweroutlet(self):
  1147. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1148. response = self.client.get(url, **self.header)
  1149. self.assertEqual(response.data['name'], self.poweroutlet1.name)
  1150. def test_list_poweroutlets(self):
  1151. url = reverse('dcim-api:poweroutlet-list')
  1152. response = self.client.get(url, **self.header)
  1153. self.assertEqual(response.data['count'], 3)
  1154. def test_create_poweroutlet(self):
  1155. data = {
  1156. 'device': self.device.pk,
  1157. 'name': 'Test Power Outlet 4',
  1158. }
  1159. url = reverse('dcim-api:poweroutlet-list')
  1160. response = self.client.post(url, data, **self.header)
  1161. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1162. self.assertEqual(PowerOutlet.objects.count(), 4)
  1163. poweroutlet4 = PowerOutlet.objects.get(pk=response.data['id'])
  1164. self.assertEqual(poweroutlet4.device_id, data['device'])
  1165. self.assertEqual(poweroutlet4.name, data['name'])
  1166. def test_update_poweroutlet(self):
  1167. data = {
  1168. 'device': self.device.pk,
  1169. 'name': 'Test Power Outlet X',
  1170. }
  1171. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1172. response = self.client.put(url, data, **self.header)
  1173. self.assertHttpStatus(response, status.HTTP_200_OK)
  1174. self.assertEqual(PowerOutlet.objects.count(), 3)
  1175. poweroutlet1 = PowerOutlet.objects.get(pk=response.data['id'])
  1176. self.assertEqual(poweroutlet1.name, data['name'])
  1177. def test_delete_poweroutlet(self):
  1178. url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
  1179. response = self.client.delete(url, **self.header)
  1180. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1181. self.assertEqual(PowerOutlet.objects.count(), 2)
  1182. class InterfaceTest(HttpStatusMixin, APITestCase):
  1183. def setUp(self):
  1184. user = User.objects.create(username='testuser', is_superuser=True)
  1185. token = Token.objects.create(user=user)
  1186. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1187. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1188. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1189. devicetype = DeviceType.objects.create(
  1190. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1191. )
  1192. devicerole = DeviceRole.objects.create(
  1193. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1194. )
  1195. self.device = Device.objects.create(
  1196. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1197. )
  1198. self.interface1 = Interface.objects.create(device=self.device, name='Test Interface 1')
  1199. self.interface2 = Interface.objects.create(device=self.device, name='Test Interface 2')
  1200. self.interface3 = Interface.objects.create(device=self.device, name='Test Interface 3')
  1201. def test_get_interface(self):
  1202. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1203. response = self.client.get(url, **self.header)
  1204. self.assertEqual(response.data['name'], self.interface1.name)
  1205. def test_get_interface_graphs(self):
  1206. self.graph1 = Graph.objects.create(
  1207. type=GRAPH_TYPE_INTERFACE, name='Test Graph 1',
  1208. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=1'
  1209. )
  1210. self.graph2 = Graph.objects.create(
  1211. type=GRAPH_TYPE_INTERFACE, name='Test Graph 2',
  1212. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=2'
  1213. )
  1214. self.graph3 = Graph.objects.create(
  1215. type=GRAPH_TYPE_INTERFACE, name='Test Graph 3',
  1216. source='http://example.com/graphs.py?interface={{ obj.name }}&foo=3'
  1217. )
  1218. url = reverse('dcim-api:interface-graphs', kwargs={'pk': self.interface1.pk})
  1219. response = self.client.get(url, **self.header)
  1220. self.assertEqual(len(response.data), 3)
  1221. self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?interface=Test Interface 1&foo=1')
  1222. def test_list_interfaces(self):
  1223. url = reverse('dcim-api:interface-list')
  1224. response = self.client.get(url, **self.header)
  1225. self.assertEqual(response.data['count'], 3)
  1226. def test_create_interface(self):
  1227. data = {
  1228. 'device': self.device.pk,
  1229. 'name': 'Test Interface 4',
  1230. }
  1231. url = reverse('dcim-api:interface-list')
  1232. response = self.client.post(url, data, **self.header)
  1233. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1234. self.assertEqual(Interface.objects.count(), 4)
  1235. interface4 = Interface.objects.get(pk=response.data['id'])
  1236. self.assertEqual(interface4.device_id, data['device'])
  1237. self.assertEqual(interface4.name, data['name'])
  1238. def test_update_interface(self):
  1239. lag_interface = Interface.objects.create(
  1240. device=self.device, name='Test LAG Interface', form_factor=IFACE_FF_LAG
  1241. )
  1242. data = {
  1243. 'device': self.device.pk,
  1244. 'name': 'Test Interface X',
  1245. 'lag': lag_interface.pk,
  1246. }
  1247. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1248. response = self.client.put(url, data, **self.header)
  1249. self.assertHttpStatus(response, status.HTTP_200_OK)
  1250. self.assertEqual(Interface.objects.count(), 4)
  1251. interface1 = Interface.objects.get(pk=response.data['id'])
  1252. self.assertEqual(interface1.name, data['name'])
  1253. self.assertEqual(interface1.lag_id, data['lag'])
  1254. def test_delete_interface(self):
  1255. url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
  1256. response = self.client.delete(url, **self.header)
  1257. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1258. self.assertEqual(Interface.objects.count(), 2)
  1259. class DeviceBayTest(HttpStatusMixin, APITestCase):
  1260. def setUp(self):
  1261. user = User.objects.create(username='testuser', is_superuser=True)
  1262. token = Token.objects.create(user=user)
  1263. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1264. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1265. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1266. self.devicetype1 = DeviceType.objects.create(
  1267. manufacturer=manufacturer, model='Parent Device Type', slug='parent-device-type',
  1268. subdevice_role=SUBDEVICE_ROLE_PARENT
  1269. )
  1270. self.devicetype2 = DeviceType.objects.create(
  1271. manufacturer=manufacturer, model='Child Device Type', slug='child-device-type',
  1272. subdevice_role=SUBDEVICE_ROLE_CHILD
  1273. )
  1274. devicerole = DeviceRole.objects.create(
  1275. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1276. )
  1277. self.parent_device = Device.objects.create(
  1278. device_type=self.devicetype1, device_role=devicerole, name='Parent Device 1', site=site
  1279. )
  1280. self.child_device = Device.objects.create(
  1281. device_type=self.devicetype2, device_role=devicerole, name='Child Device 1', site=site
  1282. )
  1283. self.devicebay1 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 1')
  1284. self.devicebay2 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 2')
  1285. self.devicebay3 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 3')
  1286. def test_get_devicebay(self):
  1287. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1288. response = self.client.get(url, **self.header)
  1289. self.assertEqual(response.data['name'], self.devicebay1.name)
  1290. def test_list_devicebays(self):
  1291. url = reverse('dcim-api:devicebay-list')
  1292. response = self.client.get(url, **self.header)
  1293. self.assertEqual(response.data['count'], 3)
  1294. def test_create_devicebay(self):
  1295. data = {
  1296. 'device': self.parent_device.pk,
  1297. 'name': 'Test Device Bay 4',
  1298. 'installed_device': self.child_device.pk,
  1299. }
  1300. url = reverse('dcim-api:devicebay-list')
  1301. response = self.client.post(url, data, **self.header)
  1302. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1303. self.assertEqual(DeviceBay.objects.count(), 4)
  1304. devicebay4 = DeviceBay.objects.get(pk=response.data['id'])
  1305. self.assertEqual(devicebay4.device_id, data['device'])
  1306. self.assertEqual(devicebay4.name, data['name'])
  1307. self.assertEqual(devicebay4.installed_device_id, data['installed_device'])
  1308. def test_update_devicebay(self):
  1309. data = {
  1310. 'device': self.parent_device.pk,
  1311. 'name': 'Test Device Bay X',
  1312. 'installed_device': self.child_device.pk,
  1313. }
  1314. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1315. response = self.client.put(url, data, **self.header)
  1316. self.assertHttpStatus(response, status.HTTP_200_OK)
  1317. self.assertEqual(DeviceBay.objects.count(), 3)
  1318. devicebay1 = DeviceBay.objects.get(pk=response.data['id'])
  1319. self.assertEqual(devicebay1.name, data['name'])
  1320. self.assertEqual(devicebay1.installed_device_id, data['installed_device'])
  1321. def test_delete_devicebay(self):
  1322. url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
  1323. response = self.client.delete(url, **self.header)
  1324. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1325. self.assertEqual(DeviceBay.objects.count(), 2)
  1326. class ModuleTest(HttpStatusMixin, APITestCase):
  1327. def setUp(self):
  1328. user = User.objects.create(username='testuser', is_superuser=True)
  1329. token = Token.objects.create(user=user)
  1330. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1331. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1332. self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1333. devicetype = DeviceType.objects.create(
  1334. manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1335. )
  1336. devicerole = DeviceRole.objects.create(
  1337. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1338. )
  1339. self.device = Device.objects.create(
  1340. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1341. )
  1342. self.module1 = Module.objects.create(device=self.device, name='Test Module 1')
  1343. self.module2 = Module.objects.create(device=self.device, name='Test Module 2')
  1344. self.module3 = Module.objects.create(device=self.device, name='Test Module 3')
  1345. def test_get_module(self):
  1346. url = reverse('dcim-api:module-detail', kwargs={'pk': self.module1.pk})
  1347. response = self.client.get(url, **self.header)
  1348. self.assertEqual(response.data['name'], self.module1.name)
  1349. def test_list_modules(self):
  1350. url = reverse('dcim-api:module-list')
  1351. response = self.client.get(url, **self.header)
  1352. self.assertEqual(response.data['count'], 3)
  1353. def test_create_module(self):
  1354. data = {
  1355. 'device': self.device.pk,
  1356. 'parent': self.module1.pk,
  1357. 'name': 'Test Module 4',
  1358. 'manufacturer': self.manufacturer.pk,
  1359. }
  1360. url = reverse('dcim-api:module-list')
  1361. response = self.client.post(url, data, **self.header)
  1362. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1363. self.assertEqual(Module.objects.count(), 4)
  1364. module4 = Module.objects.get(pk=response.data['id'])
  1365. self.assertEqual(module4.device_id, data['device'])
  1366. self.assertEqual(module4.parent_id, data['parent'])
  1367. self.assertEqual(module4.name, data['name'])
  1368. self.assertEqual(module4.manufacturer_id, data['manufacturer'])
  1369. def test_update_module(self):
  1370. data = {
  1371. 'device': self.device.pk,
  1372. 'parent': self.module1.pk,
  1373. 'name': 'Test Module X',
  1374. 'manufacturer': self.manufacturer.pk,
  1375. }
  1376. url = reverse('dcim-api:module-detail', kwargs={'pk': self.module1.pk})
  1377. response = self.client.put(url, data, **self.header)
  1378. self.assertHttpStatus(response, status.HTTP_200_OK)
  1379. self.assertEqual(Module.objects.count(), 3)
  1380. module1 = Module.objects.get(pk=response.data['id'])
  1381. self.assertEqual(module1.device_id, data['device'])
  1382. self.assertEqual(module1.parent_id, data['parent'])
  1383. self.assertEqual(module1.name, data['name'])
  1384. self.assertEqual(module1.manufacturer_id, data['manufacturer'])
  1385. def test_delete_module(self):
  1386. url = reverse('dcim-api:module-detail', kwargs={'pk': self.module1.pk})
  1387. response = self.client.delete(url, **self.header)
  1388. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1389. self.assertEqual(Module.objects.count(), 2)
  1390. class InterfaceConnectionTest(HttpStatusMixin, APITestCase):
  1391. def setUp(self):
  1392. user = User.objects.create(username='testuser', is_superuser=True)
  1393. token = Token.objects.create(user=user)
  1394. self.header = {'HTTP_AUTHORIZATION': 'Token {}'.format(token.key)}
  1395. site = Site.objects.create(name='Test Site 1', slug='test-site-1')
  1396. manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
  1397. devicetype = DeviceType.objects.create(
  1398. manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
  1399. )
  1400. devicerole = DeviceRole.objects.create(
  1401. name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
  1402. )
  1403. self.device = Device.objects.create(
  1404. device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
  1405. )
  1406. self.interface1 = Interface.objects.create(device=self.device, name='Test Interface 1')
  1407. self.interface2 = Interface.objects.create(device=self.device, name='Test Interface 2')
  1408. self.interface3 = Interface.objects.create(device=self.device, name='Test Interface 3')
  1409. self.interface4 = Interface.objects.create(device=self.device, name='Test Interface 4')
  1410. self.interface5 = Interface.objects.create(device=self.device, name='Test Interface 5')
  1411. self.interface6 = Interface.objects.create(device=self.device, name='Test Interface 6')
  1412. self.interface7 = Interface.objects.create(device=self.device, name='Test Interface 7')
  1413. self.interface8 = Interface.objects.create(device=self.device, name='Test Interface 8')
  1414. self.interfaceconnection1 = InterfaceConnection.objects.create(
  1415. interface_a=self.interface1, interface_b=self.interface2
  1416. )
  1417. self.interfaceconnection2 = InterfaceConnection.objects.create(
  1418. interface_a=self.interface3, interface_b=self.interface4
  1419. )
  1420. self.interfaceconnection3 = InterfaceConnection.objects.create(
  1421. interface_a=self.interface5, interface_b=self.interface6
  1422. )
  1423. def test_get_interfaceconnection(self):
  1424. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  1425. response = self.client.get(url, **self.header)
  1426. self.assertEqual(response.data['interface_a']['id'], self.interfaceconnection1.interface_a_id)
  1427. self.assertEqual(response.data['interface_b']['id'], self.interfaceconnection1.interface_b_id)
  1428. def test_list_interfaceconnections(self):
  1429. url = reverse('dcim-api:interfaceconnection-list')
  1430. response = self.client.get(url, **self.header)
  1431. self.assertEqual(response.data['count'], 3)
  1432. def test_create_interfaceconnection(self):
  1433. data = {
  1434. 'interface_a': self.interface7.pk,
  1435. 'interface_b': self.interface8.pk,
  1436. }
  1437. url = reverse('dcim-api:interfaceconnection-list')
  1438. response = self.client.post(url, data, **self.header)
  1439. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  1440. self.assertEqual(InterfaceConnection.objects.count(), 4)
  1441. interfaceconnection4 = InterfaceConnection.objects.get(pk=response.data['id'])
  1442. self.assertEqual(interfaceconnection4.interface_a_id, data['interface_a'])
  1443. self.assertEqual(interfaceconnection4.interface_b_id, data['interface_b'])
  1444. def test_update_interfaceconnection(self):
  1445. new_connection_status = not self.interfaceconnection1.connection_status
  1446. data = {
  1447. 'interface_a': self.interface7.pk,
  1448. 'interface_b': self.interface8.pk,
  1449. 'connection_status': new_connection_status,
  1450. }
  1451. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  1452. response = self.client.put(url, data, **self.header)
  1453. self.assertHttpStatus(response, status.HTTP_200_OK)
  1454. self.assertEqual(InterfaceConnection.objects.count(), 3)
  1455. interfaceconnection1 = InterfaceConnection.objects.get(pk=response.data['id'])
  1456. self.assertEqual(interfaceconnection1.interface_a_id, data['interface_a'])
  1457. self.assertEqual(interfaceconnection1.interface_b_id, data['interface_b'])
  1458. self.assertEqual(interfaceconnection1.connection_status, data['connection_status'])
  1459. def test_delete_interfaceconnection(self):
  1460. url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
  1461. response = self.client.delete(url, **self.header)
  1462. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  1463. self.assertEqual(InterfaceConnection.objects.count(), 2)