# 导入Django测试相关模块
from django.test import Client, RequestFactory, TestCase
from django.utils import timezone
# 导入WeRoBot文本消息类
from werobot.messages.messages import TextMessage

# 导入应用模型
from accounts.models import BlogUser
from blog.models import Category, Article
# 导入要测试的API类
from servermanager.api.commonapi import ChatGPT
from .models import commands
# 导入要测试的机器人处理类和方法
from .robot import MessageHandler, CommandHandler
from .robot import search, category, recents


# 创建服务器管理器测试类
class ServerManagerTest(TestCase):
    """
    服务器管理器功能测试类
    测试servermanager应用的各项功能
    """
    
    def setUp(self):
        """
        测试初始化方法
        在每个测试方法执行前运行，用于设置测试环境
        """
        # 创建测试客户端，用于模拟HTTP请求
        self.client = Client()
        # 创建请求工厂，用于构建请求对象
        self.factory = RequestFactory()

    def test_chat_gpt(self):
        """
        测试ChatGPT功能
        验证ChatGPT API是否能正常返回响应
        """
        content = ChatGPT.chat("你好")  # 发送测试消息
        self.assertIsNotNone(content)  # 断言响应内容不为空

    def test_validate_comment(self):
        """
        综合测试方法
        测试博客系统和微信机器人的完整功能链
        """
        # 创建超级用户
        user = BlogUser.objects.create_superuser(
            email="liangliangyy1@gmail.com",
            username="liangliangyy1",
            password="liangliangyy1")

        # 使用创建的超级用户登录
        self.client.login(username='liangliangyy1', password='liangliangyy1')

        # 创建分类
        c = Category()
        c.name = "categoryccc"
        c.save()

        # 创建文章
        article = Article()
        article.title = "nicetitleccc"
        article.body = "nicecontentccc"
        article.author = user
        article.category = c
        article.type = 'a'  # 文章类型
        article.status = 'p'  # 发布状态
        article.save()
        
        # 测试搜索功能
        s = TextMessage([])  # 创建空的文本消息对象
        s.content = "nice"  # 设置消息内容
        rsp = search(s, None)  # 调用搜索函数
        # 注意：这里没有对搜索结果进行断言，可能需要补充
        
        # 测试分类功能
        rsp = category(None, None)  # 调用分类函数
        self.assertIsNotNone(rsp)  # 断言响应不为空
        
        # 测试最近文章功能
        rsp = recents(None, None)  # 调用最近文章函数
        self.assertTrue(rsp != '暂时还没有文章')  # 断言有文章返回

        # 测试命令功能
        # 创建测试命令
        cmd = commands()
        cmd.title = "test"
        cmd.command = "ls"  # Linux列表命令
        cmd.describe = "test"
        cmd.save()

        # 测试命令处理器
        cmdhandler = CommandHandler()
        rsp = cmdhandler.run('test')  # 执行测试命令
        self.assertIsNotNone(rsp)  # 断言命令执行结果不为空
        
        # 测试消息处理器
        s.source = 'u'  # 设置消息来源
        s.content = 'test'  # 设置消息内容
        msghandler = MessageHandler(s, {})  # 创建消息处理器

        # 注释掉的管理员权限设置
        # msghandler.userinfo.isPasswordSet = True
        # msghandler.userinfo.isAdmin = True
        
        # 测试各种消息处理场景
        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()