/* eslint-disable import/first */ let myFetchMock import { internet, datatype } from 'faker' import { sample } from 'lodash' import * as fetchMock from 'fetch-mock-jest' import { ExternalExceptionError } from '../../errors/external_exception.error' import { HttpService } from '../http' import { CravaService } from './crava.service' import { Product } from './enums/product.enum' import { User } from './types/user.type' jest.mock('node-fetch', () => (myFetchMock = fetchMock.sandbox())) describe('CravaService', () => { let subject: CravaService beforeAll(() => { subject = new CravaService(new HttpService()) globalThis.secret = { crava: { endpoint: internet.url(), token: datatype.uuid(), }, } as any }) afterEach(() => { jest.resetAllMocks() myFetchMock.mockReset() }) afterAll(() => { jest.restoreAllMocks() }) describe('#redeemBenefict', () => { let user: User let product: Product beforeAll(() => { user = { id: datatype.uuid(), documentNumber: datatype.uuid() } product = sample(Object.values(Product)) as Product }) beforeEach(() => { myFetchMock.put('', {}) }) it('calls crava api', async () => { await subject.redeemBenefict({ user, product }) expect(myFetchMock).toBeCalledWith( expect.stringContaining(globalThis.secret.crava.endpoint), expect.objectContaining({ body: JSON.stringify({ id: user.id, cpf: user.documentNumber, codigo: product }) }), ) }) describe('when api returns status code error', () => { beforeEach(() => { myFetchMock.put('', () => 400, { overwriteRoutes: true }) }) it('throws an error', async () => { await expect(subject.redeemBenefict({ user, product })).rejects.toThrowError(ExternalExceptionError) }) }) }) })