test_logic.py 6.7 KB

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