tests.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. from django.core.files.uploadedfile import SimpleUploadedFile
  2. from django.test import TestCase
  3. from django.test import TestCase
  4. from django.urls import reverse
  5. from django.utils import timezone
  6. from rest_framework import status
  7. from rest_framework.test import APITestCase, APIClient
  8. from access.models import User
  9. from rest_framework_simplejwt.tokens import RefreshToken
  10. from content.models import Metric
  11. # region auth
  12. class AuthenticationTests(APITestCase):
  13. def setUp(self):
  14. self.user = User.objects.create_user(name='testuser', email='test@example.com', password='testpassword')
  15. self.token_create_url = reverse('token_create')
  16. self.token_refresh_url = reverse('token_refresh')
  17. self.client = APIClient()
  18. # Позитивный сценарий создания токена с корректными данными пользователя
  19. def test_token_create_success(self):
  20. data = {'email': 'test@example.com', 'password': 'testpassword'}
  21. response = self.client.post(self.token_create_url, data, format='json')
  22. self.assertEqual(response.status_code, status.HTTP_200_OK)
  23. self.assertIn('access', response.data)
  24. self.assertIn('refresh', response.data)
  25. # Сценарий создания токена для пользователя с неверными данными (неправильный пароль)
  26. def test_token_create_failure_invalid_credentials(self):
  27. data = {'email': 'test@example.com', 'password': 'wrongpassword'}
  28. response = self.client.post(self.token_create_url, data, format='json')
  29. self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
  30. self.assertEqual(response.data['code'], 'no_active_account')
  31. # Позитивный сценарий получения обновления токенов
  32. def test_token_refresh_success(self):
  33. # Получение refresh-токена
  34. data = {'email': 'test@example.com', 'password': 'testpassword'}
  35. response = self.client.post(self.token_create_url, data, format='json')
  36. refresh_token = response.data['refresh']
  37. # Попытка обновления токена
  38. response = self.client.post(self.token_refresh_url, {'refresh': refresh_token}, format='json')
  39. self.assertEqual(response.status_code, status.HTTP_200_OK)
  40. self.assertIn('access', response.data)
  41. self.assertIn('refresh', response.data)
  42. # Негативный сценарий: обновление токенов с неверно указанным refresh-токеном
  43. def test_token_refresh_failure_invalid_token(self):
  44. response = self.client.post(self.token_refresh_url, {'refresh': 'invalidtoken'}, format='json')
  45. self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
  46. self.assertEqual(response.data['code'], 'invalid_token')
  47. class UserTests(APITestCase):
  48. def setUp(self):
  49. self.client = APIClient()
  50. self.create_user_url = reverse('create_user') # Замените на правильный путь
  51. self.me_url = reverse('update_user') # Замените на правильный путь
  52. # Создаем тестового пользователя
  53. self.test_user = User.objects.create_user(
  54. name='testuser',
  55. email='test@example.com',
  56. password='testpassword'
  57. )
  58. # Получаем JWT токен для тестового пользователя
  59. refresh = RefreshToken.for_user(self.test_user)
  60. self.access_token = str(refresh.access_token)
  61. # Устанавливаем токен в качестве аутентификационного заголовка
  62. self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.access_token)
  63. def test_create_user(self):
  64. data = {
  65. 'name': 'newuser',
  66. 'email': 'new@example.com',
  67. 'password': 'newpassword'
  68. }
  69. response = self.client.post(self.create_user_url, data, format='json')
  70. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  71. self.assertIn('uuid', response.data) # Проверяем, что ID возвращается в данных ответа
  72. def test_retrieve_user(self):
  73. response = self.client.get(self.me_url)
  74. self.assertEqual(response.status_code, status.HTTP_200_OK)
  75. self.assertEqual(response.data['name'], 'testuser')
  76. self.assertEqual(response.data['email'], 'test@example.com')
  77. def test_update_user(self):
  78. data = {
  79. 'name': 'updated_user'
  80. }
  81. response = self.client.patch(self.me_url, data, format='json')
  82. self.assertEqual(response.status_code, status.HTTP_200_OK)
  83. self.assertEqual(response.data['name'], 'updated_user')
  84. def test_delete_user(self):
  85. response = self.client.delete(self.me_url)
  86. self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
  87. self.assertFalse(User.objects.filter(name='testuser').exists())
  88. # endregion
  89. # region metric
  90. class MetricAPITest(APITestCase):
  91. def setUp(self):
  92. # Создание и аутентификация тестового пользователя
  93. self.user = User.objects.create_user(name='testuser', email='test@example.com', password='testpass')
  94. refresh = RefreshToken.for_user(self.user)
  95. self.jwt_token = str(refresh.access_token)
  96. self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.jwt_token)
  97. # Создание метрики для тестирования
  98. self.metric = Metric.objects.create(
  99. user=self.user,
  100. pages_read=100,
  101. reading_time="20:21:52",
  102. books_read=1
  103. )
  104. # Получение списка метрик
  105. def test_list_metrics_for_authenticated_user(self):
  106. url = reverse('metric_create')
  107. response = self.client.get(url)
  108. self.assertEqual(response.status_code, status.HTTP_200_OK)
  109. self.assertTrue(len(response.data) >= 1) # Полученный список должен содержать как минимум одну метрику
  110. # Создание корректно определенной метрики
  111. def test_create_metric_for_authenticated_user(self):
  112. url = reverse('metric_create')
  113. data = {
  114. 'pages_read': 200,
  115. 'reading_time': "20:21:52",
  116. 'books_read': 2
  117. }
  118. response = self.client.post(url, data, format='json')
  119. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  120. # Получение конкретной метрики
  121. def test_retrieve_metric(self):
  122. url = reverse('metricme_rud', args=[self.metric.uuid])
  123. response = self.client.get(url)
  124. self.assertEqual(response.status_code, status.HTTP_200_OK)
  125. self.assertEqual(response.data['pages_read'], self.metric.pages_read) # Проверка получения корректной метрики по атрибуту pages_read
  126. # Обновление метрики
  127. def test_update_metric(self):
  128. url = reverse('metricme_rud', args=[self.metric.uuid])
  129. data = {
  130. 'pages_read': 150
  131. }
  132. response = self.client.patch(url, data, format='json')
  133. self.assertEqual(response.status_code, status.HTTP_200_OK)
  134. self.metric.refresh_from_db()
  135. self.assertEqual(self.metric.pages_read, 150) # Проверка, поменялось ли значение на заданное
  136. # Удаление метрики
  137. def test_delete_metric(self):
  138. url = reverse('metricme_rud', args=[self.metric.uuid])
  139. response = self.client.delete(url)
  140. self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
  141. self.assertEqual(Metric.objects.count(), 0) # Количество метрик должно стать 0
  142. # Проверка фильтрации метрик по дате
  143. def test_date_filtered_metrics(self):
  144. url = reverse('date_metrics')
  145. data = {
  146. 'start_date': (timezone.now() - timezone.timedelta(days=1)).isoformat(),
  147. 'end_date': timezone.now().isoformat()
  148. }
  149. response = self.client.get(url, data)
  150. self.assertEqual(response.status_code, status.HTTP_200_OK)