test_logic.py 5.5 KB

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