mxivideo/test_draft_content_parsing.py

284 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
测试 draft_content 解析修复
验证字符串类型的 draft_content 能正确解析为字典
"""
import sys
import os
import json
import uuid
from datetime import datetime
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from python_core.database.template_postgres import template_table
from python_core.database.types import TemplateInfo
def test_draft_content_parsing():
"""测试 draft_content 解析功能"""
print("=== 测试 draft_content 解析修复 ===\n")
try:
# 创建测试数据
test_draft = {
"canvas_config": {"width": 1920, "height": 1080, "fps": 30},
"tracks": [
{"id": "track1", "type": "video", "name": "视频轨道"}
],
"materials": [
{"id": "mat1", "name": "test.mp4", "type": "video"}
],
"duration": 10000
}
template_id = str(uuid.uuid4())
# 1. 测试正常的字典类型 draft_content
print("1. 测试字典类型 draft_content...")
template_info = TemplateInfo(
id=template_id,
name=f"测试模板-字典-{template_id[:8]}",
description="测试字典类型的 draft_content",
thumbnail_path="",
draft_content_path="",
resources_path="",
created_at=datetime.now().isoformat(),
updated_at=datetime.now().isoformat(),
canvas_config=test_draft.get('canvas_config', {}),
duration=test_draft.get('duration', 0),
material_count=len(test_draft.get('materials', [])),
track_count=len(test_draft.get('tracks', [])),
tags=["测试"],
user_id="test_user",
draft_content=test_draft # 字典类型
)
# 存储到数据库
created_id = template_table.create_template(template_info)
print(f" ✅ 模板创建成功: {created_id}")
# 读取并验证
stored_template = template_table.get_template_by_id(created_id)
if stored_template and isinstance(stored_template.draft_content, dict):
print(f" ✅ draft_content 类型正确: {type(stored_template.draft_content)}")
print(f" ✅ draft_content 键数量: {len(stored_template.draft_content)}")
else:
print(f" ❌ draft_content 类型错误: {type(stored_template.draft_content) if stored_template else 'None'}")
return False
# 清理
template_table.delete_template(created_id)
# 2. 测试直接在数据库中插入 JSON 字符串
print("\n2. 测试 JSON 字符串类型 draft_content...")
# 直接操作数据库,插入 JSON 字符串
import psycopg2.extras
from python_core.database.template_postgres import TemplateTablePostgres
template_id2 = str(uuid.uuid4())
draft_json_str = json.dumps(test_draft)
with template_table._get_connection() as conn:
with conn.cursor() as cursor:
insert_sql = """
INSERT INTO templates (
id, name, description, thumbnail_path, draft_content_path,
draft_content, resources_path, canvas_config, duration, material_count,
track_count, tags, is_cloud, user_id, created_at, updated_at
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
now = datetime.now()
cursor.execute(insert_sql, (
template_id2,
f"测试模板-字符串-{template_id2[:8]}",
"测试 JSON 字符串类型的 draft_content",
"",
"",
draft_json_str, # 直接插入 JSON 字符串
"",
json.dumps({}),
10000,
1,
1,
json.dumps(["测试"]),
False,
"test_user",
now,
now
))
conn.commit()
print(f" ✅ 直接插入 JSON 字符串成功: {template_id2}")
# 读取并验证解析
stored_template2 = template_table.get_template_by_id(template_id2)
if stored_template2:
print(f" draft_content 类型: {type(stored_template2.draft_content)}")
if isinstance(stored_template2.draft_content, dict):
print(f" ✅ JSON 字符串正确解析为字典")
print(f" ✅ draft_content 键数量: {len(stored_template2.draft_content)}")
print(f" ✅ 包含 tracks: {'tracks' in stored_template2.draft_content}")
print(f" ✅ 包含 materials: {'materials' in stored_template2.draft_content}")
else:
print(f" ❌ JSON 字符串解析失败")
return False
else:
print(f" ❌ 模板读取失败")
return False
# 测试 get_draft_content 方法
print("\n3. 测试 get_draft_content 方法...")
draft_content = template_table.get_draft_content(template_id2)
if draft_content is not None and isinstance(draft_content, dict):
print(f" ✅ get_draft_content 返回字典类型")
print(f" ✅ 键数量: {len(draft_content)}")
else:
print(f" ❌ get_draft_content 返回类型错误: {type(draft_content)}")
return False
# 清理
template_table.delete_template(template_id2)
print("\n✅ 所有测试通过!")
return True
except Exception as e:
print(f"❌ 测试失败: {e}")
import traceback
traceback.print_exc()
return False
def test_cli_command():
"""测试 CLI 命令"""
print("\n=== 测试 CLI 命令 ===\n")
try:
# 创建一个测试模板
test_draft = {
"canvas_config": {"width": 1920, "height": 1080, "fps": 30},
"tracks": [
{
"id": "track1",
"type": "video",
"name": "视频轨道",
"segments": [
{
"id": "seg1",
"start": 0,
"end": 5000,
"material_id": "mat1"
}
]
}
],
"materials": [
{
"id": "mat1",
"name": "test.mp4",
"type": "video",
"path": "test.mp4"
}
],
"duration": 5000
}
template_id = str(uuid.uuid4())
template_info = TemplateInfo(
id=template_id,
name=f"CLI测试模板-{template_id[:8]}",
description="用于测试 CLI 命令的模板",
thumbnail_path="",
draft_content_path="",
resources_path="",
created_at=datetime.now().isoformat(),
updated_at=datetime.now().isoformat(),
canvas_config=test_draft.get('canvas_config', {}),
duration=test_draft.get('duration', 0),
material_count=len(test_draft.get('materials', [])),
track_count=len(test_draft.get('tracks', [])),
tags=["CLI测试"],
user_id="test_user",
draft_content=test_draft
)
# 创建模板
created_id = template_table.create_template(template_info)
print(f"✅ 创建测试模板: {created_id}")
# 测试 CLI 命令
import subprocess
cmd = [
"python3", "-m", "python_core.cli",
"template", "detail", created_id,
"--json"
]
print(f"执行命令: {' '.join(cmd)}")
result = subprocess.run(
cmd,
capture_output=True,
text=True,
cwd="/root/projects/mixvideo_v2"
)
print(f"返回码: {result.returncode}")
if result.stdout:
print(f"标准输出: {result.stdout}")
if result.stderr:
print(f"标准错误: {result.stderr}")
if result.returncode == 0:
# 检查输出是否包含 JSONRPC 成功响应
if "JSONRPC:" in result.stdout and '"error"' not in result.stdout:
print("✅ CLI 命令执行成功,没有错误")
success = True
else:
print("❌ CLI 命令返回错误")
success = False
else:
print("❌ CLI 命令执行失败")
success = False
# 清理
template_table.delete_template(created_id)
print(f"✅ 清理测试模板: {created_id}")
return success
except Exception as e:
print(f"❌ CLI 测试失败: {e}")
import traceback
traceback.print_exc()
return False
def main():
"""主测试函数"""
print("开始测试 draft_content 解析修复...\n")
# 测试1draft_content 解析
test1_success = test_draft_content_parsing()
# 测试2CLI 命令
test2_success = test_cli_command()
print(f"\n=== 测试结果 ===")
print(f"测试1 (draft_content解析): {'✅ 通过' if test1_success else '❌ 失败'}")
print(f"测试2 (CLI命令): {'✅ 通过' if test2_success else '❌ 失败'}")
if test1_success and test2_success:
print("\n🎉 所有测试通过draft_content 解析修复成功!")
print("\n修复内容:")
print("1. ✅ 修复了数据库中 JSON 字符串的解析问题")
print("2. ✅ 改进了 CLI 命令的类型检查")
print("3. ✅ 确保 draft_content 始终为字典类型")
print("4. ✅ 解决了 'str' object has no attribute 'get' 错误")
else:
print("\n❌ 部分测试失败,需要进一步检查")
if __name__ == "__main__":
main()