Files
story/internal/callmemory/direct_native_memory_test.go
Codex Local bf1233d5df
ci / verify (push) Canceled after 0s
feat: expand companion platform, device controls, and memoir workflows
Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
2026-10-08 10:06:44 +08:00

64 lines
2.7 KiB
Go

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