Files
story/internal/extraction/processor_safety_test.go
T

59 lines
2.2 KiB
Go
Raw Normal View History

2026-08-26 06:41:07 +08:00
package extraction
import (
"context"
"strings"
2026-08-26 06:41:07 +08:00
"testing"
"data-terminal-cloud/internal/contentpolicy"
)
type safetyTestGenerator struct{ calls int }
func (g *safetyTestGenerator) Generate(context.Context, GenerationInput) (GenerationResult, error) {
g.calls++
return GenerationResult{
Meaningful: true, StoryWorthy: true, DecisionReason: "测试故事",
2026-08-26 06:41:07 +08:00
Summary: "模型摘要", OpenTopic: "开放话题", StoryTitle: "标题",
StoryContent: "模型输出风险", FactContent: "普通事实", AllowStory: true,
}, nil
}
type safetyTestClassifier struct{ calls int }
func (c *safetyTestClassifier) Classify(_ context.Context, _ string) (contentpolicy.Decision, error) {
c.calls++
if c.calls == 1 {
return contentpolicy.Decision{AllowOrdinaryStory: true, Sensitivity: "normal", ProviderRef: "managed-content-safety:test-v1"}, nil
}
return contentpolicy.Decision{AllowOrdinaryStory: false, Sensitivity: "sensitive", Reason: "model_output_safety", ProviderRef: "managed-content-safety:test-v1"}, nil
}
func TestGenerateSafelyBlocksModelOutputBeforePersistence(t *testing.T) {
generator := &safetyTestGenerator{}
classifier := &safetyTestClassifier{}
processor := &Processor{generator: generator, safety: classifier}
result, err := processor.generateSafely(context.Background(), "普通长者话轮")
if err != nil {
t.Fatal(err)
}
if generator.calls != 1 || classifier.calls != 2 || result.AllowStory || result.ModelRef != "managed-content-safety:test-v1" || result.PromptVersion != "summary-sensitive-filter-v1:model_output_safety" {
t.Fatalf("result=%+v generator_calls=%d classifier_calls=%d", result, generator.calls, classifier.calls)
}
}
func TestJoinedSubjectContentCannotPromoteAgentClaims(t *testing.T) {
content := joinedSubjectContent([]turn{
{speaker: "agent", text: "您年轻时一定在铁路上工作过。"},
{speaker: "subject", text: "没有,我以前在学校教书。"},
{speaker: "agent", text: "那您一定教了四十年。"},
})
if strings.Contains(content, "铁路") || strings.Contains(content, "四十年") {
t.Fatalf("agent claims entered extraction content: %q", content)
}
if content != "长者:没有,我以前在学校教书。" {
t.Fatalf("subject extraction content=%q", content)
}
}