redeem_service_batch_update_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //go:build unit
  2. package service
  3. import (
  4. "context"
  5. "testing"
  6. "time"
  7. infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func TestRedeemService_BatchUpdate_PartialFields(t *testing.T) {
  11. status := StatusDisabled
  12. notes := "maintenance window"
  13. expiresAt := time.Now().UTC().Add(24 * time.Hour)
  14. repo := &redeemRepoStub{}
  15. svc := &RedeemService{redeemRepo: repo}
  16. result, err := svc.BatchUpdate(context.Background(), &RedeemCodeBatchUpdateInput{
  17. IDs: []int64{1, 2, 2},
  18. Fields: RedeemCodeBatchUpdateFields{
  19. Status: &status,
  20. ExpiresAt: NullableTimeUpdate{Set: true, Value: &expiresAt},
  21. Notes: &notes,
  22. },
  23. })
  24. require.NoError(t, err)
  25. require.Equal(t, int64(2), result.Updated)
  26. require.True(t, repo.batchUpdateCalled)
  27. require.Equal(t, []int64{1, 2}, repo.batchUpdateIDs)
  28. require.Equal(t, &status, repo.batchUpdateFields.Status)
  29. require.True(t, repo.batchUpdateFields.ExpiresAt.Set)
  30. require.WithinDuration(t, expiresAt, *repo.batchUpdateFields.ExpiresAt.Value, time.Second)
  31. require.Equal(t, &notes, repo.batchUpdateFields.Notes)
  32. require.False(t, repo.batchUpdateFields.GroupID.Set)
  33. require.Nil(t, repo.batchUpdateFields.Type)
  34. require.Nil(t, repo.batchUpdateFields.Value)
  35. }
  36. func TestRedeemService_BatchUpdate_RejectsInvalidID(t *testing.T) {
  37. repo := &redeemRepoStub{}
  38. svc := &RedeemService{redeemRepo: repo}
  39. notes := "bad id"
  40. result, err := svc.BatchUpdate(context.Background(), &RedeemCodeBatchUpdateInput{
  41. IDs: []int64{1, 0},
  42. Fields: RedeemCodeBatchUpdateFields{Notes: &notes},
  43. })
  44. require.Nil(t, result)
  45. require.Error(t, err)
  46. require.True(t, infraerrors.IsBadRequest(err))
  47. require.False(t, repo.batchUpdateCalled)
  48. }
  49. func TestRedeemService_BatchUpdate_RejectsCoreFieldsForUsedCodes(t *testing.T) {
  50. repo := &redeemRepoStub{}
  51. svc := &RedeemService{redeemRepo: repo}
  52. newValue := 100.0
  53. result, err := svc.BatchUpdate(context.Background(), &RedeemCodeBatchUpdateInput{
  54. IDs: []int64{42},
  55. Fields: RedeemCodeBatchUpdateFields{
  56. Value: &newValue,
  57. },
  58. })
  59. require.Nil(t, result)
  60. require.Error(t, err)
  61. require.True(t, infraerrors.IsBadRequest(err))
  62. require.False(t, repo.batchUpdateCalled)
  63. }