SubscriptionExpiredEventHandler.spec.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import 'reflect-metadata'
  2. import { SubscriptionName } from '@standardnotes/common'
  3. import { RoleName } from '@standardnotes/domain-core'
  4. import { SubscriptionExpiredEvent } from '@standardnotes/domain-events'
  5. import { Logger } from 'winston'
  6. import * as dayjs from 'dayjs'
  7. import { User } from '../User/User'
  8. import { UserRepositoryInterface } from '../User/UserRepositoryInterface'
  9. import { SubscriptionExpiredEventHandler } from './SubscriptionExpiredEventHandler'
  10. import { UserSubscriptionRepositoryInterface } from '../Subscription/UserSubscriptionRepositoryInterface'
  11. import { RoleServiceInterface } from '../Role/RoleServiceInterface'
  12. import { OfflineUserSubscriptionRepositoryInterface } from '../Subscription/OfflineUserSubscriptionRepositoryInterface'
  13. import { UserSubscription } from '../Subscription/UserSubscription'
  14. describe('SubscriptionExpiredEventHandler', () => {
  15. let userRepository: UserRepositoryInterface
  16. let userSubscriptionRepository: UserSubscriptionRepositoryInterface
  17. let offlineUserSubscriptionRepository: OfflineUserSubscriptionRepositoryInterface
  18. let roleService: RoleServiceInterface
  19. let logger: Logger
  20. let user: User
  21. let event: SubscriptionExpiredEvent
  22. let timestamp: number
  23. const createHandler = () =>
  24. new SubscriptionExpiredEventHandler(
  25. userRepository,
  26. userSubscriptionRepository,
  27. offlineUserSubscriptionRepository,
  28. roleService,
  29. logger,
  30. )
  31. beforeEach(() => {
  32. user = {
  33. uuid: '123',
  34. email: 'test@test.com',
  35. roles: Promise.resolve([
  36. {
  37. name: RoleName.NAMES.ProUser,
  38. },
  39. ]),
  40. } as jest.Mocked<User>
  41. userRepository = {} as jest.Mocked<UserRepositoryInterface>
  42. userRepository.findOneByUsernameOrEmail = jest.fn().mockReturnValue(user)
  43. userRepository.save = jest.fn().mockReturnValue(user)
  44. userSubscriptionRepository = {} as jest.Mocked<UserSubscriptionRepositoryInterface>
  45. userSubscriptionRepository.updateEndsAt = jest.fn()
  46. userSubscriptionRepository.countActiveSubscriptions = jest.fn().mockReturnValue(13)
  47. userSubscriptionRepository.findBySubscriptionId = jest
  48. .fn()
  49. .mockReturnValue([{ user: Promise.resolve(user) } as jest.Mocked<UserSubscription>])
  50. offlineUserSubscriptionRepository = {} as jest.Mocked<OfflineUserSubscriptionRepositoryInterface>
  51. offlineUserSubscriptionRepository.updateEndsAt = jest.fn()
  52. roleService = {} as jest.Mocked<RoleServiceInterface>
  53. roleService.removeUserRoleBasedOnSubscription = jest.fn()
  54. timestamp = dayjs.utc().valueOf()
  55. event = {} as jest.Mocked<SubscriptionExpiredEvent>
  56. event.createdAt = new Date(1)
  57. event.payload = {
  58. subscriptionId: 1,
  59. userEmail: 'test@test.com',
  60. subscriptionName: SubscriptionName.PlusPlan,
  61. timestamp,
  62. offline: false,
  63. totalActiveSubscriptionsCount: 123,
  64. userExistingSubscriptionsCount: 2,
  65. billingFrequency: 1,
  66. payAmount: 12.99,
  67. }
  68. logger = {} as jest.Mocked<Logger>
  69. logger.info = jest.fn()
  70. logger.warn = jest.fn()
  71. })
  72. it('should update the user role', async () => {
  73. await createHandler().handle(event)
  74. expect(roleService.removeUserRoleBasedOnSubscription).toHaveBeenCalledWith(user, SubscriptionName.PlusPlan)
  75. })
  76. it('should update subscription ends at', async () => {
  77. await createHandler().handle(event)
  78. expect(userSubscriptionRepository.updateEndsAt).toHaveBeenCalledWith(1, timestamp, timestamp)
  79. })
  80. it('should update offline subscription ends at', async () => {
  81. event.payload.offline = true
  82. await createHandler().handle(event)
  83. expect(offlineUserSubscriptionRepository.updateEndsAt).toHaveBeenCalledWith(1, timestamp, timestamp)
  84. })
  85. it('should not do anything if no user is found for specified email', async () => {
  86. userRepository.findOneByUsernameOrEmail = jest.fn().mockReturnValue(null)
  87. await createHandler().handle(event)
  88. expect(roleService.removeUserRoleBasedOnSubscription).not.toHaveBeenCalled()
  89. expect(userSubscriptionRepository.updateEndsAt).not.toHaveBeenCalled()
  90. })
  91. it('should not do anything if username is invalid', async () => {
  92. event.payload.userEmail = ' '
  93. await createHandler().handle(event)
  94. expect(roleService.removeUserRoleBasedOnSubscription).not.toHaveBeenCalled()
  95. expect(userSubscriptionRepository.updateEndsAt).not.toHaveBeenCalled()
  96. })
  97. })