Files
story/internal/orchestration/validation_test.go
T

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)
}
}
}