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) ok, err := s.ClaimTelegram(context.Background(), 1, "tg-777") if err != nil || !ok { t.Fatalf("claim1: %v %v", ok, err) } if d := proDays(t, db, 1); d < 3 { t.Fatalf("pro days=%d", d) } // 再领 → 不再发(唯一守卫) ok2, _ := s.ClaimTelegram(context.Background(), 1, "tg-777") if ok2 { t.Fatalf("claimed twice") } } func TestClaimTelegram_NonMemberNoGrant(t *testing.T) { db := openDB(t) seedU(t, db, 1, "u1") s := newTgSvc(t, db, false) ok, _ := s.ClaimTelegram(context.Background(), 1, "tg-1") if ok { t.Fatalf("non-member granted") } if d := proDays(t, db, 1); d >= 3 { t.Fatalf("granted days to non-member: %d", d) } }