|
|
|
|
@ -0,0 +1,165 @@
|
|
|
|
|
# gst: 导入Django测试相关核心模块,用于模拟请求和执行测试
|
|
|
|
|
from django.test import Client, RequestFactory, TransactionTestCase
|
|
|
|
|
# gst: 导入reverse,用于反向解析URL路径
|
|
|
|
|
from django.urls import reverse
|
|
|
|
|
|
|
|
|
|
# gst: 导入关联数据模型,为测试准备基础数据
|
|
|
|
|
from accounts.models import BlogUser
|
|
|
|
|
from blog.models import Category, Article
|
|
|
|
|
from comments.models import Comment
|
|
|
|
|
# gst: 导入自定义评论模板标签,测试其功能可用性
|
|
|
|
|
from comments.templatetags.comments_tags import *
|
|
|
|
|
# gst: 导入工具函数,测试辅助功能
|
|
|
|
|
from djangoblog.utils import get_max_articleid_commentid
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create your tests here.
|
|
|
|
|
|
|
|
|
|
class CommentsTest(TransactionTestCase):
|
|
|
|
|
"""
|
|
|
|
|
gst: 评论功能集成测试类,继承TransactionTestCase以支持事务管理
|
|
|
|
|
主要测试评论提交、审核、回复、模板标签及工具函数等核心流程
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
|
"""
|
|
|
|
|
gst: 测试前置初始化方法,每个测试用例执行前自动执行
|
|
|
|
|
初始化测试客户端、博客设置和测试用户
|
|
|
|
|
"""
|
|
|
|
|
# gst: 初始化Django测试客户端,用于模拟用户发起HTTP请求
|
|
|
|
|
self.client = Client()
|
|
|
|
|
# gst: 初始化RequestFactory,用于构造自定义请求对象
|
|
|
|
|
self.factory = RequestFactory()
|
|
|
|
|
|
|
|
|
|
# gst: 导入博客设置模型,配置评论需要审核的规则
|
|
|
|
|
from blog.models import BlogSettings
|
|
|
|
|
value = BlogSettings()
|
|
|
|
|
value.comment_need_review = True # gst: 开启评论审核,提交后需审核才显示
|
|
|
|
|
value.save()
|
|
|
|
|
|
|
|
|
|
# gst: 创建超级用户,用于测试登录状态下的评论操作
|
|
|
|
|
self.user = BlogUser.objects.create_superuser(
|
|
|
|
|
email="liangliangyy1@gmail.com",
|
|
|
|
|
username="liangliangyy1",
|
|
|
|
|
password="liangliangyy1")
|
|
|
|
|
|
|
|
|
|
def update_article_comment_status(self, article):
|
|
|
|
|
"""
|
|
|
|
|
gst: 辅助测试方法,用于批量启用指定文章的所有评论
|
|
|
|
|
模拟评论审核通过的场景,方便后续测试评论显示逻辑
|
|
|
|
|
:param article: 接收文章对象,对其关联的评论进行状态更新
|
|
|
|
|
"""
|
|
|
|
|
# gst: 获取当前文章下的所有评论记录
|
|
|
|
|
comments = article.comment_set.all()
|
|
|
|
|
# gst: 遍历评论,将每条评论的is_enable设为True(启用状态)
|
|
|
|
|
for comment in comments:
|
|
|
|
|
comment.is_enable = True
|
|
|
|
|
comment.save() # gst: 保存修改后的评论状态
|
|
|
|
|
|
|
|
|
|
def test_validate_comment(self):
|
|
|
|
|
"""
|
|
|
|
|
gst: 核心测试用例,验证评论相关完整流程
|
|
|
|
|
涵盖登录、创建测试文章、提交评论、审核、回复、标签功能等场景
|
|
|
|
|
"""
|
|
|
|
|
# gst: 模拟用户登录,使用 setUp 中创建的超级用户账号
|
|
|
|
|
self.client.login(username='liangliangyy1', password='liangliangyy1')
|
|
|
|
|
|
|
|
|
|
# gst: 创建测试分类,用于关联测试文章
|
|
|
|
|
category = Category()
|
|
|
|
|
category.name = "categoryccc"
|
|
|
|
|
category.save() # gst: 保存分类到测试数据库
|
|
|
|
|
|
|
|
|
|
# gst: 创建测试文章,作为评论的关联对象
|
|
|
|
|
article = Article()
|
|
|
|
|
article.title = "nicetitleccc"
|
|
|
|
|
article.body = "nicecontentccc"
|
|
|
|
|
article.author = self.user # gst: 关联文章作者为测试超级用户
|
|
|
|
|
article.category = category # gst: 关联文章到测试分类
|
|
|
|
|
article.type = 'a'
|
|
|
|
|
article.status = 'p' # gst: 设置文章状态为已发布(可评论状态)
|
|
|
|
|
article.save() # gst: 保存文章到测试数据库
|
|
|
|
|
|
|
|
|
|
# gst: 反向解析评论提交接口的URL,传入文章ID参数
|
|
|
|
|
comment_url = reverse(
|
|
|
|
|
'comments:postcomment', kwargs={
|
|
|
|
|
'article_id': article.id})
|
|
|
|
|
|
|
|
|
|
# gst: 第一次提交普通评论(无父评论,非回复场景)
|
|
|
|
|
response = self.client.post(comment_url,
|
|
|
|
|
{
|
|
|
|
|
'body': '123ffffffffff' # gst: 评论正文内容
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
# gst: 验证评论提交后是否重定向(预期HTTP状态码302)
|
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
|
|
|
|
|
# gst: 重新查询文章,获取最新关联数据
|
|
|
|
|
article = Article.objects.get(pk=article.pk)
|
|
|
|
|
# gst: 验证未审核的评论是否不显示(此时评论is_enable为False)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 0)
|
|
|
|
|
|
|
|
|
|
# gst: 调用辅助方法,启用该文章的所有评论(模拟审核通过)
|
|
|
|
|
self.update_article_comment_status(article)
|
|
|
|
|
|
|
|
|
|
# gst: 验证审核通过后,评论是否正常显示(预期1条评论)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 1)
|
|
|
|
|
|
|
|
|
|
# gst: 第二次提交普通评论,验证多评论提交功能
|
|
|
|
|
response = self.client.post(comment_url,
|
|
|
|
|
{
|
|
|
|
|
'body': '123ffffffffff', # gst: 重复正文,测试重复提交允许性
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
# gst: 验证第二次提交是否成功重定向
|
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
# gst: 启用第二次提交的评论
|
|
|
|
|
self.update_article_comment_status(article)
|
|
|
|
|
# gst: 重新查询文章,刷新评论数据
|
|
|
|
|
article = Article.objects.get(pk=article.pk)
|
|
|
|
|
# gst: 验证两次提交的评论是否都正常显示(预期2条评论)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 2)
|
|
|
|
|
|
|
|
|
|
# gst: 获取第一条评论的ID,作为父评论ID,用于测试回复功能
|
|
|
|
|
parent_comment_id = article.comment_list()[0].id
|
|
|
|
|
|
|
|
|
|
# gst: 提交带Markdown格式、链接和代码块的回复评论
|
|
|
|
|
response = self.client.post(comment_url,
|
|
|
|
|
{
|
|
|
|
|
'body': '''
|
|
|
|
|
# Title1
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
import os
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
[url](https://www.lylinux.net/)
|
|
|
|
|
|
|
|
|
|
[ddd](http://www.baidu.com)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
''',
|
|
|
|
|
'parent_comment_id': parent_comment_id
|
|
|
|
|
})
|
|
|
|
|
#gst: 验证回复评论提交是否成功重定向
|
|
|
|
|
self.assertEqual(response.status_code, 302)
|
|
|
|
|
self.update_article_comment_status(article)
|
|
|
|
|
#gst: 重新查询文章,获取最新评论数据
|
|
|
|
|
article = Article.objects.get(pk=article.pk)
|
|
|
|
|
#gst: 验证三次提交(2 条普通 + 1 条回复)是否都显示(预期 3 条评论)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 3)
|
|
|
|
|
#gst: 测试 parse_commenttree 模板标签,获取父评论的子评论链
|
|
|
|
|
comment = Comment.objects.get(id=parent_comment_id)
|
|
|
|
|
tree = parse_commenttree(article.comment_list(), comment)
|
|
|
|
|
#gst: 验证子评论数量是否正确(预期 1 条回复)
|
|
|
|
|
self.assertEqual(len(tree), 1)
|
|
|
|
|
#gst: 测试 show_comment_item 模板标签,验证评论项渲染数据
|
|
|
|
|
data = show_comment_item(comment, True)
|
|
|
|
|
#gst: 验证标签是否返回有效数据(非空)
|
|
|
|
|
self.assertIsNotNone(data)
|
|
|
|
|
#gst: 测试 get_max_articleid_commentid 工具函数
|
|
|
|
|
s = get_max_articleid_commentid()
|
|
|
|
|
#gst: 验证工具函数是否返回有效结果(非空)
|
|
|
|
|
self.assertIsNotNone(s)
|
|
|
|
|
#gst: 测试评论邮件发送功能,导入工具函数并调用
|
|
|
|
|
from comments.utils import send_comment_email
|
|
|
|
|
send_comment_email(comment)
|