From e26089b6fb7030e3ba8be314c37603453520d2d4 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 26 Jun 2025 23:03:57 +0300 Subject: feat: Add raw and rawm status options This commit introduces two new options for the Status: Stopped Elapsed Time: 0s command: - 0: Displays the elapsed time in seconds. - 0: Displays the elapsed time in minutes. Unit tests have been added for both new functionalities, and the has been updated to reflect these changes. The status test has also been refactored to be more robust and less prone to flakiness by directly manipulating the timer state instead of relying on . --- internal/timer/operations.go | 28 ++++++++++++++++ internal/timer/operations_test.go | 70 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) (limited to 'internal') diff --git a/internal/timer/operations.go b/internal/timer/operations.go index 2b50e9e..6bb825d 100644 --- a/internal/timer/operations.go +++ b/internal/timer/operations.go @@ -74,6 +74,34 @@ func ResetTimer() (string, error) { return "Timer reset.", nil } +func GetRawStatus() (string, error) { + state, err := LoadState() + if err != nil { + return "", fmt.Errorf("error loading state: %w", err) + } + + elapsed := state.ElapsedTime + if state.Running { + elapsed += time.Since(state.StartTime) + } + + return fmt.Sprintf("%d", int(elapsed.Seconds())), nil +} + +func GetRawMinutesStatus() (string, error) { + state, err := LoadState() + if err != nil { + return "", fmt.Errorf("error loading state: %w", err) + } + + elapsed := state.ElapsedTime + if state.Running { + elapsed += time.Since(state.StartTime) + } + + return fmt.Sprintf("%d", int(elapsed.Minutes())), nil +} + func GetPromptStatus() (string, error) { state, err := LoadState() if err != nil { diff --git a/internal/timer/operations_test.go b/internal/timer/operations_test.go index 39029b0..dc06941 100644 --- a/internal/timer/operations_test.go +++ b/internal/timer/operations_test.go @@ -108,6 +108,76 @@ func TestGetStatus(t *testing.T) { } } +func TestGetRawStatus(t *testing.T) { + setup(t) + + // Raw status when stopped + msg, err := GetRawStatus() + if err != nil { + t.Fatalf("GetRawStatus() error = %v", err) + } + want := "0" + if msg != want { + t.Errorf("GetRawStatus() msg = %q, want %q", msg, want) + } + + // Raw status when running + state, err := LoadState() + if err != nil { + t.Fatalf("LoadState() error = %v", err) + } + state.Running = true + state.StartTime = time.Now().Add(-2 * time.Second) // Set start time 2 seconds ago + state.ElapsedTime = 0 // Reset elapsed time for this specific test + if err := state.Save(); err != nil { + t.Fatalf("Save() error = %v", err) + } + + msg, err = GetRawStatus() + if err != nil { + t.Fatalf("GetRawStatus() error = %v", err) + } + want = "2" + if msg != want { + t.Errorf("GetRawStatus() msg = %q, want %q", msg, want) + } +} + +func TestGetRawMinutesStatus(t *testing.T) { + setup(t) + + // Raw minutes status when stopped + msg, err := GetRawMinutesStatus() + if err != nil { + t.Fatalf("GetRawMinutesStatus() error = %v", err) + } + want := "0" + if msg != want { + t.Errorf("GetRawMinutesStatus() msg = %q, want %q", msg, want) + } + + // Raw minutes status when running (simulating 2 minutes) + state, err := LoadState() + if err != nil { + t.Fatalf("LoadState() error = %v", err) + } + state.Running = true + state.StartTime = time.Now().Add(-2 * time.Minute) // Set start time 2 minutes ago + state.ElapsedTime = 0 // Reset elapsed time for this specific test + if err := state.Save(); err != nil { + t.Fatalf("Save() error = %v", err) + } + + msg, err = GetRawMinutesStatus() + if err != nil { + t.Fatalf("GetRawMinutesStatus() error = %v", err) + } + want = "2" + if msg != want { + t.Errorf("GetRawMinutesStatus() msg = %q, want %q", msg, want) + } +} + func TestResetTimer(t *testing.T) { setup(t) -- cgit v1.2.3