spree_frontend 3.2.1 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/spree_frontend.gemspec +2 -3
  3. metadata +10 -86
  4. data/spec/controllers/controller_extension_spec.rb +0 -126
  5. data/spec/controllers/controller_helpers_spec.rb +0 -122
  6. data/spec/controllers/spree/checkout_controller_spec.rb +0 -515
  7. data/spec/controllers/spree/checkout_controller_with_views_spec.rb +0 -36
  8. data/spec/controllers/spree/content_controller_spec.rb +0 -12
  9. data/spec/controllers/spree/current_order_tracking_spec.rb +0 -44
  10. data/spec/controllers/spree/home_controller_spec.rb +0 -47
  11. data/spec/controllers/spree/orders_controller_ability_spec.rb +0 -96
  12. data/spec/controllers/spree/orders_controller_spec.rb +0 -134
  13. data/spec/controllers/spree/orders_controller_transitions_spec.rb +0 -31
  14. data/spec/controllers/spree/products_controller_spec.rb +0 -87
  15. data/spec/controllers/spree/taxons_controller_spec.rb +0 -12
  16. data/spec/features/address_spec.rb +0 -93
  17. data/spec/features/automatic_promotion_adjustments_spec.rb +0 -47
  18. data/spec/features/caching/products_spec.rb +0 -59
  19. data/spec/features/caching/taxons_spec.rb +0 -22
  20. data/spec/features/cart_spec.rb +0 -132
  21. data/spec/features/checkout_spec.rb +0 -572
  22. data/spec/features/checkout_unshippable_spec.rb +0 -34
  23. data/spec/features/coupon_code_spec.rb +0 -88
  24. data/spec/features/currency_spec.rb +0 -18
  25. data/spec/features/delivery_spec.rb +0 -64
  26. data/spec/features/free_shipping_promotions_spec.rb +0 -59
  27. data/spec/features/locale_spec.rb +0 -60
  28. data/spec/features/microdata_spec.rb +0 -0
  29. data/spec/features/order_spec.rb +0 -107
  30. data/spec/features/page_promotions_spec.rb +0 -36
  31. data/spec/features/products_spec.rb +0 -334
  32. data/spec/features/taxons_spec.rb +0 -147
  33. data/spec/features/template_rendering_spec.rb +0 -19
  34. data/spec/fixtures/thinking-cat.jpg +0 -0
  35. data/spec/helpers/frontend_helper_spec.rb +0 -57
  36. data/spec/helpers/taxons_helper_spec.rb +0 -17
  37. data/spec/spec_helper.rb +0 -126
  38. data/spec/support/shared_contexts/checkout_setup.rb +0 -10
  39. data/spec/support/shared_contexts/custom_products.rb +0 -25
  40. data/spec/support/shared_contexts/product_prototypes.rb +0 -30
  41. data/spec/views/spree/checkout/_summary_spec.rb +0 -11
@@ -1,12 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Spree::TaxonsController, type: :controller do
4
- it "should provide the current user to the searcher class" do
5
- taxon = create(:taxon, permalink: "test")
6
- user = mock_model(Spree.user_class, last_incomplete_spree_order: nil, spree_api_key: 'fake')
7
- allow(controller).to receive_messages spree_current_user: user
8
- expect_any_instance_of(Spree::Config.searcher_class).to receive(:current_user=).with(user)
9
- spree_get :show, id: taxon.permalink
10
- expect(response.status).to eq(200)
11
- end
12
- end
@@ -1,93 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Address", type: :feature, inaccessible: true do
4
- let!(:product) { create(:product, name: "RoR Mug") }
5
- let!(:order) { create(:order_with_totals, state: 'cart') }
6
-
7
- stub_authorization!
8
-
9
- after do
10
- Capybara.ignore_hidden_elements = true
11
- end
12
-
13
- before do
14
- Capybara.ignore_hidden_elements = false
15
-
16
- visit spree.root_path
17
-
18
- click_link "RoR Mug"
19
- click_button "add-to-cart-button"
20
-
21
- address = "order_bill_address_attributes"
22
- @country_css = "#{address}_country_id"
23
- @state_select_css = "##{address}_state_id"
24
- @state_name_css = "##{address}_state_name"
25
- end
26
-
27
- context "country requires state", js: true, focus: true do
28
- let!(:canada) { create(:country, name: "Canada", states_required: true, iso: "CA") }
29
- let!(:uk) { create(:country, name: "United Kingdom", states_required: true, iso: "UK") }
30
-
31
- before { Spree::Config[:default_country_id] = uk.id }
32
-
33
- context "but has no state" do
34
- it "shows the state input field" do
35
- click_button "Checkout"
36
-
37
- select canada.name, from: @country_css
38
- expect(page).to have_selector(@state_select_css, visible: false)
39
- expect(page).to have_selector(@state_name_css, visible: true)
40
- expect(find(@state_name_css)['class']).not_to match(/hidden/)
41
- expect(find(@state_name_css)['class']).to match(/required/)
42
- expect(find(@state_select_css)['class']).not_to match(/required/)
43
- expect(page).not_to have_selector("input#{@state_name_css}[disabled]")
44
- end
45
- end
46
-
47
- context "and has state" do
48
- before { create(:state, name: "Ontario", country: canada) }
49
-
50
- it "shows the state collection selection" do
51
- click_button "Checkout"
52
-
53
- select canada.name, from: @country_css
54
- expect(page).to have_selector(@state_select_css, visible: true)
55
- expect(page).to have_selector(@state_name_css, visible: false)
56
- expect(find(@state_select_css)['class']).to match(/required/)
57
- expect(find(@state_select_css)['class']).not_to match(/hidden/)
58
- expect(find(@state_name_css)['class']).not_to match(/required/)
59
- end
60
- end
61
-
62
- context "user changes to country without states required" do
63
- let!(:france) { create(:country, name: "France", states_required: false, iso: "FRA") }
64
-
65
- it "clears the state name" do
66
- skip "This is failing on the CI server, but not when you run the tests manually... It also does not fail locally on a machine."
67
- click_button "Checkout"
68
- select canada.name, from: @country_css
69
- page.find(@state_name_css).set("Toscana")
70
-
71
- select france.name, from: @country_css
72
- expect(page.find(@state_name_css)).to have_content('')
73
- until page.evaluate_script("$.active").to_i == 0
74
- expect(find(@state_name_css)['class']).not_to match(/hidden/)
75
- expect(find(@state_name_css)['class']).not_to match(/required/)
76
- expect(find(@state_select_css)['class']).not_to match(/required/)
77
- end
78
- end
79
- end
80
- end
81
-
82
- context "country does not require state", js: true do
83
- let!(:france) { create(:country, name: "France", states_required: false, iso: "FRA") }
84
-
85
- it "shows a disabled state input field" do
86
- click_button "Checkout"
87
-
88
- select france.name, from: @country_css
89
- expect(page).to have_selector(@state_select_css, visible: false)
90
- expect(page).to have_selector(@state_name_css, visible: false)
91
- end
92
- end
93
- end
@@ -1,47 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Automatic promotions", type: :feature, js: true do
4
- let!(:country) { create(:country, name: "United States of America", states_required: true) }
5
- let!(:state) { create(:state, name: "Alabama", country: country) }
6
- let!(:zone) { create(:zone) }
7
- let!(:shipping_method) { create(:shipping_method) }
8
- let!(:payment_method) { create(:check_payment_method) }
9
- let!(:product) { create(:product, name: "RoR Mug", price: 20) }
10
-
11
- let!(:promotion) do
12
- promotion = Spree::Promotion.create!(name: "$10 off when you spend more than $100")
13
-
14
- calculator = Spree::Calculator::FlatRate.new
15
- calculator.preferred_amount = 10
16
-
17
- rule = Spree::Promotion::Rules::ItemTotal.create
18
- rule.preferred_amount_min = 100
19
- rule.save
20
-
21
- promotion.rules << rule
22
-
23
- action = Spree::Promotion::Actions::CreateAdjustment.create
24
- action.calculator = calculator
25
- action.save
26
-
27
- promotion.actions << action
28
- end
29
-
30
- context "on the cart page" do
31
-
32
- before do
33
- visit spree.root_path
34
- click_link product.name
35
- click_button "add-to-cart-button"
36
- end
37
-
38
- it "automatically applies the promotion once the order crosses the threshold" do
39
- fill_in "order_line_items_attributes_0_quantity", with: 10
40
- click_button "Update"
41
- expect(page).to have_content("Promotion ($10 off when you spend more than $100) -$10.00")
42
- fill_in "order_line_items_attributes_0_quantity", with: 1
43
- click_button "Update"
44
- expect(page).not_to have_content("Promotion ($10 off when you spend more than $100) -$10.00")
45
- end
46
- end
47
- end
@@ -1,59 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'products', type: :feature, caching: true do
4
- let!(:product) { create(:product) }
5
- let!(:product2) { create(:product) }
6
- let!(:taxonomy) { create(:taxonomy) }
7
- let!(:taxon) { create(:taxon, taxonomy: taxonomy) }
8
-
9
- before { Timecop.scale(1000) }
10
-
11
- after { Timecop.return }
12
-
13
- before do
14
- product2.update_column(:updated_at, 1.day.ago)
15
- # warm up the cache
16
- visit spree.root_path
17
- assert_written_to_cache("views/en/USD/spree/products/all--#{product.updated_at.utc.to_s(:number)}")
18
- assert_written_to_cache("views/en/USD/spree/products/#{product.id}-#{product.updated_at.utc.to_s(:number)}")
19
- assert_written_to_cache("views/en/spree/taxonomies/#{taxonomy.id}")
20
- assert_written_to_cache("views/en/taxons/#{taxon.updated_at.utc.to_i}")
21
-
22
- clear_cache_events
23
- end
24
-
25
- it "reads from cache upon a second viewing" do
26
- visit spree.root_path
27
- expect(cache_writes.count).to eq(0)
28
- end
29
-
30
- it "busts the cache when a product is updated" do
31
- product.update_column(:updated_at, 1.day.from_now)
32
- visit spree.root_path
33
- assert_written_to_cache("views/en/USD/spree/products/all--#{product.updated_at.utc.to_s(:number)}")
34
- assert_written_to_cache("views/en/USD/spree/products/#{product.id}-#{product.updated_at.utc.to_s(:number)}")
35
- expect(cache_writes.count).to eq(2)
36
- end
37
-
38
- it "busts the cache when all products are deleted" do
39
- product.destroy
40
- product2.destroy
41
- visit spree.root_path
42
- assert_written_to_cache("views/en/USD/spree/products/all--#{Date.today.to_s(:number)}-0")
43
- expect(cache_writes.count).to eq(1)
44
- end
45
-
46
- it "busts the cache when the newest product is deleted" do
47
- product.destroy
48
- visit spree.root_path
49
- assert_written_to_cache("views/en/USD/spree/products/all--#{product2.updated_at.utc.to_s(:number)}")
50
- expect(cache_writes.count).to eq(1)
51
- end
52
-
53
- it "busts the cache when an older product is deleted" do
54
- product2.destroy
55
- visit spree.root_path
56
- assert_written_to_cache("views/en/USD/spree/products/all--#{product.updated_at.utc.to_s(:number)}")
57
- expect(cache_writes.count).to eq(1)
58
- end
59
- end
@@ -1,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'taxons', type: :feature, caching: true do
4
- let!(:taxonomy) { create(:taxonomy) }
5
- let!(:taxon) { create(:taxon, taxonomy: taxonomy) }
6
-
7
- before do
8
- # warm up the cache
9
- visit spree.root_path
10
- assert_written_to_cache("views/en/spree/taxonomies/#{taxonomy.id}")
11
- assert_written_to_cache("views/en/taxons/#{taxon.updated_at.utc.to_i}")
12
-
13
- clear_cache_events
14
- end
15
-
16
- it "busts the cache when max_level_in_taxons_menu conf changes" do
17
- Spree::Config[:max_level_in_taxons_menu] = 5
18
- visit spree.root_path
19
- assert_written_to_cache("views/en/spree/taxonomies/#{taxonomy.id}")
20
- expect(cache_writes.count).to eq(1)
21
- end
22
- end
@@ -1,132 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Cart", type: :feature, inaccessible: true do
4
- before { Timecop.scale(100) }
5
-
6
- after { Timecop.return }
7
-
8
- let!(:variant) { create(:variant) }
9
- let!(:product) { variant.product }
10
-
11
- def add_mug_to_cart
12
- visit spree.root_path
13
- click_link product.name
14
- click_button "add-to-cart-button"
15
- end
16
-
17
- it "shows cart icon on non-cart pages" do
18
- visit spree.root_path
19
- expect(page).to have_selector("li#link-to-cart a", visible: true)
20
- end
21
-
22
- it "prevents double clicking the remove button on cart", js: true do
23
- add_mug_to_cart
24
- # prevent form submit to verify button is disabled
25
- page.execute_script("$('#update-cart').submit(function(){return false;})")
26
-
27
- expect(page).not_to have_selector('button#update-button[disabled]')
28
- page.find(:css, '.delete span').click
29
- expect(page).to have_selector('button#update-button[disabled]')
30
- end
31
-
32
- # Regression test for #2006
33
- it "does not error out with a 404 when GET'ing to /orders/populate" do
34
- visit '/orders/populate'
35
- within(".alert-error") do
36
- expect(page).to have_content(Spree.t(:populate_get_error))
37
- end
38
- end
39
-
40
- it 'allows you to remove an item from the cart', js: true do
41
- add_mug_to_cart
42
- line_item = Spree::LineItem.first!
43
- within("#line_items") do
44
- click_link "delete_line_item_#{line_item.id}"
45
- end
46
-
47
- expect(page).to_not have_content("Line items quantity must be an integer")
48
- expect(page).to_not have_content(product.name)
49
- expect(page).to have_content("Your cart is empty")
50
-
51
- within "#link-to-cart" do
52
- expect(page).to have_content("Empty")
53
- end
54
- end
55
-
56
- it 'allows you to empty the cart', js: true do
57
- add_mug_to_cart
58
- expect(page).to have_content(product.name)
59
- click_on "Empty Cart"
60
- expect(page).to have_content("Your cart is empty")
61
-
62
- within "#link-to-cart" do
63
- expect(page).to have_content("Empty")
64
- end
65
- end
66
-
67
- # regression for #2276
68
- context "product contains variants but no option values" do
69
- before { variant.option_values.destroy_all }
70
-
71
- it "still adds product to cart", inaccessible: true do
72
- add_mug_to_cart
73
- visit spree.cart_path
74
- expect(page).to have_content(product.name)
75
- end
76
- end
77
-
78
- it "should have a surrounding element with data-hook='cart_container'" do
79
- visit spree.cart_path
80
- expect(page).to have_selector("div[data-hook='cart_container']")
81
- end
82
-
83
- describe 'add promotion coupon on cart page', js: true do
84
- let!(:promotion) { Spree::Promotion.create(name: 'Huhuhu', code: 'huhu') }
85
- let!(:calculator) { Spree::Calculator::FlatPercentItemTotal.create(preferred_flat_percent: '10') }
86
- let!(:action) { Spree::Promotion::Actions::CreateItemAdjustments.create(calculator: calculator) }
87
-
88
- before do
89
- promotion.actions << action
90
- add_mug_to_cart
91
- expect(current_path).to eql(spree.cart_path)
92
- end
93
-
94
- def apply_coupon(code)
95
- fill_in 'Coupon Code', with: code
96
- click_on 'Update'
97
- end
98
-
99
- context 'valid coupon' do
100
- before { apply_coupon(promotion.code) }
101
-
102
- context 'for the first time' do
103
- it 'makes sure payment reflects order total with discounts' do
104
- expect(page).to have_content(promotion.name)
105
- end
106
- end
107
-
108
- context 'same coupon for the second time' do
109
- before { apply_coupon(promotion.code) }
110
- it 'should reflect an error that coupon already applied' do
111
- apply_coupon(promotion.code)
112
- expect(page).to have_content(Spree.t(:coupon_code_already_applied))
113
- expect(page).to have_content(promotion.name)
114
- end
115
- end
116
- end
117
-
118
- context 'invalid coupon' do
119
- it 'doesnt create a payment record' do
120
- apply_coupon('invalid')
121
- expect(page).to have_content(Spree.t(:coupon_code_not_found))
122
- end
123
- end
124
-
125
- context "doesn't fill in coupon code input" do
126
- it 'advances just fine' do
127
- click_on 'Update'
128
- expect(current_path).to match(spree.cart_path)
129
- end
130
- end
131
- end
132
- end
@@ -1,572 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Checkout', type: :feature, inaccessible: true, js: true do
4
- include_context 'checkout setup'
5
-
6
- let(:country) { create(:country, name: 'United States of America', iso_name: 'UNITED STATES') }
7
- let(:state) { create(:state, name: 'Alabama', abbr: 'AL', country: country) }
8
-
9
- context "visitor makes checkout as guest without registration" do
10
- before(:each) do
11
- stock_location.stock_items.update_all(count_on_hand: 1)
12
- end
13
-
14
- context 'defaults to use billing address' do
15
- before do
16
- add_mug_to_cart
17
- Spree::Order.last.update_column(:email, 'test@example.com')
18
- click_button 'Checkout'
19
- end
20
-
21
- it 'should default checkbox to checked' do
22
- expect(find('input#order_use_billing')).to be_checked
23
- end
24
-
25
- it 'should remain checked when used and visitor steps back to address step' do
26
- fill_in_address
27
- expect(find('input#order_use_billing')).to be_checked
28
- end
29
- end
30
-
31
- # Regression test for #4079
32
- context 'persists state when on address page' do
33
- before do
34
- add_mug_to_cart
35
- click_button 'Checkout'
36
- end
37
-
38
- specify do
39
- expect(Spree::Order.count).to eq 1
40
- expect(Spree::Order.last.state).to eq 'address'
41
- end
42
- end
43
-
44
- # Regression test for #1596
45
- context 'full checkout' do
46
- before do
47
- shipping_method.calculator.update!(preferred_amount: 10)
48
- mug.shipping_category = shipping_method.shipping_categories.first
49
- mug.save!
50
- end
51
-
52
- it 'does not break the per-item shipping method calculator', js: true do
53
- add_mug_to_cart
54
- click_button 'Checkout'
55
-
56
- fill_in 'order_email', with: 'test@example.com'
57
- click_on 'Continue'
58
- fill_in_address
59
-
60
- click_button 'Save and Continue'
61
- expect(page).to_not have_content("undefined method `promotion'")
62
- click_button 'Save and Continue'
63
- expect(page).to have_content('Shipping total: $10.00')
64
- end
65
- end
66
-
67
- # Regression test for #4306
68
- context 'free shipping' do
69
- before do
70
- add_mug_to_cart
71
- click_button 'Checkout'
72
- fill_in 'order_email', with: 'test@example.com'
73
- click_on 'Continue'
74
- end
75
-
76
- it "should not show 'Free Shipping' when there are no shipments" do
77
- within('#checkout-summary') do
78
- expect(page).to_not have_content('Free Shipping')
79
- end
80
- end
81
- end
82
-
83
- # Regression test for #4190
84
- it 'updates state_lock_version on form submission', js: true do
85
- add_mug_to_cart
86
- click_button "Checkout"
87
-
88
- expect(find('input#order_state_lock_version', visible: false).value).to eq '0'
89
-
90
- fill_in 'order_email', with: 'test@example.com'
91
- fill_in_address
92
- click_button 'Save and Continue'
93
-
94
- expect(find('input#order_state_lock_version', visible: false).value).to eq '1'
95
- end
96
- end
97
-
98
- # Regression test for #2694 and #4117
99
- context "doesn't allow bad credit card numbers" do
100
- before(:each) do
101
- order = OrderWalkthrough.up_to(:payment)
102
- allow(order).to receive_messages confirmation_required?: true
103
- allow(order).to receive_messages(available_payment_methods: [create(:credit_card_payment_method)])
104
-
105
- user = create(:user)
106
- order.user = user
107
- order.update_with_updater!
108
-
109
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
110
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
111
- end
112
-
113
- it 'redirects to payment page', inaccessible: true, js: true do
114
- visit spree.checkout_state_path(:payment)
115
- click_button 'Save and Continue'
116
- choose 'Credit Card'
117
- fill_in 'Card Number', with: '123'
118
- fill_in 'card_expiry', with: '04 / 20'
119
- fill_in 'Card Code', with: '123'
120
- click_button 'Save and Continue'
121
- click_button 'Place Order'
122
- expect(page).to have_content('Bogus Gateway: Forced failure')
123
- expect(page.current_url).to include('/checkout/payment')
124
- end
125
- end
126
-
127
- # regression test for #3945
128
- context 'when Spree::Config[:always_include_confirm_step] is true' do
129
- before do
130
- Spree::Config[:always_include_confirm_step] = true
131
- end
132
-
133
- it 'displays confirmation step', js: true do
134
- add_mug_to_cart
135
- click_button 'Checkout'
136
-
137
- fill_in 'order_email', with: 'test@example.com'
138
- click_on 'Continue'
139
- fill_in_address
140
-
141
- click_button 'Save and Continue'
142
- click_button 'Save and Continue'
143
- click_button 'Save and Continue'
144
-
145
- continue_button = find('#checkout .btn-success')
146
- expect(continue_button.value).to eq 'Place Order'
147
- end
148
- end
149
-
150
- context 'and likes to double click buttons' do
151
- let!(:user) { create(:user) }
152
-
153
- let!(:order) do
154
- order = OrderWalkthrough.up_to(:payment)
155
- allow(order).to receive_messages confirmation_required?: true
156
-
157
- order.reload
158
- order.user = user
159
- order.update_with_updater!
160
- order
161
- end
162
-
163
- before(:each) do
164
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
165
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
166
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(skip_state_validation?: true)
167
- end
168
-
169
- it 'prevents double clicking the payment button on checkout', js: true do
170
- visit spree.checkout_state_path(:payment)
171
-
172
- # prevent form submit to verify button is disabled
173
- page.execute_script("$('#checkout_form_payment').submit(function(){return false;})")
174
-
175
- expect(page).to_not have_selector('input.btn.disabled')
176
- click_button 'Save and Continue'
177
- expect(page).to have_selector('input.btn.disabled')
178
- end
179
-
180
- it 'prevents double clicking the confirm button on checkout', js: true do
181
- order.payments << create(:payment, amount: order.amount)
182
- visit spree.checkout_state_path(:confirm)
183
-
184
- # prevent form submit to verify button is disabled
185
- page.execute_script("$('#checkout_form_confirm').submit(function(){return false;})")
186
-
187
- expect(page).to_not have_selector('input.btn.disabled')
188
- click_button 'Place Order'
189
- expect(page).to have_selector('input.btn.disabled')
190
- end
191
- end
192
-
193
- context 'when several payment methods are available', js: true do
194
- let(:credit_cart_payment) { create(:credit_card_payment_method) }
195
- let(:check_payment) { create(:check_payment_method) }
196
-
197
- after do
198
- Capybara.ignore_hidden_elements = true
199
- end
200
-
201
- before do
202
- Capybara.ignore_hidden_elements = false
203
- order = OrderWalkthrough.up_to(:payment)
204
- allow(order).to receive_messages(available_payment_methods: [check_payment, credit_cart_payment])
205
- order.user = create(:user)
206
- order.update_with_updater!
207
-
208
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
209
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: order.user)
210
-
211
- visit spree.checkout_state_path(:payment)
212
- end
213
-
214
- it 'the first payment method should be selected' do
215
- payment_method_css = '#order_payments_attributes__payment_method_id_'
216
- expect(find("#{payment_method_css}#{check_payment.id}")).to be_checked
217
- expect(find("#{payment_method_css}#{credit_cart_payment.id}")).not_to be_checked
218
- end
219
-
220
- it 'the fields for the other payment methods should be hidden' do
221
- payment_method_css = '#payment_method_'
222
- expect(find("#{payment_method_css}#{check_payment.id}")).to be_visible
223
- expect(find("#{payment_method_css}#{credit_cart_payment.id}")).not_to be_visible
224
- end
225
- end
226
-
227
- context 'user has payment sources', js: true do
228
- let(:bogus) { create(:credit_card_payment_method) }
229
- let(:user) { create(:user) }
230
-
231
- let!(:credit_card) do
232
- create(:credit_card, user_id: user.id, payment_method: bogus, gateway_customer_profile_id: 'BGS-WEFWF')
233
- end
234
-
235
- before do
236
- order = OrderWalkthrough.up_to(:payment)
237
- allow(order).to receive_messages(available_payment_methods: [bogus])
238
-
239
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
240
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
241
- allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
242
-
243
- visit spree.checkout_state_path(:payment)
244
- end
245
-
246
- it 'selects first source available and customer moves on' do
247
- expect(find('#use_existing_card_yes')).to be_checked
248
-
249
- expect { click_on 'Save and Continue' }.not_to change { Spree::CreditCard.count }
250
-
251
- click_on 'Place Order'
252
- expect(current_path).to match(spree.order_path(Spree::Order.last))
253
- end
254
-
255
- it 'allows user to enter a new source' do
256
- choose 'use_existing_card_no'
257
-
258
- fill_in 'Name on card', with: 'Spree Commerce'
259
- fill_in 'Card Number', with: '4111111111111111'
260
- fill_in 'card_expiry', with: '04 / 20'
261
- fill_in 'Card Code', with: '123'
262
-
263
- expect { click_on 'Save and Continue' }.to change { Spree::CreditCard.count }.by 1
264
-
265
- click_on 'Place Order'
266
- expect(current_path).to match(spree.order_path(Spree::Order.last))
267
- end
268
- end
269
-
270
- # regression for #2921
271
- context 'goes back from payment to add another item', js: true do
272
- let!(:bag) { create(:product, name: 'RoR Bag') }
273
-
274
- it 'transit nicely through checkout steps again' do
275
- add_mug_to_cart
276
- click_on 'Checkout'
277
- fill_in 'order_email', with: 'test@example.com'
278
- click_on 'Continue'
279
- fill_in_address
280
- click_on 'Save and Continue'
281
- click_on 'Save and Continue'
282
- expect(current_path).to eql(spree.checkout_state_path('payment'))
283
-
284
- visit spree.root_path
285
- click_link bag.name
286
- click_button 'add-to-cart-button'
287
-
288
- click_on 'Checkout'
289
- click_on 'Save and Continue'
290
- click_on 'Save and Continue'
291
- click_on 'Save and Continue'
292
-
293
- expect(current_path).to match(spree.order_path(Spree::Order.last))
294
- end
295
- end
296
-
297
- context 'from payment step customer goes back to cart', js: true do
298
- before do
299
- add_mug_to_cart
300
- click_on 'Checkout'
301
- fill_in 'order_email', with: 'test@example.com'
302
- click_on 'Continue'
303
- fill_in_address
304
- click_on 'Save and Continue'
305
- click_on 'Save and Continue'
306
- expect(current_path).to eql(spree.checkout_state_path('payment'))
307
- end
308
-
309
- context 'and updates line item quantity and try to reach payment page' do
310
- before do
311
- visit spree.cart_path
312
- within '.cart-item-quantity' do
313
- fill_in first('input')['name'], with: 3
314
- end
315
-
316
- click_on 'Update'
317
- end
318
-
319
- it 'redirects user back to address step' do
320
- visit spree.checkout_state_path('payment')
321
- expect(current_path).to eql(spree.checkout_state_path('address'))
322
- end
323
-
324
- it 'updates shipments properly through step address -> delivery transitions' do
325
- visit spree.checkout_state_path('payment')
326
- click_on 'Save and Continue'
327
- click_on 'Save and Continue'
328
-
329
- expect(Spree::InventoryUnit.count).to eq 3
330
- end
331
- end
332
-
333
- context 'and adds new product to cart and try to reach payment page' do
334
- let!(:bag) { create(:product, name: 'RoR Bag') }
335
-
336
- before do
337
- visit spree.root_path
338
- click_link bag.name
339
- click_button 'add-to-cart-button'
340
- end
341
-
342
- it 'redirects user back to address step' do
343
- visit spree.checkout_state_path('payment')
344
- expect(current_path).to eql(spree.checkout_state_path('address'))
345
- end
346
-
347
- it 'updates shipments properly through step address -> delivery transitions' do
348
- visit spree.checkout_state_path("payment")
349
- click_on 'Save and Continue'
350
- click_on 'Save and Continue'
351
-
352
- expect(Spree::InventoryUnit.count).to eq 2
353
- end
354
- end
355
- end
356
-
357
- context 'if coupon promotion, submits coupon along with payment', js: true do
358
- let!(:promotion) { Spree::Promotion.create(name: 'Huhuhu', code: 'huhu') }
359
- let!(:calculator) { Spree::Calculator::FlatPercentItemTotal.create(preferred_flat_percent: '10') }
360
- let!(:action) { Spree::Promotion::Actions::CreateItemAdjustments.create(calculator: calculator) }
361
-
362
- before do
363
- promotion.actions << action
364
-
365
- add_mug_to_cart
366
- click_on 'Checkout'
367
-
368
- fill_in 'order_email', with: 'test@example.com'
369
- click_on 'Continue'
370
- fill_in_address
371
- click_on 'Save and Continue'
372
-
373
- click_on 'Save and Continue'
374
- expect(current_path).to eql(spree.checkout_state_path('payment'))
375
- end
376
-
377
- it 'makes sure payment reflects order total with discounts' do
378
- fill_in 'Coupon Code', with: promotion.code
379
- click_on 'Save and Continue'
380
-
381
- expect(page).to have_content(promotion.name)
382
- expect(Spree::Payment.first.amount.to_f).to eq Spree::Order.last.total.to_f
383
- end
384
-
385
- context 'invalid coupon' do
386
- it 'doesnt create a payment record' do
387
- fill_in 'Coupon Code', with: 'invalid'
388
- click_on 'Save and Continue'
389
-
390
- expect(Spree::Payment.count).to eq 0
391
- expect(page).to have_content(Spree.t(:coupon_code_not_found))
392
- end
393
- end
394
-
395
- context "doesn't fill in coupon code input" do
396
- it 'advances just fine' do
397
- click_on 'Save and Continue'
398
- expect(current_path).to match(spree.order_path(Spree::Order.last))
399
- end
400
- end
401
- end
402
-
403
- context 'order has only payment step' do
404
- before do
405
- create(:credit_card_payment_method)
406
- @old_checkout_flow = Spree::Order.checkout_flow
407
- Spree::Order.class_eval do
408
- checkout_flow do
409
- go_to_state :payment
410
- go_to_state :confirm
411
- end
412
- end
413
-
414
- allow_any_instance_of(Spree::Order).to receive_messages email: 'spree@commerce.com'
415
-
416
- add_mug_to_cart
417
- click_on 'Checkout'
418
- end
419
-
420
- after do
421
- Spree::Order.checkout_flow(&@old_checkout_flow)
422
- end
423
-
424
- it 'goes right payment step and place order just fine' do
425
- expect(current_path).to eq spree.checkout_state_path('payment')
426
-
427
- choose 'Credit Card'
428
- fill_in 'Name on card', with: 'Spree Commerce'
429
- fill_in 'Card Number', with: '4111111111111111'
430
- fill_in 'card_expiry', with: '04 / 20'
431
- fill_in 'Card Code', with: '123'
432
- click_button 'Save and Continue'
433
-
434
- expect(current_path).to eq spree.checkout_state_path('confirm')
435
- click_button 'Place Order'
436
- end
437
- end
438
-
439
- context 'save my address' do
440
- before do
441
- stock_location.stock_items.update_all(count_on_hand: 1)
442
- add_mug_to_cart
443
- end
444
-
445
- context 'as a guest' do
446
- before do
447
- Spree::Order.last.update_column(:email, 'test@example.com')
448
- click_button 'Checkout'
449
- end
450
-
451
- it 'should not be displayed' do
452
- expect(page).to_not have_css('[data-hook=save_user_address]')
453
- end
454
- end
455
-
456
- context 'as a User' do
457
- before do
458
- user = create(:user)
459
- Spree::Order.last.update_column :user_id, user.id
460
- allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
461
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
462
- click_button 'Checkout'
463
- end
464
-
465
- it 'should be displayed' do
466
- expect(page).to have_css('[data-hook=save_user_address]')
467
- end
468
- end
469
- end
470
-
471
- context 'when order is completed' do
472
- let!(:user) { create(:user) }
473
- let!(:order) { OrderWalkthrough.up_to(:payment) }
474
-
475
- before(:each) do
476
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
477
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
478
- allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
479
-
480
- visit spree.checkout_state_path(:payment)
481
- click_button 'Save and Continue'
482
- end
483
-
484
- it 'displays a thank you message' do
485
- expect(page).to have_content(Spree.t(:thank_you_for_your_order))
486
- end
487
-
488
- it 'does not display a thank you message on that order future visits' do
489
- visit spree.order_path(order)
490
- expect(page).to_not have_content(Spree.t(:thank_you_for_your_order))
491
- end
492
- end
493
-
494
- context 'user has store credits', js: true do
495
- let(:bogus) { create(:credit_card_payment_method) }
496
- let(:store_credit_payment_method) { create(:store_credit_payment_method) }
497
- let(:user) { create(:user) }
498
- let(:order) { OrderWalkthrough.up_to(:payment) }
499
-
500
- let(:prepare_checkout!) do
501
- order.update(user: user)
502
- allow(order).to receive_messages(available_payment_methods: [bogus, store_credit_payment_method])
503
-
504
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
505
- allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
506
- allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
507
- visit spree.checkout_state_path(:payment)
508
- end
509
-
510
- context 'when not all Store Credits are used' do
511
- let!(:store_credit) { create(:store_credit, user: user) }
512
- let!(:additional_store_credit) { create(:store_credit, user: user, amount: 13) }
513
-
514
- before { prepare_checkout! }
515
-
516
- it 'page has data for (multiple) Store Credits' do
517
- expect(page).to have_selector('[data-hook="checkout_payment_store_credit_available"]')
518
- expect(page).to have_selector('button[name="apply_store_credit"]')
519
-
520
- amount = Spree::Money.new(store_credit.amount_remaining + additional_store_credit.amount_remaining)
521
- expect(page).to have_content(Spree.t('store_credit.available_amount', amount: amount))
522
- end
523
-
524
- it 'apply store credits button should move checkout to next step if amount is sufficient' do
525
- click_button 'Apply Store Credit'
526
- expect(current_path).to eq spree.order_path(order)
527
- expect(page).to have_content(Spree.t('order_processed_successfully'))
528
- end
529
-
530
- it 'apply store credits button should wait on payment step for other payment' do
531
- store_credit.update(amount_used: 145)
532
- additional_store_credit.update(amount_used: 12)
533
- click_button 'Apply Store Credit'
534
-
535
- expect(current_path).to eq spree.checkout_state_path(:payment)
536
- amount = Spree::Money.new(store_credit.amount_remaining + additional_store_credit.amount_remaining)
537
- remaining_amount = Spree::Money.new(order.total - amount.money.to_f)
538
- expect(page).to have_content(Spree.t('store_credit.applicable_amount', amount: amount))
539
- expect(page).to have_content(Spree.t('store_credit.additional_payment_needed', amount: remaining_amount))
540
- end
541
- end
542
-
543
- context 'when all Store Credits are used' do
544
- let!(:store_credit) { create(:store_credit, user: user, amount_used: 150) }
545
-
546
- before { prepare_checkout! }
547
-
548
- it 'page has no data for Store Credits when all Store Credits are used' do
549
- expect(page).to_not have_selector('[data-hook="checkout_payment_store_credit_available"]')
550
- expect(page).to_not have_selector('button[name="apply_store_credit"]')
551
- end
552
- end
553
- end
554
-
555
- def fill_in_address
556
- address = "order_bill_address_attributes"
557
- fill_in "#{address}_firstname", with: "Ryan"
558
- fill_in "#{address}_lastname", with: "Bigg"
559
- fill_in "#{address}_address1", with: "143 Swan Street"
560
- fill_in "#{address}_city", with: "Richmond"
561
- select country.name, from: "#{address}_country_id"
562
- select state.name, from: "#{address}_state_id"
563
- fill_in "#{address}_zipcode", with: "12345"
564
- fill_in "#{address}_phone", with: "(555) 555-5555"
565
- end
566
-
567
- def add_mug_to_cart
568
- visit spree.root_path
569
- click_link mug.name
570
- click_button "add-to-cart-button"
571
- end
572
- end