diff options
Diffstat (limited to 'internal/cli/root_test.go')
| -rw-r--r-- | internal/cli/root_test.go | 122 |
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 +} |
