feat(server/reward): TG getChatMember 真校验 + ClaimTelegram + POST /tg/webhook
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user