Ненадежная проверка - пост с такими значениями полей может уже быть в БД до момента запроса на создание
Делаю тест формы отправки поста. Ревьювер сделал неоднократное замечание "Ненадежная проверка - пост с такими значениями полей может уже быть в БД до момента запроса на создание. Стоит взять последний пост, отсортировав предварительно по id." Не совсем понимаю как реализовать эту проверку.
Вот эта строчка:
def post_create_form(self):
...
self.assertTrue(Post.objects.latest('id'))
В этой же проверке есть еще замечание рвеьювера "Выборка поста из БД повторяется выше - можно выполнить ее один раз и пост положить в переменную" и указывает на вот эту строчку:
def post_edit_forms(self):
...
Post.objects.get(self.post.id).author, self.post.author
Подскажите пожалуйста как лучше реализовать? Я был уверен что я правильно сделал.
Весь код:
from django.contrib.auth import get_user_model
from django.test import Client, TestCase
from django.urls import reverse
from ..forms import PostForm
from ..models import Group, Post
User = get_user_model()
class PostCreateFormTests(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.author = User.objects.create_user(username='NoName')
cls.post = Post.objects.create(
text='Тестовый текст',
author=cls.author,
)
cls.group = Group.objects.create(
title='test_title',
description='test_description',
slug='test-slug'
)
def setUp(self):
self.authorized_author = Client()
self.authorized_author.force_login(self.author)
def post_create_form(self):
"""Валидная форма создает запись в БД."""
posts_count = Post.objects.count()
form_data = {
'text': 'Текстовый текст_2',
'group': self.group.slug
}
response = self.authorized_author.post(
reverse('posts:post_create'),
data=form_data,
follow=True
)
self.assertRedirects(response, reverse(
'posts:profile', kwargs={'username': self.post.author}))
self.assertEqual(Post.objects.count(), posts_count + 1)
self.assertTrue(Post.objects.latest('id'))
def post_edit_forms(self):
"""Валидная форма редактирует запись в БД>."""
posts_count = Post.objects.count()
form_data = {
'text': 'Измененный текст',
}
response = self.authorized_author.post(
reverse('posts:post_edit', kwargs={'post_id': self.post.id}),
data=form_data,
follow=True
)
self.assertRedirects(response, reverse(
'posts:post_detail', kwargs={'post_id': self.post.id}))
self.assertEqual(Post.objects.count(), posts_count)
self.assertEqual(
Post.objects.get(self.post.id).text, form_data['text']
)
self.assertEqual(
Post.objects.get(self.post.id).author, self.post.author
)
Вопрос решен.
В методе проверки создания формы положил последний пост в переменную post_latest = Post.objects.latest('id'),тем самым сделав сортировку по id, ну потом только сделал тест на валидность формы.
def post_create_form(self):
... post_latest = Post.objects.latest('id') self.assertEqual(Post.objects.count(), posts_count + 1) self.assertRedirects(response, reverse( 'posts:profile', kwargs={'username': self.post.author})) self.assertEqual(post_latest.text, form_data['text']) self.assertEqual(post_latest.group.id, form_data['group'])Я выборку из БД положил в переменную edit_post_var = Post.objects.get(id=self.post.id)
def post_edit_forms(self):
... edit_post_var = Post.objects.get(id=self.post.id) self.assertRedirects(response, reverse( 'posts:post_detail', kwargs={'post_id': self.post.id})) self.assertEqual(Post.objects.count(), posts_count) self.assertEqual(edit_post_var.text, form_data['text']) self.assertEqual(edit_post_var.author, self.post.author)
Оказалось проще чем казалось. Оставлю здесь вдруг еще кому-нибудь понадобится.