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
@@ -12,6 +12,21 @@ module Spree
12
12
  fill_in field, options
13
13
  end
14
14
 
15
+ def fill_in_with_force(locator, with:)
16
+ if Capybara.current_driver == Capybara.javascript_driver
17
+ field_id = find_field(locator)[:id]
18
+ page.execute_script <<-JS
19
+ var field = document.getElementById('#{field_id}');
20
+ field.value = '#{with}';
21
+
22
+ var event = new Event('change', { bubbles: true });
23
+ field.dispatchEvent(event);
24
+ JS
25
+ else
26
+ fill_in locator, with: with
27
+ end
28
+ end
29
+
15
30
  def within_row(num, &block)
16
31
  within("table.index tbody tr:nth-of-type(#{num})", &block)
17
32
  end
@@ -24,7 +24,7 @@ namespace :common do
24
24
  begin
25
25
  require "generators/#{ENV['LIB_NAME']}/install/install_generator"
26
26
  puts 'Running extension installation generator...'
27
- "#{ENV['LIB_NAME'].camelize}::Generators::InstallGenerator".constantize.start(["--auto-run-migrations"])
27
+ "#{ENV['LIB_NAMESPACE'] || ENV['LIB_NAME'].camelize}::Generators::InstallGenerator".constantize.start(["--auto-run-migrations"])
28
28
  rescue LoadError
29
29
  # No extension generator to run
30
30
  end
@@ -12,14 +12,11 @@ Rails.env = 'test'
12
12
 
13
13
  require 'solidus_core'
14
14
 
15
- # @private
16
- def forgery_protected_by_default?
17
- Gem::Version.new(Rails.version) >= Gem::Version.new('5.2')
18
- end
15
+ RAILS_52_OR_ABOVE = Gem::Version.new(Rails.version) >= Gem::Version.new('5.2')
19
16
 
20
17
  # @private
21
18
  class ApplicationController < ActionController::Base
22
- if !forgery_protected_by_default?
19
+ unless RAILS_52_OR_ABOVE
23
20
  protect_from_forgery with: :exception
24
21
  end
25
22
  end
@@ -65,12 +62,8 @@ module DummyApp
65
62
  config.active_support.deprecation = :stderr
66
63
  config.secret_key_base = 'SECRET_TOKEN'
67
64
 
68
- if forgery_protected_by_default?
65
+ if RAILS_52_OR_ABOVE
69
66
  config.action_controller.default_protect_from_forgery = true
70
- end
71
-
72
- if config.active_record.sqlite3
73
- # Rails >= 5.2
74
67
  config.active_record.sqlite3.represent_boolean_as_integer = true
75
68
  end
76
69
 
@@ -60,5 +60,15 @@ FactoryBot.define do
60
60
  end
61
61
  end
62
62
  factory :promotion_with_item_total_rule, traits: [:with_item_total_rule]
63
+ trait :with_first_order_rule do
64
+ after(:create) do |promotion, _evaluator|
65
+ rule = Spree::Promotion::Rules::FirstOrder.create!(
66
+ promotion: promotion,
67
+ )
68
+ promotion.rules << rule
69
+ promotion.save!
70
+ end
71
+ end
72
+ factory :promotion_with_first_order_rule, traits: [:with_first_order_rule]
63
73
  end
64
74
  end
@@ -6,6 +6,7 @@ require 'spree/testing_support/factories/return_authorization_factory'
6
6
 
7
7
  FactoryBot.define do
8
8
  factory :return_item, class: 'Spree::ReturnItem' do
9
+ skip_customer_return_processing { true }
9
10
  association(:inventory_unit, factory: :inventory_unit, state: :shipped)
10
11
  association(:return_reason, factory: :return_reason)
11
12
  return_authorization do |_return_item|
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'spree/deprecation'
4
+
3
5
  module Spree
4
6
  module TestingSupport
5
7
  module Preferences
@@ -10,6 +12,7 @@ module Spree
10
12
  # config.track_inventory_levels = false
11
13
  # end
12
14
  #
15
+ # @deprecated
13
16
  def reset_spree_preferences(&config_block)
14
17
  Spree::Config.instance_variables.each { |iv| Spree::Config.remove_instance_variable(iv) }
15
18
  Spree::Config.preference_store = Spree::Config.default_preferences
@@ -21,6 +24,8 @@ module Spree
21
24
  configure_spree_preferences(&config_block) if block_given?
22
25
  end
23
26
 
27
+ deprecate :reset_spree_preferences, deprecator: Spree::Deprecation
28
+
24
29
  def configure_spree_preferences
25
30
  yield(Spree::Config) if block_given?
26
31
  end
@@ -29,6 +34,63 @@ module Spree
29
34
  find("#preferences_#{preference}")['checked'].should be false
30
35
  Spree::Config[preference].should be false
31
36
  end
37
+
38
+ # This is the preferred way for changing temporarily Spree preferences during
39
+ # tests via stubs, without changing the actual values stored in Spree::Config.
40
+ #
41
+ # By using stubs no global preference change will leak outside the lifecycle
42
+ # of each spec example, avoiding possible unpredictable side effects.
43
+ #
44
+ # This method may be used for stubbing one or more different preferences
45
+ # at the same time.
46
+ #
47
+ # @param [Hash] preferences names and values to be stubbed
48
+ #
49
+ # @example Stubs `currency` and `track_inventory_levels` preferences
50
+ # stub_spree_preferences(currency: 'EUR', track_inventory_levels: false)
51
+ # expect(Spree::Config.currency).to eql 'EUR'
52
+ #
53
+ # @see https://github.com/solidusio/solidus/issues/3219
54
+ # Solidus #3219 for more details and motivations.
55
+ def stub_spree_preferences(preferences)
56
+ preferences.each do |name, value|
57
+ if Spree::Config.method(:[]).owner >= Spree::Config.class
58
+ allow(Spree::Config).to receive(:[]).and_call_original
59
+ end
60
+ allow(Spree::Config).to receive(:[]).with(name) { value }
61
+ allow(Spree::Config).to receive(name) { value }
62
+ end
63
+ end
64
+
65
+ # This method allows to temporarily switch to an unfrozen Spree::Config preference
66
+ # store with all proper preferences values set.
67
+ #
68
+ # It should be used sparingly, only when `stub_spree_preferences` would not work.
69
+ #
70
+ # @example Temporarily switch to an unfrozen store and change some preferences:
71
+ # with_unfrozen_spree_preference_store do
72
+ # Spree::Config.currency = 'EUR'
73
+ # Spree::Config.track_inventory_levels = false
74
+ #
75
+ # expect(Spree::Config.currency).to eql 'EUR'
76
+ # end
77
+ # @see Spree::TestingSupport::Preferences#stub_spree_preferences
78
+ def with_unfrozen_spree_preference_store
79
+ frozen_store = Spree::Config.preference_store
80
+ Spree::Config.preference_store = Spree::Config[:unfrozen_preference_store].dup
81
+ yield
82
+ ensure
83
+ Spree::Config.preference_store = frozen_store
84
+ end
32
85
  end
33
86
  end
34
87
  end
88
+
89
+ RSpec.configure do |config|
90
+ config.before :suite do
91
+ # keep a copy of the original unfrozen preference_store for later use:
92
+ Spree::AppConfiguration.preference :unfrozen_preference_store, :hash
93
+ Spree::Config.unfrozen_preference_store = Spree::Config.preference_store.dup
94
+ Spree::Config.preference_store.freeze
95
+ end
96
+ end
@@ -3,6 +3,8 @@
3
3
  namespace :email do
4
4
  desc 'Sends test email to specified address - Example: EMAIL=spree@example.com bundle exec rake email:test'
5
5
  task test: :environment do
6
+ Spree::Deprecation.warn("rake email:test has been deprecated and will be removed with Solidus 3.0")
7
+
6
8
  raise ArgumentError, "Must pass EMAIL environment variable. Example: EMAIL=spree@example.com bundle exec rake email:test" unless ENV['EMAIL'].present?
7
9
  Spree::TestMailer.test_email(ENV['EMAIL']).deliver!
8
10
  end
@@ -13,6 +13,8 @@ namespace 'spree:migrations:copy_order_bill_address_to_credit_card' do
13
13
  # This task should be safe to run multiple times.
14
14
 
15
15
  task up: :environment do
16
+ Spree::Deprecation.warn("rake spree:migrations:copy_order_bill_address_to_credit_card:up has been deprecated and will be removed with Solidus 3.0.")
17
+
16
18
  if Spree::CreditCard.connection.adapter_name =~ /postgres/i
17
19
  postgres_copy
18
20
  else
@@ -21,6 +23,8 @@ namespace 'spree:migrations:copy_order_bill_address_to_credit_card' do
21
23
  end
22
24
 
23
25
  task down: :environment do
26
+ Spree::Deprecation.warn("rake spree:migrations:copy_order_bill_address_to_credit_card:down has been deprecated and will be removed with Solidus 3.0.")
27
+
24
28
  Spree::CreditCard.update_all(address_id: nil)
25
29
  end
26
30
 
@@ -4,6 +4,8 @@ namespace :solidus do
4
4
  namespace :migrations do
5
5
  namespace :migrate_shipping_rate_taxes do
6
6
  task up: :environment do
7
+ Spree::Deprecation.warn("rake spree:migrations:migrate_shipping_rate_taxes:up has been deprecated and will be removed with Solidus 3.0.")
8
+
7
9
  print "Adding persisted tax notes to historic shipping rates ... "
8
10
  Spree::ShippingRate.where.not(tax_rate_id: nil).find_each do |shipping_rate|
9
11
  tax_rate = Spree::TaxRate.unscoped.find(shipping_rate.tax_rate_id)
@@ -10,6 +10,8 @@ namespace 'spree:migrations:migrate_user_addresses' do
10
10
  # to the user's address book. This will catch up all the historical data.
11
11
 
12
12
  task up: :environment do
13
+ Spree::Deprecation.warn("rake spree:migrations:migrate_user_addresses:up has been deprecated and will be removed with Solidus 3.0.")
14
+
13
15
  Spree.user_class.find_each(batch_size: 500) do |user|
14
16
  ship_address = Spree::Address.find_by(id: user.ship_address_id)
15
17
  bill_address = Spree::Address.find_by(id: user.bill_address_id)
@@ -26,6 +28,7 @@ namespace 'spree:migrations:migrate_user_addresses' do
26
28
  end
27
29
 
28
30
  task down: :environment do
31
+ Spree::Deprecation.warn("rake spree:migrations:migrate_user_addresses:down has been deprecated and will be removed with Solidus 3.0.")
29
32
  Spree::UserAddress.delete_all
30
33
  end
31
34
  end
@@ -4,6 +4,7 @@ require 'solidus/migrations/rename_gateways'
4
4
 
5
5
  namespace 'solidus:migrations:rename_gateways' do
6
6
  task up: :environment do
7
+ Spree::Deprecation.warn("rake solidus:migrations:rename_gateways:up has been deprecated and will be removed with Solidus 3.0.")
7
8
  count = Solidus::Migrations::RenameGateways.new.up
8
9
 
9
10
  unless ENV['VERBOSE'] == 'false' || !verbose
@@ -12,6 +13,7 @@ namespace 'solidus:migrations:rename_gateways' do
12
13
  end
13
14
 
14
15
  task down: :environment do
16
+ Spree::Deprecation.warn("rake solidus:migrations:rename_gateways:down has been deprecated and will be removed with Solidus 3.0.")
15
17
  count = Solidus::Migrations::RenameGateways.new.down
16
18
 
17
19
  unless ENV['VERBOSE'] == 'false' || !verbose
@@ -3,6 +3,8 @@
3
3
  namespace :order_capturing do
4
4
  desc "Looks for orders with inventory that is fully shipped/short-shipped, and captures money for it"
5
5
  task capture_payments: :environment do
6
+ Spree::Deprecation.warn("rake order_capturing:capture_payments has been deprecated and will be removed with Solidus 3.0.")
7
+
6
8
  failures = []
7
9
  orders = Spree::Order.complete.where(payment_state: 'balance_due').where('completed_at > ?', Spree::Config[:order_capturing_time_window].days.ago)
8
10
 
@@ -16,7 +16,7 @@ RSpec.describe Spree::BaseHelper, type: :helper do
16
16
 
17
17
  context "with no checkout zone defined" do
18
18
  before do
19
- Spree::Config[:checkout_zone] = nil
19
+ stub_spree_preferences(checkout_zone: nil)
20
20
  end
21
21
 
22
22
  it "return complete list of countries" do
@@ -33,7 +33,7 @@ RSpec.describe Spree::BaseHelper, type: :helper do
33
33
  before do
34
34
  @country_zone = create(:zone, name: "CountryZone")
35
35
  @country_zone.members.create(zoneable: country)
36
- Spree::Config[:checkout_zone] = @country_zone.name
36
+ stub_spree_preferences(checkout_zone: @country_zone.name)
37
37
  end
38
38
 
39
39
  it "return only the countries defined by the checkout zone" do
@@ -50,7 +50,7 @@ RSpec.describe Spree::BaseHelper, type: :helper do
50
50
  state_zone = create(:zone, name: "StateZone")
51
51
  state = create(:state, country: country)
52
52
  state_zone.members.create(zoneable: state)
53
- Spree::Config[:checkout_zone] = state_zone.name
53
+ stub_spree_preferences(checkout_zone: state_zone.name)
54
54
  end
55
55
 
56
56
  it "return complete list of countries" do
@@ -75,7 +75,7 @@ module Spree
75
75
  let(:variant_price) { 15 }
76
76
 
77
77
  before do
78
- Spree::Config[:show_variant_full_price] = true
78
+ stub_spree_preferences(show_variant_full_price: true)
79
79
  variant
80
80
  end
81
81
 
@@ -148,7 +148,7 @@ THIS IS THE BEST PRODUCT EVER!
148
148
 
149
149
  product.description = description
150
150
 
151
- Spree::Config[:show_raw_product_description] = true
151
+ stub_spree_preferences(show_raw_product_description: true)
152
152
  description = product_description(product)
153
153
  expect(description).to eq(description)
154
154
  end
@@ -2,9 +2,15 @@
2
2
 
3
3
  require 'rails_helper'
4
4
 
5
- RSpec.describe Spree::AppConfiguration, type: :model do
5
+ RSpec.describe Spree::AppConfiguration do
6
6
  let(:prefs) { Spree::Config }
7
7
 
8
+ around do |example|
9
+ with_unfrozen_spree_preference_store do
10
+ example.run
11
+ end
12
+ end
13
+
8
14
  it "should be available from the environment" do
9
15
  prefs.layout = "my/layout"
10
16
  expect(prefs.layout).to eq "my/layout"
@@ -52,4 +58,8 @@ RSpec.describe Spree::AppConfiguration, type: :model do
52
58
  expect(prefs.admin_vat_location.state_id).to eq(nil)
53
59
  expect(prefs.admin_vat_location.country_id).to eq(nil)
54
60
  end
61
+
62
+ it 'has default Event adapter' do
63
+ expect(prefs.events.adapter).to eq Spree::Event::Adapters::ActiveSupportNotifications
64
+ end
55
65
  end
@@ -77,5 +77,18 @@ RSpec.describe Spree::Core::ControllerHelpers::Pricing, type: :controller do
77
77
  it { is_expected.to be_nil }
78
78
  end
79
79
  end
80
+
81
+ context "from context" do
82
+ subject { controller.current_pricing_options }
83
+
84
+ let(:store) { FactoryBot.create :store, default_currency: 'USD' }
85
+
86
+ context "when the whole context is passed" do
87
+ it "receives the right object " do
88
+ expect(Spree::Config.pricing_options_class).to receive(:from_context).with(controller)
89
+ is_expected.to be_nil
90
+ end
91
+ end
92
+ end
80
93
  end
81
94
  end
@@ -23,14 +23,7 @@ RSpec.describe Spree::Core::ControllerHelpers::StrongParameters, type: :controll
23
23
 
24
24
  describe '#permitted_checkout_attributes' do
25
25
  it 'returns Array class' do
26
- Spree::Deprecation.silence do
27
- expect(controller.permitted_checkout_attributes.class).to eq Spree::CheckoutAdditionalAttributes
28
- end
29
- end
30
-
31
- it 'is deprecated' do
32
- expect(Spree::Deprecation).to receive(:warn)
33
- controller.permitted_checkout_attributes
26
+ expect(controller.permitted_checkout_attributes.class).to eq Array
34
27
  end
35
28
  end
36
29
 
@@ -17,7 +17,7 @@ RSpec.describe 'shipping method factory' do
17
17
  end
18
18
 
19
19
  context 'store using alternate currency' do
20
- before { Spree::Config[:currency] = 'CAD' }
20
+ before { stub_spree_preferences(currency: 'CAD') }
21
21
 
22
22
  it "should configure the calculator correctly" do
23
23
  shipping_method = create(factory)
@@ -4,7 +4,16 @@ require 'rails_helper'
4
4
 
5
5
  RSpec.describe Spree::TestingSupport::Preferences do
6
6
  describe 'resetting the app configuration' do
7
+ around do |example|
8
+ with_unfrozen_spree_preference_store do
9
+ Spree::Deprecation.silence do
10
+ example.run
11
+ end
12
+ end
13
+ end
14
+
7
15
  before do
16
+ reset_spree_preferences
8
17
  @original_spree_mails_from = Spree::Config.mails_from
9
18
  @original_spree_searcher_class = Spree::Config.searcher_class
10
19
  class MySearcherClass; end
@@ -25,4 +34,28 @@ RSpec.describe Spree::TestingSupport::Preferences do
25
34
  expect(Spree::Config.searcher_class).to eq(@original_spree_searcher_class)
26
35
  end
27
36
  end
37
+
38
+ describe '#stub_spree_preferences' do
39
+ it 'stubs method calls but does not affect actual stored Spree::Config settings' do
40
+ stub_spree_preferences(currency: 'FOO')
41
+ expect(Spree::Config.currency).to eq 'FOO'
42
+ expect(Spree::Config.preference_store[:currency]).to eq 'USD'
43
+ end
44
+ end
45
+
46
+ describe '#with_unfrozen_spree_preference_store' do
47
+ it 'changes the original settings, but returns them to original values at exit' do
48
+ with_unfrozen_spree_preference_store do
49
+ Spree::Config.mails_from = 'override@example.com'
50
+ expect(Spree::Config.mails_from).to eq 'override@example.com'
51
+ expect(Spree::Config.preference_store[:mails_from]).to eq 'override@example.com'
52
+ end
53
+
54
+ # both the original frozen store and the unfrozen store are unaffected by changes above:
55
+ expect(Spree::Config.mails_from).to eq 'store@example.com'
56
+ with_unfrozen_spree_preference_store do
57
+ expect(Spree::Config.mails_from).to eq 'store@example.com'
58
+ end
59
+ end
60
+ end
28
61
  end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'spree/event'
5
+
6
+ RSpec.describe Spree::Event do
7
+ module M
8
+ include Spree::Event::Subscriber
9
+
10
+ event_action :event_name
11
+
12
+ def event_name(event)
13
+ # code that handles the event
14
+ end
15
+
16
+ def other_event(event)
17
+ # ...
18
+ end
19
+ end
20
+
21
+ describe '::subscribe!' do
22
+ before { M.unsubscribe! }
23
+
24
+ it 'adds new listeners to Spree::Event' do
25
+ expect { M.subscribe! }.to change { Spree::Event.listeners }
26
+ end
27
+
28
+ context 'when subscriptions are not registered' do
29
+ it 'does not trigger the event callback' do
30
+ expect(M).not_to receive(:event_name)
31
+ Spree::Event.fire 'event_name'
32
+ end
33
+ end
34
+
35
+ it 'subscribes event actions' do
36
+ M.subscribe!
37
+ expect(M).to receive(:event_name)
38
+ Spree::Event.fire 'event_name'
39
+ end
40
+
41
+ it 'does not subscribe event actions more than once' do
42
+ 2.times { M.subscribe! }
43
+ expect(M).to receive(:event_name).once
44
+ Spree::Event.fire 'event_name'
45
+ end
46
+ end
47
+
48
+ describe '::unsubscribe' do
49
+ before { M.subscribe! }
50
+
51
+ it 'removes the subscription' do
52
+ expect(M).not_to receive(:event_name)
53
+ M.unsubscribe!
54
+ Spree::Event.fire 'event_name'
55
+ end
56
+ end
57
+
58
+ describe '::event_action' do
59
+ context 'when the action has not been declared' do
60
+ before { M.subscribe! }
61
+
62
+ it 'does not subscribe the action' do
63
+ expect(M).not_to receive(:other_event)
64
+ Spree::Event.fire 'other_event'
65
+ end
66
+ end
67
+
68
+ context 'when the action is declared' do
69
+ before do
70
+ M.event_action :other_event
71
+ M.subscribe!
72
+ end
73
+
74
+ after do
75
+ M.unsubscribe!
76
+ M.event_actions.delete(:other_event)
77
+ end
78
+
79
+ it 'subscribe the action' do
80
+ expect(M).to receive(:other_event)
81
+ Spree::Event.fire 'other_event'
82
+ end
83
+ end
84
+ end
85
+ end