solidus_backend 2.9.5 → 2.10.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_backend might be problematic. Click here for more details.

Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree/backend.js +1 -0
  3. data/app/assets/javascripts/spree/backend/components/admin_nav.js +24 -0
  4. data/app/assets/javascripts/spree/backend/components/tabs.js +1 -1
  5. data/app/assets/javascripts/spree/backend/models/order.js +9 -0
  6. data/app/assets/javascripts/spree/backend/orders/cart.js +6 -0
  7. data/app/assets/javascripts/spree/backend/shipments.js +0 -62
  8. data/app/assets/javascripts/spree/backend/templates/index.js +0 -1
  9. data/app/assets/javascripts/spree/backend/views/cart/empty_cart_button.js +29 -0
  10. data/app/assets/javascripts/spree/backend/views/cart/line_item_table.js +5 -0
  11. data/app/assets/javascripts/spree/backend/views/index.js +1 -0
  12. data/app/assets/javascripts/spree/backend/views/order/address.js +7 -5
  13. data/app/assets/stylesheets/spree/backend/_bootstrap_custom.scss +2 -0
  14. data/app/assets/stylesheets/spree/backend/components/_breadcrumb.scss +3 -3
  15. data/app/assets/stylesheets/spree/backend/components/_messages.scss +4 -0
  16. data/app/assets/stylesheets/spree/backend/components/_navigation.scss +182 -49
  17. data/app/assets/stylesheets/spree/backend/globals/{_mixins.css → _mixins.scss} +0 -0
  18. data/app/assets/stylesheets/spree/backend/globals/_variables.scss +2 -0
  19. data/app/assets/stylesheets/spree/backend/shared/_header.scss +5 -1
  20. data/app/assets/stylesheets/spree/backend/shared/_layout.scss +0 -9
  21. data/app/controllers/spree/admin/adjustments_controller.rb +1 -1
  22. data/app/controllers/spree/admin/base_controller.rb +1 -1
  23. data/app/controllers/spree/admin/orders_controller.rb +2 -2
  24. data/app/controllers/spree/admin/payment_methods_controller.rb +4 -4
  25. data/app/controllers/spree/admin/payments_controller.rb +2 -2
  26. data/app/controllers/spree/admin/product_properties_controller.rb +1 -1
  27. data/app/controllers/spree/admin/products_controller.rb +2 -2
  28. data/app/controllers/spree/admin/resource_controller.rb +13 -4
  29. data/app/controllers/spree/admin/style_guide_controller.rb +1 -1
  30. data/app/controllers/spree/admin/taxons/attachment_controller.rb +20 -0
  31. data/app/controllers/spree/admin/users_controller.rb +6 -2
  32. data/app/helpers/spree/admin/navigation_helper.rb +3 -2
  33. data/app/helpers/spree/promotion_rules_helper.rb +1 -1
  34. data/app/views/spree/admin/customer_returns/new.html.erb +1 -1
  35. data/app/views/spree/admin/option_types/edit.html.erb +1 -1
  36. data/app/views/spree/admin/orders/_line_items_edit_form.html.erb +1 -0
  37. data/app/views/spree/admin/orders/edit.html.erb +3 -4
  38. data/app/views/spree/admin/payment_methods/new.html.erb +1 -1
  39. data/app/views/spree/admin/prices/_master_variant_table.html.erb +41 -41
  40. data/app/views/spree/admin/promotion_code_batches/new.html.erb +1 -1
  41. data/app/views/spree/admin/promotion_codes/new.html.erb +1 -1
  42. data/app/views/spree/admin/promotions/_actions.html.erb +1 -0
  43. data/app/views/spree/admin/promotions/index.html.erb +1 -1
  44. data/app/views/spree/admin/return_authorizations/new.html.erb +1 -1
  45. data/app/views/spree/admin/shared/_calculator_fields.html.erb +5 -0
  46. data/app/views/spree/admin/shared/_navigation.html.erb +3 -0
  47. data/app/views/spree/admin/shared/_new_resource_links.html.erb +1 -1
  48. data/app/views/spree/admin/shared/_order_submenu.html.erb +2 -2
  49. data/app/views/spree/admin/shared/_settings_sub_menu.html.erb +1 -1
  50. data/app/views/spree/admin/shipping_methods/_form.html.erb +1 -1
  51. data/app/views/spree/admin/stock_locations/index.html.erb +1 -1
  52. data/app/views/spree/admin/store_credit_reasons/index.html.erb +1 -1
  53. data/app/views/spree/admin/store_credits/index.html.erb +1 -1
  54. data/app/views/spree/admin/tax_rates/_form.html.erb +1 -1
  55. data/app/views/spree/admin/taxonomies/new.html.erb +1 -1
  56. data/app/views/spree/admin/taxons/_form.html.erb +1 -5
  57. data/app/views/spree/admin/taxons/attachment_forms/_paperclip.html.erb +16 -0
  58. data/app/views/spree/admin/users/_form.html.erb +12 -10
  59. data/app/views/spree/admin/users/_tabs.html.erb +1 -1
  60. data/app/views/spree/admin/users/edit.html.erb +1 -2
  61. data/app/views/spree/layouts/admin.html.erb +1 -2
  62. data/config/routes.rb +4 -6
  63. data/lib/spree/backend.rb +1 -0
  64. data/lib/spree/backend/config.rb +9 -0
  65. data/lib/spree/backend/engine.rb +5 -3
  66. data/{app/models → lib}/spree/backend_configuration.rb +5 -2
  67. data/solidus_backend.gemspec +2 -1
  68. data/spec/controllers/spree/admin/customer_returns_controller_spec.rb +1 -1
  69. data/spec/controllers/spree/admin/orders/customer_details_controller_spec.rb +2 -2
  70. data/spec/controllers/spree/admin/resource_controller_spec.rb +12 -1
  71. data/spec/controllers/spree/admin/store_credits_controller_spec.rb +1 -1
  72. data/spec/controllers/spree/admin/users_controller_spec.rb +23 -0
  73. data/spec/features/admin/configuration/payment_methods_spec.rb +11 -2
  74. data/spec/features/admin/configuration/shipping_methods_spec.rb +13 -1
  75. data/spec/features/admin/configuration/taxonomies_spec.rb +7 -0
  76. data/spec/features/admin/orders/customer_details_spec.rb +1 -2
  77. data/spec/features/admin/orders/customer_returns_spec.rb +20 -7
  78. data/spec/features/admin/orders/new_order_spec.rb +53 -5
  79. data/spec/features/admin/orders/new_refund_spec.rb +1 -1
  80. data/spec/features/admin/orders/order_details_spec.rb +14 -4
  81. data/spec/features/admin/orders/return_authorizations_spec.rb +38 -9
  82. data/spec/features/admin/products/edit/images_spec.rb +1 -1
  83. data/spec/features/admin/products/edit/taxons_spec.rb +8 -2
  84. data/spec/features/admin/products/products_spec.rb +12 -0
  85. data/spec/features/admin/promotion_adjustments_spec.rb +9 -0
  86. data/spec/features/admin/promotions/promotion_code_batches_spec.rb +37 -0
  87. data/spec/features/admin/promotions/promotion_code_spec.rb +31 -0
  88. data/spec/features/admin/taxons_spec.rb +12 -0
  89. data/spec/features/admin/users_spec.rb +18 -8
  90. data/spec/{support → fixtures/files}/ror_ringer.jpeg +0 -0
  91. data/spec/{models → lib}/spree/backend_configuration/menu_item_spec.rb +0 -0
  92. data/spec/{models → lib}/spree/backend_configuration_spec.rb +0 -0
  93. data/spec/spec_helper.rb +1 -0
  94. data/spec/support/feature/base_feature_helper.rb +6 -1
  95. data/spec/teaspoon_env.rb +8 -23
  96. data/vendor/assets/stylesheets/solidus_admin/bootstrap/_variables.scss +1 -1
  97. metadata +33 -14
  98. data/app/assets/javascripts/spree/backend/templates/variants/autocomplete_stock.hbs +0 -56
  99. data/app/views/spree/admin/orders/_add_product.html.erb +0 -12
@@ -38,6 +38,13 @@ describe "Taxonomies", type: :feature do
38
38
  click_button "Create"
39
39
  expect(page).to have_content("can't be blank")
40
40
  end
41
+
42
+ it "disables the button at submit", :js do
43
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
44
+ fill_in "taxonomy_name", with: "sports"
45
+ click_button "Create"
46
+ expect(page).to have_button("Create", disabled: true)
47
+ end
41
48
  end
42
49
 
43
50
  context "edit" do
@@ -117,7 +117,7 @@ describe "Customer Details", type: :feature, js: true do
117
117
  end
118
118
 
119
119
  it "should show validation errors" do
120
- order.update_attributes!(ship_address_id: nil)
120
+ order.update!(ship_address_id: nil)
121
121
  click_link "Customer"
122
122
  click_button "Update"
123
123
  expect(page).to have_content("Shipping address first name can't be blank")
@@ -157,7 +157,6 @@ describe "Customer Details", type: :feature, js: true do
157
157
  end
158
158
 
159
159
  it "sets default country when displaying form" do
160
- click_link "Cart"
161
160
  click_link "Customer"
162
161
  expect(page).to have_field("order_bill_address_attributes_country_id", with: brazil.id, visible: false)
163
162
  end
@@ -8,21 +8,34 @@ describe 'Customer returns', type: :feature do
8
8
  context 'when the order has more than one line item' do
9
9
  let(:order) { create :shipped_order, line_items_count: 2 }
10
10
 
11
+ def create_customer_return
12
+ find('#select-all').click
13
+ page.execute_script "$('select.add-item').val('receive')"
14
+ select 'NY Warehouse', from: 'Stock Location'
15
+ click_button 'Create'
16
+ end
17
+
18
+ before do
19
+ visit spree.new_admin_order_customer_return_path(order)
20
+ end
21
+
11
22
  context 'when creating a return with state "Received"' do
12
23
  it 'marks the order as returned', :js do
13
- visit spree.new_admin_order_customer_return_path(order)
14
-
15
- find('#select-all').click
16
- page.execute_script "$('select.add-item').val('receive')"
17
- select 'NY Warehouse', from: 'Stock Location'
18
- click_button 'Create'
24
+ create_customer_return
19
25
 
20
26
  expect(page).to have_content 'Customer Return has been successfully created'
21
-
22
27
  within 'dd.order-state' do
23
28
  expect(page).to have_content 'Returned'
24
29
  end
25
30
  end
26
31
  end
32
+
33
+ it 'disables the button at submit', :js do
34
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
35
+
36
+ create_customer_return
37
+
38
+ expect(page).to have_button("Create", disabled: true)
39
+ end
27
40
  end
28
41
  end
@@ -154,14 +154,14 @@ describe "New Order", type: :feature do
154
154
  click_on "Update"
155
155
 
156
156
  # Automatically redirected to Shipments page
157
- select2_search product.name, from: I18n.t('spree.name_or_sku')
158
-
159
- click_icon :plus
157
+ within '.no-objects-found' do
158
+ click_on "Cart"
159
+ end
160
160
 
161
- expect(page).to have_css('.stock-item')
161
+ add_line_item product.name
162
162
 
163
163
  click_on "Payments"
164
- click_on "Continue"
164
+ click_on "Update"
165
165
 
166
166
  within(".additional-info") do
167
167
  expect(page).to have_content("Confirm")
@@ -169,6 +169,54 @@ describe "New Order", type: :feature do
169
169
  end
170
170
  end
171
171
 
172
+ context "when changing customer", :js do
173
+ let!(:other_user) { create :user, bill_address: bill_address }
174
+
175
+ context "when one customer address have only textual state" do
176
+ let(:country) { create :country, iso: "IT" }
177
+ let(:bill_address) { create :address, country: country, state: nil, state_name: "Veneto" }
178
+
179
+ it "changes the bill address state accordingly" do
180
+ click_on "Customer"
181
+
182
+ within "#select-customer" do
183
+ targetted_select2_search user.email, from: "#s2id_customer_search"
184
+ end
185
+
186
+ expect(find("select#order_bill_address_attributes_state_id").value).to eq user.bill_address.state_id.to_s
187
+
188
+ within "#select-customer" do
189
+ targetted_select2_search other_user.email, from: "#s2id_customer_search"
190
+ end
191
+
192
+ expect(find("select#order_bill_address_attributes_state_id", visible: false).value).to eq ""
193
+ expect(find("#order_bill_address_attributes_state_name").value).to eq other_user.bill_address.state_name
194
+ end
195
+ end
196
+
197
+ context "when customers have same country but different state" do
198
+ let(:different_state) { Spree::State.where.not(id: user.bill_address.state_id).first }
199
+
200
+ let(:bill_address) { create :address, country: user.bill_address.country, state: different_state }
201
+
202
+ it "changes the bill address state accordingly" do
203
+ click_on "Customer"
204
+
205
+ within "#select-customer" do
206
+ targetted_select2_search user.email, from: "#s2id_customer_search"
207
+ end
208
+
209
+ expect(find('#order_bill_address_attributes_state_id').value).to eq user.bill_address.state_id.to_s
210
+
211
+ within "#select-customer" do
212
+ targetted_select2_search other_user.email, from: "#s2id_customer_search"
213
+ end
214
+
215
+ expect(find('#order_bill_address_attributes_state_id').value).to eq other_user.bill_address.state_id.to_s
216
+ end
217
+ end
218
+ end
219
+
172
220
  # Regression test for https://github.com/spree/spree/issues/5327
173
221
  context "customer with default credit card", js: true do
174
222
  let!(:credit_card) { create(:credit_card, user: user) }
@@ -29,7 +29,7 @@ RSpec.describe 'New Refund creation', :js do
29
29
  fill_in 'refund_amount', with: amount
30
30
  select reason.name, from: 'Reason'
31
31
  click_button 'Refund'
32
- expect(find('input[type="submit"]')).to be_disabled
32
+ expect(page).to have_button('Refund', disabled: true)
33
33
  end
34
34
  end
35
35
  end
@@ -76,6 +76,19 @@ describe "Order Details", type: :feature, js: true do
76
76
  expect(page).to have_field('quantity')
77
77
  end
78
78
 
79
+ it "can remove all items with empty cart" do
80
+ expect(page).to have_content("spree t-shirt")
81
+
82
+ accept_confirm "Are you sure you want to delete this record?" do
83
+ click_on 'Empty Cart'
84
+ end
85
+
86
+ expect(page).not_to have_content("spree t-shirt")
87
+
88
+ # Should have a new item row
89
+ expect(page).to have_field('quantity')
90
+ end
91
+
79
92
  # Regression test for https://github.com/spree/spree/issues/3862
80
93
  it "can cancel removing an item from a shipment" do
81
94
  expect(page).to have_content("spree t-shirt")
@@ -278,8 +291,7 @@ describe "Order Details", type: :feature, js: true do
278
291
 
279
292
  context 'A shipment has shipped' do
280
293
  it 'should not show or let me back to the cart page, nor show the shipment edit buttons' do
281
- order = create(:order, state: 'payment')
282
- order.shipments.create!(stock_location_id: stock_location.id, state: 'shipped')
294
+ order = create(:shipped_order, state: 'payment', stock_location: stock_location)
283
295
 
284
296
  visit spree.cart_admin_order_path(order)
285
297
 
@@ -525,8 +537,6 @@ describe "Order Details", type: :feature, js: true do
525
537
  expect(page).not_to have_css('.delete-item')
526
538
  expect(page).not_to have_css('.split-item')
527
539
  expect(page).not_to have_css('.edit-tracking')
528
-
529
- expect(page).not_to have_css('#add-line-item')
530
540
  end
531
541
  end
532
542
 
@@ -8,20 +8,49 @@ describe "ReturnAuthorizations", type: :feature do
8
8
  stub_authorization!
9
9
 
10
10
  let!(:order) { create(:shipped_order) }
11
- let!(:return_authorization) { create(:return_authorization, order: order) }
12
11
 
13
- it "can visit the return authorizations list page" do
14
- visit spree.admin_order_return_authorizations_path(order)
12
+ describe "create" do
13
+ def create_return_authorization
14
+ find("#select-all").click
15
+ select "NY Warehouse", from: "Stock Location"
16
+ click_button "Create"
17
+ end
18
+
19
+ before do
20
+ visit spree.new_admin_order_return_authorization_path(order)
21
+ end
22
+
23
+ it "creates a return authorization" do
24
+ create_return_authorization
25
+
26
+ expect(page).to have_content "Return Authorization has been successfully created!"
27
+ end
28
+
29
+ it "disables the button at submit", :js do
30
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
31
+
32
+ create_return_authorization
33
+
34
+ expect(page).to have_button("Create", disabled: true)
35
+ end
15
36
  end
16
37
 
17
- describe "edit" do
18
- it "can visit the return authorizations edit page" do
19
- visit spree.edit_admin_order_return_authorization_path(order, return_authorization)
38
+ describe "when a return authorization exists" do
39
+ let!(:return_authorization) { create(:return_authorization, order: order) }
40
+
41
+ it "can visit the return authorizations list page" do
42
+ visit spree.admin_order_return_authorizations_path(order)
20
43
  end
21
44
 
22
- it "return authorizations edit page has a data hook for extensions to add content above, below or within the RA form" do
23
- visit spree.edit_admin_order_return_authorization_path(order, return_authorization)
24
- expect(page).to have_selector("[data-hook=return-authorization-form-wrapper]")
45
+ describe "edit" do
46
+ it "can visit the return authorizations edit page" do
47
+ visit spree.edit_admin_order_return_authorization_path(order, return_authorization)
48
+ end
49
+
50
+ it "return authorizations edit page has a data hook for extensions to add content above, below or within the RA form" do
51
+ visit spree.edit_admin_order_return_authorization_path(order, return_authorization)
52
+ expect(page).to have_selector("[data-hook=return-authorization-form-wrapper]")
53
+ end
25
54
  end
26
55
  end
27
56
  end
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
  describe "Product Images", type: :feature do
6
6
  stub_authorization!
7
7
 
8
- let(:file_path) { Rails.root + "../../spec/support/ror_ringer.jpeg" }
8
+ let(:file_path) { file_fixture("ror_ringer.jpeg") }
9
9
  let(:product) { create(:product) }
10
10
 
11
11
  before do
@@ -26,13 +26,19 @@ describe "Product Display Order", type: :feature do
26
26
  visit spree.edit_admin_product_path(product)
27
27
 
28
28
  assert_selected_taxons([taxon_1])
29
-
30
29
  select2_search "Clothing", from: "Taxon"
31
30
  assert_selected_taxons([taxon_1, taxon_2])
32
31
 
32
+ # Without this line we have a flaky spec probably due to select2 not
33
+ # closing its fixed overlay correctly. Clicking anywhere in the page
34
+ # before submit apparently solves the issue.
35
+ find('.edit_product', visible: true, obscured: false).click
36
+
33
37
  click_button "Update"
34
38
 
35
- expect(find(".flash")).to have_text "Product \"#{product.name}\" has been successfully updated!"
39
+ within('.flash') do
40
+ expect(page).to have_content(%(Product "#{product.name}" has been successfully updated!))
41
+ end
36
42
  assert_selected_taxons([taxon_1, taxon_2])
37
43
  end
38
44
 
@@ -172,6 +172,18 @@ describe "Products", type: :feature do
172
172
  expect(page).to have_content("successfully updated!")
173
173
  end
174
174
 
175
+ it "disables the button at submit", :js do
176
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
177
+ fill_in "product_name", with: "Baseball Cap"
178
+ fill_in "product_sku", with: "B100"
179
+ fill_in "product_price", with: "100"
180
+ fill_in "product_available_on", with: "2012/01/24"
181
+ select @shipping_category.name, from: "product_shipping_category_id"
182
+ click_button "Create"
183
+
184
+ expect(page).to have_button("Create", disabled: true)
185
+ end
186
+
175
187
  it "should show validation errors", js: false do
176
188
  fill_in "product_name", with: "Baseball Cap"
177
189
  fill_in "product_sku", with: "B100"
@@ -167,6 +167,15 @@ describe "Promotion Adjustments", type: :feature, js: true do
167
167
  expect(promotion.actions.first).to be_a(Spree::Promotion::Actions::FreeShipping)
168
168
  end
169
169
 
170
+ it "disables the button at submit", :js do
171
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
172
+ fill_in "Name", with: "SAVE SAVE SAVE"
173
+ choose "Apply to all orders"
174
+ click_button "Create"
175
+
176
+ expect(page).to have_button("Create", disabled: true)
177
+ end
178
+
170
179
  it "should allow an admin to create an automatic promotion" do
171
180
  fill_in "Name", with: "SAVE SAVE SAVE"
172
181
  choose "Apply to all orders"
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ feature "Promotion Code Batches", partial_double_verification: false do
6
+ stub_authorization!
7
+
8
+ describe "create" do
9
+ let(:promotion) { create :promotion }
10
+
11
+ before do
12
+ user = double.as_null_object
13
+ allow_any_instance_of(ActionView::Base).to receive(:spree_current_user) { user }
14
+ visit spree.new_admin_promotion_promotion_code_batch_path(promotion)
15
+ end
16
+
17
+ def create_code_batch
18
+ fill_in "Base code", with: "base"
19
+ fill_in "Number of codes", with: 3
20
+ click_button "Create"
21
+ end
22
+
23
+ it "creates a new promotion code batch and disables the submit button", :js do
24
+ create_code_batch
25
+
26
+ expect(page).to have_content "Promotion Code Batch has been successfully created!"
27
+
28
+ visit spree.new_admin_promotion_promotion_code_batch_path(promotion)
29
+
30
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
31
+
32
+ create_code_batch
33
+
34
+ expect(page).to have_button("Create", disabled: true)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ feature "Promotion Codes" do
6
+ stub_authorization!
7
+
8
+ describe "create" do
9
+ let(:promotion) { create :promotion }
10
+
11
+ before do
12
+ visit spree.new_admin_promotion_promotion_code_path(promotion)
13
+ end
14
+
15
+ it "creates a new promotion code" do
16
+ fill_in "Value", with: "XYZ"
17
+ click_button "Create"
18
+
19
+ expect(page).to have_content "Promotion Code has been successfully created!"
20
+ end
21
+
22
+ it "disables the button at submit", :js do
23
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
24
+
25
+ fill_in "Value", with: "XYZ"
26
+ click_button "Create"
27
+
28
+ expect(page).to have_button("Create", disabled: true)
29
+ end
30
+ end
31
+ end
@@ -75,4 +75,16 @@ describe "Taxonomies and taxons", type: :feature do
75
75
  end
76
76
  end
77
77
  end
78
+
79
+ scenario "Removes attachments from taxon" do
80
+ taxon = create(:taxon)
81
+ taxon.update(icon: File.new(file_fixture('ror_ringer.jpeg')))
82
+
83
+ visit spree.edit_admin_taxonomy_taxon_path(taxon.taxonomy, taxon.id)
84
+ within('#taxon_icon_field') do
85
+ click_on 'Remove'
86
+ end
87
+
88
+ expect(page).to have_content("Icon has been successfully removed!")
89
+ end
78
90
  end
@@ -158,14 +158,6 @@ describe 'Users', type: :feature do
158
158
  expect(page).to have_field('user_email', with: 'a@example.com99')
159
159
  end
160
160
 
161
- it 'can edit the user password' do
162
- fill_in 'user_password', with: 'welcome'
163
- fill_in 'user_password_confirmation', with: 'welcome'
164
- click_button 'Update'
165
-
166
- expect(page).to have_text 'Account updated'
167
- end
168
-
169
161
  it 'can edit user roles' do
170
162
  click_link 'Account'
171
163
 
@@ -213,6 +205,24 @@ describe 'Users', type: :feature do
213
205
  expect(user_a.reload.bill_address.address1).to eq "1313 Mockingbird Ln"
214
206
  end
215
207
 
208
+ it 'can edit the user password' do
209
+ fill_in 'user_password', with: 'welcome'
210
+ fill_in 'user_password_confirmation', with: 'welcome'
211
+ click_button 'Update'
212
+
213
+ expect(page).to have_text 'Account updated'
214
+ end
215
+
216
+ context 'without password permissions' do
217
+ custom_authorization! do |_user|
218
+ cannot [:update_password], Spree.user_class
219
+ end
220
+
221
+ it 'cannot edit the user password' do
222
+ expect(page).to_not have_text 'Password'
223
+ end
224
+ end
225
+
216
226
  context 'invalid entry' do
217
227
  around do |example|
218
228
  ::AlwaysInvalidUser = Class.new(Spree.user_class) do