feat(scheduler): add publishing discount apply/withdraw events
This commit is contained in:
parent
71684350e9
commit
48af9e7c1c
2 changed files with 98 additions and 1 deletions
|
@ -1,4 +1,9 @@
|
|||
import { DomainEventPublisherInterface, EmailMessageRequestedEvent } from '@standardnotes/domain-events'
|
||||
import {
|
||||
DiscountApplyRequestedEvent,
|
||||
DiscountWithdrawRequestedEvent,
|
||||
DomainEventPublisherInterface,
|
||||
EmailMessageRequestedEvent,
|
||||
} from '@standardnotes/domain-events'
|
||||
import { PredicateName } from '@standardnotes/predicates'
|
||||
import 'reflect-metadata'
|
||||
import { DomainEventFactoryInterface } from '../Event/DomainEventFactoryInterface'
|
||||
|
@ -35,6 +40,12 @@ describe('JobDoneInterpreter', () => {
|
|||
domainEventFactory.createEmailMessageRequestedEvent = jest
|
||||
.fn()
|
||||
.mockReturnValue({} as jest.Mocked<EmailMessageRequestedEvent>)
|
||||
domainEventFactory.createDiscountApplyRequestedEvent = jest
|
||||
.fn()
|
||||
.mockReturnValue({} as jest.Mocked<DiscountApplyRequestedEvent>)
|
||||
domainEventFactory.createDiscountWithdrawRequestedEvent = jest
|
||||
.fn()
|
||||
.mockReturnValue({} as jest.Mocked<DiscountWithdrawRequestedEvent>)
|
||||
|
||||
domainEventPublisher = {} as jest.Mocked<DomainEventPublisherInterface>
|
||||
domainEventPublisher.publish = jest.fn()
|
||||
|
@ -172,6 +183,64 @@ describe('JobDoneInterpreter', () => {
|
|||
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should request discount apply', async () => {
|
||||
jobRepository.findOneByUuid = jest.fn().mockReturnValue({
|
||||
name: JobName.APPLY_SUBSCRIPTION_DISCOUNT,
|
||||
userIdentifier: 'test@test.te',
|
||||
userIdentifierType: 'email',
|
||||
} as jest.Mocked<Job>)
|
||||
|
||||
await createInterpreter().interpret('1-2-3')
|
||||
|
||||
expect(domainEventFactory.createDiscountApplyRequestedEvent).toHaveBeenCalledWith({
|
||||
userEmail: 'test@test.te',
|
||||
discountCode: 'econ-10',
|
||||
})
|
||||
expect(domainEventPublisher.publish).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should not request discount apply if email is missing', async () => {
|
||||
jobRepository.findOneByUuid = jest.fn().mockReturnValue({
|
||||
name: JobName.APPLY_SUBSCRIPTION_DISCOUNT,
|
||||
userIdentifier: '2-3-4',
|
||||
userIdentifierType: 'uuid',
|
||||
} as jest.Mocked<Job>)
|
||||
|
||||
await createInterpreter().interpret('1-2-3')
|
||||
|
||||
expect(domainEventFactory.createDiscountApplyRequestedEvent).not.toHaveBeenCalled()
|
||||
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should request discount withdraw', async () => {
|
||||
jobRepository.findOneByUuid = jest.fn().mockReturnValue({
|
||||
name: JobName.WITHDRAW_SUBSCRIPTION_DISCOUNT,
|
||||
userIdentifier: 'test@test.te',
|
||||
userIdentifierType: 'email',
|
||||
} as jest.Mocked<Job>)
|
||||
|
||||
await createInterpreter().interpret('1-2-3')
|
||||
|
||||
expect(domainEventFactory.createDiscountWithdrawRequestedEvent).toHaveBeenCalledWith({
|
||||
userEmail: 'test@test.te',
|
||||
discountCode: 'econ-10',
|
||||
})
|
||||
expect(domainEventPublisher.publish).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should not request discount withdraw if email is missing', async () => {
|
||||
jobRepository.findOneByUuid = jest.fn().mockReturnValue({
|
||||
name: JobName.WITHDRAW_SUBSCRIPTION_DISCOUNT,
|
||||
userIdentifier: '2-3-4',
|
||||
userIdentifierType: 'uuid',
|
||||
} as jest.Mocked<Job>)
|
||||
|
||||
await createInterpreter().interpret('1-2-3')
|
||||
|
||||
expect(domainEventFactory.createDiscountWithdrawRequestedEvent).not.toHaveBeenCalled()
|
||||
expect(domainEventPublisher.publish).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should do nothing if there is no interpretation for a given job', async () => {
|
||||
jobRepository.findOneByUuid = jest.fn().mockReturnValue({
|
||||
name: 'foobar' as JobName,
|
||||
|
|
|
@ -49,6 +49,16 @@ export class JobDoneInterpreter implements JobDoneInterpreterInterface {
|
|||
await this.requestExitInterviewEmail(job.userIdentifier)
|
||||
}
|
||||
return
|
||||
case JobName.APPLY_SUBSCRIPTION_DISCOUNT:
|
||||
if (job.userIdentifierType === 'email') {
|
||||
await this.requestDiscountApply(job.userIdentifier)
|
||||
}
|
||||
return
|
||||
case JobName.WITHDRAW_SUBSCRIPTION_DISCOUNT:
|
||||
if (job.userIdentifierType === 'email') {
|
||||
await this.requestDiscountWithdraw(job.userIdentifier)
|
||||
}
|
||||
return
|
||||
default:
|
||||
return
|
||||
}
|
||||
|
@ -86,6 +96,24 @@ export class JobDoneInterpreter implements JobDoneInterpreterInterface {
|
|||
)
|
||||
}
|
||||
|
||||
private async requestDiscountApply(userEmail: string): Promise<void> {
|
||||
await this.domainEventPublisher.publish(
|
||||
this.domainEventFactory.createDiscountApplyRequestedEvent({
|
||||
userEmail,
|
||||
discountCode: 'econ-10',
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
private async requestDiscountWithdraw(userEmail: string): Promise<void> {
|
||||
await this.domainEventPublisher.publish(
|
||||
this.domainEventFactory.createDiscountWithdrawRequestedEvent({
|
||||
userEmail,
|
||||
discountCode: 'econ-10',
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
private async predicatesAreFulfilled(job: Job): Promise<boolean> {
|
||||
const predicates = await this.predicateRepository.findByJobUuid(job.uuid)
|
||||
|
||||
|
|
Loading…
Reference in a new issue