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