From de610b9b94f41adc2285d42b2310587f497f64cb Mon Sep 17 00:00:00 2001 From: Ankur Agarwal Date: Tue, 5 Nov 2019 16:58:38 +1100 Subject: [PATCH] fix(checkout): CHECKOUT-4536 Fix error when adding a address with multishipping --- src/app/shipping/Shipping.spec.tsx | 42 ++++++++++++++++++++++++++++++ src/app/shipping/Shipping.tsx | 6 ++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/app/shipping/Shipping.spec.tsx b/src/app/shipping/Shipping.spec.tsx index 615bd2d5ab..835a5e1fe1 100644 --- a/src/app/shipping/Shipping.spec.tsx +++ b/src/app/shipping/Shipping.spec.tsx @@ -45,6 +45,9 @@ describe('Shipping Component', () => { jest.spyOn(checkoutService, 'loadShippingOptions') .mockResolvedValue({} as CheckoutSelectors); + jest.spyOn(checkoutService, 'deleteConsignment') + .mockResolvedValue({} as CheckoutSelectors); + jest.spyOn(checkoutState.data, 'getCart') .mockReturnValue({ ...getCart(), @@ -236,6 +239,45 @@ describe('Shipping Component', () => { expect(defaultProps.navigateNextStep).toHaveBeenCalledWith(true); }); + it('calls delete consignment if consignments exist when adding a new address', async () => { + jest.spyOn(checkoutState.data, 'getCustomer').mockReturnValue({ + ...getCustomer(), + }); + + jest.spyOn(checkoutState.data, 'getConsignments') + .mockReturnValue([getConsignment()]); + + component = mount(); + await new Promise(resolve => process.nextTick(resolve)); + + component.update(); + component.find('#addressToggle').simulate('click'); + component.find('#addressDropdown li').first().find('a').simulate('click'); + + await new Promise(resolve => process.nextTick(resolve)); + component.update(); + + expect(checkoutService.deleteConsignment).toHaveBeenCalled(); + }); + + it('does not Call delete consignment if consignment doesnot exist when adding a new address', async () => { + jest.spyOn(checkoutState.data, 'getCustomer').mockReturnValue({ + ...getCustomer(), + }); + + jest.spyOn(checkoutState.data, 'getConsignments') + .mockReturnValue([]); + + component = mount(); + await new Promise(resolve => process.nextTick(resolve)); + + component.update(); + component.find('#addressToggle').simulate('click'); + component.find('#addressDropdown li').first().find('a').simulate('click'); + + expect(checkoutService.deleteConsignment).not.toHaveBeenCalled(); + }); + describe('when multishipping mode is on', () => { describe('when shopper is signed', () => { beforeEach(async () => { diff --git a/src/app/shipping/Shipping.tsx b/src/app/shipping/Shipping.tsx index 04dd4910c8..d3af7b459e 100644 --- a/src/app/shipping/Shipping.tsx +++ b/src/app/shipping/Shipping.tsx @@ -225,7 +225,11 @@ const deleteConsignmentsSelector = createSelector( ({ checkoutService: { deleteConsignment } }: CheckoutContextProps) => deleteConsignment, ({ checkoutState: { data } }: CheckoutContextProps) => data.getConsignments(), (deleteConsignment, consignments) => async () => { - const [{ data }] = await Promise.all((consignments || []).map(({ id }) => + if (!consignments || !consignments.length) { + return; + } + + const [{ data }] = await Promise.all(consignments.map(({ id }) => deleteConsignment(id) ));