fix: accept zero retention limits, retire Store() for typed accessors
Phase 8 (PROJECT_REVIEW_PLAN.md 8.1): 0 in MaxLogFiles/MaxLogAgeDays now means "keep everything" end to end. runner.CleanupLogs already treated <= 0 as disabled; validateConfig, the Settings form, and loadOrCreateConfig's backfill were the only things making that state unreachable. Phase 9 (1.1, rolling up 1.2, 1.3, 7.3): added Service.Config() and Service.Paths(), copying under mu, and converted every UI site that read Service state through the raw *storage.Store returned by Store() (now removed). jobs_view's pause control is now driven by refreshView reading svc.Config().Paused on every event instead of only mirroring its own tap handler, which makes it an actual consumer of SchedulerStateChanged. mainwindow's event listener is a real type switch, and events.go's doc comment no longer claims a compiler exhaustiveness check Go doesn't have. Unexported the redundant SetAutostart/AutostartStatus package functions in platform/autostart now that only the Manager methods are used outside the package. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -183,6 +183,35 @@ func TestLoadOrCreateConfigCreatesDefaultsOnFirstRun(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestLoadOrCreateConfigPreservesZeroRetentionLimits verifies that 0 in
|
||||
// max_log_files / max_log_age_days is read back as 0 ("keep everything"), not
|
||||
// backfilled to the 100 / 30 defaults, since a config that already has the
|
||||
// field set is not the "field is missing" case loadOrCreateConfig backfills.
|
||||
func TestLoadOrCreateConfigPreservesZeroRetentionLimits(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
paths := Paths{
|
||||
AppDir: dir,
|
||||
ConfigPath: filepath.Join(dir, ConfigFileName),
|
||||
}
|
||||
want := domain.DefaultConfig()
|
||||
want.MaxLogFiles = 0
|
||||
want.MaxLogAgeDays = 0
|
||||
if err := writeJSON(paths.ConfigPath, want); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
got, err := loadOrCreateConfig(paths)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got.MaxLogFiles != 0 {
|
||||
t.Errorf("MaxLogFiles: got %d, want 0 (unlimited)", got.MaxLogFiles)
|
||||
}
|
||||
if got.MaxLogAgeDays != 0 {
|
||||
t.Errorf("MaxLogAgeDays: got %d, want 0 (unlimited)", got.MaxLogAgeDays)
|
||||
}
|
||||
}
|
||||
|
||||
// TestLoadOrCreateJobsSeedsSampleJobsOnFirstRun verifies that a missing
|
||||
// jobs.json is created with the sample jobs from defaultJobs, so a new user
|
||||
// sees scheduled and manual execution without inventing a command.
|
||||
|
||||
Reference in New Issue
Block a user