summaryrefslogtreecommitdiff
path: root/internal/cli/root_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-04 10:50:07 +0200
committerPaul Buetow <paul@buetow.org>2026-03-04 10:50:07 +0200
commit97aa8a6f666f5f40859c8a9aa4948bde435cf18f (patch)
tree0cb5928cd6a1220607dbf64e234a2522acac2848 /internal/cli/root_test.go
parentc25c9002f3214e07b041aefa26d5d13c26757839 (diff)
Rename project to timesamurai and release v0.5.0v0.5.0
Diffstat (limited to 'internal/cli/root_test.go')
-rw-r--r--internal/cli/root_test.go122
1 files changed, 117 insertions, 5 deletions
diff --git a/internal/cli/root_test.go b/internal/cli/root_test.go
index 2b12514..e1f74b1 100644
--- a/internal/cli/root_test.go
+++ b/internal/cli/root_test.go
@@ -7,8 +7,10 @@ import (
"path/filepath"
"strings"
"testing"
+ "time"
- timr "codeberg.org/snonux/timr/internal"
+ timesamurai "codeberg.org/snonux/timesamurai/internal"
+ "codeberg.org/snonux/timesamurai/internal/worktime"
)
func TestRootVersionFlag(t *testing.T) {
@@ -22,8 +24,8 @@ func TestRootVersionFlag(t *testing.T) {
t.Fatalf("Execute() error = %v", err)
}
- if strings.TrimSpace(out.String()) != timr.Version {
- t.Fatalf("output = %q, want %q", strings.TrimSpace(out.String()), timr.Version)
+ if strings.TrimSpace(out.String()) != timesamurai.Version {
+ t.Fatalf("output = %q, want %q", strings.TrimSpace(out.String()), timesamurai.Version)
}
}
@@ -96,8 +98,8 @@ func TestVersionSkipsConfigLoading(t *testing.T) {
t.Fatalf("Execute() error = %v", err)
}
- if strings.TrimSpace(out.String()) != timr.Version {
- t.Fatalf("output = %q, want %q", strings.TrimSpace(out.String()), timr.Version)
+ if strings.TrimSpace(out.String()) != timesamurai.Version {
+ t.Fatalf("output = %q, want %q", strings.TrimSpace(out.String()), timesamurai.Version)
}
}
@@ -124,3 +126,113 @@ func TestRootUsesDefaultConfigWhenNoFileExists(t *testing.T) {
t.Fatalf("WorktimeDBDir = %q, want %q", cfg.WorktimeDBDir, wantDir)
}
}
+
+func TestRootCheckDBIntegrityPasses(t *testing.T) {
+ dbDir := t.TempDir()
+ host := "host-a"
+
+ if _, err := worktime.Login(dbDir, host, "work", time.Unix(100, 0), ""); err != nil {
+ t.Fatalf("Login() error = %v", err)
+ }
+ if _, err := worktime.Logout(dbDir, host, "work", time.Unix(200, 0), ""); err != nil {
+ t.Fatalf("Logout() error = %v", err)
+ }
+
+ cfgPath := writeRootConfig(t, dbDir, host)
+
+ var out bytes.Buffer
+ cmd := NewRootCmd()
+ cmd.SetOut(&out)
+ cmd.SetErr(&out)
+ cmd.SetArgs([]string{"--config", cfgPath, "--check-db-integrity"})
+
+ if err := cmd.Execute(); err != nil {
+ t.Fatalf("Execute() error = %v (output: %q)", err, out.String())
+ }
+ if !strings.Contains(out.String(), "Database integrity check passed.") {
+ t.Fatalf("unexpected output: %q", out.String())
+ }
+}
+
+func TestRootCheckDBIntegrityFailsOnIssues(t *testing.T) {
+ dbDir := t.TempDir()
+ host := "host-a"
+
+ db := worktime.Database{
+ Entries: map[string][]worktime.Entry{
+ host: {
+ {
+ Action: "logout",
+ What: "work",
+ Epoch: 100,
+ Source: host,
+ Human: time.Unix(100, 0).Format("Mon 02.01.2006 15:04:05"),
+ },
+ },
+ },
+ }
+ if err := worktime.SaveHost(dbDir, host, db); err != nil {
+ t.Fatalf("SaveHost() error = %v", err)
+ }
+
+ cfgPath := writeRootConfig(t, dbDir, host)
+
+ var out bytes.Buffer
+ cmd := NewRootCmd()
+ cmd.SetOut(&out)
+ cmd.SetErr(&out)
+ cmd.SetArgs([]string{"--config", cfgPath, "--check-db-integrity"})
+
+ err := cmd.Execute()
+ if err == nil {
+ t.Fatal("Execute() error = nil, want integrity failure")
+ }
+ if !strings.Contains(err.Error(), "database integrity check failed") {
+ t.Fatalf("Execute() error = %v, want integrity failure", err)
+ }
+ if !strings.Contains(out.String(), "Database integrity check found") {
+ t.Fatalf("unexpected output: %q", out.String())
+ }
+}
+
+func TestRootCheckDBIntegrityWarnsForOpenSession(t *testing.T) {
+ dbDir := t.TempDir()
+ host := "host-a"
+
+ if _, err := worktime.Login(dbDir, host, "work", time.Unix(100, 0), ""); err != nil {
+ t.Fatalf("Login() error = %v", err)
+ }
+
+ cfgPath := writeRootConfig(t, dbDir, host)
+
+ var out bytes.Buffer
+ cmd := NewRootCmd()
+ cmd.SetOut(&out)
+ cmd.SetErr(&out)
+ cmd.SetArgs([]string{"--config", cfgPath, "--check-db-integrity"})
+
+ if err := cmd.Execute(); err != nil {
+ t.Fatalf("Execute() error = %v (output: %q)", err, out.String())
+ }
+ if !strings.Contains(out.String(), "Database integrity check passed.") {
+ t.Fatalf("unexpected output: %q", out.String())
+ }
+ if !strings.Contains(out.String(), "Warning: currently logged in") {
+ t.Fatalf("expected open-session warning in output: %q", out.String())
+ }
+}
+
+func writeRootConfig(t *testing.T, dbDir, host string) string {
+ t.Helper()
+
+ content := `{
+ "worktime_db_dir": "` + dbDir + `",
+ "hostname": "` + host + `"
+}
+`
+ path := filepath.Join(t.TempDir(), "config.json")
+ if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
+ t.Fatalf("write config file: %v", err)
+ }
+ return path
+}