You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
djangoBlogStudy/src/servermanager/tests.py

148 lines
5.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from django.test import Client, RequestFactory, TestCase
from django.utils import timezone # 用于处理时间相关的测试
# 导入 WeRoBot 消息类,用于模拟微信消息
from werobot.messages.messages import TextMessage
# 导入项目中的模型和 API
from accounts.models import BlogUser # 用户模型(用于创建管理员)
from blog.models import Category, Article # 博客分类和文章模型
from servermanager.api.commonapi import ChatGPT # 聊天功能接口
from .models import commands # 命令模型
from .robot import MessageHandler, CommandHandler # 核心机器人处理器
from .robot import search, category, recents # 微信机器人命令函数
class ServerManagerTest(TestCase):
"""
Django 测试用例类,用于对 servermanager 应用的核心功能进行单元测试。
测试内容包括:
- ChatGPT 聊天功能
- 微信机器人命令响应(搜索、分类、最新文章)
- 服务器命令执行
- 管理员会话流程
"""
def setUp(self):
"""
在每个测试方法执行前自动运行的初始化方法。
设置测试所需的公共环境:
- 创建测试客户端(用于模拟 HTTP 请求)
- 创建请求工厂(用于构造请求对象)
注意:虽然此处创建了 factory但在当前测试中并未实际使用。
"""
self.client = Client() # Django 测试客户端
self.factory = RequestFactory() # 请求工厂,用于创建模拟请求
def test_chat_gpt(self):
"""
测试 ChatGPT 聊天功能是否正常工作。
步骤:
1. 调用 ChatGPT.chat 方法发送问候语 "你好"
2. 断言返回内容不为 None表示接口有响应
目的:验证聊天接口的基本可用性。
"""
content = ChatGPT.chat("你好")
self.assertIsNotNone(content)
def test_validate_comment(self):
"""
综合测试方法,覆盖多个功能点。
名称 'validate_comment' 不准确,实际测试的是 servermanager 的核心功能。
测试流程:
1. 创建管理员用户并登录
2. 创建分类和文章用于测试搜索功能
3. 测试微信机器人的 search、category、recents 命令
4. 测试命令执行CommandHandler
5. 模拟完整管理员会话流程(登录、执行命令、退出等)
"""
# 1. 创建超级用户
user = BlogUser.objects.create_superuser(
email="liangliangyy1@gmail.com",
username="liangliangyy1",
password="liangliangyy1")
# 使用测试客户端登录该用户
self.client.login(username='liangliangyy1', password='liangliangyy1')
# 2. 创建博客分类
c = Category()
c.name = "categoryccc"
c.save()
# 3. 创建一篇已发布的文章
article = Article()
article.title = "nicetitleccc"
article.body = "nicecontentccc"
article.author = user
article.category = c
article.type = 'a' # 文章类型
article.status = 'p' # 发布状态
article.save()
# 4. 模拟微信文本消息
s = TextMessage([])
s.content = "nice" # 搜索关键词
# 5. 测试 search 命令
rsp = search(s, None) # 调用 search 过滤器
# 断言有响应(即使未找到文章也应返回提示)
# 6. 测试 category 命令
rsp = category(None, None)
self.assertIsNotNone(rsp) # 确保返回了分类列表
# 7. 测试 recents 命令
rsp = recents(None, None)
# 断言返回结果不是“暂时还没有文章”,说明能获取到文章
self.assertTrue(rsp != '暂时还没有文章')
# 8. 测试命令执行功能
cmd = commands()
cmd.title = "test"
cmd.command = "ls" # 测试命令(列出目录)
cmd.describe = "test"
cmd.save() # 保存到数据库
# 实例化命令处理器
cmdhandler = CommandHandler()
# 执行名为 'test' 的命令
rsp = cmdhandler.run('test')
# 断言命令执行有返回结果
self.assertIsNotNone(rsp)
# 9. 模拟管理员会话流程
s.source = 'u' # 设置用户标识OpenID
s.content = 'test' # 用户输入内容
# 创建消息处理器实例,传入模拟消息和空会话
msghandler = MessageHandler(s, {})
# 模拟用户行为序列:
msghandler.handler() # 处理 "test" 消息(应提示确认)
s.content = 'y' # 用户确认执行
msghandler.handler() # 执行命令
s.content = 'idcard:12321233' # 尝试身份证查询(占位功能)
msghandler.handler()
s.content = 'weather:上海' # 尝试天气查询(占位功能)
msghandler.handler()
s.content = 'admin' # 请求进入管理员模式
msghandler.handler()
s.content = '123' # 输入密码(测试环境下有效)
msghandler.handler()
s.content = 'exit' # 退出管理员模式
msghandler.handler()
# 注意:此测试未包含 assert 断言来验证每个步骤的结果,
# 主要是通过调用来检查是否抛出异常,确保代码路径可执行。