feat: add streak

This commit is contained in:
2026-07-07 21:10:01 +03:30
parent e8396db45c
commit e7b2e05428
4 changed files with 117 additions and 25 deletions
+32 -3
View File
@@ -4,6 +4,7 @@ import (
"context"
"path/filepath"
"testing"
"time"
"hakemsho/internal/store"
)
@@ -87,10 +88,11 @@ func TestWalletInsufficient(t *testing.T) {
func TestDailyCooldown(t *testing.T) {
svc, id := setup(t)
ctx := context.Background()
if amt, err := svc.ClaimDaily(ctx, id); err != nil || amt != DailyReward {
t.Fatalf("first claim: amt=%d err=%v", amt, err)
// اولین دریافت: استریک ۱، جایزه = DailyReward.
if amt, streak, _, err := svc.ClaimDaily(ctx, id); err != nil || amt != DailyReward || streak != 1 {
t.Fatalf("first claim: amt=%d streak=%d err=%v", amt, streak, err)
}
if _, err := svc.ClaimDaily(ctx, id); err != ErrTooSoon {
if _, _, _, err := svc.ClaimDaily(ctx, id); err != ErrTooSoon {
t.Fatalf("want ErrTooSoon, got %v", err)
}
if c := coinsOf(t, svc, id); c != DailyReward {
@@ -98,6 +100,33 @@ func TestDailyCooldown(t *testing.T) {
}
}
func TestDailyStreakContinuesAndResets(t *testing.T) {
svc, id := setup(t)
ctx := context.Background()
// دیروز گرفته ⇒ امروز استریک به ۲ می‌رسد و جایزه بیشتر می‌شود.
ySet := func(daysAgo int) {
ts := nowUTC().Add(time.Duration(-daysAgo) * 24 * time.Hour).Format(tsLayout)
if _, err := svc.db.Exec(`UPDATE users SET last_daily_at=?, daily_streak=1 WHERE id=?`, ts, id); err != nil {
t.Fatal(err)
}
}
ySet(1)
amt, streak, _, err := svc.ClaimDaily(ctx, id)
if err != nil || streak != 2 || amt != streakReward(2) {
t.Fatalf("continue: amt=%d streak=%d err=%v", amt, streak, err)
}
// دو روز فاصله ⇒ استریک ریست به ۱.
if _, err := svc.db.Exec(
`UPDATE users SET last_daily_at=?, daily_streak=5 WHERE id=?`,
nowUTC().Add(-48*time.Hour).Format(tsLayout), id); err != nil {
t.Fatal(err)
}
_, streak, _, err = svc.ClaimDaily(ctx, id)
if err != nil || streak != 1 {
t.Fatalf("reset: streak=%d err=%v", streak, err)
}
}
func TestAdRewardDedupeAndCredit(t *testing.T) {
svc, id := setup(t)
ctx := context.Background()