package reward import ( "context" "database/sql" "testing" "time" "github.com/wangjia/pangolin/server/internal/codes" ) type fakeChecker struct{ member bool } func (f fakeChecker) IsMember(_ context.Context, _, _ string) (bool, error) { return f.member, nil } func newTgSvc(t *testing.T, db *sql.DB, member bool) *Service { g := codes.NewService(codes.NewStore(db), nil, 5, time.Hour) s := NewService(db, NewStore(db), g, Config{TgDays: 3}, time.Now) s.SetTelegram("bot", "@ch", "tok", "sec") s.SetMemberChecker(fakeChecker{member: member}) return s } func TestClaimTelegram_MemberGrantsOnce(t *testing.T) { db := openDB(t) seedU(t, db, 1, "u1") s := newTgSvc(t, db, true) res, err := s.ClaimTelegram(context.Background(), 1, "tg-777") if err != nil || res != ClaimGranted { t.Fatalf("claim1: %v %v", res, err) } if d := proDays(t, db, 1); d < 3 { t.Fatalf("pro days=%d", d) } // 再领 → 已领取过(唯一守卫),不再发 res2, err2 := s.ClaimTelegram(context.Background(), 1, "tg-777") if err2 != nil || res2 != ClaimAlready { t.Fatalf("claim2: %v %v", res2, err2) } } func TestClaimTelegram_NonMemberNoGrant(t *testing.T) { db := openDB(t) seedU(t, db, 1, "u1") s := newTgSvc(t, db, false) res, err := s.ClaimTelegram(context.Background(), 1, "tg-1") if err != nil || res != ClaimNotMember { t.Fatalf("claim: %v %v", res, err) } if d := proDays(t, db, 1); d >= 3 { t.Fatalf("granted days to non-member: %d", d) } } func TestTgMsgSetFor_LanguageSelection(t *testing.T) { cases := []struct { lang string zh bool }{ {"zh-hans", true}, {"zh", true}, {"zh-CN", true}, {"en", false}, {"de", false}, {"", false}, } for _, c := range cases { got := tgMsgSetFor(c.lang) isZH := got.granted == tgMsgsZH.granted if isZH != c.zh { t.Fatalf("lang=%q: expected zh=%v, got zh=%v", c.lang, c.zh, isZH) } } }