ScuttleBot

scuttlebot / internal / store / store_test.go
Source Blame History 153 lines
0e78954… lmata 1 package store
0e78954… lmata 2
0e78954… lmata 3 import (
0e78954… lmata 4 "testing"
0e78954… lmata 5 "time"
0e78954… lmata 6 )
0e78954… lmata 7
0e78954… lmata 8 func openTest(t *testing.T) *Store {
0e78954… lmata 9 t.Helper()
0e78954… lmata 10 s, err := Open("sqlite", ":memory:")
0e78954… lmata 11 if err != nil {
0e78954… lmata 12 t.Fatalf("Open: %v", err)
0e78954… lmata 13 }
0e78954… lmata 14 t.Cleanup(func() { s.Close() })
0e78954… lmata 15 return s
0e78954… lmata 16 }
0e78954… lmata 17
0e78954… lmata 18 func TestAgentUpsertAndList(t *testing.T) {
0e78954… lmata 19 s := openTest(t)
0e78954… lmata 20
0e78954… lmata 21 cfg := []byte(`{"channels":["#general"]}`)
0e78954… lmata 22 r := &AgentRow{
0e78954… lmata 23 Nick: "claude-repo-abc1",
0e78954… lmata 24 Type: "worker",
0e78954… lmata 25 Config: cfg,
0e78954… lmata 26 CreatedAt: time.Now().UTC().Truncate(time.Second),
0e78954… lmata 27 Revoked: false,
0e78954… lmata 28 }
0e78954… lmata 29
0e78954… lmata 30 if err := s.AgentUpsert(r); err != nil {
0e78954… lmata 31 t.Fatalf("AgentUpsert: %v", err)
0e78954… lmata 32 }
0e78954… lmata 33
0e78954… lmata 34 rows, err := s.AgentList()
0e78954… lmata 35 if err != nil {
0e78954… lmata 36 t.Fatalf("AgentList: %v", err)
0e78954… lmata 37 }
0e78954… lmata 38 if len(rows) != 1 {
0e78954… lmata 39 t.Fatalf("want 1 agent, got %d", len(rows))
0e78954… lmata 40 }
0e78954… lmata 41 if rows[0].Nick != r.Nick {
0e78954… lmata 42 t.Errorf("nick = %q, want %q", rows[0].Nick, r.Nick)
0e78954… lmata 43 }
0e78954… lmata 44 if string(rows[0].Config) != string(cfg) {
0e78954… lmata 45 t.Errorf("config = %q, want %q", rows[0].Config, cfg)
0e78954… lmata 46 }
0e78954… lmata 47
0e78954… lmata 48 // Upsert again with Revoked=true.
0e78954… lmata 49 r.Revoked = true
0e78954… lmata 50 if err := s.AgentUpsert(r); err != nil {
0e78954… lmata 51 t.Fatalf("AgentUpsert (revoke): %v", err)
0e78954… lmata 52 }
0e78954… lmata 53 rows, err = s.AgentList()
0e78954… lmata 54 if err != nil {
0e78954… lmata 55 t.Fatalf("AgentList: %v", err)
0e78954… lmata 56 }
0e78954… lmata 57 if !rows[0].Revoked {
0e78954… lmata 58 t.Error("expected revoked=true after upsert")
0e78954… lmata 59 }
0e78954… lmata 60 }
0e78954… lmata 61
0e78954… lmata 62 func TestAgentDelete(t *testing.T) {
0e78954… lmata 63 s := openTest(t)
0e78954… lmata 64
0e78954… lmata 65 r := &AgentRow{Nick: "test-nick", Type: "worker", Config: []byte(`{}`), CreatedAt: time.Now()}
0e78954… lmata 66 if err := s.AgentUpsert(r); err != nil {
0e78954… lmata 67 t.Fatal(err)
0e78954… lmata 68 }
0e78954… lmata 69 if err := s.AgentDelete("test-nick"); err != nil {
0e78954… lmata 70 t.Fatal(err)
0e78954… lmata 71 }
0e78954… lmata 72 rows, err := s.AgentList()
0e78954… lmata 73 if err != nil {
0e78954… lmata 74 t.Fatal(err)
0e78954… lmata 75 }
0e78954… lmata 76 if len(rows) != 0 {
0e78954… lmata 77 t.Errorf("expected 0 agents after delete, got %d", len(rows))
0e78954… lmata 78 }
0e78954… lmata 79 }
0e78954… lmata 80
0e78954… lmata 81 func TestAdminUpsertListDelete(t *testing.T) {
0e78954… lmata 82 s := openTest(t)
0e78954… lmata 83
0e78954… lmata 84 r := &AdminRow{
0e78954… lmata 85 Username: "admin",
0e78954… lmata 86 Hash: []byte("$2a$10$fakehashabcdefghijklmnopqrstuvwx"),
0e78954… lmata 87 CreatedAt: time.Now().UTC().Truncate(time.Second),
0e78954… lmata 88 }
0e78954… lmata 89 if err := s.AdminUpsert(r); err != nil {
0e78954… lmata 90 t.Fatalf("AdminUpsert: %v", err)
0e78954… lmata 91 }
0e78954… lmata 92
0e78954… lmata 93 rows, err := s.AdminList()
0e78954… lmata 94 if err != nil {
0e78954… lmata 95 t.Fatalf("AdminList: %v", err)
0e78954… lmata 96 }
0e78954… lmata 97 if len(rows) != 1 {
0e78954… lmata 98 t.Fatalf("want 1 admin, got %d", len(rows))
0e78954… lmata 99 }
0e78954… lmata 100 if rows[0].Username != "admin" {
0e78954… lmata 101 t.Errorf("username = %q, want admin", rows[0].Username)
0e78954… lmata 102 }
0e78954… lmata 103 if string(rows[0].Hash) != string(r.Hash) {
0e78954… lmata 104 t.Errorf("hash mismatch after round-trip")
0e78954… lmata 105 }
0e78954… lmata 106
0e78954… lmata 107 if err := s.AdminDelete("admin"); err != nil {
0e78954… lmata 108 t.Fatal(err)
0e78954… lmata 109 }
0e78954… lmata 110 rows, err = s.AdminList()
0e78954… lmata 111 if err != nil {
0e78954… lmata 112 t.Fatal(err)
0e78954… lmata 113 }
0e78954… lmata 114 if len(rows) != 0 {
0e78954… lmata 115 t.Errorf("expected 0 admins after delete, got %d", len(rows))
0e78954… lmata 116 }
0e78954… lmata 117 }
0e78954… lmata 118
0e78954… lmata 119 func TestPolicyGetSet(t *testing.T) {
0e78954… lmata 120 s := openTest(t)
0e78954… lmata 121
0e78954… lmata 122 // No policy yet — should return nil.
0e78954… lmata 123 data, err := s.PolicyGet()
0e78954… lmata 124 if err != nil {
0e78954… lmata 125 t.Fatalf("PolicyGet (empty): %v", err)
0e78954… lmata 126 }
0e78954… lmata 127 if data != nil {
0e78954… lmata 128 t.Errorf("expected nil before first set, got %q", data)
0e78954… lmata 129 }
0e78954… lmata 130
0e78954… lmata 131 blob := []byte(`{"behaviors":[]}`)
0e78954… lmata 132 if err := s.PolicySet(blob); err != nil {
0e78954… lmata 133 t.Fatalf("PolicySet: %v", err)
0e78954… lmata 134 }
0e78954… lmata 135
0e78954… lmata 136 got, err := s.PolicyGet()
0e78954… lmata 137 if err != nil {
0e78954… lmata 138 t.Fatalf("PolicyGet: %v", err)
0e78954… lmata 139 }
0e78954… lmata 140 if string(got) != string(blob) {
0e78954… lmata 141 t.Errorf("PolicyGet = %q, want %q", got, blob)
0e78954… lmata 142 }
0e78954… lmata 143
0e78954… lmata 144 // Overwrite.
0e78954… lmata 145 blob2 := []byte(`{"behaviors":[{"id":"scribe"}]}`)
0e78954… lmata 146 if err := s.PolicySet(blob2); err != nil {
0e78954… lmata 147 t.Fatalf("PolicySet (overwrite): %v", err)
0e78954… lmata 148 }
0e78954… lmata 149 got2, _ := s.PolicyGet()
0e78954… lmata 150 if string(got2) != string(blob2) {
0e78954… lmata 151 t.Errorf("PolicyGet after overwrite = %q, want %q", got2, blob2)
0e78954… lmata 152 }
0e78954… lmata 153 }

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button