package main
import (
"os"
"path/filepath"
"testing"
"time"
)
func TestPruneBackupsKeepsNewest(t *testing.T) {
dir := t.TempDir()
backupDir := filepath.Join(dir, "backups")
if err := os.MkdirAll(backupDir, 0755); err != nil {
t.Fatal(err)
}
names := []string{
"gitfed-20260101T000000Z.tar.gz",
"gitfed-20260102T000000Z.tar.gz",
"gitfed-20260103T000000Z.tar.gz",
"gitfed-20260104T000000Z.tar.gz",
"gitfed-20260105T000000Z.tar.gz",
}
base := time.Now().Add(-time.Hour)
for i, n := range names {
p := filepath.Join(backupDir, n)
if err := os.WriteFile(p, []byte("x"), 0644); err != nil {
t.Fatal(err)
}
mtime := base.Add(time.Duration(i) * time.Minute)
if err := os.Chtimes(p, mtime, mtime); err != nil {
t.Fatal(err)
}
}
if err := pruneBackups(dir, 3); err != nil {
t.Fatalf("pruneBackups: %v", err)
}
remaining, err := filepath.Glob(filepath.Join(backupDir, "gitfed-*.tar.gz"))
if err != nil {
t.Fatal(err)
}
if len(remaining) != 3 {
t.Fatalf("expected 3 files remaining, got %d: %v", len(remaining), remaining)
}
for _, want := range names[2:] {
found := false
for _, r := range remaining {
if filepath.Base(r) == want {
found = true
}
}
if !found {
t.Errorf("expected newest file %s to survive pruning, remaining=%v", want, remaining)
}
}
}
func TestPruneBackupsNoopWhenUnderLimit(t *testing.T) {
dir := t.TempDir()
backupDir := filepath.Join(dir, "backups")
if err := os.MkdirAll(backupDir, 0755); err != nil {
t.Fatal(err)
}
p := filepath.Join(backupDir, "gitfed-20260101T000000Z.tar.gz")
if err := os.WriteFile(p, []byte("x"), 0644); err != nil {
t.Fatal(err)
}
if err := pruneBackups(dir, defaultBackupKeep); err != nil {
t.Fatalf("pruneBackups: %v", err)
}
if _, err := os.Stat(p); err != nil {
t.Errorf("expected file to survive when under the keep limit: %v", err)
}
}