solidus_core 2.8.6 → 2.9.0.rc.1

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 (141) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/logo/solidus.svg +1 -18
  3. data/app/assets/images/logo/solidus_logo.png +0 -0
  4. data/app/mailers/spree/test_mailer.rb +2 -0
  5. data/app/models/concerns/spree/default_price.rb +1 -1
  6. data/app/models/concerns/spree/ransackable_attributes.rb +1 -1
  7. data/app/models/concerns/spree/user_reporting.rb +1 -1
  8. data/app/models/spree/billing_integration.rb +7 -2
  9. data/app/models/spree/country.rb +2 -0
  10. data/app/models/spree/customer_return.rb +1 -1
  11. data/app/models/spree/image.rb +2 -44
  12. data/app/models/spree/image/paperclip_attachment.rb +55 -0
  13. data/app/models/spree/inventory_unit.rb +0 -1
  14. data/app/models/spree/option_type.rb +2 -0
  15. data/app/models/spree/option_value.rb +1 -1
  16. data/app/models/spree/order.rb +8 -13
  17. data/app/models/spree/payment.rb +1 -1
  18. data/app/models/spree/payment_method.rb +8 -4
  19. data/app/models/spree/product.rb +1 -1
  20. data/app/models/spree/promotion.rb +18 -11
  21. data/app/models/spree/promotion/rules/first_order.rb +1 -3
  22. data/app/models/spree/promotion/rules/item_total.rb +9 -1
  23. data/app/models/spree/promotion/rules/one_use_per_user.rb +2 -2
  24. data/app/models/spree/promotion/rules/product.rb +3 -3
  25. data/app/models/spree/promotion/rules/taxon.rb +5 -8
  26. data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
  27. data/app/models/spree/promotion_handler/coupon.rb +19 -3
  28. data/app/models/spree/property.rb +2 -0
  29. data/app/models/spree/reimbursement.rb +5 -5
  30. data/app/models/spree/return_item.rb +6 -2
  31. data/app/models/spree/state.rb +6 -0
  32. data/app/models/spree/stock/location_filter/active.rb +14 -0
  33. data/app/models/spree/stock/location_filter/base.rb +43 -0
  34. data/app/models/spree/stock/simple_coordinator.rb +4 -1
  35. data/app/models/spree/stock_location.rb +2 -0
  36. data/app/models/spree/tax_category.rb +11 -0
  37. data/app/models/spree/taxon.rb +4 -11
  38. data/app/models/spree/taxon/paperclip_attachment.rb +21 -0
  39. data/app/models/spree/taxonomy.rb +2 -0
  40. data/app/models/spree/unit_cancel.rb +12 -1
  41. data/app/models/spree/variant.rb +1 -1
  42. data/app/models/spree/variant/pricing_options.rb +10 -0
  43. data/app/models/spree/wallet_payment_source.rb +26 -10
  44. data/app/models/spree/zone.rb +1 -1
  45. data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +3 -3
  46. data/config/locales/en.yml +26 -53
  47. data/db/default/spree/store_credit.rb +1 -0
  48. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +1 -1
  49. data/db/migrate/20170608074534_rename_bogus_gateways.rb +9 -8
  50. data/db/migrate/20190220093635_drop_spree_store_credit_update_reasons.rb +19 -0
  51. data/lib/generators/spree/install/install_generator.rb +0 -3
  52. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +3 -0
  53. data/lib/solidus/migrations/rename_gateways.rb +2 -0
  54. data/lib/spree/app_configuration.rb +24 -0
  55. data/lib/spree/core.rb +1 -0
  56. data/lib/spree/core/controller_helpers/pricing.rb +1 -4
  57. data/lib/spree/core/controller_helpers/strong_parameters.rb +7 -21
  58. data/lib/spree/core/engine.rb +5 -0
  59. data/lib/spree/core/importer/order.rb +1 -3
  60. data/lib/spree/core/stock_configuration.rb +5 -0
  61. data/lib/spree/core/version.rb +3 -1
  62. data/lib/spree/deprecation.rb +50 -0
  63. data/lib/spree/event.rb +111 -0
  64. data/lib/spree/event/adapters/active_support_notifications.rb +35 -0
  65. data/lib/spree/event/configuration.rb +17 -0
  66. data/lib/spree/event/processors/mailer_processor.rb +27 -0
  67. data/lib/spree/event/subscriber.rb +84 -0
  68. data/lib/spree/permitted_attributes.rb +7 -76
  69. data/lib/spree/testing_support/capybara_ext.rb +15 -0
  70. data/lib/spree/testing_support/common_rake.rb +1 -1
  71. data/lib/spree/testing_support/dummy_app.rb +3 -10
  72. data/lib/spree/testing_support/factories/promotion_factory.rb +10 -0
  73. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -0
  74. data/lib/spree/testing_support/preferences.rb +62 -0
  75. data/lib/tasks/email.rake +2 -0
  76. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +4 -0
  77. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +2 -0
  78. data/lib/tasks/migrations/migrate_user_addresses.rake +3 -0
  79. data/lib/tasks/migrations/rename_gateways.rake +2 -0
  80. data/lib/tasks/order_capturing.rake +2 -0
  81. data/spec/helpers/base_helper_spec.rb +3 -3
  82. data/spec/helpers/products_helper_spec.rb +2 -2
  83. data/spec/{models → lib}/spree/app_configuration_spec.rb +11 -1
  84. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +13 -0
  85. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +1 -8
  86. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +1 -1
  87. data/spec/lib/spree/core/testing_support/preferences_spec.rb +33 -0
  88. data/spec/lib/spree/event/subscriber_spec.rb +85 -0
  89. data/spec/lib/spree/event_spec.rb +92 -0
  90. data/spec/lib/spree/money_spec.rb +3 -9
  91. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +5 -3
  92. data/spec/mailers/order_mailer_spec.rb +1 -1
  93. data/spec/mailers/test_mailer_spec.rb +3 -1
  94. data/spec/models/spree/address_spec.rb +5 -4
  95. data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
  96. data/spec/models/spree/country_spec.rb +5 -5
  97. data/spec/models/spree/customer_return_spec.rb +1 -1
  98. data/spec/models/spree/order/checkout_spec.rb +3 -7
  99. data/spec/models/spree/order/finalizing_spec.rb +1 -1
  100. data/spec/models/spree/order/payment_spec.rb +3 -3
  101. data/spec/models/spree/order_inventory_spec.rb +1 -1
  102. data/spec/models/spree/order_spec.rb +67 -2
  103. data/spec/models/spree/order_updater_spec.rb +2 -2
  104. data/spec/models/spree/payment_spec.rb +12 -0
  105. data/spec/models/spree/product_spec.rb +3 -3
  106. data/spec/models/spree/promotion/rules/first_order_spec.rb +13 -3
  107. data/spec/models/spree/promotion/rules/item_total_spec.rb +15 -0
  108. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +10 -0
  109. data/spec/models/spree/promotion/rules/product_spec.rb +15 -0
  110. data/spec/models/spree/promotion/rules/taxon_spec.rb +59 -8
  111. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +5 -0
  112. data/spec/models/spree/promotion_handler/shipping_spec.rb +1 -1
  113. data/spec/models/spree/promotion_spec.rb +80 -0
  114. data/spec/models/spree/reimbursement_spec.rb +3 -2
  115. data/spec/models/spree/return_item_spec.rb +9 -0
  116. data/spec/models/spree/shipment_spec.rb +3 -3
  117. data/spec/models/spree/stock/availability_spec.rb +1 -1
  118. data/spec/models/spree/stock/estimator_spec.rb +5 -7
  119. data/spec/models/spree/stock/location_filter/active_spec.rb +22 -0
  120. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +4 -2
  121. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +3 -1
  122. data/spec/models/spree/stock/quantifier_spec.rb +1 -1
  123. data/spec/models/spree/stock/simple_coordinator_spec.rb +5 -0
  124. data/spec/models/spree/stock_item_spec.rb +3 -2
  125. data/spec/models/spree/stock_movement_spec.rb +1 -1
  126. data/spec/models/spree/store_credit_spec.rb +1 -1
  127. data/spec/models/spree/tax/order_adjuster_spec.rb +1 -1
  128. data/spec/models/spree/tax/taxation_integration_spec.rb +1 -1
  129. data/spec/models/spree/tax_category_spec.rb +21 -0
  130. data/spec/models/spree/taxon_spec.rb +28 -0
  131. data/spec/models/spree/unit_cancel_spec.rb +41 -0
  132. data/spec/models/spree/user_spec.rb +3 -3
  133. data/spec/models/spree/variant/pricing_options_spec.rb +23 -0
  134. data/spec/models/spree/variant/vat_price_generator_spec.rb +1 -1
  135. data/spec/models/spree/variant_spec.rb +11 -8
  136. data/spec/models/spree/wallet_payment_source_spec.rb +35 -6
  137. data/spec/models/spree/wallet_spec.rb +1 -1
  138. data/spec/spec_helper.rb +0 -4
  139. data/spec/support/concerns/default_price.rb +8 -0
  140. metadata +18 -5
  141. data/spec/lib/spree/permitted_attributes_spec.rb +0 -41
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'spree/event'
5
+
6
+ RSpec.describe Spree::Event do
7
+ let(:subscription_name) { 'foo_bar' }
8
+ let(:item) { spy('object') }
9
+ let(:notifier) { ActiveSupport::Notifications.notifier }
10
+
11
+ subject { described_class }
12
+
13
+ it 'has default adapter' do
14
+ expect(subject.adapter).to eql Spree::Event::Adapters::ActiveSupportNotifications
15
+ end
16
+
17
+ before do
18
+ # ActiveSupport::Notifications does not provide an interface to clean all
19
+ # subscribers at once, so some low level brittle code is required
20
+ @old_subscribers = notifier.instance_variable_get('@subscribers').dup
21
+ @old_listeners = notifier.instance_variable_get('@listeners_for').dup
22
+ notifier.instance_variable_get('@subscribers').clear
23
+ notifier.instance_variable_get('@listeners_for').clear
24
+ end
25
+
26
+ after do
27
+ notifier.instance_variable_set '@subscribers', @old_subscribers
28
+ notifier.instance_variable_set '@listeners_for', @old_listeners
29
+ end
30
+
31
+ context 'with the default adapter' do
32
+ describe '#listeners' do
33
+ context 'when there is no subscription' do
34
+ it { expect(subject.listeners).to be_empty }
35
+
36
+ context 'after adding a subscription' do
37
+ before do
38
+ Spree::Event.subscribe(subscription_name) { item.do_something }
39
+ end
40
+
41
+ it 'includes the new subscription with custom suffix' do
42
+ expect(subject.listeners).to be_present
43
+ subscription_listeners = subject.listeners["#{subscription_name}.spree"]
44
+ expect(subscription_listeners).to be_a Array
45
+ expect(subscription_listeners.first).to be_a ActiveSupport::Notifications::Fanout::Subscribers::Timed
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ context 'subscriptions' do
52
+ describe '#subscribe' do
53
+ it 'can subscribe to events' do
54
+ Spree::Event.subscribe(subscription_name) { item.do_something }
55
+ Spree::Event.fire subscription_name
56
+ expect(item).to have_received :do_something
57
+ end
58
+ end
59
+
60
+ describe '#unsubscribe' do
61
+ context 'when unsubscribing using a subscription object as reference' do
62
+ let!(:subscription) { Spree::Event.subscribe(subscription_name) { item.do_something } }
63
+
64
+ before do
65
+ Spree::Event.subscribe(subscription_name) { item.do_something_else }
66
+ end
67
+
68
+ it 'can unsubscribe from single event by object' do
69
+ subject.unsubscribe subscription
70
+ Spree::Event.fire subscription_name
71
+ expect(item).not_to have_received :do_something
72
+ expect(item).to have_received :do_something_else
73
+ end
74
+ end
75
+
76
+ context 'when unsubscribing using a string as reference' do
77
+ before do
78
+ Spree::Event.subscribe(subscription_name) { item.do_something }
79
+ Spree::Event.subscribe(subscription_name) { item.do_something_else }
80
+ end
81
+
82
+ it 'can unsubscribe from multiple events with the same name' do
83
+ subject.unsubscribe subscription_name
84
+ Spree::Event.fire subscription_name
85
+ expect(item).not_to have_received :do_something
86
+ expect(item).not_to have_received :do_something_else
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -4,9 +4,7 @@ require 'rails_helper'
4
4
 
5
5
  RSpec.describe Spree::Money do
6
6
  before do
7
- configure_spree_preferences do |config|
8
- config.currency = "USD"
9
- end
7
+ stub_spree_preferences(currency: "USD")
10
8
  end
11
9
 
12
10
  describe '#initialize' do
@@ -155,9 +153,7 @@ RSpec.describe Spree::Money do
155
153
 
156
154
  context "JPY" do
157
155
  before do
158
- configure_spree_preferences do |config|
159
- config.currency = "JPY"
160
- end
156
+ stub_spree_preferences(currency: "JPY")
161
157
  end
162
158
 
163
159
  it "formats correctly" do
@@ -168,9 +164,7 @@ RSpec.describe Spree::Money do
168
164
 
169
165
  context "EUR" do
170
166
  before do
171
- configure_spree_preferences do |config|
172
- config.currency = "EUR"
173
- end
167
+ stub_spree_preferences(currency: "EUR")
174
168
  end
175
169
 
176
170
  # Regression test for https://github.com/spree/spree/issues/2634
@@ -11,9 +11,11 @@ RSpec.describe 'solidus:migrations:migrate_shipping_rate_taxes' do
11
11
  )
12
12
 
13
13
  it 'runs' do
14
- expect { task.invoke }.to output(
15
- "Adding persisted tax notes to historic shipping rates ... Success.\n"
16
- ).to_stdout
14
+ Spree::Deprecation.silence do
15
+ expect { task.invoke }.to output(
16
+ "Adding persisted tax notes to historic shipping rates ... Success.\n"
17
+ ).to_stdout
18
+ end
17
19
  end
18
20
  end
19
21
  end
@@ -109,7 +109,7 @@ RSpec.describe Spree::OrderMailer, type: :mailer do
109
109
 
110
110
  context "with preference :send_core_emails set to false" do
111
111
  it "sends no email" do
112
- Spree::Config.send_core_emails = false
112
+ stub_spree_preferences(send_core_emails: false)
113
113
  message = Spree::OrderMailer.confirm_email(order)
114
114
  expect(message.body).to be_blank
115
115
  end
@@ -6,6 +6,8 @@ RSpec.describe Spree::TestMailer, type: :mailer do
6
6
  let(:user) { create(:user) }
7
7
 
8
8
  it "confirm_email accepts a user id as an alternative to a User object" do
9
- Spree::TestMailer.test_email('test@example.com')
9
+ Spree::Deprecation.silence do
10
+ Spree::TestMailer.test_email('test@example.com')
11
+ end
10
12
  end
11
13
  end
@@ -28,8 +28,9 @@ RSpec.describe Spree::Address, type: :model do
28
28
 
29
29
  context 'address does not require state' do
30
30
  before do
31
- Spree::Config.address_requires_state = false
31
+ stub_spree_preferences(address_requires_state: false)
32
32
  end
33
+
33
34
  it "address_requires_state preference is false" do
34
35
  address.state = nil
35
36
  address.state_name = nil
@@ -39,7 +40,7 @@ RSpec.describe Spree::Address, type: :model do
39
40
 
40
41
  context 'address requires state' do
41
42
  before do
42
- Spree::Config.address_requires_state = true
43
+ stub_spree_preferences(address_requires_state: true)
43
44
  end
44
45
 
45
46
  it "state_name is not nil and country does not have any states" do
@@ -145,7 +146,7 @@ RSpec.describe Spree::Address, type: :model do
145
146
 
146
147
  context 'has a default country' do
147
148
  before do
148
- Spree::Config[:default_country_iso] = default_country.iso
149
+ stub_spree_preferences(default_country_iso: default_country.iso)
149
150
  end
150
151
 
151
152
  it "sets up a new record with Spree::Config[:default_country_iso]" do
@@ -155,7 +156,7 @@ RSpec.describe Spree::Address, type: :model do
155
156
 
156
157
  # Regression test for https://github.com/spree/spree/issues/1142
157
158
  it "raises ActiveRecord::RecordNotFound if :default_country_iso is set to an invalid value" do
158
- Spree::Config[:default_country_iso] = "00"
159
+ stub_spree_preferences(default_country_iso: "00")
159
160
  expect {
160
161
  Spree::Address.build_default.country
161
162
  }.to raise_error(ActiveRecord::RecordNotFound)
@@ -256,7 +256,7 @@ module Spree
256
256
 
257
257
  context "when automatic_default_address preference is at a default of true" do
258
258
  before do
259
- Spree::Config.automatic_default_address = true
259
+ stub_spree_preferences(automatic_default_address: true)
260
260
  expect(user).to receive(:save_in_address_book).with(kind_of(Hash), true)
261
261
  expect(user).to receive(:save_in_address_book).with(kind_of(Hash), false)
262
262
  end
@@ -269,7 +269,7 @@ module Spree
269
269
 
270
270
  context "when automatic_default_address preference is false" do
271
271
  before do
272
- Spree::Config.automatic_default_address = false
272
+ stub_spree_preferences(automatic_default_address: false)
273
273
  expect(user).to receive(:save_in_address_book).with(kind_of(Hash), false).twice
274
274
  # and not the optional 2nd argument
275
275
  end
@@ -283,7 +283,7 @@ module Spree
283
283
  context "when address is nil" do
284
284
  context "when automatic_default_address preference is at a default of true" do
285
285
  before do
286
- Spree::Config.automatic_default_address = true
286
+ stub_spree_preferences(automatic_default_address: true)
287
287
  expect(user).to receive(:save_in_address_book).with(kind_of(Hash), true).once
288
288
  end
289
289
 
@@ -305,7 +305,7 @@ module Spree
305
305
 
306
306
  context "when automatic_default_address preference is false" do
307
307
  before do
308
- Spree::Config.automatic_default_address = false
308
+ stub_spree_preferences(automatic_default_address: false)
309
309
  expect(user).to receive(:save_in_address_book).with(kind_of(Hash), false).once
310
310
  end
311
311
 
@@ -13,7 +13,7 @@ RSpec.describe Spree::Country, type: :model do
13
13
 
14
14
  context 'with the configuration setting an existing legacy default country ID' do
15
15
  before do
16
- Spree::Config[:default_country_id] = 2
16
+ stub_spree_preferences(default_country_id: 2)
17
17
  end
18
18
 
19
19
  subject(:default_country) do
@@ -32,7 +32,7 @@ RSpec.describe Spree::Country, type: :model do
32
32
 
33
33
  context 'with the configuration setting a non-existing legacy default country ID' do
34
34
  before do
35
- Spree::Config[:default_country_id] = 0
35
+ stub_spree_preferences(default_country_id: 0)
36
36
  end
37
37
 
38
38
  subject(:default_country) do
@@ -52,7 +52,7 @@ RSpec.describe Spree::Country, type: :model do
52
52
  end
53
53
 
54
54
  context 'with the configuration setting an non-existing ISO code' do
55
- before { Spree::Config[:default_country_iso] = "ZZ" }
55
+ before { stub_spree_preferences(default_country_iso: "ZZ") }
56
56
 
57
57
  it 'raises a Record not Found error' do
58
58
  expect { described_class.default }.to raise_error(ActiveRecord::RecordNotFound)
@@ -71,7 +71,7 @@ RSpec.describe Spree::Country, type: :model do
71
71
  let!(:checkout_zone) { create(:zone, name: 'Checkout Zone', countries: [united_states, canada]) }
72
72
 
73
73
  before do
74
- Spree::Config.checkout_zone = checkout_zone.name
74
+ stub_spree_preferences(checkout_zone: checkout_zone.name)
75
75
  end
76
76
 
77
77
  context 'with no arguments' do
@@ -104,7 +104,7 @@ RSpec.describe Spree::Country, type: :model do
104
104
  let!(:checkout_zone) { create(:zone, name: 'Checkout Zone', states: [state]) }
105
105
 
106
106
  before do
107
- Spree::Config[:checkout_zone] = checkout_zone.name
107
+ stub_spree_preferences(checkout_zone: checkout_zone.name)
108
108
  end
109
109
 
110
110
  context 'with no arguments' do
@@ -189,7 +189,7 @@ RSpec.describe Spree::CustomerReturn, type: :model do
189
189
 
190
190
  context 'with Config.track_inventory_levels == false' do
191
191
  before do
192
- Spree::Config.track_inventory_levels = false
192
+ stub_spree_preferences(track_inventory_levels: false)
193
193
  expect(Spree::StockItem).not_to receive(:find_by)
194
194
  expect(Spree::StockMovement).not_to receive(:create!)
195
195
  end
@@ -359,6 +359,7 @@ RSpec.describe Spree::Order, type: :model do
359
359
 
360
360
  before do
361
361
  user = create(:user, email: 'spree@example.org', bill_address: user_bill_address)
362
+ default_credit_card.update(user: user)
362
363
  wallet_payment_source = user.wallet.add(default_credit_card)
363
364
  user.wallet.default_wallet_payment_source = wallet_payment_source
364
365
  order.user = user
@@ -497,12 +498,7 @@ RSpec.describe Spree::Order, type: :model do
497
498
 
498
499
  context "with a payment in the pending state" do
499
500
  let(:order) { create :order_ready_to_complete }
500
- let(:payment) { create :payment, state: "pending", amount: order.total }
501
-
502
- before do
503
- order.payments = [payment]
504
- order.save!
505
- end
501
+ let(:payment) { create :payment, order: order, state: "pending", amount: order.total }
506
502
 
507
503
  it "allows the order to complete" do
508
504
  expect { order.complete! }.
@@ -542,7 +538,7 @@ RSpec.describe Spree::Order, type: :model do
542
538
  order.user = FactoryBot.create(:user)
543
539
  order.store = FactoryBot.create(:store)
544
540
  order.email = 'spree@example.org'
545
- order.payments << FactoryBot.create(:payment)
541
+ order.payments << FactoryBot.create(:payment, order: order)
546
542
 
547
543
  # make sure we will actually capture a payment
548
544
  allow(order).to receive_messages(payment_required?: true)
@@ -44,7 +44,7 @@ RSpec.describe Spree::Order, type: :model do
44
44
  end
45
45
 
46
46
  it "should not send duplicate confirmation emails" do
47
- allow(order).to receive_messages(confirmation_delivered?: true)
47
+ order.update(confirmation_delivered: true)
48
48
  expect(Spree::OrderMailer).not_to receive(:confirm_email)
49
49
  order.finalize!
50
50
  end
@@ -12,7 +12,7 @@ module Spree
12
12
 
13
13
  before do
14
14
  # So that Payment#purchase! is called during processing
15
- Spree::Config[:auto_capture] = true
15
+ stub_spree_preferences(auto_capture: true)
16
16
  end
17
17
 
18
18
  let(:payment_method) { create(:credit_card_payment_method) }
@@ -147,12 +147,12 @@ module Spree
147
147
  before { expect(payment).to receive(:process!).and_raise(Spree::Core::GatewayError) }
148
148
 
149
149
  it "should return true when configured to allow checkout on gateway failures" do
150
- Spree::Config.set allow_checkout_on_gateway_error: true
150
+ stub_spree_preferences(allow_checkout_on_gateway_error: true)
151
151
  expect(order.process_payments!).to be true
152
152
  end
153
153
 
154
154
  it "should return false when not configured to allow checkout on gateway failures" do
155
- Spree::Config.set allow_checkout_on_gateway_error: false
155
+ stub_spree_preferences(allow_checkout_on_gateway_error: false)
156
156
  expect(order.process_payments!).to be false
157
157
  end
158
158
  end
@@ -72,7 +72,7 @@ RSpec.describe Spree::OrderInventory, type: :model do
72
72
  context "store doesnt track inventory" do
73
73
  let(:new_quantity) { 1 }
74
74
 
75
- before { Spree::Config.track_inventory_levels = false }
75
+ before { stub_spree_preferences(track_inventory_levels: false) }
76
76
 
77
77
  it "creates on hand inventory units" do
78
78
  variant.stock_items.each(&:really_destroy!)
@@ -15,6 +15,53 @@ RSpec.describe Spree::Order, type: :model do
15
15
  end
16
16
  let(:code) { promotion.codes.first }
17
17
 
18
+ describe '#finalize!' do
19
+ context 'with event notifications' do
20
+ it 'sends an email' do
21
+ expect(Spree::Config.order_mailer_class).to receive(:confirm_email).and_call_original
22
+ order.finalize!
23
+ end
24
+
25
+ it 'marks the order as confirmation_delivered' do
26
+ expect do
27
+ order.finalize!
28
+ end.to change(order, :confirmation_delivered).to true
29
+ end
30
+
31
+ # These specs show how notifications can be removed, one at a time or
32
+ # all the ones set by MailerProcessor module
33
+ context 'when removing the default email notification subscription' do
34
+ before do
35
+ Spree::Event.unsubscribe Spree::Event::Processors::MailerProcessor.order_finalized_handler
36
+ end
37
+
38
+ after do
39
+ Spree::Event::Processors::MailerProcessor.subscribe!
40
+ end
41
+
42
+ it 'does not send the email' do
43
+ expect(Spree::Config.order_mailer_class).not_to receive(:confirm_email)
44
+ order.finalize!
45
+ end
46
+ end
47
+
48
+ context 'when removing all the email notification subscriptions' do
49
+ before do
50
+ Spree::Event::Processors::MailerProcessor.unsubscribe!
51
+ end
52
+
53
+ after do
54
+ Spree::Event::Processors::MailerProcessor.subscribe!
55
+ end
56
+
57
+ it 'does not send the email' do
58
+ expect(Spree::Config.order_mailer_class).not_to receive(:confirm_email)
59
+ order.finalize!
60
+ end
61
+ end
62
+ end
63
+ end
64
+
18
65
  context '#store' do
19
66
  it { is_expected.to respond_to(:store) }
20
67
 
@@ -135,7 +182,6 @@ RSpec.describe Spree::Order, type: :model do
135
182
  before { allow(order).to receive_messages shipments: [shipment] }
136
183
 
137
184
  it "update and persist totals" do
138
- expect(shipment).to receive :update_amounts
139
185
  expect(order.updater).to receive :update
140
186
 
141
187
  Spree::Deprecation.silence do
@@ -462,7 +508,7 @@ RSpec.describe Spree::Order, type: :model do
462
508
  let(:order) { build(:order, ship_address: ship_address, bill_address: bill_address, store: store) }
463
509
  let(:store) { build(:store) }
464
510
 
465
- before { Spree::Config[:tax_using_ship_address] = tax_using_ship_address }
511
+ before { stub_spree_preferences(tax_using_ship_address: tax_using_ship_address) }
466
512
  subject { order.tax_address }
467
513
 
468
514
  context "when the order has no addresses" do
@@ -1470,6 +1516,25 @@ RSpec.describe Spree::Order, type: :model do
1470
1516
  end
1471
1517
  end
1472
1518
 
1519
+ describe "#record_ip_address" do
1520
+ let(:ip_address) { "127.0.0.1" }
1521
+
1522
+ subject { -> { order.record_ip_address(ip_address) } }
1523
+
1524
+ it "updates the last used IP address" do
1525
+ expect(subject).to change(order, :last_ip_address).to(ip_address)
1526
+ end
1527
+
1528
+ # IP address tracking should not raise validation exceptions
1529
+ context "with an invalid order" do
1530
+ before { allow(order).to receive(:valid?).and_return(false) }
1531
+
1532
+ it "updates the IP address" do
1533
+ expect(subject).to change(order, :last_ip_address).to(ip_address)
1534
+ end
1535
+ end
1536
+ end
1537
+
1473
1538
  describe "#display_order_total_after_store_credit" do
1474
1539
  let(:order_total_after_store_credit) { 10.00 }
1475
1540