solidus_core 1.3.2 → 1.4.0.beta1

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.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -0
  3. data/app/helpers/spree/base_helper.rb +6 -2
  4. data/app/mailers/spree/base_mailer.rb +1 -1
  5. data/app/mailers/spree/carton_mailer.rb +1 -1
  6. data/app/mailers/spree/order_mailer.rb +2 -2
  7. data/app/mailers/spree/reimbursement_mailer.rb +7 -7
  8. data/app/mailers/spree/test_mailer.rb +3 -2
  9. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  10. data/app/models/spree/address.rb +14 -4
  11. data/app/models/spree/adjustment.rb +11 -19
  12. data/app/models/spree/app_configuration.rb +23 -1
  13. data/app/models/spree/base.rb +9 -0
  14. data/app/models/spree/country.rb +2 -2
  15. data/app/models/spree/exchange.rb +1 -1
  16. data/app/models/spree/gateway.rb +1 -1
  17. data/app/models/spree/item_adjustments.rb +7 -0
  18. data/app/models/spree/line_item.rb +1 -13
  19. data/app/models/spree/order/checkout.rb +19 -16
  20. data/app/models/spree/order/payments.rb +0 -2
  21. data/app/models/spree/order.rb +7 -21
  22. data/app/models/spree/order_contents.rb +60 -4
  23. data/app/models/spree/order_merger.rb +2 -4
  24. data/app/models/spree/order_shipping.rb +1 -1
  25. data/app/models/spree/order_update_attributes.rb +0 -2
  26. data/app/models/spree/order_updater.rb +14 -11
  27. data/app/models/spree/payment.rb +2 -3
  28. data/app/models/spree/payment_create.rb +5 -2
  29. data/app/models/spree/payment_method/store_credit.rb +6 -5
  30. data/app/models/spree/product/scopes.rb +2 -1
  31. data/app/models/spree/product.rb +2 -5
  32. data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -3
  33. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  34. data/app/models/spree/promotion/rules/option_value.rb +2 -3
  35. data/app/models/spree/promotion/rules/product.rb +9 -3
  36. data/app/models/spree/promotion/rules/taxon.rb +33 -7
  37. data/app/models/spree/promotion/rules/user.rb +2 -3
  38. data/app/models/spree/promotion.rb +16 -6
  39. data/app/models/spree/promotion_handler/coupon.rb +1 -1
  40. data/app/models/spree/shipment.rb +12 -16
  41. data/app/models/spree/stock/estimator.rb +1 -1
  42. data/app/models/spree/stock/package.rb +0 -1
  43. data/app/models/spree/stock_item.rb +2 -6
  44. data/app/models/spree/store.rb +2 -1
  45. data/app/models/spree/tax_rate.rb +1 -1
  46. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +29 -0
  47. data/app/models/spree/wallet/default_payment_builder.rb +26 -0
  48. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +46 -0
  49. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +1 -1
  50. data/app/views/spree/shared/_base_mailer_footer.html.erb +1 -20
  51. data/app/views/spree/shared/_base_mailer_header.html.erb +1 -31
  52. data/config/initializers/spree_user.rb +1 -1
  53. data/config/locales/en.yml +58 -34
  54. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +1 -1
  55. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +15 -3
  56. data/db/migrate/20160527070401_rename_shipment_address_field.rb +7 -0
  57. data/db/migrate/20160616232103_remove_user_id_from_promotion_rules.rb +11 -0
  58. data/db/migrate/20160718205341_add_payment_id_index_to_spree_refunds.rb +5 -0
  59. data/db/migrate/20160718205859_add_reimbursement_id_index_to_spree_refunds.rb +5 -0
  60. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  61. data/lib/generators/spree/dummy/templates/rails/database.yml +3 -1
  62. data/lib/generators/spree/dummy/templates/rails/test.rb +4 -2
  63. data/lib/generators/spree/install/install_generator.rb +6 -16
  64. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  65. data/lib/spree/core/controller_helpers/common.rb +1 -1
  66. data/lib/spree/core/controller_helpers/order.rb +2 -2
  67. data/lib/spree/core/current_store.rb +5 -1
  68. data/lib/spree/core/delegate_belongs_to.rb +1 -1
  69. data/lib/spree/core/routes.rb +6 -32
  70. data/lib/spree/core/search/base.rb +2 -2
  71. data/lib/spree/core/stock_configuration.rb +6 -0
  72. data/lib/spree/core/version.rb +2 -2
  73. data/lib/spree/core.rb +2 -1
  74. data/lib/spree/i18n.rb +7 -0
  75. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  76. data/lib/spree/mailer_previews/order_preview.rb +8 -3
  77. data/lib/spree/mailer_previews/reimbursement_preview.rb +11 -0
  78. data/lib/spree/migrations.rb +13 -7
  79. data/lib/spree/permitted_attributes.rb +1 -1
  80. data/lib/spree/testing_support/capybara_ext.rb +6 -1
  81. data/lib/spree/testing_support/common_rake.rb +3 -7
  82. data/lib/spree/testing_support/controller_requests.rb +8 -0
  83. data/lib/spree/testing_support/factories/order_factory.rb +30 -8
  84. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  85. data/lib/spree/testing_support/factories/product_factory.rb +6 -0
  86. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -0
  87. data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +3 -1
  88. data/solidus_core.gemspec +3 -3
  89. data/spec/helpers/base_helper_spec.rb +18 -2
  90. data/spec/lib/i18n_spec.rb +4 -0
  91. data/spec/lib/spree/core/controller_helpers/order_spec.rb +16 -4
  92. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +75 -59
  93. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +1 -1
  94. data/spec/lib/spree/core/importer/order_spec.rb +4 -2
  95. data/spec/lib/spree/core/stock_configuration_spec.rb +17 -0
  96. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +195 -0
  97. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +6 -0
  98. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +6 -0
  99. data/spec/lib/spree/migrations_spec.rb +3 -9
  100. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +1 -1
  101. data/spec/mailers/carton_mailer_spec.rb +1 -1
  102. data/spec/mailers/order_mailer_spec.rb +2 -2
  103. data/spec/mailers/reimbursement_mailer_spec.rb +1 -1
  104. data/spec/models/spree/address_spec.rb +22 -0
  105. data/spec/models/spree/adjustment_spec.rb +0 -10
  106. data/spec/models/spree/carton_spec.rb +1 -1
  107. data/spec/models/spree/country_spec.rb +9 -1
  108. data/spec/models/spree/gateway/bogus_spec.rb +1 -1
  109. data/spec/models/spree/item_adjustments_spec.rb +33 -0
  110. data/spec/models/spree/line_item_spec.rb +2 -21
  111. data/spec/models/spree/order/checkout_spec.rb +32 -45
  112. data/spec/models/spree/order/payment_spec.rb +1 -16
  113. data/spec/models/spree/order_cancellations_spec.rb +8 -3
  114. data/spec/models/spree/order_contents_spec.rb +48 -0
  115. data/spec/models/spree/order_merger_spec.rb +8 -5
  116. data/spec/models/spree/order_shipping_spec.rb +3 -4
  117. data/spec/models/spree/order_spec.rb +23 -59
  118. data/spec/models/spree/order_update_attributes_spec.rb +1 -5
  119. data/spec/models/spree/order_updater_spec.rb +39 -11
  120. data/spec/models/spree/payment_create_spec.rb +61 -0
  121. data/spec/models/spree/payment_method/store_credit_spec.rb +23 -10
  122. data/spec/models/spree/payment_spec.rb +17 -4
  123. data/spec/models/spree/product_spec.rb +1 -1
  124. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +8 -13
  125. data/spec/models/spree/promotion/rules/product_spec.rb +33 -0
  126. data/spec/models/spree/promotion/rules/taxon_spec.rb +52 -8
  127. data/spec/models/spree/promotion_spec.rb +18 -12
  128. data/spec/models/spree/return_authorization_spec.rb +0 -16
  129. data/spec/models/spree/shipment_spec.rb +57 -36
  130. data/spec/models/spree/stock/coordinator_spec.rb +0 -5
  131. data/spec/models/spree/stock/package_spec.rb +0 -1
  132. data/spec/models/spree/stock_item_spec.rb +35 -145
  133. data/spec/models/spree/store_spec.rb +24 -10
  134. data/spec/models/spree/tax_rate_spec.rb +2 -2
  135. data/spec/models/spree/user_spec.rb +1 -1
  136. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +20 -12
  137. data/spec/support/concerns/working_factories.rb +4 -0
  138. metadata +30 -10
  139. data/config/routes.rb +0 -1
@@ -200,6 +200,7 @@ module Spree
200
200
  order_promos[promo_sequence[0]].activate order: order
201
201
  order_promos[promo_sequence[1]].activate order: order
202
202
 
203
+ order.update!
203
204
  order.reload
204
205
  expect(order.all_adjustments.count).to eq(2), "Expected two adjustments (using sequence #{promo_sequence})"
205
206
  expect(order.all_adjustments.eligible.count).to eq(1), "Expected one elegible adjustment (using sequence #{promo_sequence})"
@@ -267,5 +268,37 @@ module Spree
267
268
  expect(line_item.adjustments.promotion.eligible.first.amount.to_i).to eq(-200)
268
269
  end
269
270
  end
271
+
272
+ context "multiple updates" do
273
+ let(:adjustment) { create(:tax_adjustment, amount: -10) }
274
+ let(:item) { adjustment.adjustable }
275
+
276
+ def update
277
+ described_class.new(item).update
278
+ end
279
+
280
+ # "fresh" record from the DB
281
+ def db_record
282
+ Spree::LineItem.find(item.id)
283
+ end
284
+
285
+ it "persists each change" do
286
+ adjustment.source.update_attributes!(amount: 0.1)
287
+ update
288
+ expect(item).not_to be_changed
289
+ expect(db_record).to have_attributes(adjustment_total: 1)
290
+
291
+ adjustment.source.update_attributes!(amount: 0.20)
292
+ item.reload
293
+ update
294
+ expect(item).not_to be_changed
295
+ expect(db_record).to have_attributes(adjustment_total: 2)
296
+
297
+ adjustment.source.update_attributes!(amount: 0.10)
298
+ update
299
+ expect(item).not_to be_changed
300
+ expect(db_record).to have_attributes(adjustment_total: 1)
301
+ end
302
+ end
270
303
  end
271
304
  end
@@ -26,25 +26,6 @@ describe Spree::LineItem, type: :model do
26
26
  end
27
27
 
28
28
  context "#save" do
29
- context "line item changes" do
30
- before do
31
- line_item.quantity = line_item.quantity + 1
32
- end
33
-
34
- it "triggers adjustment total recalculation" do
35
- expect(line_item).to receive(:update_tax_charge) # Regression test for https://github.com/spree/spree/issues/4671
36
- expect(line_item).to receive(:recalculate_adjustments)
37
- line_item.save
38
- end
39
- end
40
-
41
- context "line item does not change" do
42
- it "does not trigger adjustment total recalculation" do
43
- expect(line_item).not_to receive(:recalculate_adjustments)
44
- line_item.save
45
- end
46
- end
47
-
48
29
  context "target_shipment is provided" do
49
30
  it "verifies inventory" do
50
31
  line_item.target_shipment = Spree::Shipment.new
@@ -135,13 +116,13 @@ describe Spree::LineItem, type: :model do
135
116
  end
136
117
 
137
118
  it 'should display a deprecation warning' do
138
- expect(ActiveSupport::Deprecation).to receive(:warn)
119
+ expect(Spree::Deprecation).to receive(:warn)
139
120
  Spree::LineItem.new(variant: variant, order: order)
140
121
  end
141
122
 
142
123
  it 'should run the user-defined copy_price method' do
143
124
  expect_any_instance_of(Spree::LineItem).to receive(:copy_price).and_call_original
144
- ActiveSupport::Deprecation.silence do
125
+ Spree::Deprecation.silence do
145
126
  Spree::LineItem.new(variant: variant, order: order)
146
127
  end
147
128
  end
@@ -162,12 +162,14 @@ describe Spree::Order, type: :model do
162
162
  end
163
163
 
164
164
  context "from address" do
165
- let(:ship_address) { FactoryGirl.create(:ship_address) }
165
+ let(:ship_address) { create(:ship_address) }
166
+ let!(:line_item) { create(:line_item, order: order, price: 10) }
167
+ let!(:shipping_method) { create(:shipping_method) }
166
168
 
167
169
  before do
170
+ order.line_items.reload
168
171
  order.state = 'address'
169
172
  order.ship_address = ship_address
170
- FactoryGirl.create(:shipment, order: order, cost: 10)
171
173
  order.email = "user@example.com"
172
174
  order.save!
173
175
  end
@@ -180,31 +182,24 @@ describe Spree::Order, type: :model do
180
182
  end
181
183
  end
182
184
 
183
- it "updates totals" do
184
- line_item = FactoryGirl.create(:line_item, price: 10, adjustment_total: 10)
185
- order.line_items << line_item
186
- tax_rate = create(:tax_rate, tax_category: line_item.tax_category, amount: 0.05)
187
- allow(Spree::TaxRate).to receive_messages match: [tax_rate]
188
- FactoryGirl.create(:tax_adjustment, adjustable: line_item, source: tax_rate, order: order)
189
- order.email = "user@example.com"
185
+ it "recalculates tax and updates totals" do
186
+ create(:tax_rate, tax_category: line_item.tax_category, amount: 0.05, zone: order.tax_zone)
190
187
  order.next!
191
- expect(order.adjustment_total).to eq(0.5)
192
- expect(order.additional_tax_total).to eq(0.5)
193
- expect(order.included_tax_total).to eq(0)
194
- expect(order.total).to eq(20.5)
188
+ expect(order).to have_attributes(
189
+ adjustment_total: 0.5,
190
+ additional_tax_total: 0.5,
191
+ included_tax_total: 0,
192
+ total: 20.5
193
+ )
195
194
  end
196
195
 
197
196
  it "transitions to delivery" do
198
- allow(order).to receive_messages(ensure_available_shipping_rates: true)
199
197
  order.next!
200
198
  assert_state_changed(order, 'address', 'delivery')
201
199
  expect(order.state).to eq("delivery")
202
200
  end
203
201
 
204
202
  it "does not call persist_order_address if there is no address on the order" do
205
- # otherwise, it will crash
206
- allow(order).to receive_messages(ensure_available_shipping_rates: true)
207
-
208
203
  order.user = FactoryGirl.create(:user)
209
204
  order.save!
210
205
 
@@ -213,8 +208,6 @@ describe Spree::Order, type: :model do
213
208
  end
214
209
 
215
210
  it "calls persist_order_address on the order's user" do
216
- allow(order).to receive_messages(ensure_available_shipping_rates: true)
217
-
218
211
  order.user = FactoryGirl.create(:user)
219
212
  order.ship_address = FactoryGirl.create(:address)
220
213
  order.bill_address = FactoryGirl.create(:address)
@@ -225,8 +218,6 @@ describe Spree::Order, type: :model do
225
218
  end
226
219
 
227
220
  it "does not call persist_order_address on the order's user for a temporary address" do
228
- allow(order).to receive_messages(ensure_available_shipping_rates: true)
229
-
230
221
  order.user = FactoryGirl.create(:user)
231
222
  order.temporary_address = true
232
223
  order.save!
@@ -506,6 +497,23 @@ describe Spree::Order, type: :model do
506
497
  end
507
498
  end
508
499
 
500
+ context "with a payment in the pending state" do
501
+ let(:order) { create :order_ready_to_complete }
502
+ let(:payment) { create :payment, state: "pending", amount: order.total }
503
+
504
+ before do
505
+ order.payments = [payment]
506
+ order.save!
507
+ end
508
+
509
+ it "allows the order to complete" do
510
+ expect { order.complete! }.
511
+ to change { order.state }.
512
+ from("confirm").
513
+ to("complete")
514
+ end
515
+ end
516
+
509
517
  context "exchange order completion" do
510
518
  before do
511
519
  order.email = 'spree@example.org'
@@ -628,27 +636,6 @@ describe Spree::Order, type: :model do
628
636
  end
629
637
  end
630
638
 
631
- context "subclassed order" do
632
- # This causes another test above to fail, but fixing this test should make
633
- # the other test pass
634
- class SubclassedOrder < Spree::Order
635
- checkout_flow do
636
- go_to_state :payment
637
- go_to_state :complete
638
- end
639
- end
640
-
641
- skip "should only call default transitions once when checkout_flow is redefined" do
642
- order = SubclassedOrder.new
643
- allow(order).to receive_messages payment_required?: true
644
- expect(order).to receive(:process_payments!).once
645
- order.state = "payment"
646
- order.next!
647
- assert_state_changed(order, 'payment', 'complete')
648
- expect(order.state).to eq("complete")
649
- end
650
- end
651
-
652
639
  context "re-define checkout flow" do
653
640
  before do
654
641
  @old_checkout_flow = Spree::Order.checkout_flow
@@ -794,7 +781,7 @@ describe Spree::Order, type: :model do
794
781
  let(:params) { {} }
795
782
 
796
783
  around do |example|
797
- ActiveSupport::Deprecation.silence { example.run }
784
+ Spree::Deprecation.silence { example.run }
798
785
  end
799
786
 
800
787
  it 'calls update_atributes without order params' do
@@ -868,7 +855,7 @@ describe Spree::Order, type: :model do
868
855
  let(:params) { ActionController::Parameters.new(order: { bad_param: 'okay' } ) }
869
856
 
870
857
  it 'does not let through unpermitted attributes' do
871
- expect(order).to receive(:assign_attributes).with({})
858
+ expect(order).to receive(:assign_attributes).with(ActionController::Parameters.new.permit!)
872
859
  order.update_from_params(params, permitted_params)
873
860
  end
874
861
 
@@ -876,7 +863,7 @@ describe Spree::Order, type: :model do
876
863
  let(:params) { ActionController::Parameters.new(order: { good_param: 'okay' } ) }
877
864
 
878
865
  it 'accepts permitted attributes' do
879
- expect(order).to receive(:assign_attributes).with({ "good_param" => 'okay' })
866
+ expect(order).to receive(:assign_attributes).with(ActionController::Parameters.new("good_param" => 'okay').permit!)
880
867
  order.update_from_params(params, permitted_params)
881
868
  end
882
869
  end
@@ -45,7 +45,6 @@ module Spree
45
45
  it "does not use failed payments" do
46
46
  payment_1 = create(:payment, amount: 50)
47
47
  payment_2 = create(:payment, amount: 50, state: 'failed')
48
- allow(order).to receive(:pending_payments).and_return([payment_1])
49
48
 
50
49
  expect(payment_2).not_to receive(:process!)
51
50
 
@@ -53,13 +52,6 @@ module Spree
53
52
  end
54
53
  end
55
54
 
56
- context "with no payments" do
57
- it "should return falsy" do
58
- expect(order).to receive_messages total: 100
59
- expect(order.process_payments!).to be_falsy
60
- end
61
- end
62
-
63
55
  context "with payments completed" do
64
56
  it "should not fail transitioning to complete when paid" do
65
57
  expect(order).to receive_messages total: 100, payment_total: 100
@@ -84,7 +76,7 @@ module Spree
84
76
 
85
77
  # For the reason of this test, please see spree/spree_gateway#132
86
78
  it "keeps source attributes on assignment" do
87
- ActiveSupport::Deprecation.silence do
79
+ Spree::Deprecation.silence do
88
80
  order.update_attributes(payments_attributes: [payment_attributes])
89
81
  end
90
82
  expect(order.unprocessed_payments.last.source.number).to be_present
@@ -118,13 +110,6 @@ module Spree
118
110
  expect(order.process_payments!).to be_truthy
119
111
  end
120
112
 
121
- # Regression spec for https://github.com/spree/spree/issues/5436
122
- it 'should raise an error if there are no payments to process' do
123
- allow(order).to receive_messages unprocessed_payments: []
124
- expect(payment).to_not receive(:process!)
125
- expect(order.process_payments!).to be_falsey
126
- end
127
-
128
113
  context "when a payment raises a GatewayError" do
129
114
  before { expect(payment).to receive(:process!).and_raise(Spree::Core::GatewayError) }
130
115
 
@@ -131,13 +131,12 @@ describe Spree::OrderCancellations do
131
131
 
132
132
  context "when rounding is required" do
133
133
  let(:order) { create(:order_ready_to_ship, line_items_count: 1, line_items_price: 0.83) }
134
- let(:line_item) { order.line_items.first }
134
+ let(:line_item) { order.line_items.to_a.first }
135
135
  let(:inventory_unit_1) { line_item.inventory_units[0] }
136
136
  let(:inventory_unit_2) { line_item.inventory_units[1] }
137
137
 
138
138
  before do
139
139
  order.contents.add(line_item.variant)
140
- line_item.reload
141
140
 
142
141
  # make the total $1.67 so it divides unevenly
143
142
  Spree::Adjustment.tax.create!(
@@ -153,7 +152,13 @@ describe Spree::OrderCancellations do
153
152
  it "generates the correct total amount" do
154
153
  order.cancellations.short_ship([inventory_unit_1])
155
154
  order.cancellations.short_ship([inventory_unit_2])
156
- expect(line_item.adjustments.non_tax.sum(:amount)).to eq(-1.67)
155
+ expect(line_item.adjustments.map(&:amount)).to match_array(
156
+ [
157
+ 0.01, # tax adjustment
158
+ -0.84, # short ship 1
159
+ -0.83, # short ship 2
160
+ ]
161
+ )
157
162
  expect(line_item.total).to eq 0
158
163
  end
159
164
  end
@@ -224,6 +224,54 @@ describe Spree::OrderContents, type: :model do
224
224
  }.to change { subject.order.total }
225
225
  end
226
226
 
227
+ context "given an order with existing addresses" do
228
+ let(:default_address) { create :address, state_code: "NY", zipcode: "17402" }
229
+ let(:order_with_address ) { create :order, ship_address: default_address, bill_address: default_address }
230
+
231
+ subject { described_class.new(order_with_address) }
232
+
233
+ context "when an address in a potentially different tax zone is supplied " do
234
+ let(:updated_address) { build :address, state_code: "AL", zipcode: "64092" }
235
+
236
+ let(:params) do
237
+ { ship_address_attributes: updated_address.value_attributes, bill_address_attributes: updated_address.value_attributes }
238
+ end
239
+
240
+ it "updates tax adjustments" do
241
+ expect(subject.order).to receive(:create_tax_charge!)
242
+ subject.update_cart params
243
+ end
244
+ end
245
+
246
+ context "when an address in potentially the same tax zone is supplied" do
247
+ let(:updated_address) { build :address, state_code: "NY", zipcode: "17402", firstname: 'Robert' }
248
+
249
+ let(:params) do
250
+ { ship_address_attributes: updated_address.value_attributes, bill_address_attributes: updated_address.value_attributes }
251
+ end
252
+
253
+ it "does not updates tax adjustments" do
254
+ expect(subject.order).not_to receive(:create_tax_charge!)
255
+ subject.update_cart params
256
+ end
257
+ end
258
+ end
259
+
260
+ context "given an order with no existing addresses" do
261
+ context "when an address is supplied" do
262
+ let(:updated_address) { build :address, state_code: "CA", zipcode: "14902" }
263
+
264
+ let(:params) do
265
+ { ship_address_attributes: updated_address.attributes, bill_address_attributes: updated_address.value_attributes }
266
+ end
267
+
268
+ it "does not updates tax adjustments" do
269
+ expect(subject.order).not_to receive(:create_tax_charge!)
270
+ subject.update_cart params
271
+ end
272
+ end
273
+ end
274
+
227
275
  context "submits item quantity 0" do
228
276
  let(:params) do
229
277
  { line_items_attributes: {
@@ -104,15 +104,17 @@ module Spree
104
104
 
105
105
  specify do
106
106
  subject.merge!(order_2)
107
- line_items = order_1.line_items.reload
108
- expect(line_items.count).to eq(2)
107
+
108
+ # Both in memory and in DB line items
109
+ expect(order_1.line_items.length).to eq(2)
110
+ expect(order_1.line_items.count).to eq(2)
109
111
 
110
112
  expect(order_1.item_count).to eq 2
111
- expect(order_1.item_total).to eq line_items.map(&:amount).sum
113
+ expect(order_1.item_total).to eq order_1.line_items.map(&:amount).sum
112
114
 
113
115
  # No guarantee on ordering of line items, so we do this:
114
- expect(line_items.pluck(:quantity)).to match_array([1, 1])
115
- expect(line_items.pluck(:variant_id)).to match_array([variant.id, variant_2.id])
116
+ expect(order_1.line_items.pluck(:quantity)).to match_array([1, 1])
117
+ expect(order_1.line_items.pluck(:variant_id)).to match_array([variant.id, variant_2.id])
116
118
  end
117
119
  end
118
120
 
@@ -126,6 +128,7 @@ module Spree
126
128
 
127
129
  it "should create errors with invalid line items" do
128
130
  variant_2.really_destroy!
131
+ order_2.line_items.to_a.first.reload # so that it registers as invalid
129
132
  subject.merge!(order_2)
130
133
  expect(order_1.errors.full_messages).not_to be_empty
131
134
  end
@@ -57,7 +57,7 @@ describe Spree::OrderShipping do
57
57
  let(:shipment) { order.shipments.to_a.first }
58
58
  let(:inventory_units) { shipment.inventory_units }
59
59
  let(:stock_location) { shipment.stock_location }
60
- let(:address) { shipment.address }
60
+ let(:address) { order.ship_address }
61
61
  let(:shipping_method) { shipment.shipping_method }
62
62
 
63
63
  it_behaves_like 'shipment shipping'
@@ -190,7 +190,7 @@ describe Spree::OrderShipping do
190
190
  order.shipping.ship(
191
191
  inventory_units: shipped_inventory,
192
192
  stock_location: shipment.stock_location,
193
- address: shipment.address,
193
+ address: order.ship_address,
194
194
  shipping_method: shipment.shipping_method
195
195
  )
196
196
  end
@@ -223,8 +223,7 @@ describe Spree::OrderShipping do
223
223
  let(:shipment) do
224
224
  FactoryGirl.create(
225
225
  :shipment,
226
- order: order,
227
- address: FactoryGirl.create(:address)
226
+ order: order
228
227
  )
229
228
  end
230
229
 
@@ -40,6 +40,28 @@ describe Spree::Order, type: :model do
40
40
  end
41
41
  end
42
42
 
43
+ describe "#cancel!" do
44
+ context "with captured store credit" do
45
+ let!(:store_credit_payment_method) { create(:store_credit_payment_method) }
46
+ let(:order_total) { 500.00 }
47
+ let(:store_credit) { create(:store_credit, amount: order_total) }
48
+ let(:order) { create(:order_with_line_items, user: store_credit.user, line_items_price: order_total) }
49
+
50
+ before do
51
+ order.add_store_credit_payments
52
+ order.finalize!
53
+ order.capture_payments!
54
+ end
55
+
56
+ subject { order.cancel! }
57
+
58
+ it "cancels the order" do
59
+ expect{ subject }.to change{ order.can_cancel? }.from(true).to(false)
60
+ expect(order).to be_canceled
61
+ end
62
+ end
63
+ end
64
+
43
65
  context "#canceled_by" do
44
66
  let(:admin_user) { create :admin_user }
45
67
  let(:order) { create :order }
@@ -1021,7 +1043,7 @@ describe Spree::Order, type: :model do
1021
1043
  let(:payment) { Spree::Payment.new(amount: 10) }
1022
1044
 
1023
1045
  around do |example|
1024
- ActiveSupport::Deprecation.silence do
1046
+ Spree::Deprecation.silence do
1025
1047
  example.run
1026
1048
  end
1027
1049
  end
@@ -1114,12 +1136,6 @@ describe Spree::Order, type: :model do
1114
1136
  end
1115
1137
  end
1116
1138
 
1117
- context "there are no other payments" do
1118
- it "adds an error to the model" do
1119
- expect(subject).to be false
1120
- expect(order.errors.full_messages).to include(Spree.t("store_credit.errors.unable_to_fund"))
1121
- end
1122
- end
1123
1139
  end
1124
1140
 
1125
1141
  context "there is enough store credit to pay for the entire order" do
@@ -1476,56 +1492,4 @@ describe Spree::Order, type: :model do
1476
1492
  end
1477
1493
  end
1478
1494
  end
1479
-
1480
- describe "#validate_payments_attributes" do
1481
- let(:attributes) { [ActionController::Parameters.new(payment_method_id: payment_method.id)] }
1482
- subject do
1483
- order.validate_payments_attributes(attributes)
1484
- end
1485
-
1486
- context "with empty array" do
1487
- let(:attributes) { [] }
1488
- it "doesn't error" do
1489
- subject
1490
- end
1491
- end
1492
-
1493
- context "with no payment method specified" do
1494
- let(:attributes) { [ActionController::Parameters.new({})] }
1495
- it "doesn't error" do
1496
- subject
1497
- end
1498
- end
1499
-
1500
- context "with valid payment method" do
1501
- let(:payment_method) { create(:check_payment_method) }
1502
- it "doesn't error" do
1503
- subject
1504
- end
1505
- end
1506
-
1507
- context "with inactive payment method" do
1508
- let(:payment_method) { create(:check_payment_method, active: false) }
1509
-
1510
- it "raises RecordNotFound" do
1511
- expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1512
- end
1513
- end
1514
-
1515
- context "with unavailable payment method" do
1516
- let(:payment_method) { create(:check_payment_method, display_on: "back_end") }
1517
-
1518
- it "raises RecordNotFound" do
1519
- expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1520
- end
1521
- end
1522
-
1523
- context "with soft-deleted payment method" do
1524
- let(:payment_method) { create(:check_payment_method, deleted_at: Time.current) }
1525
-
1526
- it "raises RecordNotFound" do
1527
- expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
1528
- end
1529
- end
1530
- end
1531
1495
  end
@@ -3,7 +3,6 @@ require 'spec_helper'
3
3
  module Spree
4
4
  RSpec.describe OrderUpdateAttributes do
5
5
  let(:order) { create(:order) }
6
- let(:payment_method) { create(:payment_method) }
7
6
  let(:request_env) { nil }
8
7
  let(:update) { described_class.new(order, attributes, request_env: request_env) }
9
8
 
@@ -26,10 +25,7 @@ module Spree
26
25
  let(:attributes) do
27
26
  {
28
27
  payments_attributes: [
29
- {
30
- payment_method_id: payment_method.id,
31
- source_attributes: attributes_for(:credit_card)
32
- }
28
+ { source_attributes: attributes_for(:credit_card) }
33
29
  ]
34
30
  }
35
31
  end
@@ -47,6 +47,7 @@ module Spree
47
47
  updater.update
48
48
  create(:adjustment, source: promotion_action, adjustable: order, order: order)
49
49
  create(:line_item, order: order, price: 10) # in addition to the two already created
50
+ order.line_items.reload # need to pick up the extra line item
50
51
  updater.update
51
52
  end
52
53
 
@@ -56,17 +57,13 @@ module Spree
56
57
  end
57
58
 
58
59
  it "update order adjustments" do
59
- # A line item will not have both additional and included tax,
60
- # so please just humour me for now.
61
- order.line_items.first.update_columns({
62
- adjustment_total: 10.05,
63
- additional_tax_total: 0.05,
64
- included_tax_total: 0.05
65
- })
66
- updater.update_adjustment_total
67
- expect(order.adjustment_total).to eq(10.05)
68
- expect(order.additional_tax_total).to eq(0.05)
69
- expect(order.included_tax_total).to eq(0.05)
60
+ create(:adjustment, adjustable: order, order: order, source: nil, amount: 10)
61
+
62
+ expect {
63
+ updater.update_adjustment_total
64
+ }.to change {
65
+ order.adjustment_total
66
+ }.from(0).to(10)
70
67
  end
71
68
  end
72
69
 
@@ -277,5 +274,36 @@ module Spree
277
274
  updater.update
278
275
  end
279
276
  end
277
+
278
+ describe 'updating in-memory items' do
279
+ let(:order) do
280
+ create(:order_with_line_items, line_items_count: 1, line_items_price: 10)
281
+ end
282
+ let(:line_item) { order.line_items.first }
283
+ let(:promotion) { create(:promotion, :with_line_item_adjustment, adjustment_rate: 1) }
284
+
285
+ it 'updates in-memory items' do
286
+ promotion.activate(order: order)
287
+
288
+ expect(line_item.promo_total).to eq(0)
289
+ expect(order.promo_total).to eq(0)
290
+
291
+ order.update!
292
+
293
+ expect(line_item.promo_total).to eq(-1)
294
+ expect(order.promo_total).to eq(-1)
295
+ end
296
+ end
297
+
298
+ context "with item with no adjustment and incorrect totals" do
299
+ let!(:line_item) { create(:line_item, order: order, price: 10) }
300
+
301
+ it "updates the totals" do
302
+ line_item.update!(adjustment_total: 100)
303
+ expect {
304
+ order.update!
305
+ }.to change { line_item.reload.adjustment_total }.from(100).to(0)
306
+ end
307
+ end
280
308
  end
281
309
  end