Files
picoclaw/pkg/session/allocator_test.go
T

102 lines
3.5 KiB
Go

package session
import (
"testing"
"github.com/sipeed/picoclaw/pkg/bus"
"github.com/sipeed/picoclaw/pkg/routing"
)
func TestAllocateRouteSession_PerPeerDM(t *testing.T) {
allocation := AllocateRouteSession(AllocationInput{
AgentID: "main",
Context: bus.InboundContext{
Channel: "telegram",
Account: "default",
ChatID: "dm-123",
ChatType: "direct",
SenderID: "User123",
},
SessionPolicy: routing.SessionPolicy{
Dimensions: []string{"sender"},
},
})
if allocation.SessionKey == "" || !IsOpaqueSessionKey(allocation.SessionKey) {
t.Fatalf("SessionKey = %q, want opaque session key", allocation.SessionKey)
}
if !containsAlias(allocation.SessionAliases, "agent:main:direct:user123") {
t.Fatalf("SessionAliases = %v, want to contain agent:main:direct:user123", allocation.SessionAliases)
}
if allocation.MainSessionKey == "" || !IsOpaqueSessionKey(allocation.MainSessionKey) {
t.Fatalf("MainSessionKey = %q, want opaque session key", allocation.MainSessionKey)
}
if len(allocation.MainAliases) != 1 || allocation.MainAliases[0] != "agent:main:main" {
t.Fatalf("MainAliases = %v, want [agent:main:main]", allocation.MainAliases)
}
if allocation.Scope.Version != ScopeVersionV1 {
t.Fatalf("Scope.Version = %d, want %d", allocation.Scope.Version, ScopeVersionV1)
}
if len(allocation.Scope.Dimensions) != 1 || allocation.Scope.Dimensions[0] != "sender" {
t.Fatalf("Scope.Dimensions = %v, want [sender]", allocation.Scope.Dimensions)
}
if allocation.Scope.Values["sender"] != "user123" {
t.Fatalf("Scope.Values[sender] = %q, want user123", allocation.Scope.Values["sender"])
}
}
func TestAllocateRouteSession_GroupPeer(t *testing.T) {
allocation := AllocateRouteSession(AllocationInput{
AgentID: "main",
Context: bus.InboundContext{
Channel: "slack",
Account: "workspace-a",
ChatID: "C001",
ChatType: "channel",
SenderID: "U001",
},
SessionPolicy: routing.SessionPolicy{
Dimensions: []string{"chat"},
},
})
if allocation.SessionKey == "" || !IsOpaqueSessionKey(allocation.SessionKey) {
t.Fatalf("SessionKey = %q, want opaque session key", allocation.SessionKey)
}
if !containsAlias(allocation.SessionAliases, "agent:main:slack:channel:c001") {
t.Fatalf("SessionAliases = %v, want to contain agent:main:slack:channel:c001", allocation.SessionAliases)
}
if allocation.MainSessionKey == "" || !IsOpaqueSessionKey(allocation.MainSessionKey) {
t.Fatalf("MainSessionKey = %q, want opaque session key", allocation.MainSessionKey)
}
if len(allocation.MainAliases) != 1 || allocation.MainAliases[0] != "agent:main:main" {
t.Fatalf("MainAliases = %v, want [agent:main:main]", allocation.MainAliases)
}
if len(allocation.Scope.Dimensions) != 1 || allocation.Scope.Dimensions[0] != "chat" {
t.Fatalf("Scope.Dimensions = %v, want [chat]", allocation.Scope.Dimensions)
}
if allocation.Scope.Values["chat"] != "channel:c001" {
t.Fatalf("Scope.Values[chat] = %q, want channel:c001", allocation.Scope.Values["chat"])
}
}
func TestBuildOpaqueSessionKey_IsStable(t *testing.T) {
first := BuildOpaqueSessionKey("agent:main:direct:user123")
second := BuildOpaqueSessionKey("agent:main:direct:user123")
if first != second {
t.Fatalf("BuildOpaqueSessionKey() mismatch: %q != %q", first, second)
}
if !IsOpaqueSessionKey(first) {
t.Fatalf("expected opaque session key, got %q", first)
}
}
func containsAlias(aliases []string, want string) bool {
for _, alias := range aliases {
if alias == want {
return true
}
}
return false
}