solidus_backend 2.10.0.beta1 → 2.10.0

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 (64) 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/views/order/address.js +7 -5
  6. data/app/assets/stylesheets/spree/backend/_bootstrap_custom.scss +2 -0
  7. data/app/assets/stylesheets/spree/backend/components/_breadcrumb.scss +3 -3
  8. data/app/assets/stylesheets/spree/backend/components/_messages.scss +4 -0
  9. data/app/assets/stylesheets/spree/backend/components/_navigation.scss +182 -49
  10. data/app/assets/stylesheets/spree/backend/globals/_variables.scss +2 -0
  11. data/app/assets/stylesheets/spree/backend/shared/_header.scss +5 -1
  12. data/app/assets/stylesheets/spree/backend/shared/_layout.scss +0 -9
  13. data/app/controllers/spree/admin/orders_controller.rb +2 -2
  14. data/app/controllers/spree/admin/payment_methods_controller.rb +3 -3
  15. data/app/controllers/spree/admin/payments_controller.rb +2 -2
  16. data/app/controllers/spree/admin/product_properties_controller.rb +1 -1
  17. data/app/controllers/spree/admin/products_controller.rb +1 -1
  18. data/app/controllers/spree/admin/resource_controller.rb +12 -3
  19. data/app/controllers/spree/admin/taxons/attachment_controller.rb +20 -0
  20. data/app/controllers/spree/admin/users_controller.rb +4 -0
  21. data/app/views/spree/admin/customer_returns/new.html.erb +1 -1
  22. data/app/views/spree/admin/option_types/edit.html.erb +1 -1
  23. data/app/views/spree/admin/orders/edit.html.erb +1 -1
  24. data/app/views/spree/admin/payment_methods/new.html.erb +1 -1
  25. data/app/views/spree/admin/prices/_master_variant_table.html.erb +41 -41
  26. data/app/views/spree/admin/promotion_code_batches/new.html.erb +1 -1
  27. data/app/views/spree/admin/promotion_codes/new.html.erb +1 -1
  28. data/app/views/spree/admin/promotions/_actions.html.erb +1 -0
  29. data/app/views/spree/admin/return_authorizations/new.html.erb +1 -1
  30. data/app/views/spree/admin/shared/_calculator_fields.html.erb +5 -0
  31. data/app/views/spree/admin/shared/_navigation.html.erb +3 -0
  32. data/app/views/spree/admin/shared/_new_resource_links.html.erb +1 -1
  33. data/app/views/spree/admin/shared/_settings_sub_menu.html.erb +1 -1
  34. data/app/views/spree/admin/shipping_methods/_form.html.erb +1 -1
  35. data/app/views/spree/admin/tax_rates/_form.html.erb +1 -1
  36. data/app/views/spree/admin/taxonomies/new.html.erb +1 -1
  37. data/app/views/spree/admin/taxons/_form.html.erb +1 -5
  38. data/app/views/spree/admin/taxons/attachment_forms/_paperclip.html.erb +16 -0
  39. data/app/views/spree/admin/users/_form.html.erb +12 -10
  40. data/app/views/spree/admin/users/edit.html.erb +1 -2
  41. data/app/views/spree/layouts/admin.html.erb +1 -2
  42. data/config/routes.rb +4 -6
  43. data/lib/spree/backend_configuration.rb +2 -1
  44. data/solidus_backend.gemspec +1 -1
  45. data/spec/controllers/spree/admin/resource_controller_spec.rb +12 -1
  46. data/spec/controllers/spree/admin/users_controller_spec.rb +23 -0
  47. data/spec/features/admin/configuration/payment_methods_spec.rb +11 -2
  48. data/spec/features/admin/configuration/shipping_methods_spec.rb +13 -1
  49. data/spec/features/admin/configuration/taxonomies_spec.rb +7 -0
  50. data/spec/features/admin/orders/customer_returns_spec.rb +20 -7
  51. data/spec/features/admin/orders/new_order_spec.rb +48 -0
  52. data/spec/features/admin/orders/return_authorizations_spec.rb +38 -9
  53. data/spec/features/admin/products/edit/images_spec.rb +1 -1
  54. data/spec/features/admin/products/products_spec.rb +12 -0
  55. data/spec/features/admin/promotion_adjustments_spec.rb +9 -0
  56. data/spec/features/admin/promotions/promotion_code_batches_spec.rb +37 -0
  57. data/spec/features/admin/promotions/promotion_code_spec.rb +31 -0
  58. data/spec/features/admin/taxons_spec.rb +12 -0
  59. data/spec/features/admin/users_spec.rb +18 -8
  60. data/spec/{support → fixtures/files}/ror_ringer.jpeg +0 -0
  61. data/spec/spec_helper.rb +1 -0
  62. data/spec/support/feature/base_feature_helper.rb +6 -1
  63. data/vendor/assets/stylesheets/solidus_admin/bootstrap/_variables.scss +1 -1
  64. metadata +14 -9
@@ -3,8 +3,7 @@
3
3
  <head data-hook="admin_inside_head">
4
4
  <%= render 'spree/admin/shared/head' %>
5
5
  </head>
6
-
7
- <body class="admin">
6
+ <body class="admin <%= "admin-nav-hidden" if cookies[:admin_nav_hidden] == "true" %>">
8
7
  <%= render "spree/admin/shared/navigation" %>
9
8
  <%= render "spree/admin/shared/header" %>
10
9
  <%= render "spree/admin/shared/flash" %>
data/config/routes.rb CHANGED
@@ -66,11 +66,7 @@ Spree::Core::Engine.routes.draw do
66
66
 
67
67
  delete '/option_values/:id', to: "option_values#destroy", as: :option_value
68
68
 
69
- resources :properties do
70
- collection do
71
- get :filtered
72
- end
73
- end
69
+ resources :properties
74
70
 
75
71
  delete '/product_properties/:id', to: "product_properties#destroy", as: :product_property
76
72
 
@@ -132,7 +128,9 @@ Spree::Core::Engine.routes.draw do
132
128
  collection do
133
129
  post :update_positions
134
130
  end
135
- resources :taxons
131
+ resources :taxons do
132
+ resource :attachment, controller: 'taxons/attachment', only: [:destroy]
133
+ end
136
134
  end
137
135
 
138
136
  resources :taxons, only: [:index, :show] do
@@ -17,7 +17,8 @@ module Spree
17
17
  :payment_methods, :shipping_methods,
18
18
  :shipping_categories, :stock_locations,
19
19
  :refund_reasons, :reimbursement_types,
20
- :return_reasons, :adjustment_reasons]
20
+ :return_reasons, :adjustment_reasons,
21
+ :store_credit_reasons]
21
22
  PROMOTION_TABS ||= [:promotions, :promotion_categories]
22
23
  STOCK_TABS ||= [:stock_items]
23
24
  USER_TABS ||= [:users, :store_credits]
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.require_path = 'lib'
19
19
  s.requirements << 'none'
20
20
 
21
- s.required_ruby_version = '>= 2.2.2'
21
+ s.required_ruby_version = '>= 2.4.0'
22
22
  s.required_rubygems_version = '>= 1.8.23'
23
23
 
24
24
  s.add_dependency 'solidus_api', s.version
@@ -37,6 +37,7 @@ describe Spree::Admin::WidgetsController, type: :controller do
37
37
  def check_destroy_constraints
38
38
  return unless name == 'undestroyable'
39
39
  errors.add :base, "You can't destroy undestroyable things!"
40
+ errors.add :base, "Terrible things might happen."
40
41
  throw(:abort)
41
42
  end
42
43
  end
@@ -164,7 +165,17 @@ describe Spree::Admin::WidgetsController, type: :controller do
164
165
  it 'responds with error message' do
165
166
  subject
166
167
  expect(response).to be_unprocessable
167
- expect(response.body).to eq assigns(:widget).errors.full_messages.join(', ')
168
+ expect(response.body).to eq assigns(:widget).errors.full_messages.to_sentence
169
+ end
170
+ end
171
+
172
+ context 'html format' do
173
+ subject { delete :destroy, params: params }
174
+
175
+ it 'responds with error message' do
176
+ subject
177
+ expect(response).to be_redirect
178
+ expect(flash[:error]).to eq assigns(:widget).errors.full_messages.to_sentence
168
179
  end
169
180
  end
170
181
  end
@@ -202,6 +202,29 @@ describe Spree::Admin::UsersController, type: :controller do
202
202
  end
203
203
  end
204
204
 
205
+ context "allowed to update passwords" do
206
+ it "can change password of a user" do
207
+ expect {
208
+ put :update, params: { id: user.id, user: { password: "diff123", password_confirmation: "diff123" } }
209
+ }.to_not raise_error
210
+ end
211
+ end
212
+
213
+ context "not allowed to update passwords" do
214
+ stub_authorization! do |_user|
215
+ can [:admin, :update], Spree.user_class
216
+ end
217
+
218
+ it "cannot change password of a user" do
219
+ allow(ActionController::Parameters).
220
+ to receive(:action_on_unpermitted_parameters).and_return(:raise)
221
+
222
+ expect {
223
+ put :update, params: { id: user.id, user: { password: "diff123", password_confirmation: "diff123" } }
224
+ }.to raise_error(ActionController::UnpermittedParameters)
225
+ end
226
+ end
227
+
205
228
  it "can update ship_address attributes" do
206
229
  post :update, params: { id: user.id, user: { ship_address_attributes: valid_address_attributes } }
207
230
  expect(user.reload.ship_address.city).to eq('New York')
@@ -32,8 +32,8 @@ describe "Payment Methods", type: :feature do
32
32
  end
33
33
  end
34
34
 
35
- context "admin creating a new payment method" do
36
- it "should be able to create a new payment method" do
35
+ context "admin creating a new payment method", :js do
36
+ it "creates a new payment method and disables the form" do
37
37
  click_link "Payments"
38
38
  expect(page).to have_link 'Payment Methods'
39
39
  click_link "admin_new_payment_methods_link"
@@ -43,6 +43,15 @@ describe "Payment Methods", type: :feature do
43
43
  select Spree::PaymentMethod::Check.model_name.human, from: "Type"
44
44
  click_button "Create"
45
45
  expect(page).to have_content("successfully created!")
46
+
47
+ visit spree.new_admin_payment_method_path
48
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
49
+ fill_in "payment_method_name", with: "check90"
50
+ fill_in "payment_method_description", with: "check90 desc"
51
+ select Spree::PaymentMethod::Check.model_name.human, from: "Type"
52
+ click_button "Create"
53
+
54
+ expect(page).to have_button("Create", disabled: true)
46
55
  end
47
56
  end
48
57
 
@@ -25,7 +25,7 @@ describe "Shipping Methods", type: :feature do
25
25
  end
26
26
 
27
27
  context "create", js: true do
28
- it "should be able to create a new shipping method" do
28
+ it "creates a new shipping method and disables the submit button", :js do
29
29
  click_link "New Shipping Method"
30
30
 
31
31
  fill_in "shipping_method_name", with: "bullock cart"
@@ -36,6 +36,18 @@ describe "Shipping Methods", type: :feature do
36
36
 
37
37
  click_on "Create"
38
38
  expect(current_path).to eql(spree.edit_admin_shipping_method_path(Spree::ShippingMethod.last))
39
+
40
+ visit spree.new_admin_shipping_method_path
41
+ page.execute_script "$('form').submit(function(e) { e.preventDefault()})"
42
+ fill_in "shipping_method_name", with: "bullock cart"
43
+
44
+ within("#shipping_method_categories_field") do
45
+ check first("input[type='checkbox']")["name"]
46
+ end
47
+
48
+ click_on "Create"
49
+
50
+ expect(page).to have_button("Create", disabled: true)
39
51
  end
40
52
 
41
53
  context 'with shipping method having a calculator with array or hash preference type' do
@@ -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
@@ -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
@@ -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) }
@@ -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
@@ -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