import { ParseValidationError, ValidateSchema } from '~/data/protocols'; import { MakeSchema, ValidationSchemas } from '~/domain'; import { IApplyDefaultRules } from '~/domain/protocols/apply-default-rules'; import { Jester } from '~/tests/helpers/jest-types'; export interface IMakeSchemaAdapter { new ( schemaValidate: ValidateSchema, applyDefaultRules: IApplyDefaultRules, parseValidationError: ParseValidationError ): MakeSchema; } export interface MakeSchemaMakeSut { (): { type: T; sut: MakeSchema; stubs: { schemaValidate: Jester.Mock.Stub>; applyDefaultRules: Jester.Mock.Stub>; parseValidationError: ParseValidationError; }; }; } export const getMakeSut = ( type: T, MakeAdapter: IMakeSchemaAdapter ): MakeSchemaMakeSut => { return () => { const stubs = { applyDefaultRules: { type: type as any, apply: jest.fn(rules => rules), }, schemaValidate: { validate: jest.fn(), }, parseValidationError: { parse: jest.fn(), }, }; const sut = new MakeAdapter(stubs.schemaValidate, stubs.applyDefaultRules, stubs.parseValidationError); return { sut, stubs, type }; }; };