#gjl
import json

# 导入 Django 测试框架所需的核心类和模块
from django.test import Client, RequestFactory, TestCase

# 导入项目中使用的自定义用户模型和位置日志模型，用于在测试中创建用户和验证数据
from accounts.models import BlogUser
from .models import OwnTrackLog


# Create your tests here.

# 定义一个测试类，用于测试 OwnTrackLog 相关的功能，如数据接收、地图展示、数据查询等
# 继承自 Django 的 TestCase，提供数据库隔离、断言方法和测试工具
class OwnTrackLogTest(TestCase):
    # gjl setUp 方法在每个测试方法执行前自动运行，用于准备测试所需的环境和对象
    # gjl 本方法中初始化了测试客户端和请求工厂，便于模拟 HTTP 请求
    def setUp(self):
        # 创建一个 Django 测试客户端实例，用于模拟浏览器发送 GET、POST 等请求
        self.client = Client()

        # gjl 创建一个请求工厂实例，用于创建伪造的 HTTP 请求对象（如 HttpRequest）
        # gjl 适用于需要直接调用视图函数的测试场景（本测试中未直接使用，但已准备）
        self.factory = RequestFactory()

    # gjl test_own_track_log 是一个具体的测试用例，用于验证 OwnTrackLog 功能的正确性
    # gjl 测试内容包括：接收位置数据、数据完整性、权限控制、页面响应等
    def test_own_track_log(self):
        # gjl 构造一个模拟的位置数据字典，包含 tid（用户标识）、lat（纬度）、lon（经度）
        o = {
            'tid': 12,
            'lat': 123.123,
            'lon': 134.341
        }

        # gjl 使用测试客户端发送一个 POST 请求到 '/owntracks/logtracks' 接口
        # gjl 将位置数据 o 序列化为 JSON 字符串，并设置内容类型为 application/json
        # gjl 模拟 OwnTracks 客户端上传位置信息
        self.client.post(
            '/owntracks/logtracks',
            json.dumps(o),
            content_type='application/json')

        # 查询数据库中 OwnTrackLog 模型的所有记录数量
        length = len(OwnTrackLog.objects.all())

        # 断言：验证数据库中记录数为 1，确保第一次 POST 请求成功写入一条数据
        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)

        # 发送 GET 请求访问 '/owntracks/show_maps' 页面（查看地图）
        rsp = self.client.get('/owntracks/show_maps')

        # 断言：检查响应状态码为 302（重定向），说明未登录用户访问地图页时被重定向（如跳转到登录页）
        self.assertEqual(rsp.status_code, 302)

        # gjl 创建一个超级用户，用于测试需要登录权限的功能
        # gjl 使用 BlogUser 模型的 create_superuser 方法创建具有管理员权限的测试用户
        user = BlogUser.objects.create_superuser(
            email="liangliangyy1@gmail.com",
            username="liangliangyy1",
            password="liangliangyy1")

        # gjl 使用测试客户端以刚创建的超级用户身份登录
        # gjl 模拟用户登录过程，使后续请求具有认证状态
        self.client.login(username='liangliangyy1', password='liangliangyy1')

        # 手动创建一条 OwnTrackLog 记录并保存到数据库
        # 直接操作模型，用于准备测试数据
        s = OwnTrackLog()
        s.tid = 12
        s.lon = 123.234
        s.lat = 34.234
        s.save()

        # 发送 GET 请求访问 '/owntracks/show_dates' 页面（查看日期列表）
        rsp = self.client.get('/owntracks/show_dates')

        # 断言：检查响应状态码为 200（成功），说明登录后可以正常访问该页面
        self.assertEqual(rsp.status_code, 200)

        # 发送 GET 请求访问 '/owntracks/show_maps' 页面（查看地图）
        rsp = self.client.get('/owntracks/show_maps')

        # 断言：检查响应状态码为 200（成功），说明登录后可以正常访问地图页面
        self.assertEqual(rsp.status_code, 200)

        # 发送 GET 请求访问 '/owntracks/get_datas' 接口（获取位置数据）
        rsp = self.client.get('/owntracks/get_datas')

        # 断言：检查响应状态码为 200（成功），说明数据接口正常返回
        self.assertEqual(rsp.status_code, 200)

        # 发送 GET 请求访问 '/owntracks/get_datas' 接口，并携带日期查询参数 date=2018-02-26
        rsp = self.client.get('/owntracks/get_datas?date=2018-02-26')

        # 断言：检查响应状态码为 200（成功），说明带参数的数据查询功能正常
        self.assertEqual(rsp.status_code, 200)