|
|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
# 导入Django测试核心模块、URL工具及项目内模型/工具
|
|
|
|
|
from django.test import Client, RequestFactory, TransactionTestCase # Django测试类:Client模拟HTTP请求,RequestFactory构造请求对象,TransactionTestCase支持事务回滚
|
|
|
|
|
from django.urls import reverse # 生成URL(通过URL名称反向解析,避免硬编码)
|
|
|
|
|
@ -34,6 +35,34 @@ class CommentsTest(TransactionTestCase):
|
|
|
|
|
value.save() # 保存到测试数据库
|
|
|
|
|
|
|
|
|
|
# 3. 创建测试超级用户:用于模拟登录状态下提交评论
|
|
|
|
|
=======
|
|
|
|
|
# jyn: 评论功能测试模块,涵盖评论提交、审核状态、回复功能、模板标签及工具函数的完整性测试
|
|
|
|
|
from django.test import Client, RequestFactory, TransactionTestCase # jyn: Django 测试核心类,Client模拟请求,RequestFactory构造请求,TransactionTestCase支持事务回滚
|
|
|
|
|
from django.urls import reverse # jyn: 反向解析URL,用于生成测试请求地址
|
|
|
|
|
|
|
|
|
|
from accounts.models import BlogUser # jyn: 导入用户模型,用于创建测试用户
|
|
|
|
|
from blog.models import Category, Article # jyn: 导入博客分类、文章模型,用于创建测试文章
|
|
|
|
|
from comments.models import Comment # jyn: 导入评论模型,用于验证评论数据
|
|
|
|
|
from comments.templatetags.comments_tags import * # jyn: 导入评论相关模板标签,测试模板渲染逻辑
|
|
|
|
|
from djangoblog.utils import get_max_articleid_commentid # jyn: 导入工具函数,测试ID获取功能
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CommentsTest(TransactionTestCase):
|
|
|
|
|
"""jyn: 评论功能集成测试类,覆盖评论提交、状态更新、回复、模板标签及邮件通知等核心流程"""
|
|
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
|
"""jyn: 测试前置初始化方法,每次测试用例执行前自动调用,创建测试依赖数据"""
|
|
|
|
|
self.client = Client() # jyn: 初始化测试客户端,用于模拟前端HTTP请求
|
|
|
|
|
self.factory = RequestFactory() # jyn: 初始化请求工厂,用于构造自定义请求对象
|
|
|
|
|
|
|
|
|
|
# jyn: 创建博客设置,开启评论需审核功能(模拟真实环境的评论审核机制)
|
|
|
|
|
from blog.models import BlogSettings
|
|
|
|
|
value = BlogSettings()
|
|
|
|
|
value.comment_need_review = True # jyn: 评论需后台审核才能显示
|
|
|
|
|
value.save()
|
|
|
|
|
|
|
|
|
|
# jyn: 创建超级用户,用于测试登录状态下的评论提交
|
|
|
|
|
>>>>>>> JYN_branch
|
|
|
|
|
self.user = BlogUser.objects.create_superuser(
|
|
|
|
|
email="liangliangyy1@gmail.com", # 测试邮箱
|
|
|
|
|
username="liangliangyy1", # 测试用户名
|
|
|
|
|
@ -42,6 +71,7 @@ class CommentsTest(TransactionTestCase):
|
|
|
|
|
|
|
|
|
|
def update_article_comment_status(self, article):
|
|
|
|
|
"""
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
辅助方法:批量更新某篇文章下所有评论的启用状态(设为“启用”)
|
|
|
|
|
模拟管理员审核通过评论的操作,用于测试审核后评论的显示逻辑
|
|
|
|
|
参数:
|
|
|
|
|
@ -50,11 +80,18 @@ class CommentsTest(TransactionTestCase):
|
|
|
|
|
# 获取该文章下所有评论
|
|
|
|
|
comments = article.comment_set.all()
|
|
|
|
|
# 遍历评论,将“是否启用”字段设为True并保存
|
|
|
|
|
=======
|
|
|
|
|
jyn: 辅助方法,批量更新指定文章下所有评论的启用状态(模拟后台审核通过)
|
|
|
|
|
:param article: 目标文章实例
|
|
|
|
|
"""
|
|
|
|
|
comments = article.comment_set.all() # jyn: 获取文章关联的所有评论
|
|
|
|
|
>>>>>>> JYN_branch
|
|
|
|
|
for comment in comments:
|
|
|
|
|
comment.is_enable = True
|
|
|
|
|
comment.save()
|
|
|
|
|
comment.is_enable = True # jyn: 设为启用状态
|
|
|
|
|
comment.save() # jyn: 保存修改
|
|
|
|
|
|
|
|
|
|
def test_validate_comment(self):
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
"""
|
|
|
|
|
核心测试用例:验证评论提交流程(登录→创建文章→提交评论→验证状态)
|
|
|
|
|
覆盖场景:登录用户提交评论、评论未审核时不显示、审核后正常显示
|
|
|
|
|
@ -63,12 +100,20 @@ class CommentsTest(TransactionTestCase):
|
|
|
|
|
self.client.login(username='liangliangyy1', password='liangliangyy1')
|
|
|
|
|
|
|
|
|
|
# 2. 创建测试分类:文章需关联分类,先创建分类数据
|
|
|
|
|
=======
|
|
|
|
|
"""jyn: 核心测试用例,验证评论提交、审核、回复、模板标签及工具函数的正确性"""
|
|
|
|
|
# 1. 模拟用户登录
|
|
|
|
|
self.client.login(username='liangliangyy1', password='liangliangyy1')
|
|
|
|
|
|
|
|
|
|
# 2. 创建测试分类和文章(评论的关联对象)
|
|
|
|
|
>>>>>>> JYN_branch
|
|
|
|
|
category = Category()
|
|
|
|
|
category.name = "categoryccc" # 分类名称
|
|
|
|
|
category.save() # 保存到测试数据库
|
|
|
|
|
|
|
|
|
|
# 3. 创建测试文章:评论需关联文章,创建一篇已发布的文章
|
|
|
|
|
article = Article()
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
article.title = "nicetitleccc" # 文章标题
|
|
|
|
|
article.body = "nicecontentccc" # 文章内容
|
|
|
|
|
article.author = self.user # 关联作者(测试用户)
|
|
|
|
|
@ -97,7 +142,82 @@ class CommentsTest(TransactionTestCase):
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 0) # comment_list()应为自定义方法,返回启用的评论
|
|
|
|
|
|
|
|
|
|
# 8. 模拟审核通过:调用辅助方法,将该文章下所有评论设为“启用”
|
|
|
|
|
=======
|
|
|
|
|
article.title = "nicetitleccc"
|
|
|
|
|
article.body = "nicecontentccc"
|
|
|
|
|
article.author = self.user
|
|
|
|
|
article.category = category
|
|
|
|
|
article.type = 'a' # jyn: 文章类型(假设'a'代表普通文章)
|
|
|
|
|
article.status = 'p' # jyn: 文章状态(假设'p'代表已发布)
|
|
|
|
|
article.save()
|
|
|
|
|
|
|
|
|
|
# 3. 生成评论提交接口的URL
|
|
|
|
|
comment_url = reverse(
|
|
|
|
|
'comments:postcomment', kwargs={
|
|
|
|
|
'article_id': article.id}) # jyn: 反向解析"提交评论"接口,传入文章ID
|
|
|
|
|
|
|
|
|
|
# 4. 测试首次提交普通评论(未审核状态)
|
|
|
|
|
response = self.client.post(comment_url,
|
|
|
|
|
{
|
|
|
|
|
'body': '123ffffffffff' # jyn: 评论正文
|
|
|
|
|
})
|
|
|
|
|
self.assertEqual(response.status_code, 302) # jyn: 验证提交成功后重定向(状态码302)
|
|
|
|
|
|
|
|
|
|
# 未审核时,文章评论列表应为空
|
|
|
|
|
article = Article.objects.get(pk=article.pk)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 0) # jyn: 假设comment_list()返回启用的评论
|
|
|
|
|
|
|
|
|
|
# 模拟审核通过,再次验证评论数量
|
|
|
|
|
>>>>>>> JYN_branch
|
|
|
|
|
self.update_article_comment_status(article)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 1) # jyn: 审核后应显示1条评论
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
# 9. 验证“审核后评论显示”:再次检查评论列表长度是否为1(审核通过后应显示)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 1)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 1)
|
|
|
|
|
=======
|
|
|
|
|
# 5. 测试再次提交相同内容评论(验证重复提交允许性)
|
|
|
|
|
response = self.client.post(comment_url,
|
|
|
|
|
{
|
|
|
|
|
'body': '123ffffffffff',
|
|
|
|
|
})
|
|
|
|
|
self.assertEqual(response.status_code, 302) # jyn: 验证提交成功
|
|
|
|
|
self.update_article_comment_status(article)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 2) # jyn: 评论总数应为2条
|
|
|
|
|
|
|
|
|
|
# 6. 测试回复功能(提交带父评论ID的评论)
|
|
|
|
|
parent_comment_id = article.comment_list()[0].id # jyn: 获取第一条评论ID作为父评论
|
|
|
|
|
response = self.client.post(comment_url,
|
|
|
|
|
{
|
|
|
|
|
'body': '''
|
|
|
|
|
# Title1
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
import os
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
[url](https://www.lylinux.net/)
|
|
|
|
|
|
|
|
|
|
[ddd](http://www.baidu.com)
|
|
|
|
|
''', # jyn: 带Markdown格式、链接、代码块的评论正文
|
|
|
|
|
'parent_comment_id': parent_comment_id # jyn: 指定父评论ID,实现回复
|
|
|
|
|
})
|
|
|
|
|
self.assertEqual(response.status_code, 302) # jyn: 验证回复提交成功
|
|
|
|
|
self.update_article_comment_status(article)
|
|
|
|
|
article = Article.objects.get(pk=article.pk)
|
|
|
|
|
self.assertEqual(len(article.comment_list()), 3) # jyn: 评论总数应为3条(含1条回复)
|
|
|
|
|
|
|
|
|
|
# 7. 测试评论树解析(验证回复层级关系)
|
|
|
|
|
comment = Comment.objects.get(id=parent_comment_id)
|
|
|
|
|
tree = parse_commenttree(article.comment_list(), comment) # jyn: 调用模板标签解析评论树
|
|
|
|
|
self.assertEqual(len(tree), 1) # jyn: 验证父评论下有1条子回复
|
|
|
|
|
# 8. 测试评论项渲染模板标签(验证模板标签功能正常)
|
|
|
|
|
data = show_comment_item(comment, True) # jyn: 调用模板标签生成评论HTML片段
|
|
|
|
|
self.assertIsNotNone(data) # jyn: 验证渲染结果非空
|
|
|
|
|
# 9. 测试工具函数(验证最大ID获取功能)
|
|
|
|
|
s = get_max_articleid_commentid() # jyn: 调用工具函数获取最大文章ID和评论ID
|
|
|
|
|
self.assertIsNotNone(s) # jyn: 验证返回结果非空
|
|
|
|
|
# 10. 测试评论邮件通知(验证邮件发送功能)
|
|
|
|
|
from comments.utils import send_comment_email
|
|
|
|
|
send_comment_email(comment) # jyn: 调用工具函数发送评论通知邮件(无返回值,验证无报错)
|
|
|
|
|
>>>>>>> JYN_branch
|
|
|
|
|
|