package web import ( "fmt" "os" "path/filepath" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestListConfigBackupsNewestFirst(t *testing.T) { dir := t.TempDir() older := filepath.Join(dir, "2026-01-01-000000_mpv.conf") newer := filepath.Join(dir, "2026-01-02-000000_mpv.conf") other := filepath.Join(dir, "notes.txt") require.NoError(t, os.WriteFile(older, []byte("old"), 0600)) require.NoError(t, os.WriteFile(newer, []byte("new"), 0600)) require.NoError(t, os.WriteFile(other, []byte("x"), 0600)) oldTime := time.Date(2026, 1, 1, 0, 0, 0, 0, time.Local) newTime := time.Date(2026, 1, 2, 0, 0, 0, 0, time.Local) require.NoError(t, os.Chtimes(older, oldTime, oldTime)) require.NoError(t, os.Chtimes(newer, newTime, newTime)) backups := listConfigBackups(dir) require.Len(t, backups, 2) assert.Equal(t, "2026-01-02-000000_mpv.conf", backups[0].Filename) assert.Equal(t, filepath.Join(dir, "2026-01-02-000000_mpv.conf"), backups[0].FilePath) assert.Equal(t, newTime.Format("2006-01-02 15:04:05"), backups[0].CreatedDate) assert.Equal(t, "2026-01-01-000000_mpv.conf", backups[1].Filename) } func TestListConfigBackupsMissingDir(t *testing.T) { backups := listConfigBackups(filepath.Join(t.TempDir(), "does-not-exist")) assert.Empty(t, backups) } func TestListConfigBackupsIgnoresNonRegularConfEntries(t *testing.T) { dir := t.TempDir() realBackup := filepath.Join(dir, "real.conf") require.NoError(t, os.WriteFile(realBackup, []byte("backup"), 0600)) require.NoError(t, os.Mkdir(filepath.Join(dir, "directory.conf"), 0700)) if err := os.Symlink(realBackup, filepath.Join(dir, "link.conf")); err != nil { t.Skipf("symlinks unavailable: %v", err) } backups := listConfigBackups(dir) require.Len(t, backups, 1) assert.Equal(t, "real.conf", backups[0].Filename) } func TestBuildConfigBackupsListDataPaginates(t *testing.T) { backups := make([]ConfigBackup, 25) for i := range backups { backups[i] = ConfigBackup{Filename: fmt.Sprintf("backup-%02d.conf", i)} } first := buildConfigBackupsListData(backups, "", 0) assert.Len(t, first.ConfigBackups, configBackupsPageSize) assert.Equal(t, 25, first.Total) assert.Equal(t, 12, first.VisibleEnd) assert.Equal(t, 12, first.NextOffset) assert.True(t, first.HasMore) last := buildConfigBackupsListData(backups, "", 24) require.Len(t, last.ConfigBackups, 1) assert.Equal(t, "backup-24.conf", last.ConfigBackups[0].Filename) assert.Equal(t, 25, last.VisibleEnd) assert.False(t, last.HasMore) } func TestBuildConfigBackupsListDataSearchesMetadata(t *testing.T) { backups := []ConfigBackup{ {Filename: "alpha.conf", CreatedDate: "2026-01-02 00:00:00", FilePath: "/tmp/alpha.conf"}, {Filename: "beta.conf", CreatedDate: "2026-03-04 00:00:00", FilePath: "/archive/special/beta.conf"}, } byDate := buildConfigBackupsListData(backups, "03-04", 0) require.Len(t, byDate.ConfigBackups, 1) assert.Equal(t, "beta.conf", byDate.ConfigBackups[0].Filename) assert.Equal(t, 2, byDate.AllTotal) byPath := buildConfigBackupsListData(backups, "SPECIAL", 0) require.Len(t, byPath.ConfigBackups, 1) assert.Equal(t, "beta.conf", byPath.ConfigBackups[0].Filename) beyondEnd := buildConfigBackupsListData(backups, "", 99) assert.Empty(t, beyondEnd.ConfigBackups) assert.Equal(t, 2, beyondEnd.VisibleEnd) }