redeem_admin_fulfillment_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. //go:build unit
  2. package service
  3. import (
  4. "context"
  5. "testing"
  6. "time"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestAdminFulfillmentBypassesLimitAndKeepsRedeemAffiliate(t *testing.T) {
  10. ctx := context.Background()
  11. client := newPaymentConfigServiceTestClient(t)
  12. userID := int64(42)
  13. inviterID := int64(9001)
  14. code := &RedeemCode{
  15. ID: 102, Code: "ADMIN-SUCCESS", Type: RedeemTypeBalance, Value: 20, Status: StatusUnused,
  16. }
  17. redeemRepo := &paymentFulfillmentRedeemRepo{
  18. paymentOrderLifecycleRedeemRepo: paymentOrderLifecycleRedeemRepo{
  19. codesByCode: map[string]*RedeemCode{code.Code: code},
  20. },
  21. }
  22. userRepo := &mockUserRepo{getByIDUser: &User{ID: userID}}
  23. userRepo.updateBalanceFn = func(context.Context, int64, float64) error { return nil }
  24. cache := &paymentFulfillmentRedeemCacheStub{count: redeemMaxFailedAttempts}
  25. affiliateRepo := &paymentFulfillmentAffiliateRepoStub{
  26. inviteeSummary: &AffiliateSummary{
  27. UserID: userID, AffCode: "INVITEE", InviterID: &inviterID, CreatedAt: time.Now().Add(-time.Hour),
  28. },
  29. inviterSummary: &AffiliateSummary{
  30. UserID: inviterID, AffCode: "INVITER", CreatedAt: time.Now().Add(-2 * time.Hour),
  31. },
  32. }
  33. settingSvc := NewSettingService(&paymentFulfillmentSettingRepoStub{values: map[string]string{
  34. SettingKeyAffiliateEnabled: "true",
  35. SettingKeyAffiliateRebateRate: "10",
  36. SettingKeyAffiliateRebateFreezeHours: "0",
  37. }}, nil)
  38. affiliateSvc := NewAffiliateService(affiliateRepo, settingSvc, nil, nil)
  39. svc := NewRedeemService(redeemRepo, userRepo, nil, cache, nil, client, nil, affiliateSvc)
  40. result, err := svc.RedeemForAdminFulfillment(ctx, userID, code.Code)
  41. require.NoError(t, err)
  42. require.NotNil(t, result)
  43. require.Zero(t, cache.getCalls)
  44. require.Zero(t, cache.incrementCalls)
  45. require.Equal(t, 1, cache.acquireCalls)
  46. require.Equal(t, 1, cache.releaseCalls)
  47. require.Len(t, redeemRepo.useCalls, 1)
  48. require.Len(t, affiliateRepo.accrueCalls, 1)
  49. require.Equal(t, inviterID, affiliateRepo.accrueCalls[0].inviterID)
  50. require.Equal(t, userID, affiliateRepo.accrueCalls[0].inviteeUserID)
  51. require.InDelta(t, 2, affiliateRepo.accrueCalls[0].amount, 1e-8)
  52. require.Nil(t, affiliateRepo.accrueCalls[0].sourceOrderID)
  53. }