solidus_frontend 2.6.5 → 2.9.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 +4 -4
- data/README.md +7 -5
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/javascripts/spree/frontend/checkout/coupon-code.js +2 -1
- data/app/assets/stylesheets/spree/frontend/screen.css.scss +39 -1
- data/app/controllers/spree/checkout_controller.rb +61 -3
- data/app/controllers/spree/coupon_codes_controller.rb +35 -0
- data/app/controllers/spree/locale_controller.rb +1 -1
- data/app/controllers/spree/orders_controller.rb +27 -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/_delivery.html.erb +6 -2
- data/app/views/spree/checkout/_payment.html.erb +0 -10
- data/app/views/spree/checkout/_summary.html.erb +4 -0
- data/app/views/spree/checkout/payment/_gateway.html.erb +6 -5
- data/app/views/spree/coupon_codes/new.html.erb +6 -0
- data/app/views/spree/orders/_form.html.erb +1 -1
- data/app/views/spree/orders/_line_item.html.erb +3 -5
- data/app/views/spree/orders/edit.html.erb +5 -6
- data/app/views/spree/products/_image.html.erb +4 -1
- data/app/views/spree/products/_thumbnails.html.erb +10 -8
- data/app/views/spree/shared/_image.html.erb +4 -4
- data/app/views/spree/shared/_locale_selector.html.erb +1 -1
- data/app/views/spree/shared/_order_details.html.erb +3 -5
- data/app/views/spree/shared/_products.html.erb +1 -1
- data/config/routes.rb +1 -0
- data/lib/spree/frontend.rb +1 -1
- data/solidus_frontend.gemspec +1 -1
- data/spec/controllers/spree/checkout_controller_spec.rb +109 -9
- data/spec/controllers/spree/checkout_controller_with_views_spec.rb +1 -1
- data/spec/controllers/spree/home_controller_spec.rb +1 -1
- data/spec/controllers/spree/orders_controller_ability_spec.rb +11 -30
- data/spec/controllers/spree/orders_controller_spec.rb +54 -3
- data/spec/controllers/spree/products_controller_spec.rb +3 -3
- data/spec/controllers/spree/taxons_controller_spec.rb +1 -1
- data/spec/features/address_spec.rb +1 -1
- data/spec/features/automatic_promotion_adjustments_spec.rb +2 -2
- data/spec/features/caching/taxons_spec.rb +1 -1
- data/spec/features/checkout_confirm_insufficient_stock_spec.rb +71 -0
- data/spec/features/checkout_spec.rb +34 -25
- data/spec/features/coupon_code_spec.rb +96 -56
- data/spec/features/currency_spec.rb +1 -1
- data/spec/features/first_order_promotion_spec.rb +59 -0
- data/spec/features/free_shipping_promotions_spec.rb +2 -2
- data/spec/features/products_spec.rb +8 -8
- data/spec/features/promotion_code_invalidation_spec.rb +2 -2
- data/spec/features/quantity_promotions_spec.rb +9 -9
- data/spec/spec_helper.rb +1 -1
- metadata +14 -9
- data/spec/support/features/fill_in_with_force.rb +0 -12
@@ -7,8 +7,6 @@ module Spree
|
|
7
7
|
ORDER_TOKEN = 'ORDER_TOKEN'
|
8
8
|
|
9
9
|
let!(:store) { create(:store) }
|
10
|
-
let(:user) { create(:user) }
|
11
|
-
let(:guest_user) { create(:user) }
|
12
10
|
let(:order) { Spree::Order.create }
|
13
11
|
let(:variant) { create(:variant) }
|
14
12
|
|
@@ -18,62 +16,45 @@ module Spree
|
|
18
16
|
|
19
17
|
context 'when an order exists in the cookies.signed' do
|
20
18
|
let(:token) { 'some_token' }
|
21
|
-
let(:specified_order) { create(:order) }
|
22
19
|
|
23
20
|
before do
|
24
21
|
allow(controller).to receive_messages current_order: order
|
25
|
-
allow(controller).to receive_messages spree_current_user: user
|
26
22
|
end
|
27
23
|
|
28
24
|
context '#populate' do
|
29
|
-
it 'should check if user is authorized for :
|
30
|
-
expect(controller).to receive(:authorize!).with(:
|
25
|
+
it 'should check if user is authorized for :update' do
|
26
|
+
expect(controller).to receive(:authorize!).with(:update, order, token)
|
31
27
|
post :populate, params: { variant_id: variant.id, token: token }
|
32
28
|
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
29
|
end
|
38
30
|
|
39
31
|
context '#edit' do
|
40
|
-
it 'should check if user is authorized for :
|
41
|
-
expect(controller).to receive(:authorize!).with(:
|
32
|
+
it 'should check if user is authorized for :read' do
|
33
|
+
expect(controller).to receive(:authorize!).with(:read, order, token)
|
42
34
|
get :edit, params: { token: token }
|
43
35
|
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
36
|
end
|
49
37
|
|
50
38
|
context '#update' do
|
51
|
-
it 'should check if user is authorized for :
|
39
|
+
it 'should check if user is authorized for :update' do
|
52
40
|
allow(order).to receive :update_attributes
|
53
|
-
expect(controller).to receive(:authorize!).with(:
|
41
|
+
expect(controller).to receive(:authorize!).with(:update, order, token)
|
54
42
|
post :update, params: { order: { email: "foo@bar.com" }, token: token }
|
55
43
|
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
44
|
end
|
62
45
|
|
63
46
|
context '#empty' do
|
64
|
-
it 'should check if user is authorized for :
|
65
|
-
expect(controller).to receive(:authorize!).with(:
|
47
|
+
it 'should check if user is authorized for :update' do
|
48
|
+
expect(controller).to receive(:authorize!).with(:update, order, token)
|
66
49
|
post :empty, params: { token: token }
|
67
50
|
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
51
|
end
|
73
52
|
|
74
53
|
context "#show" do
|
54
|
+
let(:specified_order) { create(:order) }
|
55
|
+
|
75
56
|
it "should check against the specified order" do
|
76
|
-
expect(controller).to receive(:authorize!).with(:
|
57
|
+
expect(controller).to receive(:authorize!).with(:read, specified_order, token)
|
77
58
|
get :show, params: { id: specified_order.number, token: token }
|
78
59
|
end
|
79
60
|
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,63 @@ 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::Deprecation).to receive(:warn)
|
153
|
+
|
154
|
+
expect(Spree::PromotionHandler::Coupon)
|
155
|
+
.to receive_message_chain(:new, :apply)
|
156
|
+
.and_return(promotion_handler)
|
157
|
+
|
158
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
159
|
+
|
160
|
+
expect(response).to redirect_to(spree.cart_path)
|
161
|
+
expect(flash.now[:success]).to eq('Coupon Applied!')
|
162
|
+
end
|
163
|
+
|
164
|
+
context "when coupon code is not applied" do
|
165
|
+
let(:promotion_handler) { instance_double('Spree::PromotionHandler::Coupon', error: 'Some error', success: false) }
|
166
|
+
|
167
|
+
it "render cart with coupon error" do
|
168
|
+
expect(Spree::Deprecation).to receive(:warn)
|
169
|
+
|
170
|
+
expect(Spree::PromotionHandler::Coupon)
|
171
|
+
.to receive_message_chain(:new, :apply)
|
172
|
+
.and_return(promotion_handler)
|
173
|
+
|
174
|
+
put :update, params: { state: order.state, order: { coupon_code: coupon_code } }
|
175
|
+
|
176
|
+
expect(response).to render_template :edit
|
177
|
+
expect(flash.now[:error]).to eq('Some error')
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
131
182
|
end
|
132
183
|
end
|
133
184
|
|
134
185
|
context "#empty" do
|
135
186
|
before do
|
136
|
-
allow(controller).to receive :
|
187
|
+
allow(controller).to receive :authorize!
|
137
188
|
end
|
138
189
|
|
139
190
|
it "should destroy line items in the current order" do
|
@@ -165,7 +216,7 @@ describe Spree::OrdersController, type: :controller do
|
|
165
216
|
let!(:line_item) { order.contents.add(variant, 1) }
|
166
217
|
|
167
218
|
before do
|
168
|
-
allow(controller).to receive
|
219
|
+
allow(controller).to receive :authorize!
|
169
220
|
allow(controller).to receive_messages(current_order: order)
|
170
221
|
end
|
171
222
|
|
@@ -7,7 +7,7 @@ describe Spree::ProductsController, type: :controller do
|
|
7
7
|
|
8
8
|
# Regression test for https://github.com/spree/spree/issues/1390
|
9
9
|
it "allows admins to view non-active products" do
|
10
|
-
allow(controller).to receive_messages
|
10
|
+
allow(controller).to receive_messages try_spree_current_user: mock_model(Spree.user_class, has_spree_role?: true, last_incomplete_spree_order: nil, spree_api_key: 'fake')
|
11
11
|
get :show, params: { id: product.to_param }
|
12
12
|
expect(response.status).to eq(200)
|
13
13
|
end
|
@@ -20,7 +20,7 @@ describe Spree::ProductsController, type: :controller do
|
|
20
20
|
|
21
21
|
it "should provide the current user to the searcher class" do
|
22
22
|
user = mock_model(Spree.user_class, last_incomplete_spree_order: nil, spree_api_key: 'fake')
|
23
|
-
allow(controller).to receive_messages
|
23
|
+
allow(controller).to receive_messages try_spree_current_user: user
|
24
24
|
expect_any_instance_of(Spree::Config.searcher_class).to receive(:current_user=).with(user)
|
25
25
|
get :index
|
26
26
|
expect(response.status).to eq(200)
|
@@ -29,7 +29,7 @@ describe Spree::ProductsController, type: :controller do
|
|
29
29
|
# Regression test for https://github.com/spree/spree/issues/2249
|
30
30
|
it "doesn't error when given an invalid referer" do
|
31
31
|
current_user = mock_model(Spree.user_class, has_spree_role?: true, last_incomplete_spree_order: nil, generate_spree_api_key!: nil)
|
32
|
-
allow(controller).to receive_messages
|
32
|
+
allow(controller).to receive_messages try_spree_current_user: current_user
|
33
33
|
request.env['HTTP_REFERER'] = "not|a$url"
|
34
34
|
|
35
35
|
# Previously a URI::InvalidURIError exception was being thrown
|
@@ -6,7 +6,7 @@ describe Spree::TaxonsController, type: :controller do
|
|
6
6
|
it "should provide the current user to the searcher class" do
|
7
7
|
taxon = create(:taxon, permalink: "test")
|
8
8
|
user = mock_model(Spree.user_class, last_incomplete_spree_order: nil, spree_api_key: 'fake')
|
9
|
-
allow(controller).to receive_messages
|
9
|
+
allow(controller).to receive_messages try_spree_current_user: user
|
10
10
|
expect_any_instance_of(Spree::Config.searcher_class).to receive(:current_user=).with(user)
|
11
11
|
get :show, params: { id: taxon.permalink }
|
12
12
|
expect(response.status).to eq(200)
|
@@ -24,7 +24,7 @@ describe "Address", type: :feature, inaccessible: true do
|
|
24
24
|
let!(:canada) { create(:country, name: "Canada", states_required: true, iso: "CA") }
|
25
25
|
let!(:uk) { create(:country, name: "United Kingdom", states_required: true, iso: "GB") }
|
26
26
|
|
27
|
-
before {
|
27
|
+
before { stub_spree_preferences(default_country_iso: uk.iso) }
|
28
28
|
|
29
29
|
context "but has no state" do
|
30
30
|
it "shows the state input field" do
|
@@ -40,10 +40,10 @@ describe "Automatic promotions", type: :feature, js: true do
|
|
40
40
|
it "automatically applies the promotion once the order crosses the threshold" do
|
41
41
|
fill_in "order_line_items_attributes_0_quantity", with: 10
|
42
42
|
click_button "Update"
|
43
|
-
expect(page).to have_content("Promotion ($10 off when you spend more than $100) -$10.00")
|
43
|
+
expect(page).to have_content("Promotion ($10 off when you spend more than $100) -$10.00", normalize_ws: true)
|
44
44
|
fill_in "order_line_items_attributes_0_quantity", with: 1
|
45
45
|
click_button "Update"
|
46
|
-
expect(page).not_to have_content("Promotion ($10 off when you spend more than $100) -$10.00")
|
46
|
+
expect(page).not_to have_content("Promotion ($10 off when you spend more than $100) -$10.00", normalize_ws: true)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -14,7 +14,7 @@ describe 'taxons', type: :feature, caching: true do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "busts the cache when max_level_in_taxons_menu conf changes" do
|
17
|
-
|
17
|
+
stub_spree_preferences(max_level_in_taxons_menu: 5)
|
18
18
|
visit spree.root_path
|
19
19
|
expect(cache_writes.count).to eq(1)
|
20
20
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe "Checkout confirm page submission", type: :feature do
|
6
|
+
include_context 'checkout setup'
|
7
|
+
|
8
|
+
context "when the product from the order is not backorderable but has enough stock quantity" do
|
9
|
+
let(:user) { create(:user) }
|
10
|
+
|
11
|
+
let(:order) { Spree::TestingSupport::OrderWalkthrough.up_to(:payment) }
|
12
|
+
let(:order_product) { order.products.first }
|
13
|
+
let(:order_stock_item) { order_product.stock_items.first }
|
14
|
+
|
15
|
+
before do
|
16
|
+
order_stock_item.update! backorderable: false
|
17
|
+
order_stock_item.set_count_on_hand(1)
|
18
|
+
allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
|
19
|
+
allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
|
20
|
+
allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when there are not other backorderable stock locations' do
|
24
|
+
context 'when the customer is on the confirm page and the availabilty drops to zero' do
|
25
|
+
before do
|
26
|
+
visit spree.checkout_state_path(:confirm)
|
27
|
+
order_stock_item.set_count_on_hand(0)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'redirects to cart page and shows an unavailable product message' do
|
31
|
+
click_button "Place Order"
|
32
|
+
expect(page).to have_content "#{order_product.name} became unavailable"
|
33
|
+
expect(page).to have_current_path spree.cart_path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when there is another backorderable stock location' do
|
39
|
+
before do
|
40
|
+
create :stock_location, backorderable_default: true, default: false
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when the customer is on the confirm page and the availabilty drops to zero' do
|
44
|
+
before do
|
45
|
+
visit spree.checkout_state_path(:confirm)
|
46
|
+
order_stock_item.set_count_on_hand(0)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "redirects to the address checkout page and shows an availability changed message" do
|
50
|
+
click_button "Place Order"
|
51
|
+
error_message = "Quantity selected of #{order_product.name} is not available. Still, items may be available from another stock location, please try again."
|
52
|
+
expect(page).to have_content error_message
|
53
|
+
expect(page).to have_current_path spree.checkout_state_path(:address)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "can still complete the order using the backorderable stock location by restarting the checkout" do
|
57
|
+
click_button "Place Order"
|
58
|
+
expect(page).to have_current_path spree.checkout_state_path(:address)
|
59
|
+
click_button "Save and Continue"
|
60
|
+
expect(page).to have_current_path spree.checkout_state_path(:delivery)
|
61
|
+
click_button "Save and Continue"
|
62
|
+
expect(page).to have_current_path spree.checkout_state_path(:payment)
|
63
|
+
click_button "Save and Continue"
|
64
|
+
expect(page).to have_current_path spree.checkout_state_path(:confirm)
|
65
|
+
click_button "Place Order"
|
66
|
+
expect(page).to have_content 'Your order has been processed successfully'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -211,6 +211,26 @@ describe "Checkout", type: :feature, inaccessible: true do
|
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
214
|
+
context "when order has only a void payment" do
|
215
|
+
let(:order) { Spree::TestingSupport::OrderWalkthrough.up_to(:payment) }
|
216
|
+
|
217
|
+
before do
|
218
|
+
user = create(:user)
|
219
|
+
order.user = user
|
220
|
+
order.recalculate
|
221
|
+
|
222
|
+
allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
|
223
|
+
allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
|
224
|
+
end
|
225
|
+
|
226
|
+
it "does not allow successful order submission" do
|
227
|
+
visit spree.checkout_path
|
228
|
+
order.payments.first.update state: :void
|
229
|
+
click_button 'Place Order'
|
230
|
+
expect(page).to have_current_path spree.checkout_state_path(:payment)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
214
234
|
# Regression test for https://github.com/spree/spree/issues/2694 and https://github.com/spree/spree/issues/4117
|
215
235
|
context "doesn't allow bad credit card numbers" do
|
216
236
|
let!(:payment_method) { create(:credit_card_payment_method) }
|
@@ -338,30 +358,21 @@ describe "Checkout", type: :feature, inaccessible: true do
|
|
338
358
|
it "selects first source available and customer moves on" do
|
339
359
|
expect(find("#use_existing_card_yes")).to be_checked
|
340
360
|
|
341
|
-
|
342
|
-
click_on "Save and Continue"
|
343
|
-
}.not_to change { Spree::CreditCard.count }
|
344
|
-
|
361
|
+
click_on "Save and Continue"
|
345
362
|
click_on "Place Order"
|
346
363
|
expect(page).to have_current_path(spree.order_path(Spree::Order.last))
|
364
|
+
expect(page).to have_current_path(spree.order_path(Spree::Order.last))
|
365
|
+
expect(page).to have_content("Ending in #{credit_card.last_digits}")
|
347
366
|
end
|
348
367
|
|
349
368
|
it "allows user to enter a new source" do
|
350
369
|
choose "use_existing_card_no"
|
370
|
+
fill_in_credit_card
|
351
371
|
|
352
|
-
|
353
|
-
fill_in_with_force "Card Number", with: '4111 1111 1111 1111'
|
354
|
-
fill_in "card_expiry", with: '04 / 20'
|
355
|
-
fill_in "Card Code", with: '123'
|
356
|
-
|
357
|
-
expect {
|
358
|
-
click_on "Save and Continue"
|
359
|
-
}.to change { Spree::CreditCard.count }.by 1
|
360
|
-
|
361
|
-
expect(Spree::CreditCard.last.address).to be_present
|
362
|
-
|
372
|
+
click_on "Save and Continue"
|
363
373
|
click_on "Place Order"
|
364
374
|
expect(page).to have_current_path(spree.order_path(Spree::Order.last))
|
375
|
+
expect(page).to have_content('Ending in 1111')
|
365
376
|
end
|
366
377
|
end
|
367
378
|
|
@@ -498,7 +509,7 @@ describe "Checkout", type: :feature, inaccessible: true do
|
|
498
509
|
end
|
499
510
|
end
|
500
511
|
|
501
|
-
context "order has only payment step" do
|
512
|
+
context "order has only payment step", js: true do
|
502
513
|
before do
|
503
514
|
create(:credit_card_payment_method)
|
504
515
|
@old_checkout_flow = Spree::Order.checkout_flow
|
@@ -523,10 +534,7 @@ describe "Checkout", type: :feature, inaccessible: true do
|
|
523
534
|
expect(page).to have_current_path(spree.checkout_state_path('payment'))
|
524
535
|
|
525
536
|
choose "Credit Card"
|
526
|
-
|
527
|
-
fill_in "Card Number", with: '4111 1111 1111 1111'
|
528
|
-
fill_in "card_expiry", with: '04 / 20'
|
529
|
-
fill_in "Card Code", with: '123'
|
537
|
+
fill_in_credit_card
|
530
538
|
click_button "Save and Continue"
|
531
539
|
|
532
540
|
expect(current_path).to eq spree.checkout_state_path('confirm')
|
@@ -582,7 +590,7 @@ describe "Checkout", type: :feature, inaccessible: true do
|
|
582
590
|
end
|
583
591
|
|
584
592
|
it "displays a thank you message" do
|
585
|
-
expect(page).to have_content(I18n.t('spree.thank_you_for_your_order'))
|
593
|
+
expect(page).to have_content(I18n.t('spree.thank_you_for_your_order'), normalize_ws: true)
|
586
594
|
end
|
587
595
|
|
588
596
|
it "does not display a thank you message on that order future visits" do
|
@@ -657,16 +665,17 @@ describe "Checkout", type: :feature, inaccessible: true do
|
|
657
665
|
click_on "Save and Continue"
|
658
666
|
click_on "Save and Continue"
|
659
667
|
|
660
|
-
fill_in_credit_card
|
668
|
+
fill_in_credit_card
|
661
669
|
click_on "Save and Continue"
|
662
670
|
|
663
671
|
expect(page).to have_current_path("/checkout/confirm")
|
664
672
|
end
|
665
673
|
end
|
666
674
|
|
667
|
-
def fill_in_credit_card(number:)
|
668
|
-
fill_in "
|
669
|
-
|
675
|
+
def fill_in_credit_card(number: "4111 1111 1111 1111")
|
676
|
+
fill_in "Name on card", with: 'Mary Doe'
|
677
|
+
fill_in_with_force "Card Number", with: number
|
678
|
+
fill_in_with_force "Expiration", with: "12 / 24"
|
670
679
|
fill_in "Card Code", with: "123"
|
671
680
|
end
|
672
681
|
|
@@ -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,49 +34,89 @@ 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
|
-
|
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
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
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
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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'))
|
70
|
+
fill_in "order_coupon_code", with: "onetwo"
|
71
|
+
click_button "Apply Code"
|
72
|
+
expect(page).to have_content("Promotion (Onetwo) -$10.00", normalize_ws: true)
|
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", normalize_ws: true)
|
80
|
+
end
|
81
|
+
end
|
73
82
|
end
|
74
83
|
|
75
|
-
context
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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
|
80
120
|
end
|
81
121
|
end
|
82
122
|
end
|
@@ -90,22 +130,22 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
90
130
|
end
|
91
131
|
|
92
132
|
it "can enter a coupon code and receives success notification" do
|
93
|
-
fill_in "
|
94
|
-
click_button "
|
133
|
+
fill_in "coupon_code", with: "onetwo"
|
134
|
+
click_button "Apply Code"
|
95
135
|
expect(page).to have_content(I18n.t('spree.coupon_code_applied'))
|
96
136
|
end
|
97
137
|
|
98
138
|
it "can enter a promotion code with both upper and lower case letters" do
|
99
|
-
fill_in "
|
100
|
-
click_button "
|
139
|
+
fill_in "coupon_code", with: "ONETwO"
|
140
|
+
click_button "Apply Code"
|
101
141
|
expect(page).to have_content(I18n.t('spree.coupon_code_applied'))
|
102
142
|
end
|
103
143
|
|
104
144
|
it "informs the user about a coupon code which has exceeded its usage" do
|
105
145
|
expect_any_instance_of(Spree::Promotion).to receive(:usage_limit_exceeded?).and_return(true)
|
106
146
|
|
107
|
-
fill_in "
|
108
|
-
click_button "
|
147
|
+
fill_in "coupon_code", with: "onetwo"
|
148
|
+
click_button "Apply Code"
|
109
149
|
expect(page).to have_content(I18n.t('spree.coupon_code_max_usage'))
|
110
150
|
end
|
111
151
|
|
@@ -120,8 +160,8 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
120
160
|
specify do
|
121
161
|
visit spree.cart_path
|
122
162
|
|
123
|
-
fill_in "
|
124
|
-
click_button "
|
163
|
+
fill_in "coupon_code", with: "onetwo"
|
164
|
+
click_button "Apply Code"
|
125
165
|
expect(page).to have_content(I18n.t(:item_total_less_than_or_equal, scope: [:spree, :eligibility_errors, :messages], amount: "$100.00"))
|
126
166
|
end
|
127
167
|
end
|
@@ -130,8 +170,8 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
130
170
|
promotion.expires_at = Date.today.beginning_of_week
|
131
171
|
promotion.starts_at = Date.today.beginning_of_week.advance(day: 3)
|
132
172
|
promotion.save!
|
133
|
-
fill_in "
|
134
|
-
click_button "
|
173
|
+
fill_in "coupon_code", with: "onetwo"
|
174
|
+
click_button "Apply Code"
|
135
175
|
expect(page).to have_content(I18n.t('spree.coupon_code_expired'))
|
136
176
|
end
|
137
177
|
|
@@ -151,8 +191,8 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
151
191
|
click_button "add-to-cart-button"
|
152
192
|
|
153
193
|
visit spree.cart_path
|
154
|
-
fill_in "
|
155
|
-
click_button "
|
194
|
+
fill_in "coupon_code", with: "onetwo"
|
195
|
+
click_button "Apply Code"
|
156
196
|
|
157
197
|
fill_in "order_line_items_attributes_0_quantity", with: 2
|
158
198
|
fill_in "order_line_items_attributes_1_quantity", with: 2
|
@@ -162,7 +202,7 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
162
202
|
# 20% of $40 = 8
|
163
203
|
# 20% of $20 = 4
|
164
204
|
# Therefore: promotion discount amount is $12.
|
165
|
-
expect(page).to have_content("Promotion (Onetwo) -$12.00")
|
205
|
+
expect(page).to have_content("Promotion (Onetwo) -$12.00", normalize_ws: true)
|
166
206
|
end
|
167
207
|
|
168
208
|
within '.cart-total' do
|
@@ -197,11 +237,11 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
197
237
|
expect(page).to have_content("$30.00")
|
198
238
|
end
|
199
239
|
|
200
|
-
fill_in "
|
201
|
-
click_button "
|
240
|
+
fill_in "coupon_code", with: "onetwo"
|
241
|
+
click_button "Apply Code"
|
202
242
|
|
203
243
|
within '#cart_adjustments' do
|
204
|
-
expect(page).to have_content("Promotion (Onetwo) -$30.00")
|
244
|
+
expect(page).to have_content("Promotion (Onetwo) -$30.00", normalize_ws: true)
|
205
245
|
end
|
206
246
|
|
207
247
|
within '.cart-total' do
|
@@ -213,7 +253,7 @@ describe "Coupon code promotions", type: :feature, js: true do
|
|
213
253
|
click_button "Update"
|
214
254
|
|
215
255
|
within '#cart_adjustments' do
|
216
|
-
expect(page).to have_content("Promotion (Onetwo) -$60.00")
|
256
|
+
expect(page).to have_content("Promotion (Onetwo) -$60.00", normalize_ws: true)
|
217
257
|
end
|
218
258
|
|
219
259
|
within '.cart-total' do
|