spree_backend 3.0.5 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +6 -0
  4. data/Rakefile +29 -0
  5. data/app/assets/javascripts/spree/backend/admin.js +26 -0
  6. data/app/controllers/spree/admin/resource_controller.rb +4 -2
  7. data/app/helpers/spree/admin/navigation_helper.rb +10 -1
  8. data/app/views/spree/admin/images/new.html.erb +1 -1
  9. data/app/views/spree/admin/payments/_list.html.erb +1 -1
  10. data/app/views/spree/admin/products/_form.html.erb +1 -1
  11. data/app/views/spree/admin/shared/_index_table_options.html.erb +1 -11
  12. data/app/views/spree/admin/shared/sub_menu/_product.html.erb +1 -1
  13. data/script/rails +9 -0
  14. data/spec/controllers/spree/admin/base_controller_spec.rb +46 -0
  15. data/spec/controllers/spree/admin/customer_returns_controller_spec.rb +185 -0
  16. data/spec/controllers/spree/admin/general_settings_controller_spec.rb +41 -0
  17. data/spec/controllers/spree/admin/missing_products_controller_spec.rb +18 -0
  18. data/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb +42 -0
  19. data/spec/controllers/spree/admin/orders_controller_spec.rb +247 -0
  20. data/spec/controllers/spree/admin/payment_methods_controller_spec.rb +49 -0
  21. data/spec/controllers/spree/admin/payments_controller_spec.rb +97 -0
  22. data/spec/controllers/spree/admin/products_controller_spec.rb +53 -0
  23. data/spec/controllers/spree/admin/promotion_actions_controller_spec.rb +21 -0
  24. data/spec/controllers/spree/admin/promotion_rules_controller_spec.rb +21 -0
  25. data/spec/controllers/spree/admin/promotions_controller_spec.rb +44 -0
  26. data/spec/controllers/spree/admin/refunds_controller_spec.rb +32 -0
  27. data/spec/controllers/spree/admin/reimbursements_controller_spec.rb +74 -0
  28. data/spec/controllers/spree/admin/reports_controller_spec.rb +42 -0
  29. data/spec/controllers/spree/admin/resource_controller_spec.rb +276 -0
  30. data/spec/controllers/spree/admin/return_authorizations_controller_spec.rb +225 -0
  31. data/spec/controllers/spree/admin/return_items_controller_spec.rb +27 -0
  32. data/spec/controllers/spree/admin/root_controller_spec.rb +35 -0
  33. data/spec/controllers/spree/admin/search_controller_spec.rb +56 -0
  34. data/spec/controllers/spree/admin/shipping_methods_controller_spec.rb +14 -0
  35. data/spec/controllers/spree/admin/stock_items_controller_spec.rb +19 -0
  36. data/spec/controllers/spree/admin/stock_locations_controller_spec.rb +41 -0
  37. data/spec/controllers/spree/admin/stock_transfers_controller_spec.rb +41 -0
  38. data/spec/controllers/spree/admin/tax_categories_controller_spec.rb +34 -0
  39. data/spec/controllers/spree/admin/users_controller_spec.rb +161 -0
  40. data/spec/controllers/spree/admin/variants_controller_spec.rb +32 -0
  41. data/spec/features/admin/configuration/analytics_tracker_spec.rb +46 -0
  42. data/spec/features/admin/configuration/countries_spec.rb +24 -0
  43. data/spec/features/admin/configuration/general_settings_spec.rb +43 -0
  44. data/spec/features/admin/configuration/payment_methods_spec.rb +63 -0
  45. data/spec/features/admin/configuration/roles_spec.rb +47 -0
  46. data/spec/features/admin/configuration/shipping_methods_spec.rb +62 -0
  47. data/spec/features/admin/configuration/states_spec.rb +68 -0
  48. data/spec/features/admin/configuration/stock_locations_spec.rb +48 -0
  49. data/spec/features/admin/configuration/tax_categories_spec.rb +56 -0
  50. data/spec/features/admin/configuration/tax_rates_spec.rb +18 -0
  51. data/spec/features/admin/configuration/zones_spec.rb +39 -0
  52. data/spec/features/admin/homepage_spec.rb +81 -0
  53. data/spec/features/admin/locale_spec.rb +31 -0
  54. data/spec/features/admin/orders/adjustments_promotions_spec.rb +53 -0
  55. data/spec/features/admin/orders/adjustments_spec.rb +129 -0
  56. data/spec/features/admin/orders/cancelling_and_resuming_spec.rb +47 -0
  57. data/spec/features/admin/orders/customer_details_spec.rb +182 -0
  58. data/spec/features/admin/orders/line_items_spec.rb +51 -0
  59. data/spec/features/admin/orders/listing_spec.rb +225 -0
  60. data/spec/features/admin/orders/log_entries_spec.rb +55 -0
  61. data/spec/features/admin/orders/new_order_spec.rb +161 -0
  62. data/spec/features/admin/orders/order_details_spec.rb +620 -0
  63. data/spec/features/admin/orders/payments_spec.rb +229 -0
  64. data/spec/features/admin/orders/risk_analysis_spec.rb +48 -0
  65. data/spec/features/admin/orders/shipments_spec.rb +64 -0
  66. data/spec/features/admin/orders/state_changes_spec.rb +21 -0
  67. data/spec/features/admin/products/edit/images_spec.rb +86 -0
  68. data/spec/features/admin/products/edit/products_spec.rb +64 -0
  69. data/spec/features/admin/products/edit/taxons_spec.rb +41 -0
  70. data/spec/features/admin/products/edit/variants_spec.rb +56 -0
  71. data/spec/features/admin/products/option_types_spec.rb +113 -0
  72. data/spec/features/admin/products/products_spec.rb +394 -0
  73. data/spec/features/admin/products/properties_spec.rb +140 -0
  74. data/spec/features/admin/products/prototypes_spec.rb +112 -0
  75. data/spec/features/admin/products/stock_management_spec.rb +123 -0
  76. data/spec/features/admin/products/taxonomies_spec.rb +52 -0
  77. data/spec/features/admin/products/variant_spec.rb +50 -0
  78. data/spec/features/admin/promotions/adjustments_spec.rb +255 -0
  79. data/spec/features/admin/promotions/option_value_rule_spec.rb +70 -0
  80. data/spec/features/admin/promotions/tiered_calculator_spec.rb +70 -0
  81. data/spec/features/admin/reports_spec.rb +61 -0
  82. data/spec/features/admin/stock_transfer_spec.rb +75 -0
  83. data/spec/features/admin/taxons_spec.rb +47 -0
  84. data/spec/features/admin/users_spec.rb +284 -0
  85. data/spec/helpers/admin/base_helper_spec.rb +24 -0
  86. data/spec/helpers/admin/navigation_helper_spec.rb +106 -0
  87. data/spec/helpers/admin/stock_movements_helper_spec.rb +30 -0
  88. data/spec/helpers/promotion_rules_helper_spec.rb +12 -0
  89. data/spec/models/spree/resource_spec.rb +48 -0
  90. data/spec/spec_helper.rb +133 -0
  91. data/spec/support/appear_before_matcher.rb +8 -0
  92. data/spec/support/ror_ringer.jpeg +0 -0
  93. data/spec/test_views/spree/admin/submodule/posts/edit.html.erb +1 -0
  94. data/spec/test_views/spree/admin/submodule/posts/new.html.erb +1 -0
  95. data/spec/test_views/spree/admin/widgets/edit.html.erb +1 -0
  96. data/spec/test_views/spree/admin/widgets/new.html.erb +1 -0
  97. data/spree_backend.gemspec +29 -0
  98. metadata +101 -14
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Log entries", :type => :feature do
4
+ stub_authorization!
5
+
6
+ let!(:payment) { create(:payment) }
7
+
8
+ context "with a successful log entry" do
9
+ before do
10
+ response = ActiveMerchant::Billing::Response.new(
11
+ true,
12
+ "Transaction successful",
13
+ :transid => "ABCD1234"
14
+ )
15
+
16
+ payment.log_entries.create(
17
+ :source => payment.source,
18
+ :details => response.to_yaml
19
+ )
20
+ end
21
+
22
+ it "shows a successful attempt" do
23
+ visit spree.admin_order_payments_path(payment.order)
24
+ find("#payment_#{payment.id} a").click
25
+ click_link "Logs"
26
+ within("#listing_log_entries") do
27
+ expect(page).to have_content("Transaction successful")
28
+ end
29
+ end
30
+ end
31
+
32
+ context "with a failed log entry" do
33
+ before do
34
+ response = ActiveMerchant::Billing::Response.new(
35
+ false,
36
+ "Transaction failed",
37
+ :transid => "ABCD1234"
38
+ )
39
+
40
+ payment.log_entries.create(
41
+ :source => payment.source,
42
+ :details => response.to_yaml
43
+ )
44
+ end
45
+
46
+ it "shows a failed attempt" do
47
+ visit spree.admin_order_payments_path(payment.order)
48
+ find("#payment_#{payment.id} a").click
49
+ click_link "Logs"
50
+ within("#listing_log_entries") do
51
+ expect(page).to have_content("Transaction failed")
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,161 @@
1
+ require 'spec_helper'
2
+
3
+ describe "New Order", :type => :feature do
4
+ let!(:product) { create(:product_in_stock) }
5
+ let!(:state) { create(:state) }
6
+ let!(:user) { create(:user, ship_address: create(:address), bill_address: create(:address)) }
7
+ let!(:payment_method) { create(:check_payment_method) }
8
+ let!(:shipping_method) { create(:shipping_method) }
9
+
10
+ stub_authorization!
11
+
12
+ before do
13
+ # create default store
14
+ create(:store)
15
+ visit spree.new_admin_order_path
16
+ end
17
+
18
+ it "does check if you have a billing address before letting you add shipments" do
19
+ click_on "Shipments"
20
+ expect(page).to have_content 'Please fill in customer info'
21
+ expect(current_path).to eql(spree.edit_admin_order_customer_path(Spree::Order.last))
22
+ end
23
+
24
+ it "completes new order succesfully without using the cart", js: true do
25
+ select2_search product.name, from: Spree.t(:name_or_sku)
26
+ click_icon :add
27
+ wait_for_ajax
28
+ click_on "Customer"
29
+
30
+ within "#select-customer" do
31
+ targetted_select2_search user.email, from: "#s2id_customer_search"
32
+ end
33
+
34
+ check "order_use_billing"
35
+ fill_in_address
36
+ click_on "Update"
37
+
38
+ click_on "Payments"
39
+ click_on "Update"
40
+
41
+ expect(current_path).to eql(spree.admin_order_payments_path(Spree::Order.last))
42
+ click_icon "capture"
43
+
44
+ click_on "Shipments"
45
+ click_on "Ship"
46
+ wait_for_ajax
47
+
48
+ expect(page).to have_content("shipped")
49
+ end
50
+
51
+ context "adding new item to the order", js: true do
52
+ it "inventory items show up just fine and are also registered as shipments" do
53
+ select2_search product.name, from: Spree.t(:name_or_sku)
54
+
55
+ within("table.stock-levels") do
56
+ fill_in "variant_quantity", with: 2
57
+ click_icon :add
58
+ end
59
+
60
+ within(".line-items") do
61
+ expect(page).to have_content(product.name)
62
+ end
63
+
64
+ click_on "Customer"
65
+
66
+ within "#select-customer" do
67
+ targetted_select2_search user.email, from: "#s2id_customer_search"
68
+ end
69
+
70
+ check "order_use_billing"
71
+ fill_in_address
72
+ click_on "Update"
73
+
74
+ click_on "Shipments"
75
+
76
+ within(".stock-contents") do
77
+ expect(page).to have_content(product.name)
78
+ end
79
+ end
80
+ end
81
+
82
+ # Regression test for #3958
83
+ context "without a delivery step", js: true do
84
+ before do
85
+ allow(Spree::Order).to receive_messages checkout_step_names: [:address, :payment, :confirm, :complete]
86
+ end
87
+
88
+ it "can still see line items" do
89
+ select2_search product.name, from: Spree.t(:name_or_sku)
90
+ click_icon :add
91
+ within(".line-items") do
92
+ within(".line-item-name") do
93
+ expect(page).to have_content(product.name)
94
+ end
95
+ within(".line-item-qty-show") do
96
+ expect(page).to have_content("1")
97
+ end
98
+ within(".line-item-price") do
99
+ expect(page).to have_content(product.price)
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ # Regression test for #3336
106
+ context "start by customer address" do
107
+ it "completes order fine", js: true do
108
+ click_on "Customer"
109
+
110
+ within "#select-customer" do
111
+ targetted_select2_search user.email, from: "#s2id_customer_search"
112
+ end
113
+
114
+ check "order_use_billing"
115
+ fill_in_address
116
+ click_on "Update"
117
+
118
+ click_on "Shipments"
119
+ select2_search product.name, from: Spree.t(:name_or_sku)
120
+ click_icon :add
121
+ wait_for_ajax
122
+
123
+ click_on "Payments"
124
+ click_on "Continue"
125
+
126
+ within(".additional-info .state") do
127
+ expect(page).to have_content("complete")
128
+ end
129
+ end
130
+ end
131
+
132
+ # Regression test for #5327
133
+ context "customer with default credit card", js: true do
134
+ before do
135
+ create(:credit_card, default: true, user: user)
136
+ end
137
+ it "transitions to delivery not to complete" do
138
+ select2_search product.name, from: Spree.t(:name_or_sku)
139
+ within("table.stock-levels") do
140
+ fill_in "variant_quantity", with: 1
141
+ click_icon :add
142
+ end
143
+ wait_for_ajax
144
+ click_link "Customer"
145
+ targetted_select2 user.email, from: "#s2id_customer_search"
146
+ click_button "Update"
147
+ expect(Spree::Order.last.state).to eq 'delivery'
148
+ end
149
+ end
150
+
151
+ def fill_in_address(kind = "bill")
152
+ fill_in "First Name", with: "John 99"
153
+ fill_in "Last Name", with: "Doe"
154
+ fill_in "Street Address", with: "100 first lane"
155
+ fill_in "Street Address (cont'd)", with: "#101"
156
+ fill_in "City", with: "Bethesda"
157
+ fill_in "Zip", with: "20170"
158
+ targetted_select2_search state.name, from: "#s2id_order_#{kind}_address_attributes_state_id"
159
+ fill_in "Phone", with: "123-456-7890"
160
+ end
161
+ end
@@ -0,0 +1,620 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "Order Details", type: :feature, js: true do
5
+ let!(:stock_location) { create(:stock_location_with_items) }
6
+ let!(:product) { create(:product, name: 'spree t-shirt', price: 20.00) }
7
+ let!(:tote) { create(:product, name: "Tote", price: 15.00) }
8
+ let(:order) { create(:order, state: 'complete', completed_at: "2011-02-01 12:36:15", number: "R100") }
9
+ let(:state) { create(:state) }
10
+ let!(:shipping_method) { create(:shipping_method, name: "Default") }
11
+
12
+ before do
13
+ order.shipments.create(stock_location_id: stock_location.id)
14
+ order.contents.add(product.master, 2)
15
+ end
16
+
17
+ context 'as Admin' do
18
+ stub_authorization!
19
+
20
+ context "cart edit page" do
21
+ before do
22
+ product.master.stock_items.first.update_column(:count_on_hand, 100)
23
+ visit spree.cart_admin_order_path(order)
24
+ end
25
+
26
+ it "should allow me to edit order details" do
27
+ expect(page).to have_content("spree t-shirt")
28
+ expect(page).to have_content("$40.00")
29
+
30
+ within_row(1) do
31
+ click_icon :edit
32
+ fill_in "quantity", with: "1"
33
+ end
34
+ click_icon :save
35
+
36
+ within("#order_total") do
37
+ expect(page).to have_content("$20.00")
38
+ end
39
+ end
40
+
41
+ it "can add an item to a shipment" do
42
+ select2_search "spree t-shirt", from: Spree.t(:name_or_sku)
43
+ within("table.stock-levels") do
44
+ fill_in "variant_quantity", with: 2
45
+ click_icon :add
46
+ end
47
+
48
+ within("#order_total") do
49
+ expect(page).to have_content("$80.00")
50
+ end
51
+ end
52
+
53
+ it "can remove an item from a shipment" do
54
+ expect(page).to have_content("spree t-shirt")
55
+
56
+ within_row(1) do
57
+ accept_alert do
58
+ click_icon :delete
59
+ end
60
+ end
61
+
62
+ # Click "ok" on confirmation dialog
63
+ expect(page).not_to have_content("spree t-shirt")
64
+ end
65
+
66
+ # Regression test for #3862
67
+ it "can cancel removing an item from a shipment" do
68
+ expect(page).to have_content("spree t-shirt")
69
+
70
+ within_row(1) do
71
+ # Click "cancel" on confirmation dialog
72
+ dismiss_alert do
73
+ click_icon :delete
74
+ end
75
+ end
76
+
77
+ expect(page).to have_content("spree t-shirt")
78
+ end
79
+
80
+ it "can add tracking information" do
81
+ visit spree.edit_admin_order_path(order)
82
+
83
+ within(".show-tracking") do
84
+ click_icon :edit
85
+ end
86
+ fill_in "tracking", with: "FOOBAR"
87
+ click_icon :save
88
+
89
+ expect(page).not_to have_css("input[name=tracking]")
90
+ expect(page).to have_content("Tracking: FOOBAR")
91
+ end
92
+
93
+ it "can change the shipping method" do
94
+ order = create(:completed_order_with_totals)
95
+ visit spree.edit_admin_order_path(order)
96
+ within("table.table tr.show-method") do
97
+ click_icon :edit
98
+ end
99
+ select2 "Default", from: "Shipping Method"
100
+ click_icon :save
101
+
102
+ expect(page).not_to have_css('#selected_shipping_rate_id')
103
+ expect(page).to have_content("Default")
104
+ end
105
+
106
+ it "can assign a back-end only shipping method" do
107
+ create(:shipping_method, name: "Backdoor", display_on: "back_end")
108
+ order = create(
109
+ :completed_order_with_totals,
110
+ shipping_method_filter: Spree::ShippingMethod::DISPLAY_ON_FRONT_AND_BACK_END
111
+ )
112
+ visit spree.edit_admin_order_path(order)
113
+ within("table tr.show-method") do
114
+ click_icon :edit
115
+ end
116
+ select2 "Backdoor", from: "Shipping Method"
117
+ click_icon :save
118
+
119
+ expect(page).not_to have_css('#selected_shipping_rate_id')
120
+ expect(page).to have_content("Backdoor")
121
+ end
122
+
123
+ it "will show the variant sku" do
124
+ order = create(:completed_order_with_totals)
125
+ visit spree.edit_admin_order_path(order)
126
+ sku = order.line_items.first.variant.sku
127
+ expect(page).to have_content("SKU: #{sku}")
128
+ end
129
+
130
+ context "with special_instructions present" do
131
+ let(:order) { create(:order, state: 'complete', completed_at: "2011-02-01 12:36:15", number: "R100", special_instructions: "Very special instructions here") }
132
+ it "will show the special_instructions" do
133
+ visit spree.edit_admin_order_path(order)
134
+ expect(page).to have_content("Very special instructions here")
135
+ end
136
+ end
137
+
138
+ context "variant doesn't track inventory" do
139
+ before do
140
+ tote.master.update_column :track_inventory, false
141
+ # make sure there's no stock level for any item
142
+ tote.master.stock_items.update_all count_on_hand: 0, backorderable: false
143
+ end
144
+
145
+ it "adds variant to order just fine" do
146
+ select2_search tote.name, from: Spree.t(:name_or_sku)
147
+ within("table.stock-levels") do
148
+ fill_in "variant_quantity", with: 1
149
+ click_icon :add
150
+ end
151
+
152
+ within(".line-items") do
153
+ expect(page).to have_content(tote.name)
154
+ end
155
+ end
156
+ end
157
+
158
+ context "site doesn't track inventory" do
159
+ before do
160
+ Spree::Config.set track_inventory_levels: false
161
+ product.master.update_column(:track_inventory, true)
162
+ product.master.stock_items.first.update_column(:backorderable, true)
163
+ product.master.stock_items.first.update_column(:count_on_hand, 0)
164
+ end
165
+
166
+ it "adds variant to order just fine" do
167
+ select2_search product.name, from: Spree.t(:name_or_sku)
168
+ within("table.stock-levels") do
169
+ fill_in "variant_quantity", with: 1
170
+ click_icon :add
171
+ end
172
+
173
+ within(".line-items") do
174
+ expect(page).to have_content(product.name)
175
+ end
176
+ end
177
+ end
178
+
179
+ context "variant out of stock and not backorderable" do
180
+ before do
181
+ product.master.stock_items.first.update_column(:backorderable, false)
182
+ product.master.stock_items.first.update_column(:count_on_hand, 0)
183
+ end
184
+
185
+ it "displays out of stock instead of add button" do
186
+ select2_search product.name, from: Spree.t(:name_or_sku)
187
+
188
+ within("table.stock-levels") do
189
+ expect(page).to have_content(Spree.t(:out_of_stock))
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ context 'Shipment edit page' do
196
+ let!(:stock_location2) { create(:stock_location_with_items, name: 'Clarksville') }
197
+
198
+ before do
199
+ product.master.stock_items.first.update_column(:backorderable, true)
200
+ product.master.stock_items.first.update_column(:count_on_hand, 100)
201
+ product.master.stock_items.last.update_column(:count_on_hand, 100)
202
+ end
203
+
204
+ context 'splitting to location' do
205
+ before { visit spree.edit_admin_order_path(order) }
206
+ # can not properly implement until poltergeist supports checking alert text
207
+ # see https://github.com/teampoltergeist/poltergeist/pull/516
208
+ it 'should warn you if you have not selected a location or shipment'
209
+
210
+ context 'there is enough stock at the other location' do
211
+ it 'should allow me to make a split' do
212
+ expect(order.shipments.count).to eq(1)
213
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
214
+
215
+ within_row(1) { click_icon 'split' }
216
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
217
+ click_icon :save
218
+
219
+ wait_for_ajax
220
+ order.reload
221
+
222
+ expect(order.shipments.count).to eq(2)
223
+ expect(order.shipments.last.backordered?).to eq(false)
224
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(1)
225
+ expect(order.shipments.last.inventory_units_for(product.master).count).to eq(1)
226
+ end
227
+
228
+ it 'should allow me to make a transfer via splitting off all stock' do
229
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
230
+
231
+ within_row(1) { click_icon 'split' }
232
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
233
+ fill_in 'item_quantity', with: 2
234
+ click_icon :save
235
+
236
+ wait_for_ajax
237
+ order.reload
238
+
239
+ expect(order.shipments.count).to eq(1)
240
+ expect(order.shipments.last.backordered?).to eq(false)
241
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
242
+ expect(order.shipments.first.stock_location.id).to eq(stock_location2.id)
243
+ end
244
+
245
+ it 'should allow me to split more than I have if available there' do
246
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
247
+
248
+ within_row(1) { click_icon 'split' }
249
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
250
+ fill_in 'item_quantity', with: 5
251
+ click_icon :save
252
+
253
+ wait_for_ajax
254
+ order.reload
255
+
256
+ expect(order.shipments.count).to eq(1)
257
+ expect(order.shipments.last.backordered?).to eq(false)
258
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(5)
259
+ expect(order.shipments.first.stock_location.id).to eq(stock_location2.id)
260
+ end
261
+
262
+ it 'should not split anything if the input quantity is garbage' do
263
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
264
+
265
+ within_row(1) { click_icon 'split' }
266
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
267
+ fill_in 'item_quantity', with: 'ff'
268
+ click_icon :save
269
+
270
+ wait_for_ajax
271
+
272
+ expect(order.shipments.count).to eq(1)
273
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
274
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
275
+ end
276
+
277
+ it 'should not allow less than or equal to zero qty' do
278
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
279
+
280
+ within_row(1) { click_icon 'split' }
281
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
282
+ fill_in 'item_quantity', with: 0
283
+ click_icon :save
284
+
285
+ wait_for_ajax
286
+
287
+ expect(order.shipments.count).to eq(1)
288
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
289
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
290
+
291
+
292
+ fill_in 'item_quantity', with: -1
293
+ click_icon :save
294
+
295
+ wait_for_ajax
296
+
297
+ expect(order.shipments.count).to eq(1)
298
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
299
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
300
+ end
301
+
302
+ context 'A shipment has shipped' do
303
+
304
+ it 'should not show or let me back to the cart page, nor show the shipment edit buttons' do
305
+ order = create(:order, state: 'payment')
306
+ order.shipments.create!(stock_location_id: stock_location.id, state: 'shipped')
307
+
308
+ visit spree.cart_admin_order_path(order)
309
+
310
+ expect(page.current_path).to eq(spree.edit_admin_order_path(order))
311
+ expect(page).not_to have_text 'Cart'
312
+ expect(page).not_to have_selector('.fa-split')
313
+ expect(page).not_to have_selector('.fa-trash')
314
+ end
315
+
316
+ end
317
+ end
318
+
319
+ context 'there is not enough stock at the other location' do
320
+ context 'and it cannot backorder' do
321
+ it 'should not allow me to split stock' do
322
+ product.master.stock_items.last.update_column(:backorderable, false)
323
+ product.master.stock_items.last.update_column(:count_on_hand, 0)
324
+
325
+ within_row(1) { click_icon 'split' }
326
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
327
+ fill_in 'item_quantity', with: 2
328
+ click_icon :save
329
+
330
+ wait_for_ajax
331
+
332
+ expect(order.shipments.count).to eq(1)
333
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
334
+ expect(order.shipments.first.stock_location.id).to eq(stock_location.id)
335
+ end
336
+
337
+ end
338
+
339
+ context 'but it can backorder' do
340
+ it 'should allow me to split and backorder the stock' do
341
+ product.master.stock_items.last.update_column(:count_on_hand, 0)
342
+ product.master.stock_items.last.update_column(:backorderable, true)
343
+
344
+ within_row(1) { click_icon 'split' }
345
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
346
+ fill_in 'item_quantity', with: 2
347
+ click_icon :save
348
+
349
+ wait_for_ajax
350
+ order.reload
351
+
352
+ expect(order.shipments.count).to eq(1)
353
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
354
+ expect(order.shipments.first.stock_location.id).to eq(stock_location2.id)
355
+ end
356
+ end
357
+ end
358
+
359
+ context 'multiple items in cart' do
360
+ it 'should have no problem splitting if multiple items are in the from shipment' do
361
+ order.contents.add(create(:variant), 2)
362
+ expect(order.shipments.count).to eq(1)
363
+ expect(order.shipments.first.manifest.count).to eq(2)
364
+
365
+ within_row(1) { click_icon 'split' }
366
+ targetted_select2 stock_location2.name, from: '#s2id_item_stock_location'
367
+ click_icon :save
368
+
369
+ wait_for_ajax
370
+ order.reload
371
+
372
+ expect(order.shipments.count).to eq(2)
373
+ expect(order.shipments.last.backordered?).to eq(false)
374
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(1)
375
+ expect(order.shipments.last.inventory_units_for(product.master).count).to eq(1)
376
+ end
377
+ end
378
+
379
+ context "site doesn't track inventory" do
380
+ before do
381
+ Spree::Config.set track_inventory_levels: false
382
+ product.master.update_column(:track_inventory, true)
383
+ product.master.stock_items.first.update_column(:backorderable, true)
384
+ product.master.stock_items.first.update_column(:count_on_hand, 0)
385
+ end
386
+
387
+ it "adds variant to order just fine" do
388
+ select2_search product.name, from: Spree.t(:name_or_sku)
389
+ within("table.stock-levels") do
390
+ fill_in "stock_item_quantity", with: 1
391
+ click_icon :add
392
+ end
393
+
394
+ within(".stock-contents") do
395
+ expect(page).to have_content(product.name)
396
+ end
397
+ end
398
+ end
399
+
400
+ context "variant out of stock and not backorderable" do
401
+ before do
402
+ product.master.stock_items.first.update_column(:backorderable, false)
403
+ product.master.stock_items.first.update_column(:count_on_hand, 0)
404
+ end
405
+
406
+ it "displays out of stock instead of add button" do
407
+ select2_search product.name, from: Spree.t(:name_or_sku)
408
+
409
+ within("table.stock-levels") do
410
+ expect(page).to have_content(Spree.t(:out_of_stock))
411
+ end
412
+ end
413
+ end
414
+ end
415
+
416
+ context 'splitting to shipment' do
417
+ before do
418
+ @shipment2 = order.shipments.create(stock_location_id: stock_location2.id)
419
+ visit spree.edit_admin_order_path(order)
420
+ end
421
+
422
+ it 'should delete the old shipment if enough are split off' do
423
+ expect(order.shipments.count).to eq(2)
424
+
425
+ within_row(1) { click_icon 'split' }
426
+ targetted_select2 @shipment2.number, from: '#s2id_item_stock_location'
427
+ fill_in 'item_quantity', with: 2
428
+ click_icon :save
429
+
430
+ wait_for_ajax
431
+ order.reload
432
+
433
+ expect(order.shipments.count).to eq(1)
434
+ expect(order.shipments.last.inventory_units_for(product.master).count).to eq(2)
435
+ end
436
+
437
+ context 'receiving shipment can not backorder' do
438
+ before { product.master.stock_items.last.update_column(:backorderable, false) }
439
+
440
+ it 'should not allow a split if the receiving shipment qty plus the incoming is greater than the count_on_hand' do
441
+ expect(order.shipments.count).to eq(2)
442
+
443
+ within_row(1) { click_icon 'split' }
444
+ targetted_select2 @shipment2.number, from: '#s2id_item_stock_location'
445
+ fill_in 'item_quantity', with: 1
446
+ click_icon :save
447
+
448
+ wait_for_ajax
449
+
450
+ within_row(1) { click_icon 'split' }
451
+ targetted_select2 @shipment2.number, from: '#s2id_item_stock_location'
452
+ fill_in 'item_quantity', with: 200
453
+ click_icon :save
454
+
455
+ wait_for_ajax
456
+
457
+ expect(order.shipments.count).to eq(2)
458
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(1)
459
+ expect(order.shipments.last.inventory_units_for(product.master).count).to eq(1)
460
+ end
461
+
462
+ it 'should not allow a shipment to split stock to itself' do
463
+ within_row(1) { click_icon 'split' }
464
+ targetted_select2 order.shipments.first.number, from: '#s2id_item_stock_location'
465
+ fill_in 'item_quantity', with: 1
466
+ click_icon :save
467
+
468
+ wait_for_ajax
469
+
470
+ expect(order.shipments.count).to eq(2)
471
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq(2)
472
+ end
473
+
474
+ it 'should split fine if more than one line_item is in the receiving shipment' do
475
+ variant2 = create(:variant)
476
+ order.contents.add(variant2, 2, shipment: @shipment2)
477
+
478
+ within_row(1) { click_icon 'split' }
479
+ targetted_select2 @shipment2.number, from: '#s2id_item_stock_location'
480
+ fill_in 'item_quantity', with: 1
481
+ click_icon :save
482
+
483
+ wait_for_ajax
484
+
485
+ expect(order.shipments.count).to eq(2)
486
+ expect(order.shipments.first.inventory_units_for(product.master).count).to eq 1
487
+ expect(order.shipments.last.inventory_units_for(product.master).count).to eq 1
488
+ expect(order.shipments.first.inventory_units_for(variant2).count).to eq 0
489
+ expect(order.shipments.last.inventory_units_for(variant2).count).to eq 2
490
+ end
491
+ end
492
+
493
+ context 'receiving shipment can backorder' do
494
+ it 'should add more to the backorder' do
495
+ product.master.stock_items.last.update_column(:backorderable, true)
496
+ product.master.stock_items.last.update_column(:count_on_hand, 0)
497
+ expect(@shipment2.reload.backordered?).to eq(false)
498
+
499
+
500
+ within_row(1) { click_icon 'split' }
501
+ targetted_select2 @shipment2.number, from: '#s2id_item_stock_location'
502
+ fill_in 'item_quantity', with: 1
503
+ click_icon :save
504
+
505
+ wait_for_ajax
506
+
507
+ expect(@shipment2.reload.backordered?).to eq(true)
508
+
509
+ within_row(1) { click_icon 'split' }
510
+ targetted_select2 @shipment2.number, from: '#s2id_item_stock_location'
511
+ fill_in 'item_quantity', with: 1
512
+ click_icon :save
513
+
514
+ wait_for_ajax
515
+
516
+ expect(order.shipments.count).to eq(1)
517
+ expect(order.shipments.last.inventory_units_for(product.master).count).to eq(2)
518
+ expect(@shipment2.reload.backordered?).to eq(true)
519
+ end
520
+ end
521
+ end
522
+ end
523
+ end
524
+
525
+ context 'with only read permissions' do
526
+ before do
527
+ allow_any_instance_of(Spree::Admin::BaseController).to receive(:spree_current_user).and_return(nil)
528
+ end
529
+
530
+ custom_authorization! do |user|
531
+ can [:admin, :index, :read, :edit], Spree::Order
532
+ end
533
+
534
+ it "should not display forbidden links" do
535
+ visit spree.edit_admin_order_path(order)
536
+
537
+ expect(page).not_to have_button('cancel')
538
+ expect(page).not_to have_button('Resend')
539
+
540
+ # Order Tabs
541
+ expect(page).not_to have_link('Details')
542
+ expect(page).not_to have_link('Customer')
543
+ expect(page).not_to have_link('Adjustments')
544
+ expect(page).not_to have_link('Payments')
545
+ expect(page).not_to have_link('Returns')
546
+
547
+ # Order item actions
548
+ expect(page).not_to have_css('.delete-item')
549
+ expect(page).not_to have_css('.split-item')
550
+ expect(page).not_to have_css('.edit-item')
551
+ expect(page).not_to have_css('.edit-tracking')
552
+
553
+ expect(page).not_to have_css('#add-line-item')
554
+ end
555
+ end
556
+
557
+ context 'as Fakedispatch' do
558
+ custom_authorization! do |user|
559
+ # allow dispatch to :admin, :index, and :edit on Spree::Order
560
+ can [:admin, :edit, :index, :read], Spree::Order
561
+ # allow dispatch to :index, :show, :create and :update shipments on the admin
562
+ can [:admin, :manage, :read, :ship], Spree::Shipment
563
+ end
564
+
565
+ before do
566
+ allow(Spree.user_class).to receive(:find_by).
567
+ with(hash_including(:spree_api_key)).
568
+ and_return(Spree.user_class.new)
569
+ end
570
+
571
+ it 'should not display order tabs or edit buttons without ability' do
572
+ visit spree.edit_admin_order_path(order)
573
+
574
+ # Order Form
575
+ expect(page).not_to have_css('.edit-item')
576
+ # Order Tabs
577
+ expect(page).not_to have_link('Details')
578
+ expect(page).not_to have_link('Customer')
579
+ expect(page).not_to have_link('Adjustments')
580
+ expect(page).not_to have_link('Payments')
581
+ expect(page).not_to have_link('Returns')
582
+ end
583
+
584
+ it "can add tracking information" do
585
+ visit spree.edit_admin_order_path(order)
586
+ within("table.table tr:nth-child(5)") do
587
+ click_icon :edit
588
+ end
589
+ fill_in "tracking", with: "FOOBAR"
590
+ click_icon :save
591
+
592
+ expect(page).not_to have_css("input[name=tracking]")
593
+ expect(page).to have_content("Tracking: FOOBAR")
594
+ end
595
+
596
+ it "can change the shipping method" do
597
+ order = create(:completed_order_with_totals)
598
+ visit spree.edit_admin_order_path(order)
599
+ within("table.table tr.show-method") do
600
+ click_icon :edit
601
+ end
602
+ select2 "Default", from: "Shipping Method"
603
+ click_icon :save
604
+
605
+ expect(page).not_to have_css('#selected_shipping_rate_id')
606
+ expect(page).to have_content("Default")
607
+ end
608
+
609
+ it 'can ship' do
610
+ order = create(:order_ready_to_ship)
611
+ order.refresh_shipment_rates
612
+ visit spree.edit_admin_order_path(order)
613
+ click_on 'Ship'
614
+ wait_for_ajax
615
+ within '.shipment-state' do
616
+ expect(page).to have_content('shipped')
617
+ end
618
+ end
619
+ end
620
+ end