import 'reflect-metadata' import { SubscriptionName } from '@standardnotes/common' import { RoleName } from '@standardnotes/domain-core' import { SubscriptionReassignedEvent } from '@standardnotes/domain-events' import { Logger } from 'winston' import * as dayjs from 'dayjs' import { RoleServiceInterface } from '../Role/RoleServiceInterface' import { User } from '../User/User' import { UserRepositoryInterface } from '../User/UserRepositoryInterface' import { UserSubscriptionRepositoryInterface } from '../Subscription/UserSubscriptionRepositoryInterface' import { SubscriptionReassignedEventHandler } from './SubscriptionReassignedEventHandler' import { UserSubscription } from '../Subscription/UserSubscription' import { SettingServiceInterface } from '../Setting/SettingServiceInterface' import { UserSubscriptionType } from '../Subscription/UserSubscriptionType' import { SubscriptionSettingServiceInterface } from '../Setting/SubscriptionSettingServiceInterface' describe('SubscriptionReassignedEventHandler', () => { let userRepository: UserRepositoryInterface let userSubscriptionRepository: UserSubscriptionRepositoryInterface let roleService: RoleServiceInterface let logger: Logger let user: User let subscription: UserSubscription let event: SubscriptionReassignedEvent let subscriptionExpiresAt: number let timestamp: number let settingService: SettingServiceInterface let subscriptionSettingService: SubscriptionSettingServiceInterface const createHandler = () => new SubscriptionReassignedEventHandler( userRepository, userSubscriptionRepository, roleService, settingService, subscriptionSettingService, logger, ) beforeEach(() => { user = { uuid: '123', email: 'test@test.com', roles: Promise.resolve([ { name: RoleName.NAMES.CoreUser, }, ]), } as jest.Mocked subscription = { subscriptionType: UserSubscriptionType.Regular, } as jest.Mocked userRepository = {} as jest.Mocked userRepository.findOneByUsernameOrEmail = jest.fn().mockReturnValue(user) userRepository.save = jest.fn().mockReturnValue(user) userSubscriptionRepository = {} as jest.Mocked userSubscriptionRepository.save = jest.fn().mockReturnValue(subscription) roleService = {} as jest.Mocked roleService.addUserRole = jest.fn() subscriptionExpiresAt = timestamp + 365 * 1000 event = {} as jest.Mocked event.createdAt = new Date(1) event.payload = { subscriptionId: 1, offline: false, extensionKey: 'abc123', userEmail: 'test@test.com', subscriptionName: SubscriptionName.ProPlan, subscriptionExpiresAt, timestamp: dayjs.utc().valueOf(), } settingService = {} as jest.Mocked settingService.createOrReplace = jest.fn() subscriptionSettingService = {} as jest.Mocked subscriptionSettingService.applyDefaultSubscriptionSettingsForSubscription = jest.fn() logger = {} as jest.Mocked logger.info = jest.fn() logger.warn = jest.fn() }) it('should update user default settings', async () => { await createHandler().handle(event) expect(subscriptionSettingService.applyDefaultSubscriptionSettingsForSubscription).toHaveBeenCalledWith( subscription, ) }) it('should update the user role', async () => { await createHandler().handle(event) expect(roleService.addUserRole).toHaveBeenCalledWith(user, SubscriptionName.ProPlan) }) it('should create subscription', async () => { await createHandler().handle(event) subscription.planName = SubscriptionName.ProPlan subscription.endsAt = subscriptionExpiresAt subscription.subscriptionId = 1 subscription.user = Promise.resolve(user) expect(userSubscriptionRepository.save).toHaveBeenCalledWith({ ...subscription, createdAt: expect.any(Number), updatedAt: expect.any(Number), cancelled: false, }) }) it('should create an extension key setting for the user', async () => { await createHandler().handle(event) expect(settingService.createOrReplace).toHaveBeenCalledWith({ props: { name: 'EXTENSION_KEY', serverEncryptionVersion: 1, unencryptedValue: 'abc123', sensitive: true, }, user: { uuid: '123', email: 'test@test.com', roles: Promise.resolve([ { name: RoleName.NAMES.CoreUser, }, ]), }, }) }) it('should not do anything if no user is found for specified email', async () => { userRepository.findOneByUsernameOrEmail = jest.fn().mockReturnValue(null) await createHandler().handle(event) expect(roleService.addUserRole).not.toHaveBeenCalled() expect(userSubscriptionRepository.save).not.toHaveBeenCalled() }) it('should not do anything if username is invalid', async () => { event.payload.userEmail = ' ' await createHandler().handle(event) expect(roleService.addUserRole).not.toHaveBeenCalled() expect(userSubscriptionRepository.save).not.toHaveBeenCalled() }) })