package cli import ( "fmt" "strings" "testing" ) func TestKVListCommand(t *testing.T) { c, _ := setupTestCommand(t) ctx := t.Context() seed := map[string]any{ "counter": 42, "message": "hello world", "a/b": "slash value", } for key, value := range seed { if err := c.db.KVSet(ctx, key, value); err != nil { t.Fatalf("seeding %q: %v", key, err) } } out, err := executeCommand(c.rootCmd(), "kv", "list") if err != nil { t.Fatalf("kv list: %v", err) } for wantKey, wantValue := range seed { if !strings.Contains(out, wantKey) { t.Errorf("kv list output missing %q; got:\n%s", wantKey, out) } if !strings.Contains(out, fmt.Sprint(wantValue)) { t.Errorf("kv list output missing %q; got:\n%s", wantValue, out) } } } func TestKVGetCommand(t *testing.T) { c, _ := setupTestCommand(t) ctx := t.Context() if err := c.db.KVSet(ctx, "counter", 42); err != nil { t.Fatal(err) } if err := c.db.KVSet(ctx, "a/b", "slash value"); err != nil { t.Fatal(err) } // Plain key. out, err := executeCommand(c.rootCmd(), "kv", "get", "counter") if err != nil { t.Fatalf("kv get counter: %v", err) } if got := strings.TrimSpace(out); got != "42" { t.Errorf("kv get counter = %q, want %q", got, "42") } // Key containing a slash. out, err = executeCommand(c.rootCmd(), "kv", "get", "a/b") if err != nil { t.Fatalf("kv get a/b: %v", err) } if got := strings.TrimSpace(out); got != "slash value" { t.Errorf("kv get a/b = %q, want %q", got, "slash value") } // Missing key should error. if _, err := executeCommand(c.rootCmd(), "kv", "get", "missing"); err == nil { t.Error("kv get missing: expected error, got nil") } } func TestKVPopCommand(t *testing.T) { c, _ := setupTestCommand(t) ctx := t.Context() if err := c.db.KVSet(ctx, "counter", 42); err != nil { t.Fatal(err) } if err := c.db.KVSet(ctx, "a/b", "slash value"); err != nil { t.Fatal(err) } // Pop a plain key and confirm it returns the value and is deleted. out, err := executeCommand(c.rootCmd(), "kv", "pop", "counter") if err != nil { t.Fatalf("kv pop counter: %v", err) } if got := strings.TrimSpace(out); got != "42" { t.Errorf("kv pop counter = %q, want %q", got, "42") } if _, err := c.db.KVGet(ctx, "counter"); err == nil { t.Error("counter still present after kv pop") } // Pop a key containing a slash. out, err = executeCommand(c.rootCmd(), "kv", "pop", "a/b") if err != nil { t.Fatalf("kv pop a/b: %v", err) } if got := strings.TrimSpace(out); got != "slash value" { t.Errorf("kv pop a/b = %q, want %q", got, "slash value") } if _, err := c.db.KVGet(ctx, "a/b"); err == nil { t.Error("a/b still present after kv pop") } // Popping a missing key should error. if _, err := executeCommand(c.rootCmd(), "kv", "pop", "missing"); err == nil { t.Error("kv pop missing: expected error, got nil") } }