thread-master/apps/backend/internal/module/radar/usecase/sweep_fetch_test.go

66 lines
2.2 KiB
Go

package usecase
import (
"context"
"fmt"
"strings"
"testing"
"apps/backend/internal/module/radar/domain"
)
func TestMergeFetchWatchKeepsSubscriberTerms(t *testing.T) {
w := &domain.RadarWatch{Terms: []string{"求推薦", "泛紅"}, ExcludeTerms: []string{"抽獎"}}
plan := &domain.QueryPlan{Groups: []domain.QueryPlanGroup{
{Query: "換季 不適", Exclude: []string{"業配"}},
{Query: "求推薦"},
}}
got := mergeFetchWatch(w, plan)
if len(got.Terms) != 3 || got.Terms[0] != "求推薦" || got.Terms[1] != "泛紅" || got.Terms[2] != "換季 不適" {
t.Fatalf("terms=%v want subscriber keywords first, then new plan queries", got.Terms)
}
if len(got.ExcludeTerms) != 2 {
t.Fatalf("exclude=%v", got.ExcludeTerms)
}
}
func TestMergeFetchWatchExpandsLongSubscriberTerms(t *testing.T) {
w := &domain.RadarWatch{Terms: []string{"晚上睡覺容易口乾舌燥怎麼辦"}}
got := mergeFetchWatch(w, nil)
if len(got.Terms) == 0 {
t.Fatal("long subscriber term must expand before fetch")
}
for _, term := range got.Terms {
if !domain.IsThreadsSearchable(term) {
t.Fatalf("fetch term %q is not searchable", term)
}
}
}
func TestHumanFetchErrorCrawlerSessionExpired(t *testing.T) {
got := humanFetchError(fmt.Errorf(`Chrome crawler status 422: {"error":"crawler session expired"}`))
if !strings.Contains(got, "Chrome 登入已過期") || !strings.Contains(got, "設定") {
t.Fatalf("human message=%q", got)
}
}
func TestFetchCandidatesKeepsTitleOnlyHits(t *testing.T) {
svc := New(nil)
svc.HitFetch = HitFetcherFunc(func(context.Context, int64, []string, int) ([]ThreadHit, string, error) {
return []ThreadHit{{
URL: "https://www.threads.net/@a/post/xyz",
Title: "皮膚泛紅怎麼辦",
}}, "api", nil
})
// bill path: HitFetch returns api so FetchCandidates will try to bill.
// Avoid billing by setting path after... FetchCandidates bills API path.
// Use empty Usage so bill is a no-op if implemented that way.
cands, _, _, err := svc.FetchCandidates(context.Background(), 1, &domain.RadarWatch{Terms: []string{"泛紅"}}, 10)
if err != nil {
t.Fatalf("fetch: %v", err)
}
if len(cands) != 1 || cands[0].Text == "" {
t.Fatalf("title-only hit dropped: %+v err=%v", cands, err)
}
}