test_tokens.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. from rest_framework import status
  2. from desecapi.models import Token
  3. from desecapi.tests.base import DomainOwnerTestCase
  4. class TokenPermittedTestCase(DomainOwnerTestCase):
  5. def setUp(self):
  6. super().setUp()
  7. self.token.perm_manage_tokens = True
  8. self.token.save()
  9. self.token2 = self.create_token(self.owner, name='testtoken')
  10. self.other_token = self.create_token(self.user)
  11. def test_token_last_used(self):
  12. self.assertIsNone(Token.objects.get(pk=self.token.id).last_used)
  13. self.client.get(self.reverse('v1:root'))
  14. self.assertIsNotNone(Token.objects.get(pk=self.token.id).last_used)
  15. def test_list_tokens(self):
  16. response = self.client.get(self.reverse('v1:token-list'))
  17. self.assertStatus(response, status.HTTP_200_OK)
  18. self.assertEqual(len(response.data), 2)
  19. self.assertIn('id', response.data[0])
  20. self.assertFalse(any(field in response.data[0] for field in ['token', 'key', 'value']))
  21. self.assertNotContains(response, self.token.plain)
  22. def test_delete_my_token(self):
  23. token_id = Token.objects.get(user=self.owner, name='testtoken').id
  24. url = self.reverse('v1:token-detail', pk=token_id)
  25. response = self.client.delete(url)
  26. self.assertStatus(response, status.HTTP_204_NO_CONTENT)
  27. self.assertFalse(Token.objects.filter(pk=token_id).exists())
  28. response = self.client.get(url)
  29. self.assertStatus(response, status.HTTP_404_NOT_FOUND)
  30. def test_retrieve_my_token(self):
  31. token_id = Token.objects.get(user=self.owner, name='testtoken').id
  32. url = self.reverse('v1:token-detail', pk=token_id)
  33. response = self.client.get(url)
  34. self.assertStatus(response, status.HTTP_200_OK)
  35. self.assertTrue(all(field in response.data for field in ['created', 'id', 'last_used', 'name',
  36. 'perm_manage_tokens']))
  37. self.assertFalse(any(field in response.data for field in ['token', 'key', 'value']))
  38. def test_retrieve_other_token(self):
  39. token_id = Token.objects.get(user=self.user).id
  40. url = self.reverse('v1:token-detail', pk=token_id)
  41. response = self.client.get(url)
  42. self.assertStatus(response, status.HTTP_404_NOT_FOUND)
  43. def test_update_my_token(self):
  44. url = self.reverse('v1:token-detail', pk=self.token.id)
  45. for method in [self.client.patch, self.client.put]:
  46. response = method(url, data={'name': method.__name__})
  47. self.assertStatus(response, status.HTTP_200_OK)
  48. self.assertEqual(Token.objects.get(pk=self.token.id).name, method.__name__)
  49. # Revoke token management permission
  50. response = self.client.patch(url, data={'perm_manage_tokens': False})
  51. self.assertStatus(response, status.HTTP_200_OK)
  52. # Verify that the change cannot be undone
  53. response = self.client.patch(url, data={'perm_manage_tokens': True})
  54. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  55. def test_create_token(self):
  56. n = len(Token.objects.filter(user=self.owner).all())
  57. datas = [{}, {'name': ''}, {'name': 'foobar'}]
  58. for data in datas:
  59. response = self.client.post(self.reverse('v1:token-list'), data=data)
  60. self.assertStatus(response, status.HTTP_201_CREATED)
  61. self.assertTrue(all(field in response.data for field in ['id', 'created', 'token', 'name']))
  62. self.assertEqual(response.data['name'], data.get('name', ''))
  63. self.assertIsNone(response.data['last_used'])
  64. self.assertEqual(len(Token.objects.filter(user=self.owner).all()), n + len(datas))
  65. class TokenForbiddenTestCase(DomainOwnerTestCase):
  66. def setUp(self):
  67. super().setUp()
  68. self.token2 = self.create_token(self.owner, name='testtoken')
  69. self.other_token = self.create_token(self.user)
  70. def test_token_last_used(self):
  71. self.assertIsNone(Token.objects.get(pk=self.token.id).last_used)
  72. self.client.get(self.reverse('v1:root'))
  73. self.assertIsNotNone(Token.objects.get(pk=self.token.id).last_used)
  74. def test_list_tokens(self):
  75. response = self.client.get(self.reverse('v1:token-list'))
  76. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  77. def test_delete_my_token(self):
  78. for token_id in [Token.objects.get(user=self.owner, name='testtoken').id, self.token.id]:
  79. url = self.reverse('v1:token-detail', pk=token_id)
  80. response = self.client.delete(url)
  81. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  82. def test_retrieve_my_token(self):
  83. for token_id in [Token.objects.get(user=self.owner, name='testtoken').id, self.token.id]:
  84. url = self.reverse('v1:token-detail', pk=token_id)
  85. response = self.client.get(url)
  86. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  87. def test_retrieve_other_token(self):
  88. token_id = Token.objects.get(user=self.user).id
  89. url = self.reverse('v1:token-detail', pk=token_id)
  90. response = self.client.get(url)
  91. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  92. def test_update_my_token(self):
  93. url = self.reverse('v1:token-detail', pk=self.token.id)
  94. for method in [self.client.patch, self.client.put]:
  95. response = method(url, data={'name': method.__name__})
  96. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  97. def test_create_token(self):
  98. datas = [{}, {'name': ''}, {'name': 'foobar'}]
  99. for data in datas:
  100. response = self.client.post(self.reverse('v1:token-list'), data=data)
  101. self.assertStatus(response, status.HTTP_403_FORBIDDEN)