diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-03 23:55:42 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-03 23:55:42 +0200 |
| commit | a6df85f96e618de0e38edc90e10d2b3925b5c91f (patch) | |
| tree | 8e23cf667e7ab36e08e55a5077c58c73f880feda | |
| parent | 09b8aa9d74df0ef7d50858cd398efc8a952a1aad (diff) | |
timer: remove global state file override
| -rw-r--r-- | internal/cli/timer_test.go | 9 | ||||
| -rw-r--r-- | internal/timer/operations_test.go | 6 | ||||
| -rw-r--r-- | internal/timer/timer.go | 38 | ||||
| -rw-r--r-- | internal/tui/timer_test.go | 9 | ||||
| -rw-r--r-- | internal/tui/tui_test.go | 8 |
5 files changed, 31 insertions, 39 deletions
diff --git a/internal/cli/timer_test.go b/internal/cli/timer_test.go index 32b9b8b..572d5a0 100644 --- a/internal/cli/timer_test.go +++ b/internal/cli/timer_test.go @@ -2,12 +2,10 @@ package cli import ( "bytes" - "path/filepath" "strings" "testing" "time" - timrTimer "codeberg.org/snonux/timr/internal/timer" "codeberg.org/snonux/timr/internal/worktime" ) @@ -142,10 +140,7 @@ func TestTimerAutoWorktimeSyncIgnoresNotLoggedInOnStop(t *testing.T) { func setupTimerState(t *testing.T) { t.Helper() - tempDir := t.TempDir() - timrTimer.SetStateFilePathOverride(filepath.Join(tempDir, ".timr_state")) - t.Cleanup(func() { - timrTimer.SetStateFilePathOverride("") - }) + t.Setenv("XDG_CONFIG_HOME", tempDir) + t.Setenv("HOME", tempDir) } diff --git a/internal/timer/operations_test.go b/internal/timer/operations_test.go index 557631c..efdc492 100644 --- a/internal/timer/operations_test.go +++ b/internal/timer/operations_test.go @@ -13,10 +13,8 @@ import ( func setup(t *testing.T) { t.Helper() tempDir := t.TempDir() - StateFilePathOverride = filepath.Join(tempDir, ".timr_state") - t.Cleanup(func() { - StateFilePathOverride = "" - }) + t.Setenv("XDG_CONFIG_HOME", tempDir) + t.Setenv("HOME", tempDir) } func TestStartTimer(t *testing.T) { diff --git a/internal/timer/timer.go b/internal/timer/timer.go index 272233a..0e29199 100644 --- a/internal/timer/timer.go +++ b/internal/timer/timer.go @@ -4,6 +4,7 @@ import ( "encoding/json" "os" "path/filepath" + "strings" "time" ) @@ -11,33 +12,36 @@ const ( stateFile = ".timr_state" ) -// StateFilePathOverride is used by tests to override the state file path. -var StateFilePathOverride string - -func SetStateFilePathOverride(path string) { - StateFilePathOverride = path -} - type State struct { - StartTime time.Time - ElapsedTime time.Duration - Running bool + StartTime time.Time + ElapsedTime time.Duration + Running bool } -func GetStateFile() (string, error) { - if StateFilePathOverride != "" { - return StateFilePathOverride, nil +func resolveStateFilePath(path string) (string, error) { + if strings.TrimSpace(path) != "" { + return path, nil } + configDir, err := os.UserConfigDir() if err != nil { return "", err } + return filepath.Join(configDir, "timr", stateFile), nil } +func GetStateFile() (string, error) { + return resolveStateFilePath("") +} + func LoadState() (State, error) { + return LoadStateAt("") +} + +func LoadStateAt(path string) (State, error) { var state State - stateFilePath, err := GetStateFile() + stateFilePath, err := resolveStateFilePath(path) if err != nil { return state, err } @@ -55,12 +59,16 @@ func LoadState() (State, error) { } func (s *State) Save() error { + return s.SaveAt("") +} + +func (s *State) SaveAt(path string) error { data, err := json.Marshal(s) if err != nil { return err } - stateFilePath, err := GetStateFile() + stateFilePath, err := resolveStateFilePath(path) if err != nil { return err } diff --git a/internal/tui/timer_test.go b/internal/tui/timer_test.go index 4c420ce..6263c09 100644 --- a/internal/tui/timer_test.go +++ b/internal/tui/timer_test.go @@ -1,11 +1,9 @@ package tui import ( - "path/filepath" "testing" "codeberg.org/snonux/timr/internal/config" - timrTimer "codeberg.org/snonux/timr/internal/timer" "codeberg.org/snonux/timr/internal/worktime" tea "github.com/charmbracelet/bubbletea" ) @@ -84,10 +82,7 @@ func TestTimerModelWorkToggleWhenDisabled(t *testing.T) { func setupTimerStateForTUI(t *testing.T) { t.Helper() - tempDir := t.TempDir() - timrTimer.SetStateFilePathOverride(filepath.Join(tempDir, ".timr_state")) - t.Cleanup(func() { - timrTimer.SetStateFilePathOverride("") - }) + t.Setenv("XDG_CONFIG_HOME", tempDir) + t.Setenv("HOME", tempDir) } diff --git a/internal/tui/tui_test.go b/internal/tui/tui_test.go index efeb005..26fe216 100644 --- a/internal/tui/tui_test.go +++ b/internal/tui/tui_test.go @@ -1,12 +1,10 @@ package tui import ( - "path/filepath" "strings" "testing" "codeberg.org/snonux/timr/internal/config" - timrTimer "codeberg.org/snonux/timr/internal/timer" tea "github.com/charmbracelet/bubbletea" ) @@ -94,10 +92,8 @@ func newRootModelForTest(t *testing.T) *Model { t.Helper() tempDir := t.TempDir() - timrTimer.SetStateFilePathOverride(filepath.Join(tempDir, ".timr_state")) - t.Cleanup(func() { - timrTimer.SetStateFilePathOverride("") - }) + t.Setenv("XDG_CONFIG_HOME", tempDir) + t.Setenv("HOME", tempDir) cfg := config.Default() cfg.WorktimeDBDir = tempDir |
