thread-master/apps/backend/internal/module/studio/usecase/reply_prompt_test.go

78 lines
3.2 KiB
Go
Raw Normal View History

2026-07-20 06:33:14 +00:00
package usecase
import (
"strings"
"testing"
"apps/backend/internal/module/studio/domain"
"github.com/stretchr/testify/require"
)
func TestPersonaReplyFingerprintUsesExpressionWithoutContentTemplate(t *testing.T) {
p := &domain.Persona{
Brief: "產品設計師,說話直接",
Style: domain.PersonaStyle{
Draft: domain.PersonaDraft{
Tone: "輕鬆但具體",
Hooks: "真心建議開頭",
LanguageFingerprint: "短句、偶爾吐槽",
Rhythm: "長短句交錯",
Punctuation: "少用驚嘆號",
ContentPatterns: "痛點接三點建議",
CtaStyle: "最後一定問大家",
Avoid: "官腔",
},
SamplePreviews: []string{"這功能我昨天也卡了一下,後來發現入口藏得有點深。"},
},
Guard: domain.PersonaGuard{Avoid: []string{"像客服"}},
}
fp := personaExpressionFingerprintBlock(p)
require.Contains(t, fp, "輕鬆但具體")
require.Contains(t, fp, "短句、偶爾吐槽")
require.Contains(t, fp, "長短句交錯")
require.Contains(t, fp, "語感樣本")
require.NotContains(t, fp, "真心建議開頭")
require.NotContains(t, fp, "痛點接三點建議")
require.NotContains(t, fp, "最後一定問大家")
}
func TestReplyPromptsPrioritizeSourceContent(t *testing.T) {
ownPost := buildOwnPostReplyPrompt("語氣:自然", "最近把通知分類重做了", "ann", "靜音可以只套用一個品牌嗎?")
require.Contains(t, ownPost, "回應原文或留言裡至少一個具體資訊")
require.Contains(t, ownPost, "靜音可以只套用一個品牌嗎?")
require.Contains(t, ownPost, "不預設任何開頭")
require.NotContains(t, ownPost, "開場邀互動")
mention := buildMentionReplyPrompt("語氣:自然", "ann", "你這個通知分類很好用", "昨天剛上線")
require.Contains(t, mention, "直接接住對方至少一個具體資訊")
require.Contains(t, mention, "你這個通知分類很好用")
require.Contains(t, mention, "不預設任何開頭")
require.False(t, strings.Contains(mention, "嚴格遵守指紋"))
}
func TestMimicPromptPlansContentBeforeApplyingFingerprint(t *testing.T) {
prompt := buildMimicPrompt(
"語氣:直接但溫柔",
"我原本以為改版只是換顏色,真的用過才發現操作路徑少了一半。",
"談談功能刪減如何降低學習成本",
"",
)
require.Contains(t, prompt, "只抽取可借用的敘事骨架、資訊密度、轉折方式與情緒曲線")
require.Contains(t, prompt, "談談功能刪減如何降低學習成本")
require.Contains(t, prompt, "參考文只供學習結構,不是內容來源")
require.Contains(t, prompt, "不得沿用其人物、事件、品牌、例子、數字、觀點句、首句或結論")
require.Contains(t, prompt, "我原本以為改版只是換顏色")
require.Contains(t, prompt, "把文章完整講完")
require.NotContains(t, prompt, "約 30100 字")
require.NotContains(t, prompt, "有問句就留好回的小問題")
}
func TestMainPostCleanerDoesNotTruncate(t *testing.T) {
long := strings.Repeat("這段內容需要完整保留。", 120)
require.Equal(t, long, cleanGeneratedPostText(long))
require.Less(t, len([]rune(cleanGeneratedTextMax(long, 120))), len([]rune(long)))
}