|
|
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 断言来验证每个步骤的结果,
|
|
|
# 主要是通过调用来检查是否抛出异常,确保代码路径可执行。 |