78 lines
3.2 KiB
Go
78 lines
3.2 KiB
Go
|
|
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, "約 30~100 字")
|
|||
|
|
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)))
|
|||
|
|
}
|