test_logic.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. """Тестирует логику приложения."""
  2. from typing import Dict
  3. from http import HTTPStatus
  4. from django.contrib.auth import get_user_model
  5. from django.test import Client, TestCase
  6. from django.urls import reverse
  7. from pytils.translit import slugify
  8. from notes.models import ModelNote
  9. from notes.forms import WARNING
  10. class LogicTest(TestCase):
  11. """Тест на логику приложения."""
  12. @classmethod
  13. def setUpTestData(cls) -> None: # pylint: disable=C0103
  14. """Установка начальных данных."""
  15. cls.User = get_user_model()
  16. def setUp(self) -> None: # pylint: disable=C0103
  17. """Установка данных для теста."""
  18. self.client: Client = Client()
  19. self.author = self.User.objects.create_user(
  20. username='author',
  21. password='password'
  22. )
  23. self.author_client = Client()
  24. self.author_client.force_login(self.author)
  25. self.form_data: Dict[str, str] = {
  26. 'title': 'Test Note',
  27. 'text': 'Test Text',
  28. 'slug': 'test-note'
  29. }
  30. self.note = ModelNote.objects.create(
  31. title='Existing Note',
  32. text='Existing Text',
  33. slug='existing-note',
  34. author=self.author
  35. )
  36. self.urls = {
  37. 'login': reverse('users:login'),
  38. 'signup': reverse('users:signup'),
  39. 'logout': reverse('users:logout'),
  40. 'home': reverse('notes:home'),
  41. 'add': reverse('notes:add'),
  42. 'edit': reverse('notes:edit', args=(self.note.slug,)),
  43. 'detail': reverse('notes:detail', args=(self.note.slug,)),
  44. 'delete': reverse('notes:delete', args=(self.note.slug,)),
  45. 'notes_list': reverse('notes:list'),
  46. 'success': reverse('notes:success'),
  47. }
  48. self.login_redirect_url = f'{self.urls["login"]}?next='
  49. def test_user_can_create_note(self):
  50. """Тест на возможность пользователю создать примечание."""
  51. url: str = self.urls['add']
  52. initial_notes_count = ModelNote.objects.count()
  53. response = self.author_client.post(url, data=self.form_data)
  54. self.assertRedirects(response, self.urls['success'])
  55. self.assertEqual(ModelNote.objects.count(), initial_notes_count + 1)
  56. new_note = ModelNote.objects.get(slug=self.form_data['slug'])
  57. self.assertEqual(new_note.title, self.form_data['title'])
  58. self.assertEqual(new_note.text, self.form_data['text'])
  59. self.assertEqual(new_note.slug, self.form_data['slug'])
  60. self.assertEqual(new_note.author, self.author)
  61. def test_anonymous_user_cant_create_note(self):
  62. """Тест на невозможность создать примечание для анонимного
  63. пользователя."""
  64. url = self.urls['add']
  65. initial_notes_count = ModelNote.objects.count()
  66. response = self.client.post(url, data=self.form_data)
  67. expected_url = self.login_redirect_url + url
  68. self.assertRedirects(response, expected_url)
  69. self.assertEqual(ModelNote.objects.count(), initial_notes_count)
  70. def test_not_unique_slug(self):
  71. """Тест на неуникального слугу(?)."""
  72. url: str = self.urls['add']
  73. self.form_data['slug'] = self.note.slug
  74. initial_notes_count: int = ModelNote.objects.count()
  75. response = self.author_client.post(url, data=self.form_data)
  76. self.assertFormError(
  77. response,
  78. 'form',
  79. 'slug',
  80. errors=(self.note.slug + WARNING)
  81. )
  82. self.assertEqual(ModelNote.objects.count(), initial_notes_count)
  83. def test_empty_slug(self):
  84. """Тест на пустого слугу(?)."""
  85. url: str = self.urls['add']
  86. self.form_data.pop('slug')
  87. initial_notes_count = ModelNote.objects.count()
  88. response = self.author_client.post(url, data=self.form_data)
  89. self.assertRedirects(response, self.urls['success'])
  90. self.assertEqual(ModelNote.objects.count(), initial_notes_count + 1)
  91. expected_slug = slugify(self.form_data['title'])
  92. new_note = ModelNote.objects.get(slug=expected_slug)
  93. self.assertEqual(new_note.slug, expected_slug)
  94. self.assertEqual(ModelNote.objects.filter(
  95. slug=expected_slug).count(), 1)
  96. def test_author_can_edit_note(self):
  97. """Тест на невозможность автором отредактировать примечание."""
  98. url: str = self.urls['edit']
  99. response = self.author_client.post(url, self.form_data)
  100. self.assertRedirects(response, self.urls['success'])
  101. self.note.refresh_from_db()
  102. self.assertEqual(self.note.title, self.form_data['title'])
  103. self.assertEqual(self.note.text, self.form_data['text'])
  104. self.assertEqual(self.note.slug, self.form_data['slug'])
  105. self.assertEqual(self.note.author, self.author)
  106. def test_other_user_cant_edit_note(self):
  107. """Тест на невозможность отредактировать чужим пользователем примечание."""
  108. other_user = self.User.objects.create_user(
  109. username='other',
  110. password='password'
  111. )
  112. other_user_client = Client()
  113. other_user_client.force_login(other_user)
  114. url = reverse('notes:edit', args=(self.note.slug,))
  115. response = other_user_client.post(url, self.form_data)
  116. self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND)
  117. note_from_db = ModelNote.objects.get(id=self.note.id)
  118. self.assertEqual(self.note.title, note_from_db.title)
  119. self.assertEqual(self.note.text, note_from_db.text)
  120. self.assertEqual(self.note.slug, note_from_db.slug)
  121. def test_author_can_delete_note(self):
  122. """Тест на невозможность удалить автором примечание."""
  123. url: str = self.urls['delete']
  124. initial_notes_count = ModelNote.objects.count()
  125. response = self.author_client.post(url)
  126. self.assertRedirects(response, self.urls['success'])
  127. self.assertEqual(ModelNote.objects.count(), initial_notes_count - 1)
  128. def test_other_user_cant_delete_note(self):
  129. """Тест на невозможность удалить причеание чужим пользователем."""
  130. other_user = self.User.objects.create_user(
  131. username='other',
  132. password='password'
  133. )
  134. other_user_client = Client()
  135. other_user_client.force_login(other_user)
  136. url = reverse('notes:delete', args=(self.note.slug,))
  137. initial_notes_count = ModelNote.objects.count()
  138. response = other_user_client.post(url)
  139. self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND)
  140. self.assertEqual(ModelNote.objects.count(), initial_notes_count)