testdomains.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. from django.core.urlresolvers import reverse
  2. from rest_framework import status
  3. from rest_framework.test import APITestCase
  4. from .utils import utils
  5. from django.db import transaction
  6. from desecapi.models import Domain
  7. from django.core import mail
  8. import httpretty
  9. from django.conf import settings
  10. class UnauthenticatedDomainTests(APITestCase):
  11. def testExpectUnauthorizedOnGet(self):
  12. url = reverse('domain-list')
  13. response = self.client.get(url, format='json')
  14. self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
  15. def testExpectUnauthorizedOnPost(self):
  16. url = reverse('domain-list')
  17. response = self.client.post(url, format='json')
  18. self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
  19. def testExpectUnauthorizedOnPut(self):
  20. url = reverse('domain-detail', args=(1,))
  21. response = self.client.put(url, format='json')
  22. self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
  23. def testExpectUnauthorizedOnDelete(self):
  24. url = reverse('domain-detail', args=(1,))
  25. response = self.client.delete(url, format='json')
  26. self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
  27. class AuthenticatedDomainTests(APITestCase):
  28. def setUp(self):
  29. if not hasattr(self, 'owner'):
  30. self.owner = utils.createUser()
  31. self.ownedDomains = [utils.createDomain(self.owner), utils.createDomain(self.owner)]
  32. self.otherDomains = [utils.createDomain(), utils.createDomain()]
  33. self.token = utils.createToken(user=self.owner)
  34. self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
  35. def testExpectOnlyOwnedDomains(self):
  36. url = reverse('domain-list')
  37. response = self.client.get(url, format='json')
  38. self.assertEqual(response.status_code, status.HTTP_200_OK)
  39. self.assertEqual(len(response.data), 2)
  40. self.assertEqual(response.data[0]['name'], self.ownedDomains[0].name)
  41. self.assertEqual(response.data[1]['name'], self.ownedDomains[1].name)
  42. def testCanDeleteOwnedDomain(self):
  43. url = reverse('domain-detail', args=(self.ownedDomains[1].pk,))
  44. response = self.client.delete(url)
  45. self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
  46. response = self.client.get(url)
  47. self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
  48. def testCantDeleteOtherDomains(self):
  49. url = reverse('domain-detail', args=(self.otherDomains[1].pk,))
  50. response = self.client.delete(url)
  51. self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
  52. def testCanGetOwnedDomains(self):
  53. url = reverse('domain-detail', args=(self.ownedDomains[1].pk,))
  54. response = self.client.get(url)
  55. self.assertEqual(response.status_code, status.HTTP_200_OK)
  56. self.assertEqual(response.data['name'], self.ownedDomains[1].name)
  57. def testCantGetOtherDomains(self):
  58. url = reverse('domain-detail', args=(self.otherDomains[1].pk,))
  59. response = self.client.get(url)
  60. self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
  61. def testCanPutOwnedDomain(self):
  62. url = reverse('domain-detail', args=(self.ownedDomains[1].pk,))
  63. response = self.client.get(url)
  64. newname = utils.generateDomainname()
  65. response.data['name'] = newname
  66. response = self.client.put(url, response.data)
  67. self.assertEqual(response.status_code, status.HTTP_200_OK)
  68. response = self.client.get(url)
  69. self.assertEqual(response.status_code, status.HTTP_200_OK)
  70. self.assertEqual(response.data['name'], newname)
  71. def testCantPutOtherDomains(self):
  72. url = reverse('domain-detail', args=(self.otherDomains[1].pk,))
  73. response = self.client.put(url, {})
  74. self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
  75. def testCanPostDomains(self):
  76. url = reverse('domain-list')
  77. data = {'name': utils.generateDomainname()}
  78. response = self.client.post(url, data)
  79. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  80. self.assertEqual(len(mail.outbox), 0)
  81. self.assertEqual(response.data['dyn'], False)
  82. def testCanPostDynDomains(self):
  83. url = reverse('domain-list')
  84. data = {'name': utils.generateDomainname(), 'dyn': True}
  85. response = self.client.post(url, data)
  86. email = str(mail.outbox[0].message())
  87. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  88. self.assertEqual(len(mail.outbox), 1)
  89. self.assertTrue(data['name'] in email)
  90. self.assertTrue(self.token in email)
  91. self.assertEqual(response.data['dyn'], True)
  92. def testCanUpdateARecord(self):
  93. url = reverse('domain-detail', args=(self.ownedDomains[1].pk,))
  94. response = self.client.get(url)
  95. response.data['arecord'] = '10.13.3.7'
  96. response = self.client.put(url, response.data)
  97. self.assertEqual(response.status_code, status.HTTP_200_OK)
  98. response = self.client.get(url)
  99. self.assertEqual(response.status_code, status.HTTP_200_OK)
  100. self.assertEqual(response.data['arecord'], '10.13.3.7')
  101. def testCanUpdateAAAARecord(self):
  102. url = reverse('domain-detail', args=(self.ownedDomains[1].pk,))
  103. response = self.client.get(url)
  104. response.data['aaaarecord'] = 'fe80::a11:10ff:fee0:ff77'
  105. response = self.client.put(url, response.data)
  106. self.assertEqual(response.status_code, status.HTTP_200_OK)
  107. response = self.client.get(url)
  108. self.assertEqual(response.status_code, status.HTTP_200_OK)
  109. self.assertEqual(response.data['aaaarecord'], 'fe80::a11:10ff:fee0:ff77')
  110. def testPostingCausesPdnsAPICall(self):
  111. httpretty.enable()
  112. httpretty.register_uri(httpretty.POST, settings.POWERDNS_API + '/zones')
  113. url = reverse('domain-list')
  114. data = {'name': utils.generateDomainname(), 'dyn': True}
  115. response = self.client.post(url, data)
  116. self.assertTrue(data['name'] in httpretty.last_request().body)
  117. self.assertTrue('ns1.desec.io' in httpretty.last_request().body)
  118. def testUpdateingCausesPdnsAPICall(self):
  119. url = reverse('domain-detail', args=(self.ownedDomains[1].pk,))
  120. response = self.client.get(url)
  121. httpretty.enable()
  122. httpretty.register_uri(httpretty.PATCH, settings.POWERDNS_API + '/zones/' + response.data['name'])
  123. response.data['arecord'] = '10.13.3.7'
  124. response = self.client.put(url, response.data)
  125. self.assertTrue('10.13.3.7' in httpretty.last_request().body)
  126. def testDomainDetailURL(self):
  127. url = reverse('domain-detail', args=(self.ownedDomains[1].pk,))
  128. urlByName = reverse('domain-detail/byName', args=(self.ownedDomains[1].name,))
  129. self.assertTrue(("/%d" % self.ownedDomains[1].pk) in url)
  130. self.assertTrue("/" + self.ownedDomains[1].name in urlByName)
  131. def testCantUseInvalidCharactersInDomainName(self):
  132. outboxlen = len(mail.outbox)
  133. invalidnames = [
  134. 'with space.dedyn.io',
  135. 'another space.de',
  136. ' spaceatthebeginning.com',
  137. 'percentage%sign.com',
  138. '%percentagesign.dedyn.io',
  139. 'slash/desec.io',
  140. '/slashatthebeginning.dedyn.io',
  141. '\\backslashatthebeginning.dedyn.io',
  142. 'backslash\\inthemiddle.at',
  143. '@atsign.com',
  144. 'at@sign.com',
  145. ]
  146. url = reverse('domain-list')
  147. for domainname in invalidnames:
  148. data = {'name': domainname, 'dyn': True}
  149. response = self.client.post(url, data)
  150. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  151. self.assertEqual(len(mail.outbox), outboxlen)