Merge pull request #3590 from mkllnk/3576-bulk-order-spec

3576 Fix bulk order management race condition
This commit is contained in:
Maikel
2019-03-21 12:40:41 +11:00
committed by GitHub
5 changed files with 53 additions and 50 deletions

View File

@@ -26,18 +26,21 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$scope.startDate = moment(OrderCycles.byID[$scope.orderCycleFilter].orders_open_at).format('YYYY-MM-DD')
$scope.endDate = moment(OrderCycles.byID[$scope.orderCycleFilter].orders_close_at).startOf('day').format('YYYY-MM-DD')
formatted_start_date = moment($scope.startDate).format()
formatted_end_date = moment($scope.endDate).add(1,'day').format()
RequestMonitor.load $scope.orders = Orders.index(
"q[state_not_eq]": "canceled",
"q[completed_at_not_null]": "true",
"q[completed_at_gteq]": "#{moment($scope.startDate).format()}",
"q[completed_at_lt]": "#{moment($scope.endDate).add(1,'day').format()}"
"q[completed_at_gteq]": formatted_start_date,
"q[completed_at_lt]": formatted_end_date
)
RequestMonitor.load $scope.lineItems = LineItems.index(
"q[order][state_not_eq]": "canceled",
"q[order][completed_at_not_null]": "true",
"q[order][completed_at_gteq]": "#{moment($scope.startDate).format()}",
"q[order][completed_at_lt]": "#{moment($scope.endDate).add(1,'day').format()}"
"q[order][completed_at_gteq]": formatted_start_date,
"q[order][completed_at_lt]": formatted_end_date
)
unless $scope.initialized
@@ -45,11 +48,9 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
RequestMonitor.load $scope.orderCycles = OrderCycles.index(ams_prefix: "basic", as: "distributor", "q[orders_close_at_gt]": "#{moment().subtract(90,'days').format()}")
RequestMonitor.load $scope.suppliers = Enterprises.index(action: "visible", ams_prefix: "basic", "q[is_primary_producer_eq]": "true")
RequestMonitor.load $q.all([$scope.orders.$promise, $scope.distributors.$promise, $scope.orderCycles.$promise]).then ->
RequestMonitor.load $q.all([$scope.orders.$promise, $scope.distributors.$promise, $scope.orderCycles.$promise, $scope.suppliers.$promise, $scope.lineItems.$promise]).then ->
Dereferencer.dereferenceAttr $scope.orders, "distributor", Enterprises.byID
Dereferencer.dereferenceAttr $scope.orders, "order_cycle", OrderCycles.byID
RequestMonitor.load $q.all([$scope.orders.$promise, $scope.suppliers.$promise, $scope.lineItems.$promise]).then ->
Dereferencer.dereferenceAttr $scope.lineItems, "supplier", Enterprises.byID
Dereferencer.dereferenceAttr $scope.lineItems, "order", Orders.byID
$scope.bulk_order_form.$setPristine()
@@ -59,8 +60,6 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
$timeout ->
$scope.resetSelectFilters()
$scope.refreshData()
$scope.$watch 'bulk_order_form.$dirty', (newVal, oldVal) ->
if newVal == true
StatusMessage.display 'notice', t('js.unsaved_changes')
@@ -154,3 +153,5 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout,
if lineItem.quantity > 0
lineItem.final_weight_volume = LineItems.pristineByID[lineItem.id].final_weight_volume * lineItem.quantity / LineItems.pristineByID[lineItem.id].quantity
$scope.weightAdjustedPrice(lineItem)
$scope.refreshData()

View File

@@ -9,7 +9,7 @@ angular.module("admin.resources").factory 'Orders', ($q, OrderResource, RequestM
request = OrderResource.index params, (data) =>
@load(data)
(callback || angular.noop)(data)
RequestMonitor.load(request.$promise)
@all.$promise = request.$promise
@all
load: (data) ->

View File

@@ -0,0 +1,8 @@
// https://docs.angularjs.org/api/ng/directive/ngCloak
[ng-cloak],
[data-ng-cloak],
[x-ng-cloak],
.ng-cloak,
.x-ng-cloak {
display: none !important;
}

View File

@@ -49,7 +49,7 @@
%hr.divider.sixteen.columns.alpha.omega{ ng: { show: 'unitsVariantSelected()' } }
%div.sixteen.columns.alpha.omega#group_buy_calculation{ ng: { show: 'unitsVariantSelected()' } }
%div.sixteen.columns.alpha.omega#group_buy_calculation{ ng: { show: 'unitsVariantSelected()', cloak: true } }
%div.shared_resource{ :class => "four columns alpha" }
%span{ :class => 'three columns alpha' }
%input{ type: 'checkbox', :id => 'shared_resource', 'ng-model' => 'sharedResource'}
@@ -106,11 +106,11 @@
%h1
= t("admin.orders.bulk_management.loading")
%div{ :class => "sixteen columns alpha", 'ng-show' => '!RequestMonitor.loading && filteredLineItems.length == 0'}
%div{ class: "sixteen columns alpha", ng: { show: '!RequestMonitor.loading && filteredLineItems.length == 0', cloak: true } }
%h1#no_results
= t("admin.orders.bulk_management.no_results")
.margin-bottom-50{ 'ng-hide' => 'RequestMonitor.loading || filteredLineItems.length == 0' }
.margin-bottom-50{ ng: { hide: 'RequestMonitor.loading || filteredLineItems.length == 0', cloak: true } }
%form{ name: 'bulk_order_form' }
%table.index#listing_orders.bulk{ :class => "sixteen columns alpha", ng: { show: "initialized" } }
%thead
@@ -157,7 +157,7 @@
= t("admin.orders.bulk_management.ask")
%input{ :type => 'checkbox', 'ng-model' => "confirmDelete" }
%tr.line_item{ 'ng-repeat' => "line_item in filteredLineItems = ( lineItems | filter:quickSearch | selectFilter:supplierFilter:distributorFilter:orderCycleFilter | variantFilter:selectedUnitsProduct:selectedUnitsVariant:sharedResource | orderBy:sorting.predicate:sorting.reverse )", 'ng-class-even' => "'even'", 'ng-class-odd' => "'odd'", ng: { attr: { id: "li_{{line_item.id}}" } } }
%tr.line_item{ ng: { repeat: "line_item in filteredLineItems = ( lineItems | filter:quickSearch | selectFilter:supplierFilter:distributorFilter:orderCycleFilter | variantFilter:selectedUnitsProduct:selectedUnitsVariant:sharedResource | orderBy:sorting.predicate:sorting.reverse )", 'class-even' => "'even'", 'class-odd' => "'odd'", attr: { id: "li_{{line_item.id}}" } } }
%td.bulk
%input{ :type => "checkbox", :name => 'bulk', 'ng-model' => 'line_item.checked', 'ignore-dirty' => true }
%td.order_no{ 'ng-show' => 'columns.order_no.visible' } {{ line_item.order.number }}

View File

@@ -10,11 +10,11 @@ feature %q{
context "listing orders" do
before :each do
login_to_admin_section
quick_login_as_admin
end
it "displays a message when number of line items is zero" do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
expect(page).to have_text 'No orders found.'
end
@@ -27,7 +27,7 @@ feature %q{
let!(:li3) { create(:line_item, order: o3 ) }
before :each do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
end
it "displays a list of line items" do
@@ -44,8 +44,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2, product: create(:product_with_option_types) ) }
before :each do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "displays a column for user's full name" do
@@ -92,8 +91,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2) }
before do
visit spree.admin_bulk_order_management_path
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "sorts by customer name when the customer name header is clicked" do
@@ -123,7 +121,7 @@ feature %q{
context "altering line item properties" do
before :each do
admin_user = quick_login_as_admin
quick_login_as_admin
end
context "tracking changes" do
@@ -131,7 +129,7 @@ feature %q{
let!(:li1) { create(:line_item, order: o1, :quantity => 5 ) }
before :each do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
end
it "adds the class 'ng-dirty' to input elements when value is altered" do
@@ -147,7 +145,7 @@ feature %q{
before :each do
li1.variant.update_attributes(on_hand: 1, on_demand: false)
visit '/admin/orders/bulk_management'
visit_bulk_order_management
end
context "when acceptable data is sent to the server" do
@@ -179,7 +177,7 @@ feature %q{
context "using page controls" do
before :each do
admin_user = quick_login_as_admin
quick_login_as_admin
end
let!(:p1) { create(:product_with_option_types, group_buy: true, group_buy_unit_size: 5000, variant_unit: "weight", variants: [create(:variant, unit_value: 1000)] ) }
@@ -191,7 +189,7 @@ feature %q{
context "modifying the weight/volume of a line item" do
it "price is altered" do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
toggle_columns "Weight/Volume", "Price"
within "tr#li_#{li1.id}" do
expect(page).to have_field "price", with: "50.00"
@@ -208,7 +206,7 @@ feature %q{
context "modifying the quantity of a line item" do
it "price is altered" do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
toggle_columns "Price"
within "tr#li_#{li1.id}" do
expect(page).to have_field "price", with: "#{format("%.2f",li1.price * 5)}"
@@ -220,7 +218,7 @@ feature %q{
context "modifying the quantity of a line item" do
it "weight/volume is altered" do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
toggle_columns "Weight/Volume"
within "tr#li_#{li1.id}" do
expect(page).to have_field "final_weight_volume", with: "#{li1.final_weight_volume.round}"
@@ -232,7 +230,7 @@ feature %q{
context "using column display toggle" do
it "shows a column display toggle button, which shows a list of columns when clicked" do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
expect(page).to have_selector "th", :text => "NAME"
expect(page).to have_selector "th", text: I18n.t("admin.orders.bulk_management.order_date").upcase
@@ -261,8 +259,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o1, product: create(:product, supplier: s2) ) }
before :each do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "displays a select box for producers, which filters line items by the selected supplier" do
@@ -300,8 +297,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2 ) }
before :each do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "displays a select box for distributors, which filters line items by the selected distributor" do
@@ -319,10 +315,8 @@ feature %q{
end
it "displays all line items when 'All' is selected from distributor filter" do
expect(page).to have_selector "tr#li_#{li1.id}"
expect(page).to have_selector "tr#li_#{li2.id}"
select2_select d1.name, from: "distributor_filter"
expect(page).to have_selector "tr#li_#{li1.id}"
expect(page).to have_no_selector "tr#li_#{li2.id}"
select2_select "All", from: "distributor_filter"
expect(page).to have_selector "tr#li_#{li1.id}"
@@ -340,8 +334,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2 ) }
before do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "displays a select box for order cycles, which filters line items by the selected order cycle" do
@@ -381,8 +374,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2, product: p2 ) }
before :each do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "allows filters to be used in combination" do
@@ -432,8 +424,7 @@ feature %q{
let!(:li3) { create(:line_item, order: o3 ) }
before :each do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "displays a quick search input" do
@@ -462,8 +453,7 @@ feature %q{
let!(:li4) { create(:line_item, order: o4, :quantity => 4 ) }
before :each do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "displays date fields for filtering orders, with default values set" do
@@ -535,8 +525,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2 ) }
before :each do
visit '/admin/orders/bulk_management'
wait_until { request_monitor_finished 'LineItemsCtrl' }
visit_bulk_order_management
end
it "displays a checkbox for each line item in the list" do
@@ -608,7 +597,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2 ) }
before :each do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
end
it "shows an edit button for line_items, which takes the user to the standard edit page for the order" do
@@ -642,7 +631,7 @@ feature %q{
let!(:li2) { create(:line_item, order: o2 ) }
before :each do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
end
it "removes a line item when the relevant delete button is clicked" do
@@ -652,7 +641,7 @@ feature %q{
end
expect(page).to have_no_selector "a.delete-line-item", :count => 2
expect(page).to have_selector "a.delete-line-item", :count => 1
visit '/admin/orders/bulk_management'
visit_bulk_order_management
expect(page).to have_selector "a.delete-line-item", :count => 1
end
end
@@ -670,7 +659,7 @@ feature %q{
let!(:li4) { create(:line_item, order: o2, variant: v3, quantity: 1, max_quantity: 3 ) }
before :each do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
within "tr#li_#{li3.id}" do
find("a", text: li3.product.name + ": " + li3.variant.options_text).click
end
@@ -746,13 +735,18 @@ feature %q{
end
it "shows only line item from orders that I distribute, and not those that I supply" do
visit '/admin/orders/bulk_management'
visit_bulk_order_management
expect(page).to have_selector "tr#li_#{line_item_distributed.id}", :visible => true
expect(page).to have_no_selector "tr#li_#{line_item_not_distributed.id}", :visible => true
end
end
def visit_bulk_order_management
visit spree.admin_bulk_order_management_path
expect(page).to have_no_text 'Loading orders'
end
def select_date(date)
# Wait for datepicker to open and be associated to the datepicker trigger.
expect(page).to have_selector("#ui-datepicker-div")