Files
BackupX/server/internal/backup/file_runner_test.go
2026-03-17 13:29:09 +08:00

70 lines
2.3 KiB
Go

package backup
import (
"archive/tar"
"context"
"os"
"path/filepath"
"testing"
)
type bufferWriter struct{ lines []string }
func (w *bufferWriter) WriteLine(message string) { w.lines = append(w.lines, message) }
func TestFileRunnerRunAndRestore(t *testing.T) {
tempDir := t.TempDir()
sourceDir := filepath.Join(tempDir, "site")
if err := os.MkdirAll(filepath.Join(sourceDir, "node_modules"), 0o755); err != nil {
t.Fatalf("MkdirAll returned error: %v", err)
}
if err := os.WriteFile(filepath.Join(sourceDir, "index.html"), []byte("ok"), 0o644); err != nil {
t.Fatalf("WriteFile returned error: %v", err)
}
if err := os.WriteFile(filepath.Join(sourceDir, "app.log"), []byte("skip"), 0o644); err != nil {
t.Fatalf("WriteFile returned error: %v", err)
}
if err := os.WriteFile(filepath.Join(sourceDir, "node_modules", "pkg.json"), []byte("skip-dir"), 0o644); err != nil {
t.Fatalf("WriteFile returned error: %v", err)
}
runner := NewFileRunner()
writer := &bufferWriter{}
result, err := runner.Run(context.Background(), TaskSpec{Name: "site files", Type: "file", SourcePath: sourceDir, ExcludePatterns: []string{"*.log", "node_modules"}}, writer)
if err != nil {
t.Fatalf("Run returned error: %v", err)
}
archiveFile, err := os.Open(result.ArtifactPath)
if err != nil {
t.Fatalf("Open returned error: %v", err)
}
defer archiveFile.Close()
reader := tar.NewReader(archiveFile)
entries := map[string]bool{}
for {
header, err := reader.Next()
if err != nil {
break
}
entries[header.Name] = true
}
if !entries["site/index.html"] {
t.Fatalf("expected site/index.html in archive, got %#v", entries)
}
if entries["site/app.log"] || entries["site/node_modules/pkg.json"] {
t.Fatalf("unexpected excluded entries: %#v", entries)
}
if err := os.RemoveAll(sourceDir); err != nil {
t.Fatalf("RemoveAll returned error: %v", err)
}
if err := runner.Restore(context.Background(), TaskSpec{Name: "site files", Type: "file", SourcePath: sourceDir}, result.ArtifactPath, writer); err != nil {
t.Fatalf("Restore returned error: %v", err)
}
content, err := os.ReadFile(filepath.Join(sourceDir, "index.html"))
if err != nil {
t.Fatalf("ReadFile returned error: %v", err)
}
if string(content) != "ok" {
t.Fatalf("unexpected restored content: %s", string(content))
}
}