all repos — postern

@ v0.1.0-alpha

Modern mail management

clone
git clone https:///postern.git

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}