|
|
# FRR:该模块为评论功能(comments)的单元测试类,
|
|
|
# 主要测试评论提交、评论列表展示、评论嵌套结构解析及邮件通知等核心功能,
|
|
|
# 确保评论功能在各种场景下正常工作。
|
|
|
|
|
|
from django.test import Client, RequestFactory, TransactionTestCase
|
|
|
from django.urls import reverse # 用于生成URL反向解析
|
|
|
|
|
|
from accounts.models import BlogUser # 导入用户模型,用于创建测试用户
|
|
|
from blog.models import Category, Article # 导入分类和文章模型,用于创建测试文章
|
|
|
from comments.models import Comment # 导入评论模型,用于测试评论数据
|
|
|
from comments.templatetags.comments_tags import * # 导入评论相关模板标签,测试评论渲染
|
|
|
from djangoblog.utils import get_max_articleid_commentid # 导入工具函数,测试ID获取功能
|
|
|
|
|
|
|
|
|
# FRR:评论功能测试类,继承TransactionTestCase以支持事务性测试(避免测试数据污染)
|
|
|
class CommentsTest(TransactionTestCase):
|
|
|
# LGM:测试前的初始化方法,会在每个测试方法执行前运行
|
|
|
def setUp(self):
|
|
|
self.client = Client() # 创建测试客户端,模拟用户请求
|
|
|
self.factory = RequestFactory() # 创建请求工厂,用于构造复杂请求
|
|
|
|
|
|
# FRR:配置博客评论设置(需要审核才能显示)
|
|
|
from blog.models import BlogSettings
|
|
|
value = BlogSettings()
|
|
|
value.comment_need_review = True # 评论需要审核
|
|
|
value.save() # 保存设置到数据库
|
|
|
|
|
|
# FRR:创建超级用户(用于测试登录状态下的评论功能)
|
|
|
self.user = BlogUser.objects.create_superuser(
|
|
|
email="liangliangyy1@gmail.com",
|
|
|
username="liangliangyy1",
|
|
|
password="liangliangyy1") # 用户名和密码用于测试登录
|
|
|
|
|
|
# FRR:辅助方法,批量更新文章下所有评论为"启用"状态(模拟管理员审核通过)
|
|
|
def update_article_comment_status(self, article):
|
|
|
comments = article.comment_set.all() # 获取文章下所有评论
|
|
|
for comment in comments:
|
|
|
comment.is_enable = True # 设为启用
|
|
|
comment.save() # 保存修改
|
|
|
|
|
|
# FRR:核心测试方法,验证评论提交、嵌套回复、模板渲染等功能
|
|
|
def test_validate_comment(self):
|
|
|
# 1. 登录测试用户
|
|
|
self.client.login(username='liangliangyy1', password='liangliangyy1')
|
|
|
|
|
|
# 2. 创建测试分类和文章(评论必须关联到具体文章)
|
|
|
category = Category()
|
|
|
category.name = "categoryccc" # 分类名称
|
|
|
category.save() # 保存分类
|
|
|
|
|
|
article = Article()
|
|
|
article.title = "nicetitleccc" # 文章标题
|
|
|
article.body = "nicecontentccc" # 文章内容
|
|
|
article.author = self.user # 文章作者(关联测试用户)
|
|
|
article.category = category # 关联分类
|
|
|
article.type = 'a' # 文章类型(假设'a'表示普通文章)
|
|
|
article.status = 'p' # 发布状态(假设'p'表示已发布)
|
|
|
article.save() # 保存文章
|
|
|
|
|
|
# 3. 测试提交一级评论(无父评论)
|
|
|
# 生成评论提交URL(通过文章ID反向解析)
|
|
|
comment_url = reverse(
|
|
|
'comments:postcomment', kwargs={
|
|
|
'article_id': article.id})
|
|
|
|
|
|
# 模拟POST请求提交评论
|
|
|
response = self.client.post(comment_url,
|
|
|
{
|
|
|
'body': '123ffffffffff' # 评论内容
|
|
|
})
|
|
|
|
|
|
# 验证提交成功(302表示重定向,通常是提交后跳回文章页)
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
# 由于评论需要审核(默认未启用),此时评论列表应为空
|
|
|
article = Article.objects.get(pk=article.pk) # 重新获取文章(刷新数据)
|
|
|
self.assertEqual(len(article.comment_list()), 0) # 评论列表长度为0
|
|
|
|
|
|
# 手动审核评论(设为启用)
|
|
|
self.update_article_comment_status(article)
|
|
|
# 审核后评论列表应包含1条评论
|
|
|
self.assertEqual(len(article.comment_list()), 1)
|
|
|
|
|
|
# 4. 再次提交一条评论,测试多条评论场景
|
|
|
response = self.client.post(comment_url,
|
|
|
{
|
|
|
'body': '123ffffffffff',
|
|
|
})
|
|
|
self.assertEqual(response.status_code, 302) # 验证提交成功
|
|
|
|
|
|
# 审核后评论列表应包含2条评论
|
|
|
article = Article.objects.get(pk=article.pk)
|
|
|
self.update_article_comment_status(article)
|
|
|
self.assertEqual(len(article.comment_list()), 2)
|
|
|
|
|
|
# 5. 测试提交嵌套回复(针对第一条评论的回复)
|
|
|
parent_comment_id = article.comment_list()[0].id # 获取第一条评论ID作为父评论
|
|
|
|
|
|
# 提交带Markdown格式的回复内容(测试富文本支持)
|
|
|
response = self.client.post(comment_url,
|
|
|
{
|
|
|
'body': '''
|
|
|
# Title1
|
|
|
|
|
|
```python
|
|
|
import os |