Gitfed
bastien-mrq/gitfed / cmd / gitfed-ctl / backup_test.go
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)
	}
}