From b1bac703ed3449147513c22a2e6732dc2479a61a Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Thu, 5 Nov 2015 17:50:18 +1100 Subject: [PATCH] WIP: BOM Refactor, delete line_items using ngResource, updating data requests in line_items_controller --- .../line_items_controller.js.coffee | 16 +++--- .../line_items/services/line_items.js.coffee | 12 +++++ .../line_items_controller_spec.js.coffee | 48 ++++++++++------- .../services/line_items_spec.js.coffee | 52 ++++++++++++++++++- 4 files changed, 96 insertions(+), 32 deletions(-) diff --git a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee index 1c58bddc95..54939d98f4 100644 --- a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee +++ b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee @@ -30,11 +30,11 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $http, $q $scope.refreshData = -> $scope.loading = true - $scope.orders = Orders.index("q[state_not_eq]": "canceled", "q[completed_at_not_null]": "true", "q[completed_at_gt]": "#{$scope.startDate}", "q[completed_at_lt]": "#{$scope.endDate}") - $scope.distributors = Enterprises.index(action: "for_line_items", serializer: "basic", "q[sells_in][]": ["own", "any"] ) - $scope.orderCycles = OrderCycles.index(serializer: "basic", as: "distributor", "q[orders_close_at_gt]": "#{formatDate(daysFromToday(-90))}") - $scope.lineItems = LineItems.index("q[state_not_eq]": "canceled", "q[completed_at_not_null]": "true", "q[completed_at_gt]": "#{$scope.startDate}", "q[completed_at_lt]": "#{$scope.endDate}") - $scope.suppliers = Enterprises.index(action: "for_line_items", serializer: "basic", "q[is_primary_producer_eq]": "true" ) + $scope.orders = Orders.index("q[state_not_eq]": "canceled", "q[completed_at_not_null]": "true", "q[created_at_gt]": "#{$scope.startDate}", "q[created_at_lt]": "#{$scope.endDate}") + $scope.distributors = Enterprises.index(action: "for_line_items", ams_prefix: "basic", "q[sells_in][]": ["own", "any"] ) + $scope.orderCycles = OrderCycles.index(ams_prefix: "basic", as: "distributor", "q[orders_close_at_gt]": "#{formatDate(daysFromToday(-90))}") + $scope.lineItems = LineItems.index("q[order][state_not_eq]": "canceled", "q[order][completed_at_not_null]": "true", "q[order][created_at_gt]": "#{$scope.startDate}", "q[order][created_at_lt]": "#{$scope.endDate}") + $scope.suppliers = Enterprises.index(action: "for_line_items", ams_prefix: "basic", "q[is_primary_producer_eq]": "true" ) $q.all([$scope.orders.$promise, $scope.distributors.$promise, $scope.orderCycles.$promise]).then -> Dereferencer.dereferenceAttr $scope.orders, "distributor", Enterprises.enterprisesByID @@ -62,12 +62,8 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $http, $q $scope.deleteLineItem = (lineItem) -> if ($scope.confirmDelete && confirm("Are you sure?")) || !$scope.confirmDelete - $http( - method: "DELETE" - url: "/api/orders/" + lineItem.order.number + "/line_items/" + lineItem.id - ).success (data) -> + LineItems.delete(lineItem).then -> $scope.lineItems.splice $scope.lineItems.indexOf(lineItem), 1 - delete LineItems.lineItemsByID[lineItem.id] $scope.deleteLineItems = (lineItems) -> existingState = $scope.confirmDelete diff --git a/app/assets/javascripts/admin/line_items/services/line_items.js.coffee b/app/assets/javascripts/admin/line_items/services/line_items.js.coffee index 38dd3ffe93..55bc0b5aa8 100644 --- a/app/assets/javascripts/admin/line_items/services/line_items.js.coffee +++ b/app/assets/javascripts/admin/line_items/services/line_items.js.coffee @@ -46,3 +46,15 @@ angular.module("admin.lineItems").factory 'LineItems', ($q, LineItemResource) -> resetAttribute: (lineItem, attribute) -> lineItem[attribute] = @pristineByID[lineItem.id][attribute] + + delete: (lineItem, callback=null) -> + deferred = $q.defer() + lineItem.$delete({id: lineItem.id, orders: "orders", order_number: lineItem.order.number}) + .then( (data) => + delete @lineItemsByID[lineItem.id] + delete @pristineByID[lineItem.id] + (callback || angular.noop)(data) + deferred.resolve(data) + ).catch (response) -> + deferred.reject(response) + deferred.promise diff --git a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee index dbe9ead432..7759a42124 100644 --- a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee @@ -1,4 +1,4 @@ -describe "AdminOrderMgmtCtrl", -> +describe "LineItemsCtrl", -> ctrl = scope = httpBackend = VariantUnitManager = Enterprises = Orders = LineItems = OrderCycles = null supplier = distributor = orderCycle = null @@ -26,11 +26,11 @@ describe "AdminOrderMgmtCtrl", -> order = { id: 9, order_cycle: { id: 4 }, distributor: { id: 5 }, number: "R123456" } lineItem = { id: 7, quantity: 3, order: { id: 9 }, supplier: { id: 1 } } - httpBackend.expectGET("/admin/orders.json?q%5Bcompleted_at_gt%5D=SomeDate&q%5Bcompleted_at_lt%5D=SomeDate&q%5Bcompleted_at_not_null%5D=true&q%5Bstate_not_eq%5D=canceled").respond [order] - httpBackend.expectGET("/admin/enterprises/for_line_items.json?q%5Bsells_in%5D%5B%5D=own&q%5Bsells_in%5D%5B%5D=any&serializer=basic").respond [distributor] - httpBackend.expectGET("/admin/order_cycles.json?as=distributor&q%5Borders_close_at_gt%5D=SomeDate&serializer=basic").respond [orderCycle] - httpBackend.expectGET("/admin/line_items.json?q%5Bcompleted_at_gt%5D=SomeDate&q%5Bcompleted_at_lt%5D=SomeDate&q%5Bcompleted_at_not_null%5D=true&q%5Bstate_not_eq%5D=canceled").respond [lineItem] - httpBackend.expectGET("/admin/enterprises/for_line_items.json?q%5Bis_primary_producer_eq%5D=true&serializer=basic").respond [supplier] + httpBackend.expectGET("/admin/orders.json?q%5Bcompleted_at_not_null%5D=true&q%5Bcreated_at_gt%5D=SomeDate&q%5Bcreated_at_lt%5D=SomeDate&q%5Bstate_not_eq%5D=canceled").respond [order] + httpBackend.expectGET("/admin/enterprises/for_line_items.json?ams_prefix=basic&q%5Bsells_in%5D%5B%5D=own&q%5Bsells_in%5D%5B%5D=any").respond [distributor] + httpBackend.expectGET("/admin/order_cycles.json?ams_prefix=basic&as=distributor&q%5Borders_close_at_gt%5D=SomeDate").respond [orderCycle] + httpBackend.expectGET("/admin/line_items.json?q%5Border%5D%5Bcompleted_at_not_null%5D=true&q%5Border%5D%5Bcreated_at_gt%5D=SomeDate&q%5Border%5D%5Bcreated_at_lt%5D=SomeDate&q%5Border%5D%5Bstate_not_eq%5D=canceled").respond [lineItem] + httpBackend.expectGET("/admin/enterprises/for_line_items.json?ams_prefix=basic&q%5Bis_primary_producer_eq%5D=true").respond [supplier] ctrl "LineItemsCtrl", {$scope: scope, Enterprises: Enterprises, Orders: Orders, LineItems: LineItems, OrderCycles: OrderCycles} httpBackend.flush() @@ -67,23 +67,31 @@ describe "AdminOrderMgmtCtrl", -> describe "deleting a line item", -> order = line_item1 = line_item2 = null - beforeEach -> + beforeEach inject((LineItemResource) -> spyOn(window,"confirm").andReturn true - order = { number: "R12345678", line_items: [] } - line_item1 = { id: 1, order: order } - line_item2 = { id: 2, order: order } - order.line_items = [ line_item1, line_item2 ] + order = { number: "R12345678" } + line_item1 = new LineItemResource({ id: 1, order: order }) + line_item2 = new LineItemResource({ id: 2, order: order }) + scope.lineItems= [ line_item1, line_item2 ] + ) - it "sends a delete request via the API", -> - httpBackend.expectDELETE("/api/orders/#{line_item1.order.number}/line_items/#{line_item1.id}").respond "nothing" - scope.deleteLineItem line_item1 - httpBackend.flush() + describe "where the request is successful", -> + beforeEach -> + httpBackend.expectDELETE("/admin/orders/R12345678/line_items/1.json").respond "nothing" + scope.deleteLineItem line_item1 + httpBackend.flush() - it "does not remove line_item from the line_items array when request is not successful", -> - httpBackend.expectDELETE("/api/orders/#{line_item1.order.number}/line_items/#{line_item1.id}").respond 404, "NO CONTENT" - scope.deleteLineItem line_item1 - httpBackend.flush() - expect(order.line_items).toEqual [line_item1, line_item2] + it "removes the deleted item from the line_items array", -> + expect(scope.lineItems).toEqual [line_item2] + + describe "where the request is unsuccessful", -> + beforeEach -> + httpBackend.expectDELETE("/admin/orders/R12345678/line_items/1.json").respond 404, "NO CONTENT" + scope.deleteLineItem line_item1 + httpBackend.flush() + + it "does not remove line_item from the line_items array", -> + expect(scope.lineItems).toEqual [line_item1, line_item2] describe "deleting 'checked' line items", -> line_item1 = line_item2 = line_item3 = line_item4 = null diff --git a/spec/javascripts/unit/admin/line_items/services/line_items_spec.js.coffee b/spec/javascripts/unit/admin/line_items/services/line_items_spec.js.coffee index 2796a2dd8a..44948ecb37 100644 --- a/spec/javascripts/unit/admin/line_items/services/line_items_spec.js.coffee +++ b/spec/javascripts/unit/admin/line_items/services/line_items_spec.js.coffee @@ -34,8 +34,6 @@ describe "LineItems service", -> describe "#save", -> - result = null - describe "success", -> lineItem = null resolved = false @@ -105,3 +103,53 @@ describe "LineItems service", -> it "resets the specified value according to the pristine record", -> LineItems.resetAttribute(lineItem, "price") expect(lineItem.price).toEqual 12 + + describe "#delete", -> + describe "success", -> + callback = jasmine.createSpy("callback") + lineItem = null + resolved = rejected = false + + beforeEach -> + lineItem = new LineItemResource({ id: 15, order: { number: '12345678'} }) + LineItems.pristineByID[15] = lineItem + LineItems.lineItemsByID[15] = lineItem + $httpBackend.expectDELETE('/admin/orders/12345678/line_items/15.json').respond 200, { id: 15, name: 'LineItem 1'} + LineItems.delete(lineItem, callback).then( -> resolved = true).catch( -> rejected = true) + $httpBackend.flush() + + it "updates the pristine copy of the lineItem", -> + expect(LineItems.pristineByID[15]).toBeUndefined() + expect(LineItems.lineItemsByID[15]).toBeUndefined() + + it "runs the callback", -> + expect(callback).toHaveBeenCalled() + + it "resolves the promise", -> + expect(resolved).toBe(true) + expect(rejected).toBe(false) + + + describe "failure", -> + callback = jasmine.createSpy("callback") + lineItem = null + resolved = rejected = false + + beforeEach -> + lineItem = new LineItemResource({ id: 15, order: { number: '12345678'} }) + LineItems.pristineByID[15] = lineItem + LineItems.lineItemsByID[15] = lineItem + $httpBackend.expectDELETE('/admin/orders/12345678/line_items/15.json').respond 422, { error: 'obj' } + LineItems.delete(lineItem, callback).then( -> resolved = true).catch( -> rejected = true) + $httpBackend.flush() + + it "does not update the pristine copy of the lineItem", -> + expect(LineItems.pristineByID[15]).toBeDefined() + expect(LineItems.lineItemsByID[15]).toBeDefined() + + it "does not run the callback", -> + expect(callback).not.toHaveBeenCalled() + + it "rejects the promise", -> + expect(resolved).toBe(false) + expect(rejected).toBe(true)