thread-master/apps/backend/internal/module/radar/domain/term_test.go

101 lines
2.4 KiB
Go

package domain
import "testing"
func TestNormalizeSearchTerm(t *testing.T) {
cases := []struct {
in, want string
}{
{" 保母 求推薦 ", "保母 求推薦"},
{"到府 保母", "到府 保母"},
{"\t ", ""},
}
for _, c := range cases {
if got := NormalizeSearchTerm(c.in); got != c.want {
t.Errorf("NormalizeSearchTerm(%q) = %q, want %q", c.in, got, c.want)
}
}
}
func TestIsThreadsSearchable(t *testing.T) {
ok := []string{
"保母 求推薦",
"到府保母",
"求推薦",
"有人知道",
"wedding photo",
"台北 保母",
}
for _, s := range ok {
if !IsThreadsSearchable(s) {
t.Errorf("IsThreadsSearchable(%q) = false, want true", s)
}
}
bad := []string{
"",
"a",
"台北 婚攝 推薦", // 3 tokens
"這是一個超長關鍵字超過十二字", // too long
"保母 AND 求推薦",
"保母#推薦",
"保母!",
"🎉 保母",
"\"保母\"",
" ",
"一", // 1 CJK rune
}
for _, s := range bad {
if IsThreadsSearchable(s) {
t.Errorf("IsThreadsSearchable(%q) = true, want false", s)
}
}
}
func TestSearchableTermVariantsKeepsShortAndShortensLong(t *testing.T) {
got := SearchableTermVariants("保母 求推薦", true)
if len(got) != 1 || got[0] != "保母 求推薦" {
t.Fatalf("short term variants=%v", got)
}
got = SearchableTermVariants("晚上睡覺容易口乾舌燥怎麼辦", true)
if len(got) == 0 {
t.Fatal("long sentence produced no variants")
}
for _, term := range got {
if !IsThreadsSearchable(term) {
t.Fatalf("variant %q is not searchable", term)
}
}
hasDry := false
hasSleep := false
for _, term := range got {
if term == "口乾舌燥" {
hasDry = true
}
if term == "晚上睡覺" {
hasSleep = true
}
}
if !hasDry || !hasSleep {
t.Fatalf("variants=%v want 晚上睡覺 and 口乾舌燥", got)
}
got = SearchableTermVariants("台北 婚攝 推薦 價格", true)
if len(got) == 0 || got[0] != "台北 婚攝" {
t.Fatalf("multi-token variants=%v want 台北 婚攝 first", got)
}
}
func TestExpandSearchTermsShortensUnsearchable(t *testing.T) {
got := ExpandSearchTerms([]string{"求推薦", "晚上睡覺容易口乾舌燥怎麼辦"}, 20)
if len(got) < 2 {
t.Fatalf("expanded=%v", got)
}
if got[0] != "求推薦" {
t.Fatalf("kept original first, got %v", got)
}
for _, term := range got {
if !IsThreadsSearchable(term) {
t.Fatalf("expanded term %q is not searchable", term)
}
}
}