72 lines
2.8 KiB
Go
72 lines
2.8 KiB
Go
package orchestration
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"errors"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestConstructorAndBoundaryValidation(t *testing.T) {
|
||
|
|
if _, err := NewStartProcessor(nil, nil, nil, 0); err == nil {
|
||
|
|
t.Fatal("invalid start processor dependencies were accepted")
|
||
|
|
}
|
||
|
|
if err := (&StartProcessor{}).ConfigureStartProtection(nil, 0); err == nil {
|
||
|
|
t.Fatal("invalid provider start protection was accepted")
|
||
|
|
}
|
||
|
|
if _, err := NewStopProcessor(nil, nil, nil); err == nil {
|
||
|
|
t.Fatal("invalid stop processor dependencies were accepted")
|
||
|
|
}
|
||
|
|
if _, err := NewProviderEventProcessor(nil, 0); err == nil {
|
||
|
|
t.Fatal("invalid provider event processor dependencies were accepted")
|
||
|
|
}
|
||
|
|
if _, err := NewProviderHealth(nil, 0, 0); err == nil {
|
||
|
|
t.Fatal("invalid provider health dependencies were accepted")
|
||
|
|
}
|
||
|
|
if _, err := NewHeartbeatService(nil, nil, nil, nil, HeartbeatServiceOptions{}); err == nil {
|
||
|
|
t.Fatal("invalid heartbeat dependencies were accepted")
|
||
|
|
}
|
||
|
|
if _, err := NewRecoveryScanner(nil, nil, nil, RecoveryOptions{}); err == nil {
|
||
|
|
t.Fatal("invalid recovery scanner dependencies were accepted")
|
||
|
|
}
|
||
|
|
if _, err := NewTranscriptBatchService(nil, nil, nil, nil); err == nil {
|
||
|
|
t.Fatal("invalid transcript dependencies were accepted")
|
||
|
|
}
|
||
|
|
if _, err := NewService(nil, nil, nil, nil, nil, nil, ServiceOptions{}); err == nil {
|
||
|
|
t.Fatal("invalid orchestration dependencies were accepted")
|
||
|
|
}
|
||
|
|
|
||
|
|
conflict := &TranscriptConflictError{}
|
||
|
|
if !errors.Is(conflict, conflict) || conflict.Error() == "" {
|
||
|
|
t.Fatal("transcript conflict error contract is invalid")
|
||
|
|
}
|
||
|
|
if got := truncateContextText(" 长者今日精神状态良好 ", 4); got != "长者今日…" {
|
||
|
|
t.Fatalf("truncated context=%q", got)
|
||
|
|
}
|
||
|
|
if got := truncateContextText(" 简短 ", 10); got != "简短" {
|
||
|
|
t.Fatalf("short context=%q", got)
|
||
|
|
}
|
||
|
|
if _, err := NewRedisLeaseCache(nil, "test"); err == nil {
|
||
|
|
t.Fatal("nil redis client was accepted")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestAuthorizedProfileContextRejectsMalformedWhitelistedFields(t *testing.T) {
|
||
|
|
valid, err := authorizedProfileContext(
|
||
|
|
[]byte(`{"background":"退休教师","interests":["戏曲","散步"],"internal_note":{"ignored":true}}`),
|
||
|
|
[]byte(`{"conversation_goal":"轻松交流","pace":"slow","preferred_topics":["家乡"]}`),
|
||
|
|
)
|
||
|
|
if err != nil || valid.Background != "退休教师" || len(valid.Interests) != 2 || valid.Pace != "slow" {
|
||
|
|
t.Fatalf("valid context=%+v err=%v", valid, err)
|
||
|
|
}
|
||
|
|
for _, malformed := range []struct {
|
||
|
|
profile, preferences string
|
||
|
|
}{
|
||
|
|
{`{"background":42}`, `{}`},
|
||
|
|
{`{"interests":["戏曲",42]}`, `{}`},
|
||
|
|
{`{}`, `{"preferred_topics":"家乡"}`},
|
||
|
|
} {
|
||
|
|
if _, err := authorizedProfileContext([]byte(malformed.profile), []byte(malformed.preferences)); err == nil {
|
||
|
|
t.Fatalf("malformed whitelisted context was accepted: profile=%s preferences=%s", malformed.profile, malformed.preferences)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|