diff --git a/modules/order/front/prices-popover/index.spec.js b/modules/order/front/prices-popover/index.spec.js new file mode 100644 index 000000000..a68a328a2 --- /dev/null +++ b/modules/order/front/prices-popover/index.spec.js @@ -0,0 +1,171 @@ +import './index.js'; + +describe('Order', () => { + describe('Component vnOrderPricesPopover', () => { + let controller; + let $httpBackend; + let orderId = 16; + + beforeEach(ngModule('order')); + + beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { + $httpBackend = _$httpBackend_; + const $scope = $rootScope.$new(); + const $element = angular.element(''); + const $transclude = { + $$boundTransclude: { + $$slots: [] + } + }; + controller = $componentController('vnOrderPricesPopover', {$element, $scope, $transclude}); + controller._prices = [ + {warehouseFk: 1, grouping: 10, quantity: 0}, + {warehouseFk: 1, grouping: 100, quantity: 100} + ]; + controller.item = {available: 1000}; + controller.order = {id: orderId}; + })); + + describe('prices() setter', () => { + it('should call to the getTotalQuantity() method', () => { + controller.getTotalQuantity = jest.fn(); + + controller.prices = [ + {grouping: 10, quantity: 0}, + {grouping: 100, quantity: 0}, + {grouping: 1000, quantity: 0}, + ]; + + expect(controller.getTotalQuantity).toHaveBeenCalledWith(); + }); + }); + + describe('getTotalQuantity()', () => { + it('should set the totalQuantity and maxQuantity properties', () => { + controller.getTotalQuantity(); + + expect(controller.totalQuantity).toEqual(100); + expect(controller.maxQuantity).toEqual(900); + }); + }); + + describe('addQuantity()', () => { + it('should call to the getTotalQuantity() method and NOT set the quantity property', () => { + jest.spyOn(controller, 'getTotalQuantity'); + + controller.prices = [ + {grouping: 10, quantity: 0}, + {grouping: 100, quantity: 0}, + {grouping: 1000, quantity: 1000}, + ]; + + const oneThousandGrouping = controller.prices[2]; + + expect(oneThousandGrouping.quantity).toEqual(1000); + + controller.addQuantity(oneThousandGrouping); + + expect(controller.getTotalQuantity).toHaveBeenCalledWith(); + expect(oneThousandGrouping.quantity).toEqual(1000); + }); + + it('should call to the getTotalQuantity() method and then set the quantity property', () => { + jest.spyOn(controller, 'getTotalQuantity'); + + const oneHandredGrouping = controller.prices[1]; + controller.addQuantity(oneHandredGrouping); + + expect(controller.getTotalQuantity).toHaveBeenCalledWith(); + expect(oneHandredGrouping.quantity).toEqual(200); + }); + }); + + describe('getGroupings()', () => { + it('should return a row with the total filled quantity', () => { + jest.spyOn(controller, 'getTotalQuantity'); + + controller.prices = [ + {warehouseFk: 1, grouping: 10, quantity: 10}, + {warehouseFk: 1, grouping: 100, quantity: 100}, + {warehouseFk: 1, grouping: 1000, quantity: 1000}, + ]; + + const rows = controller.getGroupings(); + const firstRow = rows[0]; + + expect(rows.length).toEqual(1); + expect(firstRow.quantity).toEqual(1110); + }); + + it('should return two filled rows with a quantity', () => { + jest.spyOn(controller, 'getTotalQuantity'); + + controller.prices = [ + {warehouseFk: 1, grouping: 10, quantity: 10}, + {warehouseFk: 2, grouping: 10, quantity: 10}, + {warehouseFk: 1, grouping: 100, quantity: 0}, + {warehouseFk: 1, grouping: 1000, quantity: 1000}, + ]; + + const rows = controller.getGroupings(); + const firstRow = rows[0]; + const secondRow = rows[1]; + + expect(rows.length).toEqual(2); + expect(firstRow.quantity).toEqual(1010); + expect(secondRow.quantity).toEqual(10); + }); + }); + + describe('submit()', () => { + it('should throw an error if none of the rows contains a quantity', () => { + jest.spyOn(controller, 'getTotalQuantity'); + jest.spyOn(controller.vnApp, 'showError'); + + controller.prices = [ + {warehouseFk: 1, grouping: 10, quantity: 0}, + {warehouseFk: 1, grouping: 100, quantity: 0} + ]; + + controller.submit(); + + expect(controller.vnApp.showError).toHaveBeenCalledWith(`First you must add some quantity`); + }); + + it(`should throw an error if the quantity doesn't match the grouping value`, () => { + jest.spyOn(controller, 'getTotalQuantity'); + jest.spyOn(controller.vnApp, 'showError'); + + controller.prices = [ + {warehouseFk: 1, grouping: 10, quantity: 0}, + {warehouseFk: 1, grouping: 100, quantity: 101} + ]; + + controller.submit(); + + expect(controller.vnApp.showError).toHaveBeenCalledWith(`The amounts doesn't match with the grouping`); + }); + + it('should should make an http query and then show a success message', () => { + jest.spyOn(controller, 'getTotalQuantity'); + jest.spyOn(controller.vnApp, 'showSuccess'); + + controller.prices = [ + {warehouseFk: 1, grouping: 10, quantity: 0}, + {warehouseFk: 1, grouping: 100, quantity: 100} + ]; + + const params = { + orderFk: orderId, + items: [{warehouseFk: 1, grouping: 100, quantity: 100}] + }; + + $httpBackend.expectPOST('OrderRows/addToOrder', params).respond(200); + controller.submit(); + $httpBackend.flush(); + + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith(`Data saved!`); + }); + }); + }); +});