Files
story/internal/callmemory/direct_native_memory_test.go
T

64 lines
2.7 KiB
Go
Raw Normal View History

package callmemory
import (
"context"
"strings"
"testing"
"data-terminal-cloud/internal/elderagent"
"data-terminal-cloud/internal/memoryidentity"
"github.com/google/uuid"
)
type nativeMemoryTestProvider struct{ configs []map[string]any }
func (p *nativeMemoryTestProvider) Ensure(context.Context, string, map[string]any, map[string]any) (elderagent.Bot, error) {
panic("not used")
}
func (p *nativeMemoryTestProvider) Update(_ context.Context, _ string, c, a map[string]any) error {
p.configs = append(p.configs, c)
return nil
}
func TestDirectNativeMemoryUsesVikingWithoutPlatformFactsAndDisablesAfterWithdrawal(t *testing.T) {
f, d := directFixture(t)
f.add(t)
f.exec(t, `UPDATE subject_voice_agent SET config='{"S2SConfig":{"ProviderParams":{"dialog":{"system_role":"基础人设"}}},"MemoryConfig":{"Enable":false}}'::jsonb WHERE subject_id=$1::uuid`, f.subject)
provider := &nativeMemoryTestProvider{}
agent := &elderagent.Service{Pool: f.p, Provider: provider, VikingCollectionName: "aiphone", VikingEventType: "event_v1", CallbackURL: "https://example.com/callback", CallbackSecret: []byte(strings.Repeat("k", 32))}
f.s.direct.Prepare = agent.Prepare
ctx := context.Background()
sid := uuid.NewString()
if _, err := f.s.DirectRequest(ctx, d, "start", DirectInput{SessionID: sid}); err != nil {
t.Fatal(err)
}
if len(provider.configs) != 1 {
t.Fatal("provider not prepared")
}
c := provider.configs[0]
m := c["MemoryConfig"].(map[string]any)
filter := m["ProviderParams"].(map[string]any)["filter"].(map[string]any)
if m["Enable"] != true || filter["user_id"].([]string)[0] != memoryidentity.UserID(f.tenant, f.subject) {
t.Fatal("Viking identity does not match uploads", m)
}
role := c["S2SConfig"].(map[string]any)["ProviderParams"].(map[string]any)["dialog"].(map[string]any)["system_role"].(string)
if strings.Contains(role, "喜欢喝淡茶") || strings.Contains(role, "<资料>") {
t.Fatal("platform facts entered prompt")
}
var mode string
if err := f.p.QueryRow(ctx, `SELECT memory_mode FROM call_session WHERE id=$1::uuid`, sid).Scan(&mode); err != nil || mode != "NATIVE_VIKING" {
t.Fatal("incorrect frozen memory mode", mode, err)
}
if _, err := f.s.DirectRequest(ctx, d, "end", DirectInput{SessionID: sid, Reason: "hangup", SDKStopped: true}); err != nil {
t.Fatal(err)
}
f.exec(t, `UPDATE consent_record SET withdrawn_at=now() WHERE subject_id=$1::uuid AND consent_type='personalized_memory' AND withdrawn_at IS NULL`, f.subject)
if _, err := f.s.DirectRequest(ctx, d, "start", DirectInput{SessionID: uuid.NewString()}); err != nil {
t.Fatal(err)
}
m = provider.configs[1]["MemoryConfig"].(map[string]any)
if m["Enable"] != false || len(m) != 1 {
t.Fatal("withdrawn memory still has retrieval filters", m)
}
}