test_routes.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """Тестирование роутов."""
  2. from typing import Dict
  3. from http import HTTPStatus
  4. import pytest
  5. from django.urls import reverse
  6. from django.contrib.auth import get_user_model
  7. from news.models import Comment, News
  8. User = get_user_model()
  9. # Полные URL'ы
  10. FULL_URLS = {
  11. "home": ("news:home", None),
  12. "login": ("users:login", None),
  13. "logout": ("users:logout", None),
  14. "signup": ("users:signup", None),
  15. }
  16. # Зависимые URL'ы
  17. DEPENDENT_URLS: Dict[str, str] = {
  18. "detail": "news:detail",
  19. "delete": "news:delete",
  20. "edit": "news:edit",
  21. }
  22. def format_urls(pk):
  23. """Форматирует урлы."""
  24. formatted_urls = {}
  25. for name, url_info in FULL_URLS.items():
  26. url_name, args = url_info
  27. formatted_urls[name] = reverse(url_name, args=args)
  28. for name, url_name in DEPENDENT_URLS.items():
  29. formatted_urls[name] = reverse(url_name, args=(pk,))
  30. return formatted_urls
  31. @pytest.fixture
  32. def initial_data(db):
  33. """Настройка данных."""
  34. news = News.objects.create(title='Заголовок', text='Текст')
  35. author = User.objects.create(username='Лев Толстой')
  36. urls = format_urls(news.id)
  37. return news, author, urls
  38. def test_pages_availability(client, initial_data):
  39. """Тест доступности страниц."""
  40. _, _, urls = initial_data
  41. for url in [urls["home"], urls["login"], urls["logout"], urls["signup"]]:
  42. response = client.get(url)
  43. assert response.status_code == HTTPStatus.OK
  44. def test_availability_for_comment_edit_and_delete(client, initial_data):
  45. """Тест доступности редактирования и удаления комментариев."""
  46. news, author, urls = initial_data
  47. reader = User.objects.create(username='Читатель простой')
  48. Comment.objects.create(
  49. news=news,
  50. author=author,
  51. text='Текст комментария'
  52. )
  53. user_statuses = [
  54. (author, HTTPStatus.OK),
  55. (reader, HTTPStatus.NOT_FOUND),
  56. ]
  57. for user, status in user_statuses:
  58. client.force_login(user)
  59. for url in [urls["edit"], urls["delete"]]:
  60. response = client.get(url)
  61. assert response.status_code == status
  62. def test_redirect_for_anonymous_client(client, initial_data):
  63. """Проверка редиректа для анонимных клиентов."""
  64. news, author, urls = initial_data
  65. Comment.objects.create(
  66. news=news,
  67. author=author,
  68. text='Текст комментария'
  69. )
  70. login_url = urls["login"]
  71. for url in [urls["edit"], urls["delete"]]:
  72. redirect_url = f'{login_url}?next={url}'
  73. response = client.get(url)
  74. assert response.status_code == HTTPStatus.FOUND
  75. assert response.url == redirect_url