import { Test, TestingModule } from '@nestjs/testing' import { datatype, random } from 'faker' import { sample } from 'lodash' import { factory } from '../../../test/factories' import { MockedModule } from '../../../test/types' import { LanguageCountryCode } from '../../utils' import { MailService } from '../mail' import { PDFService } from '../pdf' import { StorageService } from '../storage' import { ContractData, ContractService } from './contract.service' import { TranslateContractHelper } from './i18n' describe('ContractService', () => { let language = sample(Object.values(LanguageCountryCode)) let subject: ContractService let mailService: MockedModule let pdfService: MockedModule let storageService: MockedModule let contract: ContractData const translateContractHelper = new TranslateContractHelper() beforeAll(async () => { mailService = { send: jest.fn(), } pdfService = { generatePDF: jest.fn(), } storageService = { upload: jest.fn(), } const app: TestingModule = await Test.createTestingModule({ providers: [ { provide: MailService, useValue: mailService }, { provide: PDFService, useValue: pdfService }, { provide: StorageService, useValue: storageService }, { provide: TranslateContractHelper, useValue: translateContractHelper }, ContractService, ], }).compile() subject = app.get(ContractService) contract = await factory.build('contract') }) afterEach(() => { jest.resetAllMocks() }) afterAll(() => { jest.restoreAllMocks() }) describe('#generateSubscriptionContract', () => { let pdf: Buffer let patientId: string let subscriptionId: string beforeAll(() => { pdf = Buffer.from(random.alphaNumeric()) patientId = datatype.uuid() subscriptionId = datatype.uuid() }) beforeEach(() => { pdfService.generatePDF.mockResolvedValue(pdf) }) describe('when language is pt_BR', () => { beforeAll(() => { language = 'pt_BR' as LanguageCountryCode }) it('generates contract in pdf', async () => { await subject.generateSubscriptionContract(contract, patientId, subscriptionId, language) expect(pdfService.generatePDF).toBeCalled() }) it('uploads contract for storage', async () => { await subject.generateSubscriptionContract(contract, patientId, subscriptionId, language) expect(storageService.upload).toBeCalled() }) it('sends an email for user', async () => { await subject.generateSubscriptionContract(contract, patientId, subscriptionId, language) expect(mailService.send).toBeCalled() }) }) }) })