solidus_frontend 2.6.5 → 2.9.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_frontend might be problematic. Click here for more details.

Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -5
  3. data/app/assets/images/favicon.ico +0 -0
  4. data/app/assets/javascripts/spree/frontend/checkout/coupon-code.js +2 -1
  5. data/app/assets/stylesheets/spree/frontend/screen.css.scss +39 -1
  6. data/app/controllers/spree/checkout_controller.rb +61 -3
  7. data/app/controllers/spree/coupon_codes_controller.rb +35 -0
  8. data/app/controllers/spree/locale_controller.rb +1 -1
  9. data/app/controllers/spree/orders_controller.rb +27 -12
  10. data/app/controllers/spree/store_controller.rb +0 -18
  11. data/app/controllers/spree/taxons_controller.rb +6 -3
  12. data/app/views/spree/checkout/_coupon_code.html.erb +12 -0
  13. data/app/views/spree/checkout/_delivery.html.erb +6 -2
  14. data/app/views/spree/checkout/_payment.html.erb +0 -10
  15. data/app/views/spree/checkout/_summary.html.erb +4 -0
  16. data/app/views/spree/checkout/payment/_gateway.html.erb +6 -5
  17. data/app/views/spree/coupon_codes/new.html.erb +6 -0
  18. data/app/views/spree/orders/_form.html.erb +1 -1
  19. data/app/views/spree/orders/_line_item.html.erb +3 -5
  20. data/app/views/spree/orders/edit.html.erb +5 -6
  21. data/app/views/spree/products/_image.html.erb +4 -1
  22. data/app/views/spree/products/_thumbnails.html.erb +10 -8
  23. data/app/views/spree/shared/_image.html.erb +4 -4
  24. data/app/views/spree/shared/_locale_selector.html.erb +1 -1
  25. data/app/views/spree/shared/_order_details.html.erb +3 -5
  26. data/app/views/spree/shared/_products.html.erb +1 -1
  27. data/config/routes.rb +1 -0
  28. data/lib/spree/frontend.rb +1 -1
  29. data/solidus_frontend.gemspec +1 -1
  30. data/spec/controllers/spree/checkout_controller_spec.rb +109 -9
  31. data/spec/controllers/spree/checkout_controller_with_views_spec.rb +1 -1
  32. data/spec/controllers/spree/home_controller_spec.rb +1 -1
  33. data/spec/controllers/spree/orders_controller_ability_spec.rb +11 -30
  34. data/spec/controllers/spree/orders_controller_spec.rb +54 -3
  35. data/spec/controllers/spree/products_controller_spec.rb +3 -3
  36. data/spec/controllers/spree/taxons_controller_spec.rb +1 -1
  37. data/spec/features/address_spec.rb +1 -1
  38. data/spec/features/automatic_promotion_adjustments_spec.rb +2 -2
  39. data/spec/features/caching/taxons_spec.rb +1 -1
  40. data/spec/features/checkout_confirm_insufficient_stock_spec.rb +71 -0
  41. data/spec/features/checkout_spec.rb +34 -25
  42. data/spec/features/coupon_code_spec.rb +96 -56
  43. data/spec/features/currency_spec.rb +1 -1
  44. data/spec/features/first_order_promotion_spec.rb +59 -0
  45. data/spec/features/free_shipping_promotions_spec.rb +2 -2
  46. data/spec/features/products_spec.rb +8 -8
  47. data/spec/features/promotion_code_invalidation_spec.rb +2 -2
  48. data/spec/features/quantity_promotions_spec.rb +9 -9
  49. data/spec/spec_helper.rb +1 -1
  50. metadata +14 -9
  51. 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 :edit' do
30
- expect(controller).to receive(:authorize!).with(:edit, order, token)
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 :edit' do
41
- expect(controller).to receive(:authorize!).with(:edit, order, token)
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 :edit' do
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(:edit, order, token)
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 :edit' do
65
- expect(controller).to receive(:authorize!).with(:edit, order, token)
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(:edit, specified_order, token)
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 :check_authorization
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 :check_authorization
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(:check_authorization)
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 spree_current_user: mock_model(Spree.user_class, has_spree_role?: true, last_incomplete_spree_order: nil, spree_api_key: 'fake')
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 spree_current_user: user
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 spree_current_user: current_user
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 spree_current_user: user
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 { Spree::Config[:default_country_iso] = uk.iso }
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
- Spree::Config[:max_level_in_taxons_menu] = 5
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
- expect {
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
- fill_in "Name on card", with: 'Spree Commerce'
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
- fill_in "Name on card", with: 'Spree Commerce'
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(number: "4111 1111 1111 1111")
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 "Card Number", with: number
669
- fill_in "Expiration", with: "12 / 24"
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 as guest without registration" do
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
- 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
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
- 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
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
- 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 "Save and Continue"
69
- expect(page).to have_content(I18n.t('spree.coupon_code_not_found'))
70
- fill_in "order_coupon_code", with: "onetwo"
71
- click_button "Save and Continue"
72
- expect(page).to have_content("Promotion (Onetwo) -$10.00")
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 "with a promotion" do
76
- it "applies a promotion to an order" do
77
- fill_in "order_coupon_code", with: "onetwo"
78
- click_button "Save and Continue"
79
- expect(page).to have_content("Promotion (Onetwo) -$10.00")
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 "order_coupon_code", with: "onetwo"
94
- click_button "Update"
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 "order_coupon_code", with: "ONETwO"
100
- click_button "Update"
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 "order_coupon_code", with: "onetwo"
108
- click_button "Update"
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 "order_coupon_code", with: "onetwo"
124
- click_button "Update"
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 "order_coupon_code", with: "onetwo"
134
- click_button "Update"
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 "order_coupon_code", with: "onetwo"
155
- click_button "Update"
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 "order_coupon_code", with: "onetwo"
201
- click_button "Update"
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