summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-03 23:55:42 +0200
committerPaul Buetow <paul@buetow.org>2026-03-03 23:55:42 +0200
commita6df85f96e618de0e38edc90e10d2b3925b5c91f (patch)
tree8e23cf667e7ab36e08e55a5077c58c73f880feda
parent09b8aa9d74df0ef7d50858cd398efc8a952a1aad (diff)
timer: remove global state file override
-rw-r--r--internal/cli/timer_test.go9
-rw-r--r--internal/timer/operations_test.go6
-rw-r--r--internal/timer/timer.go38
-rw-r--r--internal/tui/timer_test.go9
-rw-r--r--internal/tui/tui_test.go8
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