|
8fe9b10…
|
lmata
|
1 |
package warden_test |
|
8fe9b10…
|
lmata
|
2 |
|
|
8fe9b10…
|
lmata
|
3 |
import ( |
|
8fe9b10…
|
lmata
|
4 |
"testing" |
|
8fe9b10…
|
lmata
|
5 |
"time" |
|
8fe9b10…
|
lmata
|
6 |
|
|
8fe9b10…
|
lmata
|
7 |
"github.com/conflicthq/scuttlebot/internal/bots/warden" |
|
8fe9b10…
|
lmata
|
8 |
) |
|
8fe9b10…
|
lmata
|
9 |
|
|
8fe9b10…
|
lmata
|
10 |
func newBot() *warden.Bot { |
|
3420a83…
|
lmata
|
11 |
return warden.New("localhost:6667", "pass", nil, |
|
8fe9b10…
|
lmata
|
12 |
map[string]warden.ChannelConfig{ |
|
8fe9b10…
|
lmata
|
13 |
"#fleet": {MessagesPerSecond: 5, Burst: 10, CoolDown: 60 * time.Second}, |
|
8fe9b10…
|
lmata
|
14 |
}, |
|
8fe9b10…
|
lmata
|
15 |
warden.ChannelConfig{MessagesPerSecond: 2, Burst: 5}, |
|
8fe9b10…
|
lmata
|
16 |
nil, |
|
8fe9b10…
|
lmata
|
17 |
) |
|
8fe9b10…
|
lmata
|
18 |
} |
|
8fe9b10…
|
lmata
|
19 |
|
|
8fe9b10…
|
lmata
|
20 |
func TestBotName(t *testing.T) { |
|
8fe9b10…
|
lmata
|
21 |
b := newBot() |
|
8fe9b10…
|
lmata
|
22 |
if b.Name() != "warden" { |
|
8fe9b10…
|
lmata
|
23 |
t.Errorf("Name(): got %q", b.Name()) |
|
8fe9b10…
|
lmata
|
24 |
} |
|
8fe9b10…
|
lmata
|
25 |
} |
|
8fe9b10…
|
lmata
|
26 |
|
|
8fe9b10…
|
lmata
|
27 |
func TestBotNew(t *testing.T) { |
|
8fe9b10…
|
lmata
|
28 |
b := newBot() |
|
8fe9b10…
|
lmata
|
29 |
if b == nil { |
|
8fe9b10…
|
lmata
|
30 |
t.Fatal("expected non-nil bot") |
|
8fe9b10…
|
lmata
|
31 |
} |
|
8fe9b10…
|
lmata
|
32 |
} |
|
8fe9b10…
|
lmata
|
33 |
|
|
8fe9b10…
|
lmata
|
34 |
func TestChannelConfigDefaults(t *testing.T) { |
|
8fe9b10…
|
lmata
|
35 |
// Zero-value config should get sane defaults applied. |
|
3420a83…
|
lmata
|
36 |
b := warden.New("localhost:6667", "pass", nil, |
|
8fe9b10…
|
lmata
|
37 |
nil, |
|
8fe9b10…
|
lmata
|
38 |
warden.ChannelConfig{}, // zero — should default |
|
8fe9b10…
|
lmata
|
39 |
nil, |
|
8fe9b10…
|
lmata
|
40 |
) |
|
8fe9b10…
|
lmata
|
41 |
if b == nil { |
|
8fe9b10…
|
lmata
|
42 |
t.Fatal("expected non-nil bot") |
|
8fe9b10…
|
lmata
|
43 |
} |
|
8fe9b10…
|
lmata
|
44 |
} |
|
8fe9b10…
|
lmata
|
45 |
|
|
8fe9b10…
|
lmata
|
46 |
func TestRateLimiterTokenBucket(t *testing.T) { |
|
8fe9b10…
|
lmata
|
47 |
// We test the rate limiter logic indirectly through the ChannelConfig. |
|
8fe9b10…
|
lmata
|
48 |
// The key invariant: high burst allows initial traffic, sustained rate is enforced. |
|
8fe9b10…
|
lmata
|
49 |
// Full rate-limit enforcement requires IRC wiring; this tests construction. |
|
8fe9b10…
|
lmata
|
50 |
cfg := warden.ChannelConfig{ |
|
8fe9b10…
|
lmata
|
51 |
MessagesPerSecond: 10, |
|
8fe9b10…
|
lmata
|
52 |
Burst: 20, |
|
8fe9b10…
|
lmata
|
53 |
CoolDown: 30 * time.Second, |
|
8fe9b10…
|
lmata
|
54 |
} |
|
3420a83…
|
lmata
|
55 |
b := warden.New("localhost:6667", "pass", nil, |
|
8fe9b10…
|
lmata
|
56 |
map[string]warden.ChannelConfig{"#fleet": cfg}, |
|
8fe9b10…
|
lmata
|
57 |
warden.ChannelConfig{}, |
|
8fe9b10…
|
lmata
|
58 |
nil, |
|
8fe9b10…
|
lmata
|
59 |
) |
|
8fe9b10…
|
lmata
|
60 |
if b == nil { |
|
8fe9b10…
|
lmata
|
61 |
t.Fatal("expected non-nil bot") |
|
8fe9b10…
|
lmata
|
62 |
} |
|
8fe9b10…
|
lmata
|
63 |
} |
|
8fe9b10…
|
lmata
|
64 |
|
|
8fe9b10…
|
lmata
|
65 |
func TestActionConstants(t *testing.T) { |
|
8fe9b10…
|
lmata
|
66 |
// Ensure action constants are stable. |
|
8fe9b10…
|
lmata
|
67 |
actions := map[warden.Action]string{ |
|
8fe9b10…
|
lmata
|
68 |
warden.ActionWarn: "warn", |
|
8fe9b10…
|
lmata
|
69 |
warden.ActionMute: "mute", |
|
8fe9b10…
|
lmata
|
70 |
warden.ActionKick: "kick", |
|
8fe9b10…
|
lmata
|
71 |
} |
|
8fe9b10…
|
lmata
|
72 |
for action, want := range actions { |
|
8fe9b10…
|
lmata
|
73 |
if string(action) != want { |
|
8fe9b10…
|
lmata
|
74 |
t.Errorf("Action constant: got %q, want %q", action, want) |
|
8fe9b10…
|
lmata
|
75 |
} |
|
8fe9b10…
|
lmata
|
76 |
} |
|
8fe9b10…
|
lmata
|
77 |
} |