import { HttpResponse, HttpResponseOk, HttpResponseError, ApiError } from '../http/types' import { errorCodes } from '../responseCodes' import { CreateTokenResponse, ClientNonceResponse, PaymentProvidersResponse, ProviderId, LoyaltyProgram, } from './types' const clientNonceResponse = { card_type: 'cardType', last_four: 'lastFour', nonce: 'nonce', } const jsonResponseHeaders = new Headers({ 'content-type': 'application/json', }) const getMock = (method: (a?: Partial) => HttpResponseOk) => (partialBody?: Partial) => jest.fn((): Promise> => Promise.resolve(method(partialBody))) const getErrorResponse = (message: string) => (code = errorCodes.K0001): HttpResponseError => ({ ok: false, status: 500, headers: jsonResponseHeaders, error: { code, message: `${message}: Something went wrong`, }, }) export const getMockedPaymentCreateClientTokenResponse = ( partialBody: Partial = {} ): HttpResponseOk => ({ ok: true, status: 200, headers: jsonResponseHeaders, body: { token: 'token', ...partialBody, }, }) export const getMockedErrorPaymentCreateClientTokenResponse = getErrorResponse('Create client token') export const getPaymentCreateClientTokenMock = getMock(getMockedPaymentCreateClientTokenResponse) export const getMockedAddPaymentCardResponse = ( partialBody: Partial = {} ): HttpResponseOk => ({ ok: true, status: 200, headers: jsonResponseHeaders, body: { ...clientNonceResponse, ...partialBody, }, }) export const getMockedErrorAddPaymentCardResponse = getErrorResponse('Add payment card') export const getAddPaymentCardMock = getMock(getMockedAddPaymentCardResponse) export const getMockedPaymentGetClientNonceResponse = ( partialBody: Partial = {} ): HttpResponseOk => ({ ok: true, status: 200, headers: jsonResponseHeaders, body: { ...clientNonceResponse, ...partialBody, }, }) export const getMockedErrorPaymentGetClientNonceResponse = getErrorResponse('Get client nonce') export const getPaymentGetClientNonceMock = getMock(getMockedPaymentGetClientNonceResponse) export const paymentProviderIdBeingUsed: ProviderId = 'Braintree' export const loyaltyProgramBeingUsed: LoyaltyProgram = { id: 'client', name: 'Client Name' } export const getMockedPaymentProviderResponse = (): HttpResponseOk => ({ ok: true, status: 200, headers: jsonResponseHeaders, body: { provider: { id: paymentProviderIdBeingUsed, }, loyalty_programme: loyaltyProgramBeingUsed, }, }) export const getMockedPaymentProviderEmptyResponse = (): HttpResponseOk => ({ ok: true, status: 200, headers: jsonResponseHeaders, body: {}, }) export const getMockedPaymentProviderWithoutLoyaltyResponse = (): HttpResponseOk => ({ ok: true, status: 200, headers: jsonResponseHeaders, body: { provider: { id: paymentProviderIdBeingUsed, }, }, }) export const getPaymentProviderMock = getMock(getMockedPaymentProviderResponse)