#!/usr/bin/env python3 """ 测试片段重命名功能 """ import sys import json import subprocess from pathlib import Path def parse_jsonrpc_response(stdout): """解析 JSONRPC 格式的响应""" stdout = stdout.strip() if stdout.startswith("JSONRPC:"): stdout = stdout[8:] # 移除 "JSONRPC:" 前缀 response = json.loads(stdout) # JSONRPC 格式检查 if "result" in response: return True, response["result"] elif "error" in response: return False, response["error"] else: return False, response def run_cli_command(args): """运行CLI命令并返回结果""" try: cmd = ["python3", "-m", "python_core.cli"] + args print(f"Running: {' '.join(cmd)}") result = subprocess.run( cmd, capture_output=True, text=True, cwd=Path(__file__).parent ) print(f"Return code: {result.returncode}") print(f"STDOUT: {result.stdout}") if result.stderr: print(f"STDERR: {result.stderr}") return result except Exception as e: print(f"Error running command: {e}") return None def test_segment_rename(): """测试片段重命名功能""" print("=" * 60) print("测试片段重命名功能") print("=" * 60) # 1. 首先获取模板列表 print("\n1. 获取模板列表...") result = run_cli_command(["template", "list", "--limit", "5", "--json"]) if not result or result.returncode != 0: print("❌ 获取模板列表失败") return False try: success, data = parse_jsonrpc_response(result.stdout) if not success: print(f"❌ 模板列表API返回失败: {data}") return False templates = data.get("templates", []) if not templates: print("❌ 没有找到模板") return False template = templates[0] template_id = template["id"] print(f"✅ 找到模板: {template['name']} (ID: {template_id})") except json.JSONDecodeError as e: print(f"❌ 解析模板列表响应失败: {e}") return False # 2. 获取模板详情 print(f"\n2. 获取模板详情...") result = run_cli_command(["template", "detail", template_id, "--json"]) if not result or result.returncode != 0: print("❌ 获取模板详情失败") return False try: success, detail = parse_jsonrpc_response(result.stdout) if not success: print(f"❌ 模板详情API返回失败: {detail}") return False tracks = detail.get("tracks", []) if not tracks: print("❌ 模板没有轨道") return False # 找到第一个有片段的轨道 segment = None segment_track = None for track in tracks: segments = track.get("segments", []) if segments: segment = segments[0] segment_track = track break if not segment: print("❌ 模板没有片段") return False segment_id = segment["id"] original_name = segment["name"] print(f"✅ 找到片段: {original_name} (ID: {segment_id})") except json.JSONDecodeError as e: print(f"❌ 解析模板详情响应失败: {e}") return False # 3. 更新片段名称 new_name = f"测试重命名_{original_name}" print(f"\n3. 更新片段名称: '{original_name}' -> '{new_name}'") result = run_cli_command([ "template", "update-segment", template_id, segment_id, new_name, "--json", "--verbose" ]) if not result or result.returncode != 0: print("❌ 更新片段名称失败") return False try: success, update_data = parse_jsonrpc_response(result.stdout) if not success: print(f"❌ 更新片段名称API返回失败: {update_data}") return False print(f"✅ 更新成功: {update_data}") except json.JSONDecodeError as e: print(f"❌ 解析更新响应失败: {e}") return False # 4. 验证更新结果 print(f"\n4. 验证更新结果...") result = run_cli_command(["template", "detail", template_id, "--json"]) if not result or result.returncode != 0: print("❌ 重新获取模板详情失败") return False try: success, detail = parse_jsonrpc_response(result.stdout) if not success: print(f"❌ 重新获取模板详情API返回失败: {detail}") return False tracks = detail.get("tracks", []) # 查找更新后的片段 updated_segment = None for track in tracks: for seg in track.get("segments", []): if seg["id"] == segment_id: updated_segment = seg break if updated_segment: break if not updated_segment: print("❌ 找不到更新后的片段") return False updated_name = updated_segment["name"] print(f"✅ 片段名称已更新: '{updated_name}'") if updated_name == new_name: print("✅ 验证成功:片段名称更新正确") else: print(f"❌ 验证失败:期望 '{new_name}',实际 '{updated_name}'") return False except json.JSONDecodeError as e: print(f"❌ 解析验证响应失败: {e}") return False # 5. 恢复原始名称 print(f"\n5. 恢复原始名称...") result = run_cli_command([ "template", "update-segment", template_id, segment_id, original_name, "--json" ]) if result and result.returncode == 0: try: success, data = parse_jsonrpc_response(result.stdout) if success: print("✅ 已恢复原始名称") else: print(f"⚠️ 恢复原始名称失败: {data}") except: print("⚠️ 恢复原始名称响应解析失败") else: print("⚠️ 恢复原始名称命令失败") print("\n" + "=" * 60) print("✅ 片段重命名功能测试完成") print("=" * 60) return True if __name__ == "__main__": success = test_segment_rename() sys.exit(0 if success else 1)