From ae5494d32ea9d486f7cbab6d0edf209c4d85a24c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 3 Mar 2026 22:51:37 +0200 Subject: Task 352: add work cobra subcommands --- internal/cli/work_test.go | 100 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 internal/cli/work_test.go (limited to 'internal/cli/work_test.go') diff --git a/internal/cli/work_test.go b/internal/cli/work_test.go new file mode 100644 index 0000000..2e44e02 --- /dev/null +++ b/internal/cli/work_test.go @@ -0,0 +1,100 @@ +package cli + +import ( + "bytes" + "os" + "path/filepath" + "strings" + "testing" +) + +func TestWorkLoginStatusLogoutFlow(t *testing.T) { + dbDir := t.TempDir() + cfgPath := writeWorkConfig(t, dbDir, "host-a") + + out, err := runRootCommand("--config", cfgPath, "work", "login", "--at", "2026-01-05T09:00") + if err != nil { + t.Fatalf("work login error = %v (output: %q)", err, out) + } + if !strings.Contains(out, "Logged in:") { + t.Fatalf("unexpected login output: %q", out) + } + + out, err = runRootCommand("--config", cfgPath, "work", "status") + if err != nil { + t.Fatalf("work status error = %v (output: %q)", err, out) + } + if !strings.Contains(out, "Logged in: work") { + t.Fatalf("unexpected status output after login: %q", out) + } + + out, err = runRootCommand("--config", cfgPath, "work", "logout", "--at", "2026-01-05T18:00") + if err != nil { + t.Fatalf("work logout error = %v (output: %q)", err, out) + } + if !strings.Contains(out, "Logged out:") { + t.Fatalf("unexpected logout output: %q", out) + } + + out, err = runRootCommand("--config", cfgPath, "work", "status") + if err != nil { + t.Fatalf("work status error = %v (output: %q)", err, out) + } + if !strings.Contains(out, "Not logged in.") { + t.Fatalf("unexpected status output after logout: %q", out) + } +} + +func TestWorkAddSubUseBufferAndReport(t *testing.T) { + dbDir := t.TempDir() + cfgPath := writeWorkConfig(t, dbDir, "host-b") + + out, err := runRootCommand("--config", cfgPath, "work", "add", "1h", "--at", "2026-01-06T10:00") + if err != nil { + t.Fatalf("work add error = %v (output: %q)", err, out) + } + out, err = runRootCommand("--config", cfgPath, "work", "sub", "30m", "--at", "2026-01-06T11:00") + if err != nil { + t.Fatalf("work sub error = %v (output: %q)", err, out) + } + out, err = runRootCommand("--config", cfgPath, "work", "use-buffer", "15m", "--at", "2026-01-06T12:00") + if err != nil { + t.Fatalf("work use-buffer error = %v (output: %q)", err, out) + } + + out, err = runRootCommand("--config", cfgPath, "work", "report", "--no-color") + if err != nil { + t.Fatalf("work report error = %v (output: %q)", err, out) + } + if !strings.Contains(out, "work:") { + t.Fatalf("work report missing work field: %q", out) + } + if !strings.Contains(out, "buffer:") { + t.Fatalf("work report missing buffer field: %q", out) + } +} + +func writeWorkConfig(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 +} + +func runRootCommand(args ...string) (string, error) { + var out bytes.Buffer + cmd := NewRootCmd() + cmd.SetOut(&out) + cmd.SetErr(&out) + cmd.SetArgs(args) + err := cmd.Execute() + return out.String(), err +} -- cgit v1.2.3