internal/cli/kv_test.go (view raw)
1package cli
2
3import (
4 "fmt"
5 "strings"
6 "testing"
7)
8
9func TestKVListCommand(t *testing.T) {
10 c, _ := setupTestCommand(t)
11 ctx := t.Context()
12
13 seed := map[string]any{
14 "counter": 42,
15 "message": "hello world",
16 "a/b": "slash value",
17 }
18 for key, value := range seed {
19 if err := c.db.KVSet(ctx, key, value); err != nil {
20 t.Fatalf("seeding %q: %v", key, err)
21 }
22 }
23
24 out, err := executeCommand(c.rootCmd(), "kv", "list")
25 if err != nil {
26 t.Fatalf("kv list: %v", err)
27 }
28
29 for wantKey, wantValue := range seed {
30 if !strings.Contains(out, wantKey) {
31 t.Errorf("kv list output missing %q; got:\n%s", wantKey, out)
32 }
33 if !strings.Contains(out, fmt.Sprint(wantValue)) {
34 t.Errorf("kv list output missing %q; got:\n%s", wantValue, out)
35 }
36 }
37}
38
39func TestKVGetCommand(t *testing.T) {
40 c, _ := setupTestCommand(t)
41 ctx := t.Context()
42
43 if err := c.db.KVSet(ctx, "counter", 42); err != nil {
44 t.Fatal(err)
45 }
46 if err := c.db.KVSet(ctx, "a/b", "slash value"); err != nil {
47 t.Fatal(err)
48 }
49
50 // Plain key.
51 out, err := executeCommand(c.rootCmd(), "kv", "get", "counter")
52 if err != nil {
53 t.Fatalf("kv get counter: %v", err)
54 }
55 if got := strings.TrimSpace(out); got != "42" {
56 t.Errorf("kv get counter = %q, want %q", got, "42")
57 }
58
59 // Key containing a slash.
60 out, err = executeCommand(c.rootCmd(), "kv", "get", "a/b")
61 if err != nil {
62 t.Fatalf("kv get a/b: %v", err)
63 }
64 if got := strings.TrimSpace(out); got != "slash value" {
65 t.Errorf("kv get a/b = %q, want %q", got, "slash value")
66 }
67
68 // Missing key should error.
69 if _, err := executeCommand(c.rootCmd(), "kv", "get", "missing"); err == nil {
70 t.Error("kv get missing: expected error, got nil")
71 }
72}
73
74func TestKVPopCommand(t *testing.T) {
75 c, _ := setupTestCommand(t)
76 ctx := t.Context()
77
78 if err := c.db.KVSet(ctx, "counter", 42); err != nil {
79 t.Fatal(err)
80 }
81 if err := c.db.KVSet(ctx, "a/b", "slash value"); err != nil {
82 t.Fatal(err)
83 }
84
85 // Pop a plain key and confirm it returns the value and is deleted.
86 out, err := executeCommand(c.rootCmd(), "kv", "pop", "counter")
87 if err != nil {
88 t.Fatalf("kv pop counter: %v", err)
89 }
90 if got := strings.TrimSpace(out); got != "42" {
91 t.Errorf("kv pop counter = %q, want %q", got, "42")
92 }
93 if _, err := c.db.KVGet(ctx, "counter"); err == nil {
94 t.Error("counter still present after kv pop")
95 }
96
97 // Pop a key containing a slash.
98 out, err = executeCommand(c.rootCmd(), "kv", "pop", "a/b")
99 if err != nil {
100 t.Fatalf("kv pop a/b: %v", err)
101 }
102 if got := strings.TrimSpace(out); got != "slash value" {
103 t.Errorf("kv pop a/b = %q, want %q", got, "slash value")
104 }
105 if _, err := c.db.KVGet(ctx, "a/b"); err == nil {
106 t.Error("a/b still present after kv pop")
107 }
108
109 // Popping a missing key should error.
110 if _, err := executeCommand(c.rootCmd(), "kv", "pop", "missing"); err == nil {
111 t.Error("kv pop missing: expected error, got nil")
112 }
113}