solidus_frontend 2.6.6 → 2.7.0
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.
Potentially problematic release.
This version of solidus_frontend might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/app/assets/javascripts/spree/frontend/checkout/coupon-code.js +1 -0
- data/app/assets/stylesheets/spree/frontend/screen.css.scss +27 -1
- data/app/controllers/spree/checkout_controller.rb +17 -0
- data/app/controllers/spree/orders_controller.rb +26 -12
- data/app/controllers/spree/store_controller.rb +0 -18
- data/app/controllers/spree/taxons_controller.rb +6 -3
- data/app/views/spree/checkout/_coupon_code.html.erb +12 -0
- data/app/views/spree/checkout/_payment.html.erb +0 -10
- data/app/views/spree/checkout/_summary.html.erb +4 -0
- data/spec/controllers/spree/checkout_controller_spec.rb +58 -0
- data/spec/controllers/spree/orders_controller_ability_spec.rb +11 -27
- data/spec/controllers/spree/orders_controller_spec.rb +50 -3
- data/spec/features/checkout_spec.rb +1 -1
- data/spec/features/coupon_code_spec.rb +79 -39
- metadata +9 -8
- data/spec/support/features/fill_in_with_force.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f93efb17a172ec80966788d2091045939cc53f3c
|
4
|
+
data.tar.gz: 771c644fb04e3d9c22d81514bf92b632c259c042
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5db460e348131768ed73ff6e4e7ab72fb3903bafe0c531b124cfacb32a2b8d2b67c8b7a3d3e688ea97080af5760b57d2ea16a6ef5a10f8299bb2f79db81be79c
|
7
|
+
data.tar.gz: 5c21bb80b91a4b6ed2cf639841a3ffcc2c36fadebe54037b7c9743ad28bc4b82a1bc3a2fe06a1e427434348e74f0b25dd7ab7221d90cfe808fb04e0f3725dacb
|
@@ -948,9 +948,35 @@ p[data-hook="use_billing"] {
|
|
948
948
|
padding: 5px;
|
949
949
|
}
|
950
950
|
|
951
|
+
.coupon-code {
|
952
|
+
margin-top: 20px;
|
953
|
+
padding: 10px;
|
954
|
+
|
955
|
+
form {
|
956
|
+
display: flex;
|
957
|
+
flex-flow: row wrap;
|
958
|
+
}
|
959
|
+
|
960
|
+
label {
|
961
|
+
flex: 1 100%;
|
962
|
+
text-align: left;
|
963
|
+
}
|
964
|
+
|
965
|
+
input[type="text"] {
|
966
|
+
flex: 3 0;
|
967
|
+
width: 100%;
|
968
|
+
margin-right: 5px;
|
969
|
+
}
|
970
|
+
|
971
|
+
&-apply-button {
|
972
|
+
white-space: nowrap;
|
973
|
+
}
|
974
|
+
}
|
975
|
+
|
951
976
|
#coupon_status {
|
977
|
+
margin-top: 10px;
|
952
978
|
font-weight: bold;
|
953
|
-
font-size:
|
979
|
+
font-size: 100%;
|
954
980
|
&.success {
|
955
981
|
color: $c_green;
|
956
982
|
}
|
@@ -166,6 +166,23 @@ module Spree
|
|
166
166
|
spree.order_path(@order)
|
167
167
|
end
|
168
168
|
|
169
|
+
def apply_coupon_code
|
170
|
+
if update_params[:coupon_code].present?
|
171
|
+
@order.coupon_code = update_params[:coupon_code]
|
172
|
+
|
173
|
+
handler = PromotionHandler::Coupon.new(@order).apply
|
174
|
+
|
175
|
+
if handler.error.present?
|
176
|
+
flash.now[:error] = handler.error
|
177
|
+
elsif handler.success
|
178
|
+
flash[:success] = handler.success
|
179
|
+
end
|
180
|
+
|
181
|
+
setup_for_current_state
|
182
|
+
respond_with(@order) { |format| format.html { render :edit } } && return
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
169
186
|
def setup_for_current_state
|
170
187
|
method_name = :"before_#{@order.state}"
|
171
188
|
send(method_name) if respond_to?(method_name, true)
|
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
class OrdersController < Spree::StoreController
|
5
|
-
before_action :check_authorization
|
6
5
|
helper 'spree/products', 'spree/orders'
|
7
6
|
|
8
7
|
respond_to :html
|
9
8
|
|
9
|
+
before_action :store_guest_token
|
10
10
|
before_action :assign_order, only: :update
|
11
11
|
# note: do not lock the #edit action because that's where we redirect when we fail to acquire a lock
|
12
12
|
around_action :lock_order, only: :update
|
@@ -15,9 +15,11 @@ module Spree
|
|
15
15
|
|
16
16
|
def show
|
17
17
|
@order = Spree::Order.find_by!(number: params[:id])
|
18
|
+
authorize! :read, @order, cookies.signed[:guest_token]
|
18
19
|
end
|
19
20
|
|
20
21
|
def update
|
22
|
+
authorize! :update, @order, cookies.signed[:guest_token]
|
21
23
|
if @order.contents.update_cart(order_params)
|
22
24
|
@order.next if params.key?(:checkout) && @order.cart?
|
23
25
|
|
@@ -38,12 +40,15 @@ module Spree
|
|
38
40
|
# Shows the current incomplete order from the session
|
39
41
|
def edit
|
40
42
|
@order = current_order || Spree::Order.incomplete.find_or_initialize_by(guest_token: cookies.signed[:guest_token])
|
43
|
+
authorize! :read, @order, cookies.signed[:guest_token]
|
41
44
|
associate_user
|
42
45
|
end
|
43
46
|
|
44
47
|
# Adds a new item to the order (creating a new order if none already exists)
|
45
48
|
def populate
|
46
|
-
@order
|
49
|
+
@order = current_order(create_order_if_necessary: true)
|
50
|
+
authorize! :update, @order, cookies.signed[:guest_token]
|
51
|
+
|
47
52
|
variant = Spree::Variant.find(params[:variant_id])
|
48
53
|
quantity = params[:quantity].present? ? params[:quantity].to_i : 1
|
49
54
|
|
@@ -78,6 +83,7 @@ module Spree
|
|
78
83
|
|
79
84
|
def empty
|
80
85
|
if @order = current_order
|
86
|
+
authorize! :update, @order, cookies.signed[:guest_token]
|
81
87
|
@order.empty!
|
82
88
|
end
|
83
89
|
|
@@ -92,19 +98,12 @@ module Spree
|
|
92
98
|
end
|
93
99
|
end
|
94
100
|
|
95
|
-
|
96
|
-
cookies.permanent.signed[:guest_token] = params[:token] if params[:token]
|
97
|
-
order = Spree::Order.find_by(number: params[:id]) || current_order
|
101
|
+
private
|
98
102
|
|
99
|
-
|
100
|
-
|
101
|
-
else
|
102
|
-
authorize! :create, Spree::Order
|
103
|
-
end
|
103
|
+
def store_guest_token
|
104
|
+
cookies.permanent.signed[:guest_token] = params[:token] if params[:token]
|
104
105
|
end
|
105
106
|
|
106
|
-
private
|
107
|
-
|
108
107
|
def order_params
|
109
108
|
if params[:order]
|
110
109
|
params[:order].permit(*permitted_order_attributes)
|
@@ -120,5 +119,20 @@ module Spree
|
|
120
119
|
redirect_to(root_path) && return
|
121
120
|
end
|
122
121
|
end
|
122
|
+
|
123
|
+
def apply_coupon_code
|
124
|
+
if order_params[:coupon_code].present?
|
125
|
+
@order.coupon_code = order_params[:coupon_code]
|
126
|
+
|
127
|
+
handler = PromotionHandler::Coupon.new(@order).apply
|
128
|
+
|
129
|
+
if handler.error.present?
|
130
|
+
flash.now[:error] = handler.error
|
131
|
+
respond_with(@order) { |format| format.html { render :edit } } && return
|
132
|
+
elsif handler.success
|
133
|
+
flash[:success] = handler.success
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
123
137
|
end
|
124
138
|
end
|
@@ -16,24 +16,6 @@ module Spree
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
-
# This method is placed here so that the CheckoutController
|
20
|
-
# and OrdersController can both reference it (or any other controller
|
21
|
-
# which needs it)
|
22
|
-
def apply_coupon_code
|
23
|
-
if params[:order] && params[:order][:coupon_code]
|
24
|
-
@order.coupon_code = params[:order][:coupon_code]
|
25
|
-
|
26
|
-
handler = PromotionHandler::Coupon.new(@order).apply
|
27
|
-
|
28
|
-
if handler.error.present?
|
29
|
-
flash.now[:error] = handler.error
|
30
|
-
respond_with(@order) { |format| format.html { render :edit } } && return
|
31
|
-
elsif handler.success
|
32
|
-
flash[:success] = handler.success
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
19
|
def config_locale
|
38
20
|
Spree::Frontend::Config[:locale]
|
39
21
|
end
|
@@ -4,12 +4,11 @@ module Spree
|
|
4
4
|
class TaxonsController < Spree::StoreController
|
5
5
|
helper 'spree/products', 'spree/taxon_filters'
|
6
6
|
|
7
|
+
before_action :load_taxon, only: [:show]
|
8
|
+
|
7
9
|
respond_to :html
|
8
10
|
|
9
11
|
def show
|
10
|
-
@taxon = Spree::Taxon.find_by!(permalink: params[:id])
|
11
|
-
return unless @taxon
|
12
|
-
|
13
12
|
@searcher = build_searcher(params.merge(taxon: @taxon.id, include_images: true))
|
14
13
|
@products = @searcher.retrieve_products
|
15
14
|
@taxonomies = Spree::Taxonomy.includes(root: :children)
|
@@ -17,6 +16,10 @@ module Spree
|
|
17
16
|
|
18
17
|
private
|
19
18
|
|
19
|
+
def load_taxon
|
20
|
+
@taxon = Spree::Taxon.find_by!(permalink: params[:id])
|
21
|
+
end
|
22
|
+
|
20
23
|
def accurate_title
|
21
24
|
if @taxon
|
22
25
|
@taxon.seo_title
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="coupon-code" data-hook='coupon_code'>
|
2
|
+
<%= form_for order, url: update_checkout_path(order.state) do |form| %>
|
3
|
+
<%= form.label :coupon_code %>
|
4
|
+
<%= form.text_field :coupon_code, placeholder: :coupon_code %>
|
5
|
+
|
6
|
+
<button type="submit" class="button coupon-code-apply-button" id="coupon-code-apply-button">
|
7
|
+
<%= t('spree.apply_code') %>
|
8
|
+
</button>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<div id='coupon_status'></div>
|
12
|
+
</div>
|
@@ -56,16 +56,6 @@
|
|
56
56
|
<% end %>
|
57
57
|
</ul>
|
58
58
|
<br style="clear:both;" />
|
59
|
-
<p class='field' data-hook='coupon_code'>
|
60
|
-
<%= form.label :coupon_code %>
|
61
|
-
<%= form.text_field :coupon_code %>
|
62
|
-
<button type="button" class="button" id="coupon-code-apply-button">
|
63
|
-
<%= t('spree.apply_code') %>
|
64
|
-
</button>
|
65
|
-
|
66
|
-
</p>
|
67
|
-
<div id='coupon_status'></div>
|
68
|
-
|
69
59
|
</div>
|
70
60
|
</fieldset>
|
71
61
|
|
@@ -478,4 +478,62 @@ describe Spree::CheckoutController, type: :controller do
|
|
478
478
|
post :update, params: { state: "payment" }
|
479
479
|
}.to change { order.line_items.to_a.size }.from(1).to(0)
|
480
480
|
end
|
481
|
+
|
482
|
+
context 'trying to apply a coupon code' do
|
483
|
+
let(:order) { create(:order_with_line_items, state: 'payment', guest_token: 'a token') }
|
484
|
+
let(:coupon_code) { "coupon_code" }
|
485
|
+
|
486
|
+
before { cookies.signed[:guest_token] = order.guest_token }
|
487
|
+
|
488
|
+
context "when coupon code is empty" do
|
489
|
+
let(:coupon_code) { "" }
|
490
|
+
|
491
|
+
it 'does not try to apply coupon code' do
|
492
|
+
expect(Spree::PromotionHandler::Coupon).not_to receive :new
|
493
|
+
|
494
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
495
|
+
|
496
|
+
expect(response).to redirect_to(spree.checkout_state_path('confirm'))
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
context "when coupon code is applied" do
|
501
|
+
let(:promotion_handler) { instance_double('Spree::PromotionHandler::Coupon', error: nil, success: 'Coupon Applied!') }
|
502
|
+
|
503
|
+
it "continues checkout flow normally" do
|
504
|
+
expect(Spree::PromotionHandler::Coupon)
|
505
|
+
.to receive_message_chain(:new, :apply)
|
506
|
+
.and_return(promotion_handler)
|
507
|
+
|
508
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
509
|
+
|
510
|
+
expect(response).to render_template :edit
|
511
|
+
expect(flash.now[:success]).to eq('Coupon Applied!')
|
512
|
+
end
|
513
|
+
|
514
|
+
context "when coupon code is not applied" do
|
515
|
+
let(:promotion_handler) { instance_double('Spree::PromotionHandler::Coupon', error: 'Some error', success: false) }
|
516
|
+
|
517
|
+
it "setups the current step correctly before rendering" do
|
518
|
+
expect(Spree::PromotionHandler::Coupon)
|
519
|
+
.to receive_message_chain(:new, :apply)
|
520
|
+
.and_return(promotion_handler)
|
521
|
+
expect(controller).to receive(:setup_for_current_state)
|
522
|
+
|
523
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
524
|
+
end
|
525
|
+
|
526
|
+
it "render cart with coupon error" do
|
527
|
+
expect(Spree::PromotionHandler::Coupon)
|
528
|
+
.to receive_message_chain(:new, :apply)
|
529
|
+
.and_return(promotion_handler)
|
530
|
+
|
531
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
532
|
+
|
533
|
+
expect(response).to render_template :edit
|
534
|
+
expect(flash.now[:error]).to eq('Some error')
|
535
|
+
end
|
536
|
+
end
|
537
|
+
end
|
538
|
+
end
|
481
539
|
end
|
@@ -18,7 +18,6 @@ module Spree
|
|
18
18
|
|
19
19
|
context 'when an order exists in the cookies.signed' do
|
20
20
|
let(:token) { 'some_token' }
|
21
|
-
let(:specified_order) { create(:order) }
|
22
21
|
|
23
22
|
before do
|
24
23
|
allow(controller).to receive_messages current_order: order
|
@@ -26,54 +25,39 @@ module Spree
|
|
26
25
|
end
|
27
26
|
|
28
27
|
context '#populate' do
|
29
|
-
it 'should check if user is authorized for :
|
30
|
-
expect(controller).to receive(:authorize!).with(:
|
28
|
+
it 'should check if user is authorized for :update' do
|
29
|
+
expect(controller).to receive(:authorize!).with(:update, order, token)
|
31
30
|
post :populate, params: { variant_id: variant.id, token: token }
|
32
31
|
end
|
33
|
-
it "should check against the specified order" do
|
34
|
-
expect(controller).to receive(:authorize!).with(:edit, specified_order, token)
|
35
|
-
post :populate, params: { id: specified_order.number, variant_id: variant.id, token: token }
|
36
|
-
end
|
37
32
|
end
|
38
33
|
|
39
34
|
context '#edit' do
|
40
|
-
it 'should check if user is authorized for :
|
41
|
-
expect(controller).to receive(:authorize!).with(:
|
35
|
+
it 'should check if user is authorized for :read' do
|
36
|
+
expect(controller).to receive(:authorize!).with(:read, order, token)
|
42
37
|
get :edit, params: { token: token }
|
43
38
|
end
|
44
|
-
it "should check against the specified order" do
|
45
|
-
expect(controller).to receive(:authorize!).with(:edit, specified_order, token)
|
46
|
-
get :edit, params: { id: specified_order.number, token: token }
|
47
|
-
end
|
48
39
|
end
|
49
40
|
|
50
41
|
context '#update' do
|
51
|
-
it 'should check if user is authorized for :
|
42
|
+
it 'should check if user is authorized for :update' do
|
52
43
|
allow(order).to receive :update_attributes
|
53
|
-
expect(controller).to receive(:authorize!).with(:
|
44
|
+
expect(controller).to receive(:authorize!).with(:update, order, token)
|
54
45
|
post :update, params: { order: { email: "foo@bar.com" }, token: token }
|
55
46
|
end
|
56
|
-
it "should check against the specified order" do
|
57
|
-
allow(order).to receive :update_attributes
|
58
|
-
expect(controller).to receive(:authorize!).with(:edit, specified_order, token)
|
59
|
-
post :update, params: { order: { email: "foo@bar.com" }, id: specified_order.number, token: token }
|
60
|
-
end
|
61
47
|
end
|
62
48
|
|
63
49
|
context '#empty' do
|
64
|
-
it 'should check if user is authorized for :
|
65
|
-
expect(controller).to receive(:authorize!).with(:
|
50
|
+
it 'should check if user is authorized for :update' do
|
51
|
+
expect(controller).to receive(:authorize!).with(:update, order, token)
|
66
52
|
post :empty, params: { token: token }
|
67
53
|
end
|
68
|
-
it "should check against the specified order" do
|
69
|
-
expect(controller).to receive(:authorize!).with(:edit, specified_order, token)
|
70
|
-
post :empty, params: { id: specified_order.number, token: token }
|
71
|
-
end
|
72
54
|
end
|
73
55
|
|
74
56
|
context "#show" do
|
57
|
+
let(:specified_order) { create(:order) }
|
58
|
+
|
75
59
|
it "should check against the specified order" do
|
76
|
-
expect(controller).to receive(:authorize!).with(:
|
60
|
+
expect(controller).to receive(:authorize!).with(:read, specified_order, token)
|
77
61
|
get :show, params: { id: specified_order.number, token: token }
|
78
62
|
end
|
79
63
|
end
|
@@ -105,7 +105,7 @@ describe Spree::OrdersController, type: :controller do
|
|
105
105
|
context "#update" do
|
106
106
|
context "with authorization" do
|
107
107
|
before do
|
108
|
-
allow(controller).to receive :
|
108
|
+
allow(controller).to receive :authorize!
|
109
109
|
allow(controller).to receive_messages current_order: order
|
110
110
|
end
|
111
111
|
|
@@ -128,12 +128,59 @@ describe Spree::OrdersController, type: :controller do
|
|
128
128
|
put :update, params: { checkout: true }
|
129
129
|
expect(response).to redirect_to checkout_state_path('address')
|
130
130
|
end
|
131
|
+
|
132
|
+
context 'trying to apply a coupon code' do
|
133
|
+
let(:order) { create(:order_with_line_items, state: 'cart') }
|
134
|
+
let(:coupon_code) { "coupon_code" }
|
135
|
+
|
136
|
+
context "when coupon code is empty" do
|
137
|
+
let(:coupon_code) { "" }
|
138
|
+
|
139
|
+
it 'does not try to apply coupon code' do
|
140
|
+
expect(Spree::PromotionHandler::Coupon).not_to receive :new
|
141
|
+
|
142
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
143
|
+
|
144
|
+
expect(response).to redirect_to(spree.cart_path)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context "when coupon code is applied" do
|
149
|
+
let(:promotion_handler) { instance_double('Spree::PromotionHandler::Coupon', error: nil, success: 'Coupon Applied!') }
|
150
|
+
|
151
|
+
it "continues checkout flow normally" do
|
152
|
+
expect(Spree::PromotionHandler::Coupon)
|
153
|
+
.to receive_message_chain(:new, :apply)
|
154
|
+
.and_return(promotion_handler)
|
155
|
+
|
156
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
157
|
+
|
158
|
+
expect(response).to redirect_to(spree.cart_path)
|
159
|
+
expect(flash.now[:success]).to eq('Coupon Applied!')
|
160
|
+
end
|
161
|
+
|
162
|
+
context "when coupon code is not applied" do
|
163
|
+
let(:promotion_handler) { instance_double('Spree::PromotionHandler::Coupon', error: 'Some error', success: false) }
|
164
|
+
|
165
|
+
it "render cart with coupon error" do
|
166
|
+
expect(Spree::PromotionHandler::Coupon)
|
167
|
+
.to receive_message_chain(:new, :apply)
|
168
|
+
.and_return(promotion_handler)
|
169
|
+
|
170
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
171
|
+
|
172
|
+
expect(response).to render_template :edit
|
173
|
+
expect(flash.now[:error]).to eq('Some error')
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
131
178
|
end
|
132
179
|
end
|
133
180
|
|
134
181
|
context "#empty" do
|
135
182
|
before do
|
136
|
-
allow(controller).to receive :
|
183
|
+
allow(controller).to receive :authorize!
|
137
184
|
end
|
138
185
|
|
139
186
|
it "should destroy line items in the current order" do
|
@@ -165,7 +212,7 @@ describe Spree::OrdersController, type: :controller do
|
|
165
212
|
let!(:line_item) { order.contents.add(variant, 1) }
|
166
213
|
|
167
214
|
before do
|
168
|
-
allow(controller).to receive
|
215
|
+
allow(controller).to receive :authorize!
|
169
216
|
allow(controller).to receive_messages(current_order: order)
|
170
217
|
end
|
171
218
|
|
@@ -350,7 +350,7 @@ describe "Checkout", type: :feature, inaccessible: true do
|
|
350
350
|
choose "use_existing_card_no"
|
351
351
|
|
352
352
|
fill_in "Name on card", with: 'Spree Commerce'
|
353
|
-
|
353
|
+
fill_in "Card Number", with: '4111 1111 1111 1111'
|
354
354
|
fill_in "card_expiry", with: '04 / 20'
|
355
355
|
fill_in "Card Code", with: '123'
|
356
356
|
|
@@ -11,7 +11,7 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
11
11
|
let!(:payment_method) { create(:check_payment_method) }
|
12
12
|
let!(:product) { create(:product, name: "RoR Mug", price: 20) }
|
13
13
|
|
14
|
-
context "visitor makes checkout
|
14
|
+
context "visitor makes checkout" do
|
15
15
|
def create_basic_coupon_promotion(code)
|
16
16
|
promotion = create(
|
17
17
|
:promotion,
|
@@ -34,50 +34,90 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
34
34
|
|
35
35
|
let!(:promotion) { create_basic_coupon_promotion("onetwo") }
|
36
36
|
|
37
|
-
# OrdersController
|
38
37
|
context "on the payment page" do
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
it "informs about an invalid coupon code" do
|
61
|
-
fill_in "order_coupon_code", with: "coupon_codes_rule_man"
|
62
|
-
click_button "Save and Continue"
|
63
|
-
expect(page).to have_content(I18n.t('spree.coupon_code_not_found'))
|
64
|
-
end
|
38
|
+
context "as guest without registration" do
|
39
|
+
before do
|
40
|
+
visit spree.root_path
|
41
|
+
click_link "RoR Mug"
|
42
|
+
click_button "add-to-cart-button"
|
43
|
+
click_button "Checkout"
|
44
|
+
fill_in "order_email", with: "spree@example.com"
|
45
|
+
fill_in "First Name", with: "John"
|
46
|
+
fill_in "Last Name", with: "Smith"
|
47
|
+
fill_in "Street Address", with: "1 John Street"
|
48
|
+
fill_in "City", with: "City of John"
|
49
|
+
fill_in "Zip", with: "01337"
|
50
|
+
select country.name, from: "Country"
|
51
|
+
select state.name, from: "order[bill_address_attributes][state_id]"
|
52
|
+
fill_in "Phone", with: "555-555-5555"
|
53
|
+
|
54
|
+
# To shipping method screen
|
55
|
+
click_button "Save and Continue"
|
56
|
+
# To payment screen
|
57
|
+
click_button "Save and Continue"
|
58
|
+
end
|
65
59
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
click_button "Save and Continue"
|
72
|
-
expect(page).to have_content("Promotion (Onetwo) -$10.00")
|
73
|
-
end
|
60
|
+
it "informs about an invalid coupon code" do
|
61
|
+
fill_in "order_coupon_code", with: "coupon_codes_rule_man"
|
62
|
+
click_button "Apply Code"
|
63
|
+
expect(page).to have_content(I18n.t('spree.coupon_code_not_found'))
|
64
|
+
end
|
74
65
|
|
75
|
-
|
76
|
-
|
66
|
+
it "can enter an invalid coupon code, then a real one" do
|
67
|
+
fill_in "order_coupon_code", with: "coupon_codes_rule_man"
|
68
|
+
click_button "Apply Code"
|
69
|
+
expect(page).to have_content(I18n.t('spree.coupon_code_not_found'))
|
77
70
|
fill_in "order_coupon_code", with: "onetwo"
|
78
|
-
click_button "
|
71
|
+
click_button "Apply Code"
|
79
72
|
expect(page).to have_content("Promotion (Onetwo) -$10.00")
|
80
73
|
end
|
74
|
+
|
75
|
+
context "with a promotion" do
|
76
|
+
it "applies a promotion to an order" do
|
77
|
+
fill_in "order_coupon_code", with: "onetwo"
|
78
|
+
click_button "Apply Code"
|
79
|
+
expect(page).to have_content("Promotion (Onetwo) -$10.00")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'as logged user' do
|
85
|
+
let!(:user) { create(:user, bill_address: create(:address), ship_address: create(:address)) }
|
86
|
+
|
87
|
+
before do
|
88
|
+
allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
|
89
|
+
allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with saved credit card' do
|
93
|
+
let(:bogus) { create(:credit_card_payment_method) }
|
94
|
+
let!(:credit_card) do
|
95
|
+
create(:credit_card, user_id: user.id, payment_method: bogus, gateway_customer_profile_id: "BGS-WEFWF")
|
96
|
+
end
|
97
|
+
|
98
|
+
before do
|
99
|
+
user.wallet.add(credit_card)
|
100
|
+
|
101
|
+
visit spree.root_path
|
102
|
+
click_link "RoR Mug"
|
103
|
+
click_button "add-to-cart-button"
|
104
|
+
# To Cart
|
105
|
+
click_button "Checkout"
|
106
|
+
# To shipping method screen, address is auto-populated
|
107
|
+
# with user's saved addresses
|
108
|
+
click_button "Save and Continue"
|
109
|
+
# To payment screen
|
110
|
+
click_button "Save and Continue"
|
111
|
+
end
|
112
|
+
|
113
|
+
it "shows wallet payments on coupon code errors" do
|
114
|
+
fill_in "order_coupon_code", with: "coupon_codes_rule_man"
|
115
|
+
click_button "Apply Code"
|
116
|
+
|
117
|
+
expect(page).to have_content("The coupon code you entered doesn't exist. Please try again.")
|
118
|
+
expect(page).to have_content("Use an existing card")
|
119
|
+
end
|
120
|
+
end
|
81
121
|
end
|
82
122
|
end
|
83
123
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidus_frontend
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Solidus Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solidus_api
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.7.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.7.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: solidus_core
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.
|
33
|
+
version: 2.7.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.
|
40
|
+
version: 2.7.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: canonical-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -208,6 +208,7 @@ files:
|
|
208
208
|
- app/views/spree/address/_form_hidden.html.erb
|
209
209
|
- app/views/spree/checkout/_address.html.erb
|
210
210
|
- app/views/spree/checkout/_confirm.html.erb
|
211
|
+
- app/views/spree/checkout/_coupon_code.html.erb
|
211
212
|
- app/views/spree/checkout/_delivery.html.erb
|
212
213
|
- app/views/spree/checkout/_payment.html.erb
|
213
214
|
- app/views/spree/checkout/_summary.html.erb
|
@@ -303,7 +304,6 @@ files:
|
|
303
304
|
- spec/helpers/order_helper_spec.rb
|
304
305
|
- spec/helpers/taxon_filters_helper_spec.rb
|
305
306
|
- spec/spec_helper.rb
|
306
|
-
- spec/support/features/fill_in_with_force.rb
|
307
307
|
- spec/support/shared_contexts/checkout_setup.rb
|
308
308
|
- spec/support/shared_contexts/custom_products.rb
|
309
309
|
- spec/support/shared_contexts/locales.rb
|
@@ -328,7 +328,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
328
328
|
version: 1.8.23
|
329
329
|
requirements:
|
330
330
|
- none
|
331
|
-
|
331
|
+
rubyforge_project:
|
332
|
+
rubygems_version: 2.6.10
|
332
333
|
signing_key:
|
333
334
|
specification_version: 4
|
334
335
|
summary: Cart and storefront for the Solidus e-commerce project.
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module FillInWithForce
|
4
|
-
def fill_in_with_force(locator, with:)
|
5
|
-
field_id = find_field(locator)[:id]
|
6
|
-
page.execute_script "document.getElementById('#{field_id}').value = '#{with}';"
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
RSpec.configure do |config|
|
11
|
-
config.include FillInWithForce, type: :feature
|
12
|
-
end
|