package transfer import ( "os" "path/filepath" "testing" ) func TestReadFileRoundTrip(t *testing.T) { src := filepath.Join(t.TempDir(), "hello.txt") content := []byte("hello, clip-sync!") if err := os.WriteFile(src, content, 0644); err != nil { t.Fatalf("WriteFile: %v", err) } f, err := ReadFile(src, "machine-a") if err != nil { t.Fatalf("ReadFile: %v", err) } if f.Name != "hello.txt" { t.Errorf("Name = %q, want \"hello.txt\"", f.Name) } if f.Mime != "text/plain; charset=utf-8" { t.Errorf("Mime = %q, want \"text/plain; charset=utf-8\"", f.Mime) } decoded, err := f.Decode() if err != nil { t.Fatalf("Decode: %v", err) } if string(decoded) != string(content) { t.Errorf("decoded = %q, want %q", decoded, content) } } func TestSaveTo(t *testing.T) { dir := t.TempDir() f := &File{Name: "out.bin", Mime: "application/octet-stream", Data: ""} // Data must be base64-encoded; use a known encoding of "abc". f.Data = "YWJj" dest, err := f.SaveTo(dir) if err != nil { t.Fatalf("SaveTo: %v", err) } got, err := os.ReadFile(dest) if err != nil { t.Fatalf("ReadFile: %v", err) } if string(got) != "abc" { t.Errorf("saved = %q, want \"abc\"", got) } } func TestSaveToAvoidsOverwrite(t *testing.T) { dir := t.TempDir() f := &File{Name: "out.bin", Data: "eA=="} // base64 "x" first, err := f.SaveTo(dir) if err != nil { t.Fatalf("first SaveTo: %v", err) } second, err := f.SaveTo(dir) if err != nil { t.Fatalf("second SaveTo: %v", err) } if first == second { t.Errorf("second save overwrote first: %q == %q", first, second) } } func TestSaveToSanitizesPath(t *testing.T) { dir := t.TempDir() f := &File{Name: "../../etc/passwd", Data: "eA=="} dest, err := f.SaveTo(dir) if err != nil { t.Fatalf("SaveTo: %v", err) } if filepath.Dir(dest) != dir { t.Errorf("dest dir = %q, want %q (path traversal not sanitized)", filepath.Dir(dest), dir) } }