solidus_core 3.0.0.rc2 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +1 -1
  3. data/app/helpers/spree/products_helper.rb +1 -1
  4. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +11 -11
  5. data/app/models/concerns/spree/active_storage_adapter.rb +2 -0
  6. data/app/models/concerns/spree/default_price.rb +63 -10
  7. data/app/models/spree/adjustment.rb +6 -5
  8. data/app/models/spree/base.rb +0 -17
  9. data/app/models/spree/calculator.rb +4 -0
  10. data/app/models/spree/customer_return.rb +3 -2
  11. data/app/models/spree/image/active_storage_attachment.rb +11 -8
  12. data/app/models/spree/image/paperclip_attachment.rb +3 -3
  13. data/app/models/spree/line_item.rb +2 -2
  14. data/app/models/spree/order.rb +12 -7
  15. data/app/models/spree/payment_method/bogus_credit_card.rb +13 -9
  16. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +4 -4
  17. data/app/models/spree/payment_method.rb +3 -0
  18. data/app/models/spree/price.rb +1 -1
  19. data/app/models/spree/product/scopes.rb +5 -5
  20. data/app/models/spree/product.rb +12 -1
  21. data/app/models/spree/promotion/rules/item_total.rb +50 -6
  22. data/app/models/spree/promotion.rb +2 -2
  23. data/app/models/spree/promotion_action.rb +3 -0
  24. data/app/models/spree/promotion_code.rb +1 -1
  25. data/app/models/spree/promotion_rule.rb +4 -0
  26. data/app/models/spree/return_item.rb +2 -3
  27. data/app/models/spree/shipping_rate_tax.rb +1 -1
  28. data/app/models/spree/stock/availability.rb +11 -3
  29. data/app/models/spree/stock/simple_coordinator.rb +6 -11
  30. data/app/models/spree/stock_location.rb +1 -1
  31. data/app/models/spree/store_credit.rb +6 -1
  32. data/app/models/spree/tax_calculator/shipping_rate.rb +1 -1
  33. data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
  34. data/app/models/spree/taxon/paperclip_attachment.rb +3 -3
  35. data/app/models/spree/variant/price_selector.rb +16 -3
  36. data/app/models/spree/variant.rb +27 -17
  37. data/config/locales/en.yml +2 -0
  38. data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
  39. data/lib/generators/solidus/install/install_generator.rb +2 -2
  40. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -1
  41. data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
  42. data/lib/generators/solidus/update/update_generator.rb +112 -0
  43. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +0 -1
  44. data/lib/generators/spree/dummy/templates/rails/database.yml +78 -35
  45. data/lib/spree/app_configuration.rb +70 -0
  46. data/lib/spree/core/engine.rb +10 -11
  47. data/lib/spree/core/product_filters.rb +1 -1
  48. data/lib/spree/core/search/base.rb +1 -1
  49. data/lib/spree/core/state_machines/order.rb +1 -1
  50. data/lib/spree/core/validators/email.rb +1 -1
  51. data/lib/spree/core/version.rb +5 -1
  52. data/lib/spree/core/versioned_value.rb +75 -0
  53. data/lib/spree/core.rb +17 -0
  54. data/lib/spree/deprecation.rb +1 -1
  55. data/lib/spree/permitted_attributes.rb +8 -2
  56. data/lib/spree/preferences/configuration.rb +62 -0
  57. data/lib/spree/preferences/persistable.rb +23 -0
  58. data/lib/spree/preferences/preferable.rb +8 -0
  59. data/lib/spree/preferences/preferable_class_methods.rb +5 -3
  60. data/lib/spree/preferences/preference_differentiator.rb +28 -0
  61. data/lib/spree/testing_support/dummy_app/database.yml +42 -22
  62. data/lib/spree/testing_support/dummy_app.rb +33 -17
  63. data/lib/spree/testing_support/fixtures/file.txt +1 -0
  64. data/lib/spree/testing_support.rb +1 -1
  65. data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
  66. data/solidus_core.gemspec +20 -0
  67. metadata +29 -8
  68. data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
  69. data/lib/tasks/migrations/migrate_address_names.rake +0 -158
  70. data/lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake +0 -38
  71. data/lib/tasks/upgrade.rake +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 35ced6fd29e1822a14a86b637243c871d373b2ead2d575e7737d0fa35907a48d
4
- data.tar.gz: ab72677886bf4ce7c2ba48dbe711fe73aa5e1193d990fb4d7cd872035e247f33
3
+ metadata.gz: b6d8a64c0ba51b637a6a5eb82952d5920f388413f74d271920c41b6c34b00b5f
4
+ data.tar.gz: a92bbdc37bd0a9f9a53fe943542ba0f4890af67290faf937de4a57583cdb1ffa
5
5
  SHA512:
6
- metadata.gz: 1b18d6067bfbe97ce226fd82fb9a48da5e16eadeef3ac3b758c7d159dc079aef8880396a2acb9c0e23f98953d331f8161ba3271f780c21de04c1f9e501b1136b
7
- data.tar.gz: 5cc4ad46294a842daa2850e785d08dbfa4f01b28f5806449457fb498898c557866590ed7d332888d6c5fae72ae1ee81fbf3d4fa1ead5aa682af226debce6a890
6
+ metadata.gz: 0dd269d1a10a861a6d76cba306cf3b42b758773d4fe4e3265986e0abfe318e40ba2468d6431ec89d472b72591a23e19684a20afa37bb48f0be71371e79736e0f
7
+ data.tar.gz: c524310230c534ebc135368fbf5d1b75def4f3b3672f8b4818b85d6e40d2fd04f1bfb03e37d0218f37d5b5bb7167499c2deff8bbd2593a8571f9b1de211d665c
@@ -130,7 +130,7 @@ module Spree
130
130
  end
131
131
 
132
132
  def display_price(product_or_variant)
133
- product_or_variant.price_for(current_pricing_options).to_html
133
+ product_or_variant.price_for_options(current_pricing_options)&.money&.to_html
134
134
  end
135
135
 
136
136
  def pretty_time(time, format = :long)
@@ -38,7 +38,7 @@ module Spree
38
38
  .with_prices(current_pricing_options)
39
39
  .all? { |variant_with_prices| variant_with_prices.price_same_as_master?(current_pricing_options) }
40
40
 
41
- variant.price_for(current_pricing_options).to_html
41
+ variant.price_for_options(current_pricing_options)&.money&.to_html
42
42
  end
43
43
 
44
44
  # Converts line breaks in product description into <p> tags.
@@ -9,11 +9,9 @@ module Spree
9
9
  class Attachment
10
10
  delegate_missing_to :@attachment
11
11
 
12
- DEFAULT_SIZE = '100%'
13
-
14
12
  def initialize(attachment, styles: {})
15
13
  @attachment = attachment
16
- @styles = styles
14
+ @styles = normalize_styles(styles)
17
15
  end
18
16
 
19
17
  def exists?
@@ -21,20 +19,18 @@ module Spree
21
19
  end
22
20
 
23
21
  def filename
24
- blob.filename.to_s
22
+ blob&.filename.to_s
25
23
  end
26
24
 
27
25
  def url(style = nil)
28
- variant(style).url
26
+ variant(style)&.url
29
27
  end
30
28
 
31
29
  def variant(style = nil)
32
- size = style_to_size(style&.to_sym)
30
+ size = style_to_size(style)
33
31
  @attachment.variant(
34
- resize: size,
35
- strip: true,
36
- 'auto-orient': true,
37
- colorspace: 'sRGB',
32
+ resize_to_limit: size,
33
+ strip: true
38
34
  ).processed
39
35
  end
40
36
 
@@ -61,8 +57,12 @@ module Spree
61
57
  @attachment.metadata
62
58
  end
63
59
 
60
+ def normalize_styles(styles)
61
+ styles.transform_values { |v| v.split('x') }
62
+ end
63
+
64
64
  def style_to_size(style)
65
- @styles.fetch(style) { DEFAULT_SIZE }
65
+ @styles.fetch(style&.to_sym) { [width, height] }
66
66
  end
67
67
  end
68
68
  end
@@ -107,6 +107,8 @@ module Spree
107
107
 
108
108
  def url(style = default_style)
109
109
  attachment.url(style)
110
+ rescue ActiveStorage::FileNotFoundError
111
+ "noimage/#{style}.png"
110
112
  end
111
113
 
112
114
  def destroy_attachment(_name)
@@ -5,23 +5,76 @@ module Spree
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- has_one :default_price,
9
- -> { with_discarded.currently_valid.with_default_attributes },
10
- class_name: 'Spree::Price',
11
- inverse_of: :variant,
12
- dependent: :destroy,
13
- autosave: true
8
+ delegate :display_price, :display_amount, :price, to: :default_price, allow_nil: true
9
+ delegate :price=, to: :default_price_or_build
10
+
11
+ # @see Spree::Variant::PricingOptions.default_price_attributes
12
+ def self.default_price_attributes
13
+ Spree::Config.default_pricing_options.desired_attributes
14
+ end
14
15
  end
15
16
 
16
- def find_or_build_default_price
17
- default_price || build_default_price(Spree::Config.default_pricing_options.desired_attributes)
17
+ # Returns `#prices` prioritized for being considered as default price
18
+ #
19
+ # @return [ActiveRecord::Relation<Spree::Price>]
20
+ def currently_valid_prices
21
+ prices.currently_valid
18
22
  end
19
23
 
20
- delegate :display_price, :display_amount, :price, to: :find_or_build_default_price
21
- delegate :price=, to: :find_or_build_default_price
24
+ # Returns {#default_price} or builds it from {Spree::Variant.default_price_attributes}
25
+ #
26
+ # @return [Spree::Price, nil]
27
+ # @see Spree::Variant.default_price_attributes
28
+ def default_price_or_build
29
+ default_price ||
30
+ prices.build(self.class.default_price_attributes)
31
+ end
32
+
33
+ # Select from {#prices} the one to be considered as the default
34
+ #
35
+ # This method works with the in-memory association, so non-persisted prices
36
+ # are taken into account. Discarded prices are also considered.
37
+ #
38
+ # A price is a candidate to be considered as the default when it meets
39
+ # {Spree::Variant.default_price_attributes} criteria. When more than one candidate is
40
+ # found, non-persisted records take preference. When more than one persisted
41
+ # candidate exists, the one most recently updated is taken or, in case of
42
+ # race condition, the one with higher id.
43
+ #
44
+ # @return [Spree::Price, nil]
45
+ # @see Spree::Variant.default_price_attributes
46
+ def default_price
47
+ prioritized_default(
48
+ prices_meeting_criteria_to_be_default(
49
+ (prices + prices.with_discarded).uniq
50
+ )
51
+ )
52
+ end
22
53
 
23
54
  def has_default_price?
24
55
  default_price.present? && !default_price.discarded?
25
56
  end
57
+
58
+ private
59
+
60
+ def prices_meeting_criteria_to_be_default(prices)
61
+ criteria = self.class.default_price_attributes.transform_keys(&:to_s)
62
+ prices.select do |price|
63
+ contender = price.attributes.slice(*criteria.keys)
64
+ criteria == contender
65
+ end
66
+ end
67
+
68
+ def prioritized_default(prices)
69
+ prices.min do |prev, succ|
70
+ contender_one, contender_two = [succ, prev].map do |item|
71
+ [
72
+ item.updated_at || Time.zone.now,
73
+ item.id || Float::INFINITY
74
+ ]
75
+ end
76
+ contender_one <=> contender_two
77
+ end
78
+ end
26
79
  end
27
80
  end
@@ -55,11 +55,12 @@ module Spree
55
55
  #
56
56
  # @param excluded_orders [Array<Spree::Order>] Orders to exclude from query
57
57
  # @return [ActiveRecord::Relation] Scoped Adjustments
58
- def self.in_completed_orders(excluded_orders: [])
59
- joins(:order).
60
- merge(Spree::Order.complete).
61
- where.not(spree_orders: { id: excluded_orders }).
62
- distinct
58
+ def self.in_completed_orders(excluded_orders: [], exclude_canceled: false)
59
+ result = joins(:order)
60
+ .merge(Spree::Order.complete)
61
+ .where.not(spree_orders: { id: excluded_orders })
62
+ .distinct
63
+ exclude_canceled ? result.merge(Spree::Order.not_canceled) : result
63
64
  end
64
65
 
65
66
  def finalize!
@@ -1,26 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Spree::Base < ActiveRecord::Base
4
- include Spree::Preferences::Preferable
5
4
  include Spree::Core::Permalinks
6
5
  include Spree::RansackableAttributes
7
6
 
8
- def initialize_preference_defaults
9
- if has_attribute?(:preferences)
10
- self.preferences = default_preferences.merge(preferences)
11
- end
12
- end
13
-
14
- # Only run preference initialization on models which requires it. Improves
15
- # performance of record initialization slightly.
16
- def self.preference(*args)
17
- # after_initialize can be called multiple times with the same symbol, it
18
- # will only be called once on initialization.
19
- serialize :preferences, Hash
20
- after_initialize :initialize_preference_defaults
21
- super
22
- end
23
-
24
7
  self.abstract_class = true
25
8
 
26
9
  # Provides a scope that should be included any time products
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'spree/preferences/persistable'
4
+
3
5
  module Spree
4
6
  class Calculator < Spree::Base
7
+ include Spree::Preferences::Persistable
8
+
5
9
  belongs_to :calculable, polymorphic: true, optional: true
6
10
 
7
11
  # This method calls a compute_<computable> method. must be overriden in concrete calculator.
@@ -40,7 +40,8 @@ module Spree
40
40
  # Temporarily tie a customer_return to one order
41
41
  def order
42
42
  return nil if return_items.blank?
43
- return_items.first.inventory_unit.order
43
+
44
+ return_items.first.inventory_unit&.order
44
45
  end
45
46
 
46
47
  def fully_reimbursed?
@@ -65,7 +66,7 @@ module Spree
65
66
  end
66
67
 
67
68
  def return_items_belong_to_same_order
68
- if return_items.reject{ |return_item| return_item.inventory_unit.order_id == order_id }.any?
69
+ if return_items.reject{ |return_item| return_item.inventory_unit&.order_id == order_id }.any?
69
70
  errors.add(:base, I18n.t('spree.return_items_cannot_be_associated_with_multiple_orders'))
70
71
  end
71
72
  end
@@ -7,15 +7,18 @@ module Spree::Image::ActiveStorageAttachment
7
7
  delegate :width, :height, to: :attachment, prefix: true
8
8
 
9
9
  included do
10
- has_attachment :attachment,
11
- styles: {
12
- mini: '48x48>',
13
- small: '400x400>',
14
- product: '680x680>',
15
- large: '1200x1200>'
16
- },
17
- default_style: :product
18
10
  validates :attachment, presence: true
19
11
  validate :attachment_is_an_image
12
+ validate :supported_content_type
13
+
14
+ has_attachment :attachment,
15
+ styles: Spree::Config.product_image_styles,
16
+ default_style: Spree::Config.product_image_style_default
17
+
18
+ def supported_content_type
19
+ unless attachment.content_type.in?(Spree::Config.allowed_image_mime_types)
20
+ errors.add(:attachment, :content_type_not_supported)
21
+ end
22
+ end
20
23
  end
21
24
  end
@@ -7,15 +7,15 @@ module Spree::Image::PaperclipAttachment
7
7
  validate :no_attachment_errors
8
8
 
9
9
  has_attached_file :attachment,
10
- styles: { mini: '48x48>', small: '400x400>', product: '680x680>', large: '1200x1200>' },
11
- default_style: :product,
10
+ styles: Spree::Config.product_image_styles,
11
+ default_style: Spree::Config.product_image_style_default,
12
12
  default_url: 'noimage/:style.png',
13
13
  url: '/spree/products/:id/:style/:basename.:extension',
14
14
  path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
15
15
  convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
16
16
  validates_attachment :attachment,
17
17
  presence: true,
18
- content_type: { content_type: %w[image/jpeg image/jpg image/png image/gif] }
18
+ content_type: { content_type: Spree::Config.allowed_image_mime_types }
19
19
 
20
20
  # save the w,h of the original image (from which others can be calculated)
21
21
  # we need to look at the write-queue for images which have not been saved yet
@@ -123,7 +123,7 @@ module Spree
123
123
  # a price for this line item, even if there is no existing price
124
124
  # for the associated line item in the order currency.
125
125
  unless options.key?(:price) || options.key?('price')
126
- self.money_price = variant.price_for(pricing_options)
126
+ self.money_price = variant.price_for_options(pricing_options)&.money
127
127
  end
128
128
  end
129
129
 
@@ -149,7 +149,7 @@ module Spree
149
149
  # Set price, cost_price and currency.
150
150
  def set_pricing_attributes
151
151
  self.cost_price ||= variant.cost_price
152
- self.money_price = variant.price_for(pricing_options) if price.nil?
152
+ self.money_price = variant.price_for_options(pricing_options)&.money if price.nil?
153
153
  true
154
154
  end
155
155
 
@@ -51,7 +51,7 @@ module Spree
51
51
  end
52
52
 
53
53
  self.whitelisted_ransackable_associations = %w[shipments user order_promotions promotions bill_address ship_address line_items]
54
- self.whitelisted_ransackable_attributes = %w[bill_address_name completed_at created_at email number state payment_state shipment_state total store_id]
54
+ self.whitelisted_ransackable_attributes = %w[completed_at created_at email number state payment_state shipment_state total store_id]
55
55
 
56
56
  attr_reader :coupon_code
57
57
  attr_accessor :temporary_address
@@ -128,7 +128,7 @@ module Spree
128
128
  before_create :create_token
129
129
  before_create :link_by_email
130
130
 
131
- validates :email, presence: true, if: :require_email
131
+ validates :email, presence: true, if: :email_required?
132
132
  validates :email, 'spree/email' => true, allow_blank: true
133
133
  validates :guest_token, presence: { allow_nil: true }
134
134
  validates :number, presence: true, uniqueness: { allow_blank: true, case_sensitive: true }
@@ -269,15 +269,15 @@ module Spree
269
269
  end
270
270
 
271
271
  def contents
272
- @contents ||= Spree::OrderContents.new(self)
272
+ @contents ||= Spree::Config.order_contents_class.new(self)
273
273
  end
274
274
 
275
275
  def shipping
276
- @shipping ||= Spree::OrderShipping.new(self)
276
+ @shipping ||= Spree::Config.order_shipping_class.new(self)
277
277
  end
278
278
 
279
279
  def cancellations
280
- @cancellations ||= Spree::OrderCancellations.new(self)
280
+ @cancellations ||= Spree::Config.order_cancellations_class.new(self)
281
281
  end
282
282
 
283
283
  # Associates the specified user with the order.
@@ -490,7 +490,7 @@ module Spree
490
490
  raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_shipments_not_pending'))
491
491
  else
492
492
  shipments.destroy_all
493
- self.shipments = Spree::Config.stock.coordinator_class.new(self).shipments
493
+ shipments.push(*Spree::Config.stock.coordinator_class.new(self).shipments)
494
494
  end
495
495
  end
496
496
 
@@ -750,10 +750,15 @@ module Spree
750
750
  end
751
751
 
752
752
  # Determine if email is required (we don't want validation errors before we hit the checkout)
753
- def require_email
753
+ def email_required?
754
754
  true unless new_record? || ['cart', 'address'].include?(state)
755
755
  end
756
756
 
757
+ def require_email
758
+ Spree::Deprecation.warn "Use email_required? instead", caller(1)
759
+ email_required?
760
+ end
761
+
757
762
  def ensure_inventory_units
758
763
  if has_checkout_step?("delivery")
759
764
  inventory_validator = Spree::Stock::InventoryValidator.new
@@ -9,6 +9,10 @@ module Spree
9
9
 
10
10
  VALID_CCS = ['1', TEST_VISA, TEST_MC, TEST_AMEX, TEST_DISC].flatten
11
11
 
12
+ AUTHORIZATION_CODE = '12345'
13
+ FAILURE_MESSAGE = 'Bogus Gateway: Forced failure'
14
+ SUCCESS_MESSAGE = 'Bogus Gateway: Forced success'
15
+
12
16
  attr_accessor :test
13
17
 
14
18
  def gateway_class
@@ -26,40 +30,40 @@ module Spree
26
30
  def authorize(_money, credit_card, _options = {})
27
31
  profile_id = credit_card.gateway_customer_profile_id
28
32
  if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
29
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'D' })
33
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: { code: 'D' })
30
34
  else
31
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
35
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, { message: FAILURE_MESSAGE }, test: true)
32
36
  end
33
37
  end
34
38
 
35
39
  def purchase(_money, credit_card, _options = {})
36
40
  profile_id = credit_card.gateway_customer_profile_id
37
41
  if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
38
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'M' })
42
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE, avs_result: { code: 'M' })
39
43
  else
40
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
44
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, message: FAILURE_MESSAGE, test: true)
41
45
  end
42
46
  end
43
47
 
44
48
  def credit(_money, _credit_card, _response_code, _options = {})
45
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
49
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
46
50
  end
47
51
 
48
52
  def capture(_money, authorization, _gateway_options)
49
53
  if authorization == '12345'
50
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true)
54
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true)
51
55
  else
52
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', error: 'Bogus Gateway: Forced failure', test: true)
56
+ ActiveMerchant::Billing::Response.new(false, FAILURE_MESSAGE, error: FAILURE_MESSAGE, test: true)
53
57
  end
54
58
  end
55
59
 
56
60
  def void(_response_code, _credit_card, _options = {})
57
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
61
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
58
62
  end
59
63
 
60
64
  # @see Spree::PaymentMethod#try_void
61
65
  def try_void(_payment)
62
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
66
+ ActiveMerchant::Billing::Response.new(true, SUCCESS_MESSAGE, {}, test: true, authorization: AUTHORIZATION_CODE)
63
67
  end
64
68
 
65
69
  def test?