spree_frontend 3.2.9 → 3.3.0.rc1
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.
- checksums.yaml +4 -4
- data/app/controllers/spree/checkout_controller.rb +8 -2
- data/app/controllers/spree/orders_controller.rb +7 -3
- data/app/controllers/spree/products_controller.rb +3 -1
- data/app/helpers/spree/frontend_helper.rb +1 -1
- data/app/helpers/spree/taxons_helper.rb +2 -3
- data/app/views/spree/checkout/_confirm.html.erb +3 -0
- data/app/views/spree/checkout/_summary.html.erb +1 -1
- data/app/views/spree/checkout/payment/_storecredit.html.erb +1 -0
- data/app/views/spree/products/_cart_form.html.erb +3 -3
- data/app/views/spree/shared/_main_nav_bar.html.erb +1 -1
- data/app/views/spree/shared/_order_details.html.erb +0 -1
- data/app/views/spree/shared/_products.html.erb +4 -1
- data/spec/controllers/controller_extension_spec.rb +126 -0
- data/spec/controllers/controller_helpers_spec.rb +122 -0
- data/spec/controllers/spree/checkout_controller_spec.rb +547 -0
- data/spec/controllers/spree/checkout_controller_with_views_spec.rb +36 -0
- data/spec/controllers/spree/content_controller_spec.rb +12 -0
- data/spec/controllers/spree/current_order_tracking_spec.rb +44 -0
- data/spec/controllers/spree/home_controller_spec.rb +47 -0
- data/spec/controllers/spree/orders_controller_ability_spec.rb +96 -0
- data/spec/controllers/spree/orders_controller_spec.rb +134 -0
- data/spec/controllers/spree/orders_controller_transitions_spec.rb +31 -0
- data/spec/controllers/spree/products_controller_spec.rb +87 -0
- data/spec/controllers/spree/taxons_controller_spec.rb +12 -0
- data/spec/features/address_spec.rb +93 -0
- data/spec/features/automatic_promotion_adjustments_spec.rb +47 -0
- data/spec/features/caching/products_spec.rb +59 -0
- data/spec/features/caching/taxons_spec.rb +22 -0
- data/spec/features/cart_spec.rb +132 -0
- data/spec/features/checkout_spec.rb +723 -0
- data/spec/features/checkout_unshippable_spec.rb +34 -0
- data/spec/features/coupon_code_spec.rb +88 -0
- data/spec/features/currency_spec.rb +18 -0
- data/spec/features/delivery_spec.rb +64 -0
- data/spec/features/free_shipping_promotions_spec.rb +59 -0
- data/spec/features/locale_spec.rb +60 -0
- data/spec/features/microdata_spec.rb +0 -0
- data/spec/features/order_spec.rb +107 -0
- data/spec/features/page_promotions_spec.rb +36 -0
- data/spec/features/products_spec.rb +345 -0
- data/spec/features/taxons_spec.rb +147 -0
- data/spec/features/template_rendering_spec.rb +19 -0
- data/spec/helpers/frontend_helper_spec.rb +57 -0
- data/spec/helpers/taxons_helper_spec.rb +17 -0
- data/spec/spec_helper.rb +128 -0
- data/spec/support/shared_contexts/checkout_setup.rb +10 -0
- data/spec/support/shared_contexts/custom_products.rb +25 -0
- data/spec/support/shared_contexts/product_prototypes.rb +30 -0
- data/spec/views/spree/checkout/_summary_spec.rb +11 -0
- data/spree_frontend.gemspec +5 -4
- metadata +90 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 895c04875fd5f5f2af102a55b9625f8a61a901c9
|
4
|
+
data.tar.gz: 8e081c1219e709db368ab3deb9f59cbb48518bcc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90a535919679f330a4b07abe0fc769a2a3eddc9daa8d91d9583597de65607dfd07323075a9ac0976e401d89c9b6740af930c31ab18b68735dc843424a33b2022
|
7
|
+
data.tar.gz: 83a4a268aa6426b1d6bba8f101a620aeab42d8aafb6b9e418b1fe7437b8baaed31c071c7acb1d551826d7c86fefd0e4dabf4e27bfce1b9a289cedd19862853b1
|
@@ -4,7 +4,6 @@ module Spree
|
|
4
4
|
# checkout which has nothing to do with updating an order that this approach
|
5
5
|
# is waranted.
|
6
6
|
class CheckoutController < Spree::StoreController
|
7
|
-
before_action :expires_now, only: [:edit]
|
8
7
|
before_action :load_order_with_lock
|
9
8
|
before_action :ensure_valid_state_lock_version, only: [:update]
|
10
9
|
before_action :set_state_if_present
|
@@ -18,7 +17,7 @@ module Spree
|
|
18
17
|
before_action :check_authorization
|
19
18
|
|
20
19
|
before_action :setup_for_current_state
|
21
|
-
before_action :add_store_credit_payments, only: [:update]
|
20
|
+
before_action :add_store_credit_payments, :remove_store_credit_payments, only: [:update]
|
22
21
|
|
23
22
|
helper 'spree/orders'
|
24
23
|
|
@@ -180,6 +179,13 @@ module Spree
|
|
180
179
|
end
|
181
180
|
end
|
182
181
|
|
182
|
+
def remove_store_credit_payments
|
183
|
+
if params.key?(:remove_store_credit)
|
184
|
+
@order.remove_store_credit_payments
|
185
|
+
redirect_to checkout_state_path(@order.state) and return
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
183
189
|
def rescue_from_spree_gateway_error(exception)
|
184
190
|
flash.now[:error] = Spree.t(:spree_gateway_error_flash_for_checkout)
|
185
191
|
@order.errors.add(:base, exception.message)
|
@@ -10,7 +10,7 @@ module Spree
|
|
10
10
|
skip_before_action :verify_authenticity_token, only: [:populate]
|
11
11
|
|
12
12
|
def show
|
13
|
-
@order = Order.includes(line_items: [variant: [:option_values, :images, :product]], bill_address: :state, ship_address: :state).
|
13
|
+
@order = Order.includes(line_items: [variant: [:option_values, :images, :product]], bill_address: :state, ship_address: :state).find_by!(number: params[:id])
|
14
14
|
end
|
15
15
|
|
16
16
|
def update
|
@@ -49,6 +49,9 @@ module Spree
|
|
49
49
|
if quantity.between?(1, 2_147_483_647)
|
50
50
|
begin
|
51
51
|
order.contents.add(variant, quantity, options)
|
52
|
+
order.update_line_item_prices!
|
53
|
+
order.create_tax_charge!
|
54
|
+
order.update_with_updater!
|
52
55
|
rescue ActiveRecord::RecordInvalid => e
|
53
56
|
error = e.record.errors.full_messages.join(", ")
|
54
57
|
end
|
@@ -68,7 +71,7 @@ module Spree
|
|
68
71
|
|
69
72
|
def populate_redirect
|
70
73
|
flash[:error] = Spree.t(:populate_get_error)
|
71
|
-
redirect_to
|
74
|
+
redirect_to cart_path
|
72
75
|
end
|
73
76
|
|
74
77
|
def empty
|
@@ -88,7 +91,8 @@ module Spree
|
|
88
91
|
end
|
89
92
|
|
90
93
|
def check_authorization
|
91
|
-
order = Spree::Order.
|
94
|
+
order = Spree::Order.find_by(number: params[:id]) if params[:id].present?
|
95
|
+
order = current_order unless order
|
92
96
|
|
93
97
|
if order
|
94
98
|
authorize! :edit, order, cookies.signed[:guest_token]
|
@@ -41,7 +41,9 @@ module Spree
|
|
41
41
|
else
|
42
42
|
@products = Product.active(current_currency)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
|
+
@product = @products.includes(:variants_including_master, variant_images: :viewable).
|
46
|
+
friendly.distinct(false).find(params[:id])
|
45
47
|
end
|
46
48
|
|
47
49
|
def load_taxon
|
@@ -23,7 +23,7 @@ module Spree
|
|
23
23
|
def checkout_progress(numbers: false)
|
24
24
|
states = @order.checkout_steps
|
25
25
|
items = states.each_with_index.map do |state, i|
|
26
|
-
text = Spree.t("
|
26
|
+
text = Spree.t("order_states.#{state}").titleize
|
27
27
|
text.prepend("#{i.succ}. ") if numbers
|
28
28
|
|
29
29
|
css_classes = []
|
@@ -4,13 +4,12 @@ module Spree
|
|
4
4
|
# that we can use configurations as well as make it easier for end users to override this determination. One idea is
|
5
5
|
# to show the most popular products for a particular taxon (that is an exercise left to the developer.)
|
6
6
|
def taxon_preview(taxon, max=4)
|
7
|
-
products = taxon.active_products.select("spree_products.*, spree_products_taxons.position").limit(max)
|
7
|
+
products = taxon.active_products.select("DISTINCT (spree_products.id), spree_products.*, spree_products_taxons.position").limit(max)
|
8
8
|
if (products.size < max)
|
9
9
|
products_arel = Spree::Product.arel_table
|
10
10
|
taxon.descendants.each do |taxon|
|
11
11
|
to_get = max - products.length
|
12
|
-
products += taxon.active_products.select("spree_products.*, spree_products_taxons.position").
|
13
|
-
where(products_arel[:id].not_in(products.map(&:id))).limit(to_get)
|
12
|
+
products += taxon.active_products.select("DISTINCT (spree_products.id), spree_products.*, spree_products_taxons.position").where(products_arel[:id].not_in(products.map(&:id))).limit(to_get)
|
14
13
|
break if products.size >= max
|
15
14
|
end
|
16
15
|
end
|
@@ -8,6 +8,9 @@
|
|
8
8
|
</div>
|
9
9
|
|
10
10
|
<div class="well text-right form-buttons" data-hook="buttons">
|
11
|
+
<% if @order.using_store_credit? %>
|
12
|
+
<%= button_tag Spree.t('store_credit.remove'), name: 'remove_store_credit', class: 'continue btn' %>
|
13
|
+
<% end %>
|
11
14
|
<%= submit_tag Spree.t(:place_order), class: 'btn btn-lg btn-success' %>
|
12
15
|
<script>Spree.disableSaveOnClick();</script>
|
13
16
|
</div>
|
@@ -64,7 +64,7 @@
|
|
64
64
|
|
65
65
|
<% if order.using_store_credit? %>
|
66
66
|
<tr data-hook="order_details_store_credit">
|
67
|
-
<td><%= Spree.t(:store_credit_name) %>:</strong></td>
|
67
|
+
<td><strong><%= Spree.t(:store_credit_name) %>:</strong></td>
|
68
68
|
<td><span id='summary-store-credit'><%= order.display_total_applied_store_credit.to_html %></span></td>
|
69
69
|
</tr>
|
70
70
|
<% end %>
|
@@ -5,6 +5,7 @@
|
|
5
5
|
<p><%= Spree.t('store_credit.remaining_amount', amount: @order.display_store_credit_remaining_after_capture) %></p>
|
6
6
|
<% else %>
|
7
7
|
<p><%= Spree.t('store_credit.additional_payment_needed', amount: @order.display_order_total_after_store_credit) %></p>
|
8
|
+
<%= button_tag Spree.t('store_credit.remove'), name: 'remove_store_credit', class: 'continue btn' %>
|
8
9
|
<% end %>
|
9
10
|
</div>
|
10
11
|
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<% @product.variants_and_option_values(current_currency).each_with_index do |variant, index| %>
|
8
8
|
<li>
|
9
9
|
<%= radio_button_tag "variant_id", variant.id, index == 0,
|
10
|
-
'data-price' => variant.price_in(current_currency).money,
|
10
|
+
'data-price' => variant.price_in(current_currency).money,
|
11
11
|
'data-in-stock' => variant.can_supply?
|
12
12
|
%>
|
13
13
|
<%= label_tag "variant_id_#{ variant.id }" do %>
|
@@ -34,10 +34,10 @@
|
|
34
34
|
<div id="product-price">
|
35
35
|
<h6 class="product-section-title"><%= Spree.t(:price) %></h6>
|
36
36
|
<div>
|
37
|
-
<span class="lead price selling" itemprop="price">
|
37
|
+
<span class="lead price selling" itemprop="price" content="<%= @product.price_in(current_currency).amount.to_d %>">
|
38
38
|
<%= display_price(@product) %>
|
39
39
|
</span>
|
40
|
-
<span itemprop="priceCurrency" content="<%=
|
40
|
+
<span itemprop="priceCurrency" content="<%= current_currency %>"></span>
|
41
41
|
</div>
|
42
42
|
|
43
43
|
<% if @product.master.can_supply? %>
|
@@ -16,7 +16,6 @@
|
|
16
16
|
<div class="delivery">
|
17
17
|
<% order.shipments.each do |shipment| %>
|
18
18
|
<div>
|
19
|
-
<i class='fa fa-truck'></i>
|
20
19
|
<%= Spree.t(:shipment_details, stock_location: shipment.stock_location.name, shipping_method: shipment.selected_shipping_rate.name) %>
|
21
20
|
</div>
|
22
21
|
<% end %>
|
@@ -32,7 +32,10 @@
|
|
32
32
|
</div>
|
33
33
|
<div class="panel-footer text-center">
|
34
34
|
<span itemprop="offers" itemscope itemtype="https://schema.org/Offer">
|
35
|
-
<span class="price selling lead" itemprop="price"
|
35
|
+
<span class="price selling lead" itemprop="price" content="<%= product.price_in(current_currency).amount.to_d %>">
|
36
|
+
<%= display_price(product) %>
|
37
|
+
</span>
|
38
|
+
<span itemprop="priceCurrency" content="<%= current_currency %>"></span>
|
36
39
|
</span>
|
37
40
|
</div>
|
38
41
|
<% end %>
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# This test tests the functionality within
|
4
|
+
# spree/core/controller_helpers/respond_with.rb
|
5
|
+
# Rather than duck-punching the existing controllers, let's define a custom one:
|
6
|
+
class Spree::CustomController < Spree::BaseController
|
7
|
+
def index
|
8
|
+
respond_with(Spree::Address.new) do |format|
|
9
|
+
format.html { render plain: "neutral" }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
# Just need a model with validations
|
15
|
+
# Address is good enough, so let's go with that
|
16
|
+
address = Spree::Address.new(params[:address])
|
17
|
+
respond_with(address)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Spree::CustomController, type: :controller do
|
22
|
+
after do
|
23
|
+
Spree::CustomController.clear_overrides!
|
24
|
+
end
|
25
|
+
|
26
|
+
before do
|
27
|
+
@routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
|
28
|
+
r.draw {
|
29
|
+
get 'index', to: 'spree/custom#index'
|
30
|
+
post 'create', to: 'spree/custom#create'
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "extension testing" do
|
36
|
+
context "index" do
|
37
|
+
context "specify symbol for handler instead of Proc" do
|
38
|
+
before do
|
39
|
+
Spree::CustomController.class_eval do
|
40
|
+
respond_override({index: {html: {success: :success_method}}})
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def success_method
|
45
|
+
render plain: 'success!!!'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "GET" do
|
51
|
+
it "has value success" do
|
52
|
+
spree_get :index
|
53
|
+
expect(response).to be_success
|
54
|
+
assert (response.body =~ /success!!!/)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "render" do
|
60
|
+
before do
|
61
|
+
Spree::CustomController.instance_eval do
|
62
|
+
respond_override(index: { html: { success: lambda { render(plain: 'success!!!') } } })
|
63
|
+
respond_override(index: { html: { failure: lambda { render(plain: 'failure!!!') } } })
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "GET" do
|
68
|
+
it "has value success" do
|
69
|
+
spree_get :index
|
70
|
+
expect(response).to be_success
|
71
|
+
assert (response.body =~ /success!!!/)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "redirect" do
|
77
|
+
before do
|
78
|
+
Spree::CustomController.instance_eval do
|
79
|
+
respond_override({index: {html: {success: lambda { redirect_to('/cart') }}}})
|
80
|
+
respond_override(index: { html: { failure: lambda { render(plain: 'failure!!!') } } })
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "GET" do
|
85
|
+
it "has value success" do
|
86
|
+
spree_get :index
|
87
|
+
expect(response).to be_redirect
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "validation error" do
|
93
|
+
before do
|
94
|
+
Spree::CustomController.instance_eval do
|
95
|
+
respond_to :html
|
96
|
+
respond_override(create: { html: { success: lambda { render(plain: 'success!!!') } } })
|
97
|
+
respond_override(create: { html: { failure: lambda { render(plain: 'failure!!!') } } })
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "POST" do
|
102
|
+
it "has value success" do
|
103
|
+
spree_post :create
|
104
|
+
expect(response).to be_success
|
105
|
+
assert (response.body =~ /success!/)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'A different controllers respond_override. Regression test for #1301' do
|
111
|
+
before do
|
112
|
+
Spree::CheckoutController.instance_eval do
|
113
|
+
respond_override(index: { html: { success: lambda { render(plain: 'success!!!') } } })
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "POST" do
|
118
|
+
it "should not effect the wrong controller" do
|
119
|
+
spree_get :index
|
120
|
+
assert (response.body =~ /neutral/)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# In this file, we want to test that the controller helpers function correctly
|
4
|
+
# So we need to use one of the controllers inside Spree.
|
5
|
+
# ProductsController is good.
|
6
|
+
describe Spree::ProductsController, type: :controller do
|
7
|
+
|
8
|
+
let!(:available_locales) { [:en, :de] }
|
9
|
+
let!(:available_locale) { :de }
|
10
|
+
let!(:unavailable_locale) { :ru }
|
11
|
+
|
12
|
+
before do
|
13
|
+
I18n.enforce_available_locales = false
|
14
|
+
expect(I18n).to receive(:available_locales).and_return(available_locales)
|
15
|
+
end
|
16
|
+
|
17
|
+
after do
|
18
|
+
Spree::Frontend::Config[:locale] = :en
|
19
|
+
Rails.application.config.i18n.default_locale = :en
|
20
|
+
I18n.locale = :en
|
21
|
+
I18n.enforce_available_locales = true
|
22
|
+
end
|
23
|
+
|
24
|
+
# Regression test for #1184
|
25
|
+
context 'when session locale not set' do
|
26
|
+
before(:each) do
|
27
|
+
session[:locale] = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when Spree::Frontend::Config[:locale] not present' do
|
31
|
+
before(:each) do
|
32
|
+
Spree::Frontend::Config[:locale] = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when rails application default locale not set' do
|
36
|
+
before(:each) do
|
37
|
+
Rails.application.config.i18n.default_locale = nil
|
38
|
+
end
|
39
|
+
|
40
|
+
it "sets the I18n default locale" do
|
41
|
+
spree_get :index
|
42
|
+
expect(I18n.locale).to eq(I18n.default_locale)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when rails application default locale is set' do
|
47
|
+
context 'and not in available_locales' do
|
48
|
+
before(:each) do
|
49
|
+
Rails.application.config.i18n.default_locale = unavailable_locale
|
50
|
+
end
|
51
|
+
|
52
|
+
it "sets the I18n default locale" do
|
53
|
+
spree_get :index
|
54
|
+
expect(I18n.locale).to eq(I18n.default_locale)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'and in available_locales' do
|
59
|
+
before(:each) do
|
60
|
+
Rails.application.config.i18n.default_locale = available_locale
|
61
|
+
end
|
62
|
+
|
63
|
+
it "sets the rails app locale" do
|
64
|
+
expect(I18n.locale).to eq(:en)
|
65
|
+
spree_get :index
|
66
|
+
expect(I18n.locale).to eq(available_locale)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when Spree::Frontend::Config[:locale] is present' do
|
73
|
+
context 'and not in available_locales' do
|
74
|
+
before(:each) do
|
75
|
+
Spree::Frontend::Config[:locale] = unavailable_locale
|
76
|
+
end
|
77
|
+
|
78
|
+
it "sets the I18n default locale" do
|
79
|
+
spree_get :index
|
80
|
+
expect(I18n.locale).to eq(I18n.default_locale)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'and not in available_locales' do
|
85
|
+
before(:each) do
|
86
|
+
Spree::Frontend::Config[:locale] = available_locale
|
87
|
+
end
|
88
|
+
|
89
|
+
it "sets the default locale based on Spree::Frontend::Config[:locale]" do
|
90
|
+
expect(I18n.locale).to eq(:en)
|
91
|
+
spree_get :index
|
92
|
+
expect(I18n.locale).to eq(available_locale)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'when session locale is set' do
|
99
|
+
context 'and not in available_locales' do
|
100
|
+
before(:each) do
|
101
|
+
session[:locale] = unavailable_locale
|
102
|
+
end
|
103
|
+
|
104
|
+
it "sets the I18n default locale" do
|
105
|
+
spree_get :index
|
106
|
+
expect(I18n.locale).to eq(I18n.default_locale)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'and in available_locales' do
|
111
|
+
before(:each) do
|
112
|
+
session[:locale] = available_locale
|
113
|
+
end
|
114
|
+
|
115
|
+
it "sets the session locale" do
|
116
|
+
expect(I18n.locale).to eq(:en)
|
117
|
+
spree_get :index
|
118
|
+
expect(I18n.locale).to eq(available_locale)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|