package main import ( "os" "path/filepath" "testing" ) // 录制结束时文件会被移动到保存目录,视频分段和弹幕文件都要按新位置找。 // 以前只有视频分段走了查找,弹幕还拿着录制时的路径:视频找到了、弹幕找不到, // 整场合并以「jsonl 文件不存在」告终(用户看到的就是合成失败 + 一条失败推送)。 func TestPrepareForMergeFindsMovedJsonl(t *testing.T) { savedConfig := config defer func() { config = savedConfig }() root := t.TempDir() config.Directory = root config.RecordSubdir = "record" if err := os.MkdirAll(recordSaveDir(), 0755); err != nil { t.Fatal(err) } name := "2026-09-27 22-40-42 甲 标题" // 录制时的位置:文件已经被搬走,这里不该再有 oldDir := t.TempDir() oldVideo := filepath.Join(oldDir, name+".mp4") oldJsonl := filepath.Join(oldDir, name+".jsonl") // 实际位置 newVideo := filepath.Join(recordSaveDir(), name+".mp4") newJsonl := filepath.Join(recordSaveDir(), name+".jsonl") for _, p := range []string{newVideo, newJsonl} { if err := os.WriteFile(p, []byte("{}\n"), 0644); err != nil { t.Fatal(err) } } segs := []recordSegment{{file: oldVideo, startNs: 0}} video, jsonl, _, _, cleanup, err := prepareForMerge("没有这个-ffmpeg.exe", segs, oldJsonl, 0) defer cleanup() if err != nil { t.Fatalf("单段不该报错:%v", err) } if video != newVideo { t.Errorf("视频应当按保存目录里的实际位置找:\n got %s\n want %s", video, newVideo) } if jsonl != newJsonl { t.Errorf("弹幕文件应当按保存目录里的实际位置找:\n got %s\n want %s", jsonl, newJsonl) } } // 文件确实不在(既没在录制时的位置、也不在保存目录)时,要退回原路径而不是空串: // 否则报错会变成「文件不存在:」,看不出到底缺的是哪个 func TestResolveAfterMoveKeepsOriginalWhenMissing(t *testing.T) { savedConfig := config defer func() { config = savedConfig }() root := t.TempDir() config.Directory = root config.RecordSubdir = "record" gone := filepath.Join(t.TempDir(), "这个目录是对的但文件不在.mp4") if got := resolveAfterMove(gone); got != gone { t.Errorf("找不到时应当退回原路径:got %q want %q", got, gone) } real := filepath.Join(root, "record", "在保存目录里.mp4") if err := os.MkdirAll(filepath.Dir(real), 0755); err != nil { t.Fatal(err) } if err := os.WriteFile(real, []byte("x"), 0644); err != nil { t.Fatal(err) } if got := resolveAfterMove(real); got != real { t.Errorf("文件就在原路径时不该改:got %q want %q", got, real) } }