2026-08-09 07:57:35 +00:00
|
|
|
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",
|
2026-08-13 07:54:25 +00:00
|
|
|
"台北 婚攝 推薦", // 3 tokens
|
2026-08-09 07:57:35 +00:00
|
|
|
"這是一個超長關鍵字超過十二字", // too long
|
|
|
|
|
"保母 AND 求推薦",
|
|
|
|
|
"保母#推薦",
|
|
|
|
|
"保母!",
|
|
|
|
|
"🎉 保母",
|
|
|
|
|
"\"保母\"",
|
|
|
|
|
" ",
|
|
|
|
|
"一", // 1 CJK rune
|
|
|
|
|
}
|
|
|
|
|
for _, s := range bad {
|
|
|
|
|
if IsThreadsSearchable(s) {
|
|
|
|
|
t.Errorf("IsThreadsSearchable(%q) = true, want false", s)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-08-13 07:54:25 +00:00
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|