ScuttleBot

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

Keyboard Shortcuts

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