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

78 lines
3.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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