diff --git a/src/3-adapters/controller/exchangeRate/updateExchangeRateController.ts b/src/3-adapters/controller/exchangeRate/updateExchangeRateController.ts new file mode 100644 index 0000000..218d6f4 --- /dev/null +++ b/src/3-adapters/controller/exchangeRate/updateExchangeRateController.ts @@ -0,0 +1,32 @@ +import { IExchangeRateRepository } from '../../../2-business/repositories/iExchangeRateRepository' +import { IExchangeRateService } from '../../../2-business/services/iExchangeRateService' +import { UpdateExchangeRateUseCase } from '../../../2-business/useCases/exchangeRate/updateExchangeRateUseCase' +import { ControllerBase } from '../../controllerBase' +import { Output } from '../../../2-business/dto/output' + +export class UpdateExchangeRateController extends ControllerBase { + constructor ( + private readonly exchangeRateRepository: IExchangeRateRepository, + private readonly exchangeRateService: IExchangeRateService + ) { super() } + + async run (): Promise> { + const logPrefix = 'UpdateExchangeRateController' + console.log(`${logPrefix} :: start`) + + try { + const updateExchangeRateUseCase = new UpdateExchangeRateUseCase( + this.exchangeRateRepository, + this.exchangeRateService + ) + + await updateExchangeRateUseCase.execute() + + console.log(`${logPrefix} :: end`) + + return { status: 'success' } + } catch (error) { + throw error + } + } +} diff --git a/src/3-adapters/controllerBase.ts b/src/3-adapters/controllerBase.ts new file mode 100644 index 0000000..4d9d531 --- /dev/null +++ b/src/3-adapters/controllerBase.ts @@ -0,0 +1,5 @@ +import { Output } from '../2-business/dto/output' + +export abstract class ControllerBase { + abstract run (input: I): Promise> +} diff --git a/test/unit/3-adpters/exchangeRate/updateExchangeRateController.test.ts b/test/unit/3-adpters/exchangeRate/updateExchangeRateController.test.ts new file mode 100644 index 0000000..d63fe42 --- /dev/null +++ b/test/unit/3-adpters/exchangeRate/updateExchangeRateController.test.ts @@ -0,0 +1,56 @@ +import { UpdateExchangeRateController } from '../../../../src/3-adapters/controller/exchangeRate/updateExchangeRateController' +import { IExchangeRateRepository } from '../../../../src/2-business/repositories/iExchangeRateRepository' +import { IExchangeRateService } from '../../../../src/2-business/services/iExchangeRateService' +import { ILatestRatesResponse } from '../../../../src/1-domain/models/iExchangeRateResponse' + +jest.mock('../../../../src/2-business/useCases/exchangeRate/updateExchangeRateUseCase') + +describe('UpdateExchangeRateController', () => { + const exchangeRateResponseMock: ILatestRatesResponse = { + success: true, + timestamp: 1519296206, + base: 'BRL', + date: '2021-03-17', + rates: { + AUD: 1.566015, + CAD: 1.560132, + CHF: 1.154727, + CNY: 7.827874, + GBP: 0.882047, + JPY: 132.360679, + USD: 1.23396 + } + } + + let exchangeRateRepository: IExchangeRateRepository + let exchangeRateService: IExchangeRateService + let UpdateExchangeRateUseCase = jest.fn() + + const setMocks = () => { + exchangeRateRepository = { + upsert: jest.fn().mockResolvedValue(null) + } + exchangeRateService = { + getLatestRates: jest.fn().mockResolvedValue(exchangeRateResponseMock) + } + UpdateExchangeRateUseCase.mockClear() + } + + beforeEach(() => { + setMocks() + }) + + test('Success::should update the exchange rates successfully', async () => { + UpdateExchangeRateUseCase.mockImplementation(() => { + return { + execute: jest.fn() + } + }) + const controller = new UpdateExchangeRateController( + exchangeRateRepository, + exchangeRateService + ) + + await expect(controller.run()).resolves.not.toThrow() + }) +})