solidus_frontend 1.0.2 → 1.0.3

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.

Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +6 -0
  4. data/Rakefile +15 -0
  5. data/script/rails +9 -0
  6. data/solidus_frontend.gemspec +28 -0
  7. data/spec/controllers/controller_extension_spec.rb +126 -0
  8. data/spec/controllers/controller_helpers_spec.rb +26 -0
  9. data/spec/controllers/spree/checkout_controller_spec.rb +401 -0
  10. data/spec/controllers/spree/checkout_controller_with_views_spec.rb +36 -0
  11. data/spec/controllers/spree/content_controller_spec.rb +7 -0
  12. data/spec/controllers/spree/current_order_tracking_spec.rb +44 -0
  13. data/spec/controllers/spree/home_controller_spec.rb +27 -0
  14. data/spec/controllers/spree/orders_controller_ability_spec.rb +104 -0
  15. data/spec/controllers/spree/orders_controller_spec.rb +134 -0
  16. data/spec/controllers/spree/orders_controller_transitions_spec.rb +31 -0
  17. data/spec/controllers/spree/products_controller_spec.rb +36 -0
  18. data/spec/controllers/spree/taxons_controller_spec.rb +12 -0
  19. data/spec/features/address_spec.rb +76 -0
  20. data/spec/features/automatic_promotion_adjustments_spec.rb +47 -0
  21. data/spec/features/caching/products_spec.rb +55 -0
  22. data/spec/features/caching/taxons_spec.rb +22 -0
  23. data/spec/features/cart_spec.rb +81 -0
  24. data/spec/features/checkout_spec.rb +477 -0
  25. data/spec/features/checkout_unshippable_spec.rb +35 -0
  26. data/spec/features/coupon_code_spec.rb +227 -0
  27. data/spec/features/currency_spec.rb +18 -0
  28. data/spec/features/free_shipping_promotions_spec.rb +59 -0
  29. data/spec/features/locale_spec.rb +60 -0
  30. data/spec/features/order_spec.rb +73 -0
  31. data/spec/features/products_spec.rb +260 -0
  32. data/spec/features/promotion_code_invalidation_spec.rb +51 -0
  33. data/spec/features/quantity_promotions_spec.rb +128 -0
  34. data/spec/features/taxons_spec.rb +135 -0
  35. data/spec/features/template_rendering_spec.rb +19 -0
  36. data/spec/fixtures/thinking-cat.jpg +0 -0
  37. data/spec/helpers/base_helper_spec.rb +11 -0
  38. data/spec/spec_helper.rb +121 -0
  39. data/spec/support/shared_contexts/checkout_setup.rb +9 -0
  40. data/spec/support/shared_contexts/custom_products.rb +25 -0
  41. data/spec/support/shared_contexts/product_prototypes.rb +30 -0
  42. data/spec/views/spree/checkout/_summary_spec.rb +11 -0
  43. metadata +47 -6
@@ -0,0 +1,47 @@
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 = 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
@@ -0,0 +1,55 @@
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 do
10
+ product2.update_column(:updated_at, 1.day.ago)
11
+ # warm up the cache
12
+ visit spree.root_path
13
+ assert_written_to_cache("views/en/USD/spree/products/all--#{product.updated_at.utc.to_s(:number)}")
14
+ assert_written_to_cache("views/en/USD/spree/products/#{product.id}-#{product.updated_at.utc.to_s(:number)}")
15
+ assert_written_to_cache("views/en/spree/taxonomies/#{taxonomy.id}")
16
+ assert_written_to_cache("views/en/taxons/#{taxon.updated_at.utc.to_i}")
17
+
18
+ clear_cache_events
19
+ end
20
+
21
+ it "reads from cache upon a second viewing" do
22
+ visit spree.root_path
23
+ expect(cache_writes.count).to eq(0)
24
+ end
25
+
26
+ it "busts the cache when a product is updated" do
27
+ product.update_column(:updated_at, 1.day.from_now)
28
+ visit spree.root_path
29
+ assert_written_to_cache("views/en/USD/spree/products/all--#{product.updated_at.utc.to_s(:number)}")
30
+ assert_written_to_cache("views/en/USD/spree/products/#{product.id}-#{product.updated_at.utc.to_s(:number)}")
31
+ expect(cache_writes.count).to eq(2)
32
+ end
33
+
34
+ it "busts the cache when all products are deleted" do
35
+ product.destroy
36
+ product2.destroy
37
+ visit spree.root_path
38
+ assert_written_to_cache("views/en/USD/spree/products/all--#{Date.today.to_s(:number)}-0")
39
+ expect(cache_writes.count).to eq(1)
40
+ end
41
+
42
+ it "busts the cache when the newest product is deleted" do
43
+ product.destroy
44
+ visit spree.root_path
45
+ assert_written_to_cache("views/en/USD/spree/products/all--#{product2.updated_at.utc.to_s(:number)}")
46
+ expect(cache_writes.count).to eq(1)
47
+ end
48
+
49
+ it "busts the cache when an older product is deleted" do
50
+ product2.destroy
51
+ visit spree.root_path
52
+ assert_written_to_cache("views/en/USD/spree/products/all--#{product.updated_at.utc.to_s(:number)}")
53
+ expect(cache_writes.count).to eq(1)
54
+ end
55
+ end
@@ -0,0 +1,22 @@
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
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Cart", type: :feature, inaccessible: true do
4
+ it "shows cart icon on non-cart pages" do
5
+ visit spree.root_path
6
+ expect(page).to have_selector("li#link-to-cart a", :visible => true)
7
+ end
8
+
9
+ it "prevents double clicking the remove button on cart", :js => true do
10
+ @product = create(:product, :name => "RoR Mug")
11
+
12
+ visit spree.root_path
13
+ click_link "RoR Mug"
14
+ click_button "add-to-cart-button"
15
+
16
+ # prevent form submit to verify button is disabled
17
+ page.execute_script("$('#update-cart').submit(function(){return false;})")
18
+
19
+ expect(page).not_to have_selector('button#update-button[disabled]')
20
+ page.find(:css, '.delete img').click
21
+ expect(page).to have_selector('button#update-button[disabled]')
22
+ end
23
+
24
+ # Regression test for #2006
25
+ it "does not error out with a 404 when GET'ing to /orders/populate" do
26
+ visit '/orders/populate'
27
+ within(".error") do
28
+ expect(page).to have_content(Spree.t(:populate_get_error))
29
+ end
30
+ end
31
+
32
+ it 'allows you to remove an item from the cart', :js => true do
33
+ create(:product, :name => "RoR Mug")
34
+ visit spree.root_path
35
+ click_link "RoR Mug"
36
+ click_button "add-to-cart-button"
37
+ find('.cart-item-delete .delete').click
38
+ expect(page).not_to have_content("Line items quantity must be an integer")
39
+ expect(page).not_to have_content("RoR Mug")
40
+ expect(page).to have_content("Your cart is empty")
41
+
42
+ within "#link-to-cart" do
43
+ expect(page).to have_content("EMPTY")
44
+ end
45
+ end
46
+
47
+ it 'allows you to empty the cart', js: true do
48
+ create(:product, :name => "RoR Mug")
49
+ visit spree.root_path
50
+ click_link "RoR Mug"
51
+ click_button "add-to-cart-button"
52
+
53
+ expect(page).to have_content("RoR Mug")
54
+ click_on "Empty Cart"
55
+ expect(page).to have_content("Your cart is empty")
56
+
57
+ within "#link-to-cart" do
58
+ expect(page).to have_content("EMPTY")
59
+ end
60
+ end
61
+
62
+ # regression for #2276
63
+ context "product contains variants but no option values" do
64
+ let(:variant) { create(:variant) }
65
+ let(:product) { variant.product }
66
+
67
+ before { variant.option_values.destroy_all }
68
+
69
+ it "still adds product to cart", inaccessible: true do
70
+ visit spree.product_path(product)
71
+ click_button "add-to-cart-button"
72
+
73
+ visit spree.cart_path
74
+ expect(page).to have_content(product.name)
75
+ end
76
+ end
77
+ it "should have a surrounding element with data-hook='cart_container'" do
78
+ visit spree.cart_path
79
+ expect(page).to have_selector("div[data-hook='cart_container']")
80
+ end
81
+ end
@@ -0,0 +1,477 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Checkout", type: :feature, inaccessible: true do
4
+
5
+ include_context 'checkout setup'
6
+
7
+ context "visitor makes checkout as guest without registration" do
8
+ before(:each) do
9
+ stock_location.stock_items.update_all(count_on_hand: 1)
10
+ end
11
+
12
+ context "defaults to use billing address" do
13
+ before do
14
+ add_mug_to_cart
15
+ Spree::Order.last.update_column(:email, "test@example.com")
16
+ click_button "Checkout"
17
+ end
18
+
19
+ it "should default checkbox to checked", inaccessible: true do
20
+ expect(find('input#order_use_billing')).to be_checked
21
+ end
22
+
23
+ it "should remain checked when used and visitor steps back to address step", :js => true do
24
+ fill_in_address
25
+ expect(find('input#order_use_billing')).to be_checked
26
+ end
27
+ end
28
+
29
+ # Regression test for #4079
30
+ context "persists state when on address page" do
31
+ before do
32
+ add_mug_to_cart
33
+ click_button "Checkout"
34
+ end
35
+
36
+ specify do
37
+ expect(Spree::Order.count).to eq(1)
38
+ expect(Spree::Order.last.state).to eq("address")
39
+ end
40
+ end
41
+
42
+ # Regression test for #1596
43
+ context "full checkout" do
44
+ before do
45
+ shipping_method.calculator.update!(preferred_amount: 10)
46
+ mug.shipping_category = shipping_method.shipping_categories.first
47
+ mug.save!
48
+ end
49
+
50
+ it "does not break the per-item shipping method calculator", :js => true do
51
+ add_mug_to_cart
52
+ click_button "Checkout"
53
+
54
+ fill_in "order_email", :with => "test@example.com"
55
+ fill_in_address
56
+
57
+ click_button "Save and Continue"
58
+ expect(page).not_to have_content("undefined method `promotion'")
59
+ click_button "Save and Continue"
60
+ expect(page).to have_content("Shipping total: $10.00")
61
+ end
62
+ end
63
+
64
+ # Regression test for #4306
65
+ context "free shipping" do
66
+ before do
67
+ add_mug_to_cart
68
+ click_button "Checkout"
69
+ end
70
+
71
+ it "should not show 'Free Shipping' when there are no shipments" do
72
+ within("#checkout-summary") do
73
+ expect(page).to_not have_content('Free Shipping')
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ # Regression test for #2694 and #4117
80
+ context "doesn't allow bad credit card numbers" do
81
+ before(:each) do
82
+ order = OrderWalkthrough.up_to(:delivery)
83
+ allow(order).to receive_messages :confirmation_required? => true
84
+ allow(order).to receive_messages(:available_payment_methods => [ create(:credit_card_payment_method, :environment => 'test') ])
85
+
86
+ user = create(:user)
87
+ order.user = user
88
+ order.update!
89
+
90
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(:current_order => order)
91
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(:try_spree_current_user => user)
92
+ end
93
+
94
+ it "redirects to payment page", inaccessible: true do
95
+ visit spree.checkout_state_path(:delivery)
96
+ click_button "Save and Continue"
97
+ choose "Credit Card"
98
+ fill_in "Card Number", :with => '123'
99
+ fill_in "card_expiry", :with => '04 / 20'
100
+ fill_in "Card Code", :with => '123'
101
+ click_button "Save and Continue"
102
+ click_button "Place Order"
103
+ expect(page).to have_content("Bogus Gateway: Forced failure")
104
+ expect(page.current_url).to include("/checkout/payment")
105
+ end
106
+ end
107
+
108
+ context "and likes to double click buttons" do
109
+ let!(:user) { create(:user) }
110
+
111
+ let!(:order) do
112
+ order = OrderWalkthrough.up_to(:delivery)
113
+ allow(order).to receive_messages :confirmation_required? => true
114
+
115
+ order.reload
116
+ order.user = user
117
+ order.update!
118
+ order
119
+ end
120
+
121
+ before(:each) do
122
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(:current_order => order)
123
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(:try_spree_current_user => user)
124
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(:skip_state_validation? => true)
125
+ end
126
+
127
+ it "prevents double clicking the payment button on checkout", :js => true do
128
+ visit spree.checkout_state_path(:payment)
129
+
130
+ # prevent form submit to verify button is disabled
131
+ page.execute_script("$('#checkout_form_payment').submit(function(){return false;})")
132
+
133
+ expect(page).not_to have_selector('input.button[disabled]')
134
+ click_button "Save and Continue"
135
+ expect(page).to have_selector('input.button[disabled]')
136
+ end
137
+
138
+ it "prevents double clicking the confirm button on checkout", :js => true do
139
+ order.payments << create(:payment)
140
+ visit spree.checkout_state_path(:confirm)
141
+
142
+ # prevent form submit to verify button is disabled
143
+ page.execute_script("$('#checkout_form_confirm').submit(function(){return false;})")
144
+
145
+ expect(page).not_to have_selector('input.button[disabled]')
146
+ click_button "Place Order"
147
+ expect(page).to have_selector('input.button[disabled]')
148
+ end
149
+ end
150
+
151
+ context "when several payment methods are available" do
152
+ let(:credit_cart_payment) {create(:credit_card_payment_method, :environment => 'test') }
153
+ let(:check_payment) {create(:check_payment_method, :environment => 'test') }
154
+
155
+ after do
156
+ Capybara.ignore_hidden_elements = true
157
+ end
158
+
159
+ before do
160
+ Capybara.ignore_hidden_elements = false
161
+ order = OrderWalkthrough.up_to(:delivery)
162
+ allow(order).to receive_messages(:available_payment_methods => [check_payment,credit_cart_payment])
163
+ order.user = create(:user)
164
+ order.update!
165
+
166
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
167
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: order.user)
168
+
169
+ visit spree.checkout_state_path(:payment)
170
+ end
171
+
172
+ it "the first payment method should be selected", :js => true do
173
+ payment_method_css = "#order_payments_attributes__payment_method_id_"
174
+ expect(find("#{payment_method_css}#{check_payment.id}")).to be_checked
175
+ expect(find("#{payment_method_css}#{credit_cart_payment.id}")).not_to be_checked
176
+ end
177
+
178
+ it "the fields for the other payment methods should be hidden", :js => true do
179
+ payment_method_css = "#payment_method_"
180
+ expect(find("#{payment_method_css}#{check_payment.id}")).to be_visible
181
+ expect(find("#{payment_method_css}#{credit_cart_payment.id}")).not_to be_visible
182
+ end
183
+ end
184
+
185
+ context "user has payment sources", js: true do
186
+ let(:bogus) { create(:credit_card_payment_method) }
187
+ let(:user) { create(:user) }
188
+
189
+ let!(:credit_card) do
190
+ create(:credit_card, user_id: user.id, payment_method: bogus, gateway_customer_profile_id: "BGS-WEFWF")
191
+ end
192
+
193
+ before do
194
+ order = OrderWalkthrough.up_to(:delivery)
195
+ allow(order).to receive_messages(:available_payment_methods => [bogus])
196
+
197
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
198
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
199
+ allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
200
+
201
+ visit spree.checkout_state_path(:payment)
202
+ end
203
+
204
+ it "selects first source available and customer moves on" do
205
+ expect(find "#use_existing_card_yes").to be_checked
206
+
207
+ expect {
208
+ click_on "Save and Continue"
209
+ }.not_to change { Spree::CreditCard.count }
210
+
211
+ click_on "Place Order"
212
+ expect(current_path).to eql(spree.order_path(Spree::Order.last))
213
+ end
214
+
215
+ it "allows user to enter a new source" do
216
+ choose "use_existing_card_no"
217
+
218
+ fill_in "Name on card", :with => 'Spree Commerce'
219
+ fill_in "Card Number", :with => '4111111111111111'
220
+ fill_in "card_expiry", :with => '04 / 20'
221
+ fill_in "Card Code", :with => '123'
222
+
223
+ expect {
224
+ click_on "Save and Continue"
225
+ }.to change { Spree::CreditCard.count }.by 1
226
+
227
+ expect(Spree::CreditCard.last.address).to be_present
228
+
229
+ click_on "Place Order"
230
+ expect(current_path).to eql(spree.order_path(Spree::Order.last))
231
+ end
232
+ end
233
+
234
+ # regression for #2921
235
+ context "goes back from payment to add another item", js: true do
236
+ let!(:store) { FactoryGirl.create(:store) }
237
+ let!(:bag) { create(:product, :name => "RoR Bag") }
238
+
239
+ it "transit nicely through checkout steps again" do
240
+ add_mug_to_cart
241
+ click_on "Checkout"
242
+ fill_in "order_email", :with => "test@example.com"
243
+ fill_in_address
244
+ click_on "Save and Continue"
245
+ click_on "Save and Continue"
246
+ expect(current_path).to eql(spree.checkout_state_path("payment"))
247
+
248
+ visit spree.root_path
249
+ click_link bag.name
250
+ click_button "add-to-cart-button"
251
+
252
+ click_on "Checkout"
253
+ click_on "Save and Continue"
254
+ click_on "Save and Continue"
255
+ click_on "Save and Continue"
256
+ click_on "Place Order"
257
+
258
+ expect(current_path).to eql(spree.order_path(Spree::Order.last))
259
+ end
260
+ end
261
+
262
+ context "from payment step customer goes back to cart", js: true do
263
+ before do
264
+ add_mug_to_cart
265
+ click_on "Checkout"
266
+ fill_in "order_email", :with => "test@example.com"
267
+ fill_in_address
268
+ click_on "Save and Continue"
269
+ click_on "Save and Continue"
270
+ expect(current_path).to eql(spree.checkout_state_path("payment"))
271
+ end
272
+
273
+ context "and updates line item quantity and try to reach payment page" do
274
+ before do
275
+ visit spree.cart_path
276
+ within ".cart-item-quantity" do
277
+ fill_in first("input")["name"], with: 3
278
+ end
279
+
280
+ click_on "Update"
281
+ end
282
+
283
+ it "redirects user back to address step" do
284
+ visit spree.checkout_state_path("payment")
285
+ expect(current_path).to eql(spree.checkout_state_path("address"))
286
+ end
287
+
288
+ it "updates shipments properly through step address -> delivery transitions" do
289
+ visit spree.checkout_state_path("payment")
290
+ click_on "Save and Continue"
291
+ click_on "Save and Continue"
292
+
293
+ expect(Spree::InventoryUnit.count).to eq 3
294
+ end
295
+ end
296
+
297
+ context "and adds new product to cart and try to reach payment page" do
298
+ let!(:bag) { create(:product, :name => "RoR Bag") }
299
+
300
+ before do
301
+ visit spree.root_path
302
+ click_link bag.name
303
+ click_button "add-to-cart-button"
304
+ end
305
+
306
+ it "redirects user back to address step" do
307
+ visit spree.checkout_state_path("payment")
308
+ expect(current_path).to eql(spree.checkout_state_path("address"))
309
+ end
310
+
311
+ it "updates shipments properly through step address -> delivery transitions" do
312
+ visit spree.checkout_state_path("payment")
313
+ click_on "Save and Continue"
314
+ click_on "Save and Continue"
315
+
316
+ expect(Spree::InventoryUnit.count).to eq 2
317
+ end
318
+ end
319
+ end
320
+
321
+ context "in coupon promotion, submits coupon along with payment", js: true do
322
+ let!(:promotion) { create(:promotion, name: "Huhuhu", code: "huhu") }
323
+ let!(:calculator) { Spree::Calculator::FlatPercentItemTotal.create(preferred_flat_percent: "10") }
324
+ let!(:action) { Spree::Promotion::Actions::CreateItemAdjustments.create(calculator: calculator) }
325
+
326
+ before do
327
+ promotion.actions << action
328
+
329
+ add_mug_to_cart
330
+ click_on "Checkout"
331
+
332
+ fill_in "order_email", :with => "test@example.com"
333
+ fill_in_address
334
+ click_on "Save and Continue"
335
+
336
+ click_on "Save and Continue"
337
+ expect(current_path).to eql(spree.checkout_state_path("payment"))
338
+ end
339
+
340
+ it "makes sure payment reflects order total with discounts" do
341
+ fill_in "Coupon Code", with: promotion.codes.first.value
342
+ click_on "Save and Continue"
343
+
344
+ expect(page).to have_content(promotion.name)
345
+ expect(Spree::Payment.first.amount.to_f).to eq Spree::Order.last.total.to_f
346
+ end
347
+
348
+ context "invalid coupon" do
349
+ it "doesnt create a payment record" do
350
+ fill_in "Coupon Code", with: 'invalid'
351
+ click_on "Save and Continue"
352
+
353
+ expect(Spree::Payment.count).to eq 0
354
+ expect(page).to have_content(Spree.t(:coupon_code_not_found))
355
+ end
356
+ end
357
+
358
+ context "doesn't fill in coupon code input" do
359
+ it "advances just fine" do
360
+ click_on "Save and Continue"
361
+ expect(current_path).to eql(spree.checkout_state_path("confirm"))
362
+ end
363
+ end
364
+ end
365
+
366
+ context "order has only payment step" do
367
+ before do
368
+ create(:credit_card_payment_method)
369
+ @old_checkout_flow = Spree::Order.checkout_flow
370
+ Spree::Order.class_eval do
371
+ checkout_flow do
372
+ go_to_state :payment
373
+ go_to_state :confirm
374
+ end
375
+ end
376
+
377
+ allow_any_instance_of(Spree::Order).to receive_messages email: "spree@commerce.com"
378
+
379
+ add_mug_to_cart
380
+ click_on "Checkout"
381
+ end
382
+
383
+ after do
384
+ Spree::Order.checkout_flow(&@old_checkout_flow)
385
+ end
386
+
387
+ it "goes right payment step and place order just fine" do
388
+ expect(current_path).to eq spree.checkout_state_path('payment')
389
+
390
+ choose "Credit Card"
391
+ fill_in "Name on card", :with => 'Spree Commerce'
392
+ fill_in "Card Number", :with => '4111111111111111'
393
+ fill_in "card_expiry", :with => '04 / 20'
394
+ fill_in "Card Code", :with => '123'
395
+ click_button "Save and Continue"
396
+
397
+ expect(current_path).to eq spree.checkout_state_path('confirm')
398
+ click_button "Place Order"
399
+ end
400
+ end
401
+
402
+
403
+ context "save my address" do
404
+ before do
405
+ stock_location.stock_items.update_all(count_on_hand: 1)
406
+ add_mug_to_cart
407
+ end
408
+
409
+ context 'as a guest' do
410
+ before do
411
+ Spree::Order.last.update_column(:email, "test@example.com")
412
+ click_button "Checkout"
413
+ end
414
+
415
+ it 'should not be displayed' do
416
+ expect(page).to_not have_css("[data-hook=save_user_address]")
417
+ end
418
+ end
419
+
420
+ context 'as a User' do
421
+ before do
422
+ user = create(:user)
423
+ Spree::Order.last.update_column :user_id, user.id
424
+ allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
425
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
426
+ click_button "Checkout"
427
+ end
428
+
429
+ it 'should be displayed' do
430
+ expect(page).to have_css("[data-hook=save_user_address]")
431
+ end
432
+ end
433
+ end
434
+
435
+ context "when order is completed" do
436
+ let!(:user) { create(:user) }
437
+ let!(:order) { OrderWalkthrough.up_to(:delivery) }
438
+
439
+ before(:each) do
440
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(:current_order => order)
441
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(:try_spree_current_user => user)
442
+ allow_any_instance_of(Spree::OrdersController).to receive_messages(:try_spree_current_user => user)
443
+
444
+ visit spree.checkout_state_path(:delivery)
445
+ click_button "Save and Continue"
446
+ click_button "Save and Continue"
447
+ click_button "Place Order"
448
+ end
449
+
450
+ it "displays a thank you message" do
451
+ expect(page).to have_content(Spree.t(:thank_you_for_your_order))
452
+ end
453
+
454
+ it "does not display a thank you message on that order future visits" do
455
+ visit spree.order_path(order)
456
+ expect(page).to_not have_content(Spree.t(:thank_you_for_your_order))
457
+ end
458
+ end
459
+
460
+ def fill_in_address
461
+ address = "order_bill_address_attributes"
462
+ fill_in "#{address}_firstname", with: "Ryan"
463
+ fill_in "#{address}_lastname", with: "Bigg"
464
+ fill_in "#{address}_address1", with: "143 Swan Street"
465
+ fill_in "#{address}_city", with: "Richmond"
466
+ select "United States of America", from: "#{address}_country_id"
467
+ select "Alabama", from: "#{address}_state_id"
468
+ fill_in "#{address}_zipcode", with: "12345"
469
+ fill_in "#{address}_phone", with: "(555) 555-5555"
470
+ end
471
+
472
+ def add_mug_to_cart
473
+ visit spree.root_path
474
+ click_link mug.name
475
+ click_button "add-to-cart-button"
476
+ end
477
+ end