test_routes.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. """Тест роутов приложения."""
  2. from typing import Any
  3. from http import HTTPStatus
  4. from django.contrib.auth import get_user_model
  5. from django.test import TestCase, Client
  6. from django.urls import reverse
  7. from notes.models import ModelNote
  8. class TestRoutes(TestCase):
  9. """Тестирует роуты приложения."""
  10. test_user1: Any = None
  11. test_user2: Any = None
  12. @classmethod
  13. def setUpTestData(cls): # pylint: disable=C0103
  14. """Устанавливает предварительные условия."""
  15. user_model = get_user_model().objects
  16. cls.test_user1 = user_model.create_user( # bandit disable
  17. username='testuser1',
  18. password='12345'
  19. )
  20. cls.test_user2 = user_model.create_user(
  21. username='testuser2',
  22. password='12345'
  23. )
  24. cls.note1 = ModelNote.objects.create(
  25. title="Test Note 1",
  26. text="Test Note Text",
  27. author=cls.test_user1
  28. )
  29. cls.note2 = ModelNote.objects.create(
  30. title="Test Note 2",
  31. text="Test Note Text",
  32. author=cls.test_user2
  33. )
  34. cls.url_names_with_slug = [
  35. 'notes:edit',
  36. 'notes:detail',
  37. 'notes:delete'
  38. ]
  39. cls.url_names_without_args = [
  40. 'notes:list',
  41. 'notes:success',
  42. 'notes:add',
  43. 'notes:home'
  44. ]
  45. cls.auth_url_names = [
  46. 'users:login',
  47. 'users:logout',
  48. 'users:signup'
  49. ]
  50. def setUp(self): # pylint: disable=C0103
  51. """Начальная настройка теста."""
  52. self.client = Client()
  53. def test_urls_availability(self):
  54. """Тест доступности урлов."""
  55. users = [self.test_user1, self.test_user2, None]
  56. for user in users:
  57. if user is not None:
  58. self.client.login(username=user.username, password='12345')
  59. else:
  60. self.client.logout()
  61. for name in self.url_names_with_slug:
  62. with self.subTest(user=user, url=name):
  63. url = reverse(name, args=[self.note1.slug])
  64. response = self.client.get(url)
  65. if user is self.test_user1 or (
  66. user is None and name
  67. not in self.url_names_with_slug
  68. ):
  69. self.assertEqual(response.status_code, HTTPStatus.OK)
  70. elif user is self.test_user2:
  71. self.assertEqual(
  72. response.status_code,
  73. HTTPStatus.NOT_FOUND
  74. )
  75. else:
  76. login_url = reverse('users:login')
  77. next_url = url
  78. redirect_url = f"{login_url}?next={next_url}"
  79. self.assertRedirects(response, redirect_url)
  80. for name in self.url_names_without_args:
  81. with self.subTest(user=user, url=name):
  82. url = reverse(name)
  83. response = self.client.get(url)
  84. if user is not None or name == 'notes:home':
  85. self.assertEqual(response.status_code, HTTPStatus.OK)
  86. else:
  87. login_url = reverse('users:login')
  88. next_url = url
  89. redirect_url = f"{login_url}?next={next_url}"
  90. self.assertRedirects(response, redirect_url)
  91. for name in self.auth_url_names:
  92. with self.subTest(user=user, url=name):
  93. url = reverse(name)
  94. response = self.client.get(url)
  95. self.assertEqual(response.status_code, HTTPStatus.OK)