Changeset 0.11.0 (#62)
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestMatch(t *testing.T) {
|
||||
@@ -112,6 +113,12 @@ func TestRouteFor(t *testing.T) {
|
||||
{"unknown.event", DirLocal}, // default
|
||||
{"ping", DirFromClient},
|
||||
{"pong", DirToClient},
|
||||
// Tool bridge routes
|
||||
{"tool.call.abc123", DirToClient},
|
||||
{"tool.result.abc123", DirFromClient},
|
||||
// Extension lifecycle
|
||||
{"extension.loaded", DirLocal},
|
||||
{"extension.error", DirLocal},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
@@ -121,3 +128,84 @@ func TestRouteFor(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWaitFor_Success(t *testing.T) {
|
||||
bus := NewBus()
|
||||
|
||||
// Publish after a short delay
|
||||
go func() {
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
bus.Publish(Event{
|
||||
Label: "tool.result.abc123",
|
||||
Payload: json.RawMessage(`{"result":"hello"}`),
|
||||
})
|
||||
}()
|
||||
|
||||
event, ok := bus.WaitFor("tool.result.abc123", 1*time.Second)
|
||||
if !ok {
|
||||
t.Fatal("WaitFor timed out, expected success")
|
||||
}
|
||||
if event.Label != "tool.result.abc123" {
|
||||
t.Errorf("expected label tool.result.abc123, got %s", event.Label)
|
||||
}
|
||||
if string(event.Payload) != `{"result":"hello"}` {
|
||||
t.Errorf("unexpected payload: %s", string(event.Payload))
|
||||
}
|
||||
}
|
||||
|
||||
func TestWaitFor_Timeout(t *testing.T) {
|
||||
bus := NewBus()
|
||||
|
||||
_, ok := bus.WaitFor("tool.result.never", 50*time.Millisecond)
|
||||
if ok {
|
||||
t.Error("WaitFor should have timed out")
|
||||
}
|
||||
}
|
||||
|
||||
func TestWaitFor_IgnoresOtherLabels(t *testing.T) {
|
||||
bus := NewBus()
|
||||
|
||||
go func() {
|
||||
time.Sleep(5 * time.Millisecond)
|
||||
bus.Publish(Event{Label: "tool.result.other", Payload: json.RawMessage(`{}`)})
|
||||
time.Sleep(5 * time.Millisecond)
|
||||
bus.Publish(Event{Label: "tool.result.target", Payload: json.RawMessage(`{"ok":true}`)})
|
||||
}()
|
||||
|
||||
event, ok := bus.WaitFor("tool.result.target", 1*time.Second)
|
||||
if !ok {
|
||||
t.Fatal("WaitFor timed out")
|
||||
}
|
||||
if event.Label != "tool.result.target" {
|
||||
t.Errorf("got wrong label: %s", event.Label)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWaitFor_CleansUpSubscription(t *testing.T) {
|
||||
bus := NewBus()
|
||||
|
||||
// WaitFor with immediate timeout
|
||||
bus.WaitFor("tool.result.cleanup", 1*time.Millisecond)
|
||||
time.Sleep(5 * time.Millisecond)
|
||||
|
||||
// Verify no panic when publishing to the label after cleanup
|
||||
bus.Publish(Event{Label: "tool.result.cleanup", Payload: json.RawMessage(`{}`)})
|
||||
}
|
||||
|
||||
func TestToolCallRouteToClient(t *testing.T) {
|
||||
if !ShouldSendToClient("tool.call.abc123") {
|
||||
t.Error("tool.call.* should be sent to client")
|
||||
}
|
||||
if ShouldAcceptFromClient("tool.call.abc123") {
|
||||
t.Error("tool.call.* should NOT be accepted from client")
|
||||
}
|
||||
}
|
||||
|
||||
func TestToolResultRouteFromClient(t *testing.T) {
|
||||
if !ShouldAcceptFromClient("tool.result.abc123") {
|
||||
t.Error("tool.result.* should be accepted from client")
|
||||
}
|
||||
if ShouldSendToClient("tool.result.abc123") {
|
||||
t.Error("tool.result.* should NOT be sent to client")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user