Ce didacticiel testera les commentaires créés à l'aide du package Django Comments Xtd sur une page Wagtail, à l'aide de Factory Boy.
Notre point de départ est une fonctionnalité de commentaire et une configuration de test de page pour Wagtail avec Factory Boy. Comme dans les didacticiels précédents, on crée une usine de commentaires dans /tests/factories.py
. Parce qu'on veut également enregistrer un utilisateur avec nos commentaires, on commence par créer une usine d'utilisateurs:
import factory
from userauth.models import CustomUser
class CustomUserFactory(factory.django.DjangoModelFactory):
class Meta:
model = CustomUser
username = factory.Sequence(lambda n: 'Username{0}'.format(n))
password = factory.Sequence(lambda n: 'Password{0}'.format(n))
On génère automatiquement un nom d'utilisateur et un mot de passe car c'est le minimum que Django attend. Notez que dans notre implémentation d'authentification, on utilise l'email au lieu du nom d'utilisateur, mais cela est géré par allauth, et puisque on n'utilise pas la fonctionnalité d'inscription d'allauth, on doit s'en occuper soi-même. On est maintenant prêt à créer une usine de commentaires:
from ..models import ArticlePage, CustomComment
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site as DjangoSite
class CustomCommentFactory(factory.django.DjangoModelFactory):
class Meta:
model = CustomComment
content_type = ContentType.objects.get_for_model(ArticlePage)
site = DjangoSite.objects.get_current()
page = factory.SubFactory(ArticlePageFactory)
user = factory.SubFactory(CustomUserFactory)
comment = factory.Sequence(lambda n: 'Comment {0}'.format(n))
En regardant le modèle pour les commentaires, on a besoin de trois champs obligatoires: content_type
, site
et object_pk
. Nos commentaires vont être sur une ArticlePage
, donc on peut récupérer le type de contenu en utilisant la méthode Django get_for_model()
. Le site actuel peut être récupéré avec la méthode Django get_current()
. On renomme la classe Site
pour éviter toute confusion avec la classe Wagtail Site
. Le troisième champ obligatoire object_pk
sera défini lors de la création de l'instance de commentaire. page
et user
sont deux relations de clé étrangère (foreign key) du commentaire, on utilise donc une SubFactory
pour eux. Et enfin pour le texte de commentaire lui-même, on génère un texte avec Sequence
.
On peut créer quelques pages Wagtail comme on l'a fait précédemment. Mettez ce qui suit dans un fichier /tests/test_comments.py
:
from .factories import HomePageFactory, ArticlePageFactory, ArticleIndexPageFactory
from django.test import TestCase
from wagtail.core.models import Page, Site
class TestComments(TestCase):
@classmethod
def setUpTestData(cls):
cls.site = Site.objects.create(is_default_site=True, root_page=Page.get_first_root_node())
cls.homepage = HomePageFactory()
cls.articleindexpage = ArticleIndexPageFactory(parent=cls.homepage)
cls.articlepage1 = ArticlePageFactory(parent=cls.articleindexpage)
Maintenant, on ajoute un utilisateur et un commentaire de cet utilisateur à la configuration:
from .factories import CustomUserFactory, CustomCommentFactory
cls.user = CustomUserFactory(email="johndoe@example.com", display_name="John")
cls.customcomment = CustomCommentFactory(object_pk=str(cls.articlepage1.pk), user=cls.user)
Les champs pour l'utilisateur sont explicites. Pour le commentaire, comme mentionné précédemment, on définit maintenant l'object_pk
: on le définit sur la clé primaire de la page sur laquelle on veut le commentaire. Puisque Django Comments définit le champ comme un champ de texte, on convertit d'abord la clé primaire. Cela termine la configuration. Le test lui-même est désormais très simple. La partie intéressante du modèle à tester est la méthode save()
, et puisque le commentaire est déjà créé, cela aurait déjà dû faire son travail. On vérifie donc simplement si la page et l'utilisateur sont enregistrés correctement:
def test_custom_comment_gets_saved_correctly(self):
self.assertEqual(self.customcomment.page.url, self.articlepage1.url)
self.assertEqual(self.customcomment.user_name, self.user.display_name)
On en reste là. Vérifier notre couverture avec
coverage run --source=cms manage.py test cms.tests
coverage html
nous dit que la plus grande partie de notre code non couvert se trouve dans nos streamforms
, c'est donc là qu'on ira ensuite.
Commentez cet article (connectez-vous d'abord ou confirmez par nom et email ci-dessous)