# 导入json模块，用于处理JSON数据格式
import json

# 从Django测试框架导入必要的测试工具
# Client用于模拟用户在视图上的请求
# RequestFactory用于创建请求对象
# TestCase是Django测试的基础类
from django.test import Client, RequestFactory, TestCase

# 导入账户模型BlogUser，用于测试用户相关功能
from accounts.models import BlogUser
# 从当前应用导入要测试的模型OwnTrackLog
from .models import OwnTrackLog


# Create your tests here.  # Django自动生成的注释，提示在此处编写测试代码

# 定义测试类OwnTrackLogTest，继承自TestCase
# 该类包含对OwnTrackLog模型及相关视图的测试用例
class OwnTrackLogTest(TestCase):
    # setUp方法在每个测试方法执行前运行，用于初始化测试环境
    def setUp(self):
        # 创建一个测试客户端，用于模拟用户请求
        self.client = Client()
        # 创建一个请求工厂，用于构建复杂的请求对象
        self.factory = RequestFactory()

    # 定义具体的测试方法，方法名以test_开头
    def test_own_track_log(self):
        # 定义一个符合要求的测试数据字典，包含tid、lat、lon字段
        o = {
            'tid': 12,
            'lat': 123.123,
            'lon': 134.341
        }

        # 使用测试客户端发送POST请求到指定URL
        # 发送JSON格式的数据，指定content_type为application/json
        self.client.post(
            '/owntracks/logtracks',  # 请求的URL
            json.dumps(o),  # 将字典转换为JSON字符串
            content_type='application/json')  # 指定内容类型

        # 检查数据库中OwnTrackLog记录的数量
        length = len(OwnTrackLog.objects.all())
        # 断言记录数为1，验证第一条数据成功保存
        self.assertEqual(length, 1)

        # 定义一个不完整的测试数据字典，缺少lon字段
        o = {
            'tid': 12,
            'lat': 123.123
        }

        # 再次发送POST请求，使用不完整的数据
        self.client.post(
            '/owntracks/logtracks',
            json.dumps(o),
            content_type='application/json')

        # 再次检查数据库中记录的数量
        length = len(OwnTrackLog.objects.all())
        # 断言记录数仍为1，验证不完整数据没有被保存
        self.assertEqual(length, 1)

        # 测试未登录状态下访问/show_maps页面
        rsp = self.client.get('/owntracks/show_maps')
        # 断言返回状态码为302（重定向），验证未登录用户被重定向
        self.assertEqual(rsp.status_code, 302)

        # 创建一个超级用户，用于测试登录状态下的功能
        user = BlogUser.objects.create_superuser(
            email="liangliangyy1@gmail.com",
            username="liangliangyy1",
            password="liangliangyy1")

        # 使用测试客户端登录刚刚创建的用户
        self.client.login(username='liangliangyy1', password='liangliangyy1')

        # 手动创建并保存一条OwnTrackLog记录
        s = OwnTrackLog()
        s.tid = 12
        s.lon = 123.234
        s.lat = 34.234
        s.save()

        # 测试登录状态下访问/show_dates页面
        rsp = self.client.get('/owntracks/show_dates')
        # 断言返回状态码为200（成功）
        self.assertEqual(rsp.status_code, 200)

        # 测试登录状态下访问/show_maps页面
        rsp = self.client.get('/owntracks/show_maps')
        # 断言返回状态码为200（成功）
        self.assertEqual(rsp.status_code, 200)

        # 测试登录状态下访问/get_datas页面
        rsp = self.client.get('/owntracks/get_datas')
        # 断言返回状态码为200（成功）
        self.assertEqual(rsp.status_code, 200)

        # 测试登录状态下带日期参数访问/get_datas页面
        rsp = self.client.get('/owntracks/get_datas?date=2018-02-26')
        # 断言返回状态码为200（成功）
        self.assertEqual(rsp.status_code, 200)