package fileio import ( "io/fs" "os" "path/filepath" "reflect" "testing" ) func TestCopyFiles(t *testing.T) { // Create a temporary directory for testing srcDir, err := os.MkdirTemp("", "src") if err != nil { t.Fatal(err) } defer os.RemoveAll(srcDir) // Create a source file srcFile := filepath.Join(srcDir, "source.txt") err = os.WriteFile(srcFile, []byte("test data"), 0644) if err != nil { t.Fatal(err) } // Specify the destination directory dstDir, err := os.MkdirTemp("", "dst") if err != nil { t.Fatal(err) } defer os.RemoveAll(dstDir) // Call the CopyFiles function const perm = fs.FileMode(0444) pattern := filepath.Join(srcDir, "*.txt") err = CopyFiles(pattern, dstDir, perm) if err != nil { t.Fatal(err) } // Verify that the file was copied correctly dstFile := filepath.Join(dstDir, "source.txt") fileInfo, err := os.Stat(dstFile) if err != nil { t.Fatalf("file not copied: %s", err) } if fileInfo.Mode() != perm { t.Errorf("unexpected file permissions: got %v, want %v", fileInfo.Mode(), perm) } // Read the contents of the copied file data, err := os.ReadFile(dstFile) if err != nil { t.Fatal(err) } // Verify the contents of the copied file expected := []byte("test data") if string(data) != string(expected) { t.Errorf("unexpected file content: got %q, want %q", data, expected) } } func TestReadJson(t *testing.T) { type Person struct{ Name string } t.Run("valid", func(t *testing.T) { got, err := ReadJson[Person](filepath.Join("testdata", "valid.json")) if err != nil { t.Fatalf("unexpected error %v", err) } want := Person{"alice"} if !reflect.DeepEqual(got, want) { t.Errorf("expected %v, got %v", want, got) } }) t.Run("invalid", func(t *testing.T) { _, err := ReadJson[Person](filepath.Join("testdata", "invalid.json")) if err == nil { t.Fatal("expected error, got nil") } }) t.Run("does not exist", func(t *testing.T) { _, err := ReadJson[Person](filepath.Join("testdata", "missing.json")) if err == nil { t.Fatal("expected error, got nil") } }) } func TestWriteFile(t *testing.T) { dir, err := os.MkdirTemp("", "files") if err != nil { t.Fatal(err) } defer os.RemoveAll(dir) t.Run("text", func(t *testing.T) { path := filepath.Join(dir, "data.txt") err = WriteFile(path, "hello", 0444) if err != nil { t.Fatalf("expected nil err, got %v", err) } got, err := os.ReadFile(path) if err != nil { t.Fatalf("read file: expected nil err, got %v", err) } want := []byte("hello") if !reflect.DeepEqual(got, want) { t.Errorf("read file: expected %v, got %v", want, got) } }) t.Run("binary", func(t *testing.T) { path := filepath.Join(dir, "data.bin") err = WriteFile(path, "data:application/octet-stream;base64,MTIz", 0444) if err != nil { t.Fatalf("expected nil err, got %v", err) } got, err := os.ReadFile(path) if err != nil { t.Fatalf("read file: expected nil err, got %v", err) } want := []byte("123") if !reflect.DeepEqual(got, want) { t.Errorf("read file: expected %v, got %v", want, got) } }) t.Run("perm", func(t *testing.T) { const perm = fs.FileMode(0444) path := filepath.Join(dir, "perm.txt") err = WriteFile(path, "hello", perm) if err != nil { t.Fatalf("expected nil err, got %v", err) } fileInfo, err := os.Stat(path) if err != nil { t.Fatalf("file not created: %s", err) } if fileInfo.Mode() != perm { t.Errorf("unexpected file permissions: got %v, want %v", fileInfo.Mode(), perm) } }) t.Run("missing data-url separator", func(t *testing.T) { path := filepath.Join(dir, "data.bin") err = WriteFile(path, "data:application/octet-stream:MTIz", 0444) if err == nil { t.Fatal("expected error, got nil") } }) t.Run("invalid binary value", func(t *testing.T) { path := filepath.Join(dir, "data.bin") err = WriteFile(path, "data:application/octet-stream;base64,12345", 0444) if err == nil { t.Fatal("expected error, got nil") } }) }