123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- import 'reflect-metadata'
- import { SubscriptionName } from '@standardnotes/common'
- import { Repository, SelectQueryBuilder, UpdateQueryBuilder } from 'typeorm'
- import { UserSubscription } from '../../Domain/Subscription/UserSubscription'
- import { MySQLUserSubscriptionRepository } from './MySQLUserSubscriptionRepository'
- import { UserSubscriptionType } from '../../Domain/Subscription/UserSubscriptionType'
- import { TimerInterface } from '@standardnotes/time'
- describe('MySQLUserSubscriptionRepository', () => {
- let ormRepository: Repository<UserSubscription>
- let selectQueryBuilder: SelectQueryBuilder<UserSubscription>
- let updateQueryBuilder: UpdateQueryBuilder<UserSubscription>
- let subscription: UserSubscription
- let timer: TimerInterface
- const createRepository = () => new MySQLUserSubscriptionRepository(ormRepository, timer)
- beforeEach(() => {
- selectQueryBuilder = {} as jest.Mocked<SelectQueryBuilder<UserSubscription>>
- updateQueryBuilder = {} as jest.Mocked<UpdateQueryBuilder<UserSubscription>>
- subscription = {
- planName: SubscriptionName.ProPlan,
- cancelled: false,
- } as jest.Mocked<UserSubscription>
- ormRepository = {} as jest.Mocked<Repository<UserSubscription>>
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- ormRepository.save = jest.fn()
- timer = {} as jest.Mocked<TimerInterface>
- timer.getTimestampInMicroseconds = jest.fn().mockReturnValue(123)
- })
- it('should save', async () => {
- await createRepository().save(subscription)
- expect(ormRepository.save).toHaveBeenCalledWith(subscription)
- })
- it('should find all subscriptions by user uuid', async () => {
- const canceledSubscription = {
- planName: SubscriptionName.ProPlan,
- cancelled: true,
- } as jest.Mocked<UserSubscription>
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
- selectQueryBuilder.getMany = jest.fn().mockReturnValue([canceledSubscription, subscription])
- const result = await createRepository().findByUserUuid('123')
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('user_uuid = :user_uuid', {
- user_uuid: '123',
- })
- expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('ends_at', 'DESC')
- expect(selectQueryBuilder.getMany).toHaveBeenCalled()
- expect(result).toEqual([canceledSubscription, subscription])
- })
- it('should count all active subscriptions', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.groupBy = jest.fn().mockReturnThis()
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.getCount = jest.fn().mockReturnValue(2)
- const result = await createRepository().countActiveSubscriptions()
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('ends_at > :timestamp', {
- timestamp: 123,
- })
- expect(selectQueryBuilder.groupBy).toHaveBeenCalledWith('user_uuid')
- expect(selectQueryBuilder.getCount).toHaveBeenCalled()
- expect(result).toEqual(2)
- })
- it('should find one longest lasting uncanceled subscription by user uuid if there are canceled ones', async () => {
- const canceledSubscription = {
- planName: SubscriptionName.ProPlan,
- cancelled: true,
- } as jest.Mocked<UserSubscription>
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
- selectQueryBuilder.getMany = jest.fn().mockReturnValue([canceledSubscription, subscription])
- const result = await createRepository().findOneByUserUuid('123')
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('user_uuid = :user_uuid', {
- user_uuid: '123',
- })
- expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('ends_at', 'DESC')
- expect(selectQueryBuilder.getMany).toHaveBeenCalled()
- expect(result).toEqual(subscription)
- })
- it('should find one, longest lasting subscription by user uuid if there are no canceled ones', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
- selectQueryBuilder.getMany = jest.fn().mockReturnValue([subscription])
- const result = await createRepository().findOneByUserUuid('123')
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('user_uuid = :user_uuid', {
- user_uuid: '123',
- })
- expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('ends_at', 'DESC')
- expect(selectQueryBuilder.getMany).toHaveBeenCalled()
- expect(result).toEqual(subscription)
- })
- it('should count by user uuid', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.getCount = jest.fn().mockReturnValue(2)
- const result = await createRepository().countByUserUuid('123')
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('user_uuid = :user_uuid', {
- user_uuid: '123',
- })
- expect(selectQueryBuilder.getCount).toHaveBeenCalled()
- expect(result).toEqual(2)
- })
- it('should find one, longest lasting subscription by user uuid if there are no ucanceled ones', async () => {
- subscription.cancelled = true
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
- selectQueryBuilder.getMany = jest.fn().mockReturnValue([subscription])
- const result = await createRepository().findOneByUserUuid('123')
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('user_uuid = :user_uuid', {
- user_uuid: '123',
- })
- expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('ends_at', 'DESC')
- expect(selectQueryBuilder.getMany).toHaveBeenCalled()
- expect(result).toEqual(subscription)
- })
- it('should find none if there are no subscriptions for the user', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
- selectQueryBuilder.getMany = jest.fn().mockReturnValue([])
- const result = await createRepository().findOneByUserUuid('123')
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('user_uuid = :user_uuid', {
- user_uuid: '123',
- })
- expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('ends_at', 'DESC')
- expect(selectQueryBuilder.getMany).toHaveBeenCalled()
- expect(result).toBeNull()
- })
- it('should update ends at by subscription id', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => updateQueryBuilder)
- updateQueryBuilder.update = jest.fn().mockReturnThis()
- updateQueryBuilder.set = jest.fn().mockReturnThis()
- updateQueryBuilder.where = jest.fn().mockReturnThis()
- updateQueryBuilder.execute = jest.fn()
- await createRepository().updateEndsAt(1, 1000, 1000)
- expect(updateQueryBuilder.update).toHaveBeenCalled()
- expect(updateQueryBuilder.set).toHaveBeenCalledWith({
- updatedAt: 1000,
- renewedAt: 1000,
- endsAt: 1000,
- })
- expect(updateQueryBuilder.where).toHaveBeenCalledWith('subscription_id = :subscriptionId', {
- subscriptionId: 1,
- })
- expect(updateQueryBuilder.execute).toHaveBeenCalled()
- })
- it('should update cancelled by subscription id', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => updateQueryBuilder)
- updateQueryBuilder.update = jest.fn().mockReturnThis()
- updateQueryBuilder.set = jest.fn().mockReturnThis()
- updateQueryBuilder.where = jest.fn().mockReturnThis()
- updateQueryBuilder.execute = jest.fn()
- await createRepository().updateCancelled(1, true, 1000)
- expect(updateQueryBuilder.update).toHaveBeenCalled()
- expect(updateQueryBuilder.set).toHaveBeenCalledWith({
- updatedAt: expect.any(Number),
- cancelled: true,
- })
- expect(updateQueryBuilder.where).toHaveBeenCalledWith('subscription_id = :subscriptionId', {
- subscriptionId: 1,
- })
- expect(updateQueryBuilder.execute).toHaveBeenCalled()
- })
- it('should find subscriptions by id', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
- selectQueryBuilder.getMany = jest.fn().mockReturnValue([subscription])
- const result = await createRepository().findBySubscriptionId(123)
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('subscription_id = :subscriptionId', {
- subscriptionId: 123,
- })
- expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('created_at', 'DESC')
- expect(selectQueryBuilder.getMany).toHaveBeenCalled()
- expect(result).toEqual([subscription])
- })
- it('should find subscriptions by id and type', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.orderBy = jest.fn().mockReturnThis()
- selectQueryBuilder.getMany = jest.fn().mockReturnValue([subscription])
- const result = await createRepository().findBySubscriptionIdAndType(123, UserSubscriptionType.Regular)
- expect(selectQueryBuilder.where).toHaveBeenCalledWith(
- 'subscription_id = :subscriptionId AND subscription_type = :type',
- {
- subscriptionId: 123,
- type: 'regular',
- },
- )
- expect(selectQueryBuilder.orderBy).toHaveBeenCalledWith('created_at', 'DESC')
- expect(selectQueryBuilder.getMany).toHaveBeenCalled()
- expect(result).toEqual([subscription])
- })
- it('should find one subscription by id and user uuid', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.getOne = jest.fn().mockReturnValue(subscription)
- const result = await createRepository().findOneByUserUuidAndSubscriptionId('1-2-3', 5)
- expect(selectQueryBuilder.where).toHaveBeenCalledWith(
- 'user_uuid = :userUuid AND subscription_id = :subscriptionId',
- {
- subscriptionId: 5,
- userUuid: '1-2-3',
- },
- )
- expect(selectQueryBuilder.getOne).toHaveBeenCalled()
- expect(result).toEqual(subscription)
- })
- it('should find one subscription by uuid', async () => {
- ormRepository.createQueryBuilder = jest.fn().mockImplementation(() => selectQueryBuilder)
- selectQueryBuilder.where = jest.fn().mockReturnThis()
- selectQueryBuilder.getOne = jest.fn().mockReturnValue(subscription)
- const result = await createRepository().findOneByUuid('1-2-3')
- expect(selectQueryBuilder.where).toHaveBeenCalledWith('uuid = :uuid', {
- uuid: '1-2-3',
- })
- expect(selectQueryBuilder.getOne).toHaveBeenCalled()
- expect(result).toEqual(subscription)
- })
- })
|