From d37f669cbfe9ebbbbb10dcf6f27e5d0e72c49aa9 Mon Sep 17 00:00:00 2001 From: Nima Sheibani Date: Thu, 8 Aug 2024 17:14:49 -0500 Subject: [PATCH] CHK-3367: fix shipping line fee --- src/shipping/changeShippingLineWithCode.ts | 20 ++++++ src/shipping/index.ts | 1 + src/types/apiInterfaces.ts | 1 + src/variables/mocks.ts | 10 ++- src/variables/variables.ts | 3 +- .../changeShippingLineWithCode.test.ts | 71 +++++++++++++++++++ 6 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 src/shipping/changeShippingLineWithCode.ts create mode 100644 tests/shipping/changeShippingLineWithCode.test.ts diff --git a/src/shipping/changeShippingLineWithCode.ts b/src/shipping/changeShippingLineWithCode.ts new file mode 100644 index 0000000..9ba49f8 --- /dev/null +++ b/src/shipping/changeShippingLineWithCode.ts @@ -0,0 +1,20 @@ +import {apiTypeKeys, apiTypes, fetchAPI, getApiOptions, getApiUrl, IApiReturnObject, checkApiResponse} from 'src'; + +/** + * # changeShippingLine + * + * calls post shipping lines endpoint and sets the values for a shipping line + * + * @param index id of the appropriate available shipping line + * @param code + * @param numOfRetries + */ +export async function changeShippingLineWithCode(index: string, code = '', numOfRetries = 0): Promise { + const {changeShippingLines} = apiTypeKeys; + const url = getApiUrl(changeShippingLines); + const options = getApiOptions(changeShippingLines, { index, code }); + const fetchRes = await fetchAPI(url, options, numOfRetries); + const {keysToTest} = apiTypes.changeShippingLines; + + return checkApiResponse(fetchRes, keysToTest); +} diff --git a/src/shipping/index.ts b/src/shipping/index.ts index f3d5010..9884676 100644 --- a/src/shipping/index.ts +++ b/src/shipping/index.ts @@ -1,3 +1,4 @@ export * from './getShippingLines'; export * from './estimateShippingLines'; export * from './changeShippingLine'; +export * from './changeShippingLineWithCode'; diff --git a/src/types/apiInterfaces.ts b/src/types/apiInterfaces.ts index c02f7e7..543e280 100644 --- a/src/types/apiInterfaces.ts +++ b/src/types/apiInterfaces.ts @@ -874,6 +874,7 @@ export interface IShippingLine { id: string; description: string; amount: number; + code: string; } export interface IPigiActionType { diff --git a/src/variables/mocks.ts b/src/variables/mocks.ts index d5091f6..8639042 100644 --- a/src/variables/mocks.ts +++ b/src/variables/mocks.ts @@ -213,7 +213,9 @@ export const patchOrderMetaDataMock: IPatchOrderMetaDataRequest = { export const selectShippingLineMock: IShippingLine = { id: 'test_select_shipping_line_id', description: 'Test Description', - amount: 100 + amount: 100, + code: '', + }; export const availableShippingLineMock: IAvailableShippingLine = { @@ -284,11 +286,13 @@ export const selectShippingLineArrayMock: Array = [ { id: '1', description: 'First shipping line Option', - amount: 999 + amount: 999, + code: '111', }, { id: '2', description: 'Second shipping line Option', - amount: 1500 + amount: 1500, + code: '222' } ]; diff --git a/src/variables/variables.ts b/src/variables/variables.ts index ab0db98..da11d3b 100644 --- a/src/variables/variables.ts +++ b/src/variables/variables.ts @@ -111,7 +111,8 @@ export const shipping: IShipping = { selected_shipping: { id: '', description: '', - amount: 0 + amount: 0, + code: '', }, available_shipping_lines: [], taxes: [], diff --git a/tests/shipping/changeShippingLineWithCode.test.ts b/tests/shipping/changeShippingLineWithCode.test.ts new file mode 100644 index 0000000..e410589 --- /dev/null +++ b/tests/shipping/changeShippingLineWithCode.test.ts @@ -0,0 +1,71 @@ +import {apiTypeKeys, baseReturnObject, methods, apiTypes, changeShippingLineWithCode} from 'src'; +import {applicationStateMock, selectShippingLineMock} from 'src/variables/mocks'; +import * as fetchAPI from 'src/utils/fetchAPI'; +import * as getApiOptions from 'src/utils/getApiOptions'; +import * as apiUrl from 'src/utils/apiUrl'; +import * as apiResponse from 'src/utils/apiResponse'; + +describe('testing set shipping address api', () => { + const returnObject = {...baseReturnObject}; + const timesWhenCalled = 1; + const index = '1'; + const code = 'code'; + const apiUrlMock = 'https://api.com/checkout/storefront/123/123/addresses/shipping'; + const {keysToTest} = apiTypes.changeShippingLines; + let optionsMock: RequestInit; + let getApiOptionsSpy: jest.SpyInstance; + let getApiUrlSpy: jest.SpyInstance; + let fetchApiSpy: jest.SpyInstance; + let checkApiResponseSpy: jest.SpyInstance; + + beforeEach(() => { + global.Headers = jest.fn().mockReturnValue({ + append: jest.fn(() => null) + }); + optionsMock = {method: methods.POST, headers: new Headers(), body: JSON.stringify({})}; + getApiOptionsSpy = jest.spyOn(getApiOptions, 'getApiOptions').mockReturnValue(optionsMock); + getApiUrlSpy = jest.spyOn(apiUrl, 'getApiUrl').mockReturnValue(apiUrlMock); + fetchApiSpy = jest.spyOn(fetchAPI, 'fetchAPI').mockReturnValue(Promise.resolve(returnObject)); + checkApiResponseSpy = jest.spyOn(apiResponse, 'checkApiResponse').mockReturnValue(returnObject); + returnObject.response = { data: { selected_shipping: selectShippingLineMock, application_state: applicationStateMock }}; + returnObject.success = true; + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + test('calling shippingLines', async () => { + const res = await changeShippingLineWithCode(index, code); + + expect(getApiOptionsSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(getApiUrlSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(fetchApiSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(checkApiResponseSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(getApiOptionsSpy).toHaveBeenCalledWith(apiTypeKeys.changeShippingLines, {index, code}); + expect(getApiUrlSpy).toHaveBeenCalledWith(apiTypeKeys.changeShippingLines); + expect(fetchApiSpy).toHaveBeenCalledWith(apiUrlMock, optionsMock, 0); + expect(checkApiResponseSpy).toHaveBeenCalledWith(returnObject, keysToTest); + expect(res).toStrictEqual(returnObject); + }); + + test('calling shippingLines w/ success = false', async () => { + const tempReturnObject = {...baseReturnObject}; + + fetchApiSpy.mockReturnValueOnce(Promise.resolve(tempReturnObject)); + checkApiResponseSpy.mockReturnValueOnce(tempReturnObject); + + const res = await changeShippingLineWithCode(index, code, 1); + + expect(getApiOptionsSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(getApiUrlSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(fetchApiSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(checkApiResponseSpy).toHaveBeenCalledTimes(timesWhenCalled); + expect(getApiOptionsSpy).toHaveBeenCalledWith(apiTypeKeys.changeShippingLines, {index, code}); + expect(getApiUrlSpy).toHaveBeenCalledWith(apiTypeKeys.changeShippingLines); + expect(fetchApiSpy).toHaveBeenCalledWith(apiUrlMock, optionsMock, 1); + expect(checkApiResponseSpy).toHaveBeenCalledWith(tempReturnObject, keysToTest); + expect(res).toStrictEqual(tempReturnObject); + }); + +});