account_repo_auto_pause_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package repository
  2. import (
  3. "context"
  4. "database/sql/driver"
  5. "encoding/json"
  6. "reflect"
  7. "regexp"
  8. "testing"
  9. "time"
  10. "github.com/DATA-DOG/go-sqlmock"
  11. "github.com/Wei-Shaw/sub2api/internal/service"
  12. "github.com/stretchr/testify/require"
  13. )
  14. type accountIDsPayloadMatcher struct {
  15. want []int64
  16. }
  17. func (m accountIDsPayloadMatcher) Match(value driver.Value) bool {
  18. raw, ok := value.([]byte)
  19. if !ok {
  20. return false
  21. }
  22. var payload struct {
  23. AccountIDs []int64 `json:"account_ids"`
  24. }
  25. if err := json.Unmarshal(raw, &payload); err != nil {
  26. return false
  27. }
  28. return reflect.DeepEqual(m.want, payload.AccountIDs)
  29. }
  30. func TestAutoPauseExpiredAccountsEnqueuesAffectedAccounts(t *testing.T) {
  31. db, mock, err := sqlmock.New()
  32. require.NoError(t, err)
  33. t.Cleanup(func() { _ = db.Close() })
  34. now := time.Now()
  35. mock.ExpectQuery(`(?s)UPDATE accounts.*RETURNING id`).
  36. WithArgs(now).
  37. WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(int64(11)).AddRow(int64(29)))
  38. mock.ExpectExec(regexp.QuoteMeta("INSERT INTO scheduler_outbox (event_type, account_id, group_id, payload)")).
  39. WithArgs(service.SchedulerOutboxEventAccountBulkChanged, nil, nil, accountIDsPayloadMatcher{want: []int64{11, 29}}).
  40. WillReturnResult(sqlmock.NewResult(1, 1))
  41. repo := newAccountRepositoryWithSQL(nil, db, nil)
  42. updated, err := repo.AutoPauseExpiredAccounts(context.Background(), now)
  43. require.NoError(t, err)
  44. require.EqualValues(t, 2, updated)
  45. require.NoError(t, mock.ExpectationsWereMet())
  46. }
  47. func TestAutoPauseExpiredAccountsSkipsOutboxWithoutChanges(t *testing.T) {
  48. db, mock, err := sqlmock.New()
  49. require.NoError(t, err)
  50. t.Cleanup(func() { _ = db.Close() })
  51. now := time.Now()
  52. mock.ExpectQuery(`(?s)UPDATE accounts.*RETURNING id`).
  53. WithArgs(now).
  54. WillReturnRows(sqlmock.NewRows([]string{"id"}))
  55. repo := newAccountRepositoryWithSQL(nil, db, nil)
  56. updated, err := repo.AutoPauseExpiredAccounts(context.Background(), now)
  57. require.NoError(t, err)
  58. require.Zero(t, updated)
  59. require.NoError(t, mock.ExpectationsWereMet())
  60. }