| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- """Тестирование роутов."""
- from typing import Dict
- from http import HTTPStatus
- import pytest
- from django.urls import reverse
- from django.contrib.auth import get_user_model
- from news.models import Comment, News
- User = get_user_model()
- # Полные URL'ы
- FULL_URLS = {
- "home": ("news:home", None),
- "login": ("users:login", None),
- "logout": ("users:logout", None),
- "signup": ("users:signup", None),
- }
- # Зависимые URL'ы
- DEPENDENT_URLS: Dict[str, str] = {
- "detail": "news:detail",
- "delete": "news:delete",
- "edit": "news:edit",
- }
- def format_urls(pk):
- """Форматирует урлы."""
- formatted_urls = {}
- for name, url_info in FULL_URLS.items():
- url_name, args = url_info
- formatted_urls[name] = reverse(url_name, args=args)
- for name, url_name in DEPENDENT_URLS.items():
- formatted_urls[name] = reverse(url_name, args=(pk,))
- return formatted_urls
- @pytest.fixture
- def initial_data(db):
- """Настройка данных."""
- news = News.objects.create(title='Заголовок', text='Текст')
- author = User.objects.create(username='Лев Толстой')
- urls = format_urls(news.id)
- return news, author, urls
- def test_pages_availability(client, initial_data):
- """Тест доступности страниц."""
- _, _, urls = initial_data
- for url in [urls["home"], urls["login"], urls["logout"], urls["signup"]]:
- response = client.get(url)
- assert response.status_code == HTTPStatus.OK
- def test_availability_for_comment_edit_and_delete(client, initial_data):
- """Тест доступности редактирования и удаления комментариев."""
- news, author, urls = initial_data
- reader = User.objects.create(username='Читатель простой')
- Comment.objects.create(
- news=news,
- author=author,
- text='Текст комментария'
- )
- user_statuses = [
- (author, HTTPStatus.OK),
- (reader, HTTPStatus.NOT_FOUND),
- ]
- for user, status in user_statuses:
- client.force_login(user)
- for url in [urls["edit"], urls["delete"]]:
- response = client.get(url)
- assert response.status_code == status
- def test_redirect_for_anonymous_client(client, initial_data):
- """Проверка редиректа для анонимных клиентов."""
- news, author, urls = initial_data
- Comment.objects.create(
- news=news,
- author=author,
- text='Текст комментария'
- )
- login_url = urls["login"]
- for url in [urls["edit"], urls["delete"]]:
- redirect_url = f'{login_url}?next={url}'
- response = client.get(url)
- assert response.status_code == HTTPStatus.FOUND
- assert response.url == redirect_url
|