package runmgr import ( "os" "path/filepath" "testing" ) func TestStageWorkspaceInputs(t *testing.T) { root := t.TempDir() paths, err := StageWorkspaceInputs(root, "alice", "conv1", []WorkspaceFile{ {Name: "纪要.docx", Content: []byte("docx")}, {Name: "../secret.txt", Content: []byte("no")}, {Name: "纪要.docx", Content: []byte("second")}, {Name: "", Content: []byte("skip")}, }, "品牌模板.pptx", []byte("tpl")) if err != nil { t.Fatal(err) } want := []string{"inputs/纪要.docx", "inputs/secret.txt", "inputs/纪要-2.docx", "inputs/_default-template.pptx"} if len(paths) != len(want) { t.Fatalf("paths = %v, want %v", paths, want) } for i, rel := range want { if paths[i] != rel { t.Fatalf("paths[%d] = %q, want %q", i, paths[i], rel) } if _, err := os.Stat(filepath.Join(root, "alice", "conv1", rel)); err != nil { t.Fatal(err) } } if _, err := os.Stat(filepath.Join(root, "alice", "secret.txt")); err == nil { t.Fatal("path traversal must not escape inputs/") } empty, err := StageWorkspaceInputs("", "alice", "conv1", []WorkspaceFile{{Name: "a.txt", Content: []byte("x")}}, "", nil) if err != nil || empty != nil { t.Fatalf("unconfigured root must no-op, got %v %v", empty, err) } }