solidus_core 2.10.0.beta1 → 2.10.0
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.
- checksums.yaml +4 -4
- data/app/helpers/spree/base_helper.rb +4 -4
- data/app/helpers/spree/products_helper.rb +2 -1
- data/app/jobs/spree/promotion_code_batch_job.rb +2 -2
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/spree/address.rb +11 -15
- data/app/models/spree/adjustment.rb +11 -0
- data/app/models/spree/calculator/price_sack.rb +1 -1
- data/app/models/spree/calculator/shipping/flexi_rate.rb +2 -2
- data/app/models/spree/calculator/tiered_flat_rate.rb +5 -5
- data/app/models/spree/calculator/tiered_percent.rb +6 -6
- data/app/models/spree/carton.rb +1 -1
- data/app/models/spree/credit_card.rb +2 -2
- data/app/models/spree/inventory_unit.rb +1 -19
- data/app/models/spree/line_item.rb +1 -1
- data/app/models/spree/order.rb +3 -2
- data/app/models/spree/order/checkout.rb +1 -1
- data/app/models/spree/order/payments.rb +2 -2
- data/app/models/spree/order_capturing.rb +2 -2
- data/app/models/spree/order_taxation.rb +2 -2
- data/app/models/spree/payment.rb +4 -41
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/payment_method.rb +2 -2
- data/app/models/spree/product.rb +3 -3
- data/app/models/spree/product/scopes.rb +8 -7
- data/app/models/spree/promotion.rb +27 -12
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +1 -1
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
- data/app/models/spree/promotion/rules/option_value.rb +2 -2
- data/app/models/spree/promotion/rules/product.rb +3 -3
- data/app/models/spree/promotion_action.rb +1 -1
- data/app/models/spree/promotion_chooser.rb +2 -2
- data/app/models/spree/promotion_code.rb +9 -8
- data/app/models/spree/promotion_code/batch_builder.rb +3 -3
- data/app/models/spree/promotion_rule.rb +1 -1
- data/app/models/spree/refund.rb +2 -2
- data/app/models/spree/reimbursement.rb +3 -11
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
- data/app/models/spree/return_authorization.rb +1 -7
- data/app/models/spree/return_item.rb +3 -42
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/shipment.rb +4 -38
- data/app/models/spree/shipping_calculator.rb +0 -4
- data/app/models/spree/shipping_method.rb +1 -1
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/differentiator.rb +1 -1
- data/app/models/spree/stock/package.rb +1 -1
- data/app/models/spree/stock_item.rb +1 -1
- data/app/models/spree/stock_quantities.rb +13 -12
- data/app/models/spree/tax_calculator/default.rb +0 -4
- data/app/models/spree/tax_calculator/shipping_rate.rb +0 -3
- data/app/models/spree/tax_rate.rb +4 -0
- data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
- data/app/models/spree/user_last_url_storer.rb +46 -0
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
- data/app/models/spree/variant.rb +9 -9
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
- data/app/models/spree/zone.rb +1 -1
- data/config/initializers/money.rb +2 -0
- data/config/locales/en.yml +12 -0
- data/lib/generators/spree/install/install_generator.rb +3 -0
- data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +8 -0
- data/lib/spree/app_configuration.rb +18 -3
- data/lib/spree/core.rb +12 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -13
- data/lib/spree/core/engine.rb +2 -2
- data/lib/spree/core/environment_extension.rb +9 -0
- data/lib/spree/core/importer/order.rb +26 -26
- data/lib/spree/core/product_filters.rb +15 -15
- data/lib/spree/core/role_configuration.rb +2 -2
- data/lib/spree/core/search/variant.rb +1 -1
- data/lib/spree/core/state_machines.rb +78 -0
- data/lib/spree/core/state_machines/inventory_unit.rb +42 -0
- data/lib/spree/core/state_machines/payment.rb +61 -0
- data/lib/spree/core/state_machines/reimbursement.rb +33 -0
- data/lib/spree/core/state_machines/return_authorization.rb +32 -0
- data/lib/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
- data/lib/spree/core/state_machines/return_item/reception_status.rb +42 -0
- data/lib/spree/core/state_machines/shipment.rb +58 -0
- data/lib/spree/core/stock_configuration.rb +1 -0
- data/lib/spree/core/validators/email.rb +1 -8
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/money.rb +2 -2
- data/lib/spree/permission_sets/user_management.rb +3 -0
- data/lib/spree/permitted_attributes.rb +3 -3
- data/lib/spree/preferences/static_model_preferences.rb +2 -2
- data/lib/spree/testing_support/dummy_app.rb +4 -1
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +8 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +7 -0
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
- data/solidus_core.gemspec +2 -2
- data/spec/lib/spree/core/environment_extension_spec.rb +12 -1
- data/spec/lib/spree/core/stock_configuration_spec.rb +36 -0
- data/spec/lib/spree/core/validators/email_spec.rb +18 -18
- data/spec/models/spree/address_spec.rb +23 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +2 -2
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +24 -15
- data/spec/models/spree/carton_spec.rb +8 -0
- data/spec/models/spree/classification_spec.rb +21 -9
- data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
- data/spec/models/spree/concerns/user_methods_spec.rb +2 -1
- data/spec/models/spree/order_merger_spec.rb +3 -3
- data/spec/models/spree/order_spec.rb +8 -15
- data/spec/models/spree/order_updater_spec.rb +4 -3
- data/spec/models/spree/payment_create_spec.rb +4 -14
- data/spec/models/spree/permission_sets/user_management_spec.rb +2 -0
- data/spec/models/spree/preference_spec.rb +4 -4
- data/spec/models/spree/preferences/preferable_spec.rb +3 -3
- data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -2
- data/spec/models/spree/promotion_rule_spec.rb +6 -6
- data/spec/models/spree/promotion_spec.rb +73 -52
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
- data/spec/models/spree/returns_calculator_spec.rb +2 -2
- data/spec/models/spree/shipping_calculator_spec.rb +1 -13
- data/spec/models/spree/shipping_method_spec.rb +32 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +2 -2
- data/spec/models/spree/stock/differentiator_spec.rb +2 -2
- data/spec/models/spree/stock/estimator_spec.rb +3 -3
- data/spec/models/spree/stock/package_spec.rb +28 -28
- data/spec/models/spree/stock/simple_coordinator_spec.rb +11 -11
- data/spec/models/spree/stock/splitter/base_spec.rb +4 -4
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +7 -7
- data/spec/models/spree/stock_quantities_spec.rb +1 -1
- data/spec/models/spree/store_credit_spec.rb +1 -1
- data/spec/models/spree/tax_rate_spec.rb +1 -0
- data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
- data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +31 -0
- data/spec/models/spree/user_last_url_storer_spec.rb +60 -0
- metadata +17 -12
- data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -162
- data/spec/models/spree/order/updating_spec.rb +0 -18
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
# Reimbursement' state machine
|
|
7
|
+
#
|
|
8
|
+
# for each event the following instance methods are dynamically implemented:
|
|
9
|
+
# #<event_name>
|
|
10
|
+
# #<event_name>!
|
|
11
|
+
# #can_<event_name>?
|
|
12
|
+
#
|
|
13
|
+
# for each state the following instance methods are implemented:
|
|
14
|
+
# #<state_name>?
|
|
15
|
+
#
|
|
16
|
+
module Reimbursement
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
state_machine :reimbursement_status, initial: :pending do
|
|
21
|
+
event :errored do
|
|
22
|
+
transition to: :errored, from: [:pending, :errored]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
event :reimbursed do
|
|
26
|
+
transition to: :reimbursed, from: [:pending, :errored]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
# Return Authorizations' state machine
|
|
7
|
+
#
|
|
8
|
+
# for each event the following instance methods are dynamically implemented:
|
|
9
|
+
# #<event_name>
|
|
10
|
+
# #<event_name>!
|
|
11
|
+
# #can_<event_name>?
|
|
12
|
+
#
|
|
13
|
+
# for each state the following instance methods are implemented:
|
|
14
|
+
# #<state_name>?
|
|
15
|
+
#
|
|
16
|
+
module ReturnAuthorization
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
state_machine initial: :authorized do
|
|
21
|
+
before_transition to: :canceled, do: :cancel_return_items
|
|
22
|
+
|
|
23
|
+
event :cancel do
|
|
24
|
+
transition to: :canceled, from: :authorized,
|
|
25
|
+
if: lambda { |return_authorization| return_authorization.can_cancel_return_items? }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
module ReturnItem
|
|
7
|
+
# Return Items' acceptance status state machine
|
|
8
|
+
#
|
|
9
|
+
# for each event the following instance methods are dynamically implemented:
|
|
10
|
+
# #<event_name>
|
|
11
|
+
# #<event_name>!
|
|
12
|
+
# #can_<event_name>?
|
|
13
|
+
#
|
|
14
|
+
# for each state the following instance methods are implemented:
|
|
15
|
+
# #<state_name>?
|
|
16
|
+
#
|
|
17
|
+
module AcceptanceStatus
|
|
18
|
+
extend ActiveSupport::Concern
|
|
19
|
+
|
|
20
|
+
included do
|
|
21
|
+
state_machine :acceptance_status, initial: :pending do
|
|
22
|
+
event :attempt_accept do
|
|
23
|
+
transition to: :accepted, from: :accepted
|
|
24
|
+
transition to: :accepted, from: :pending, if: ->(return_item) { return_item.eligible_for_return? }
|
|
25
|
+
transition to: :manual_intervention_required, from: :pending, if: ->(return_item) { return_item.requires_manual_intervention? }
|
|
26
|
+
transition to: :rejected, from: :pending
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# bypasses eligibility checks
|
|
30
|
+
event :accept do
|
|
31
|
+
transition to: :accepted, from: [:accepted, :pending, :manual_intervention_required]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# bypasses eligibility checks
|
|
35
|
+
event :reject do
|
|
36
|
+
transition to: :rejected, from: [:accepted, :pending, :manual_intervention_required]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# bypasses eligibility checks
|
|
40
|
+
event :require_manual_intervention do
|
|
41
|
+
transition to: :manual_intervention_required, from: [:accepted, :pending, :manual_intervention_required]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
after_transition any => any, do: :persist_acceptance_status_errors
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
module ReturnItem
|
|
7
|
+
# Return Items' reception status state machine
|
|
8
|
+
#
|
|
9
|
+
# for each event the following instance methods are dynamically implemented:
|
|
10
|
+
# #<event_name>
|
|
11
|
+
# #<event_name>!
|
|
12
|
+
# #can_<event_name>?
|
|
13
|
+
#
|
|
14
|
+
# for each state the following instance methods are implemented:
|
|
15
|
+
# #<state_name>?
|
|
16
|
+
#
|
|
17
|
+
module ReceptionStatus
|
|
18
|
+
extend ActiveSupport::Concern
|
|
19
|
+
|
|
20
|
+
included do
|
|
21
|
+
state_machine :reception_status, initial: :awaiting do
|
|
22
|
+
after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :attempt_accept
|
|
23
|
+
after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :check_unexchange
|
|
24
|
+
after_transition to: :received, do: :process_inventory_unit!
|
|
25
|
+
|
|
26
|
+
event(:cancel) { transition to: :cancelled, from: :awaiting }
|
|
27
|
+
|
|
28
|
+
event(:receive) { transition to: :received, from: ::Spree::ReturnItem::INTERMEDIATE_RECEPTION_STATUSES + [:awaiting] }
|
|
29
|
+
event(:unexchange) { transition to: :unexchanged, from: [:awaiting] }
|
|
30
|
+
event(:give) { transition to: :given_to_customer, from: :awaiting }
|
|
31
|
+
event(:lost) { transition to: :lost_in_transit, from: :awaiting }
|
|
32
|
+
event(:wrong_item_shipped) { transition to: :shipped_wrong_item, from: :awaiting }
|
|
33
|
+
event(:short_shipped) { transition to: :short_shipped, from: :awaiting }
|
|
34
|
+
event(:in_transit) { transition to: :in_transit, from: :awaiting }
|
|
35
|
+
event(:expired) { transition to: :expired, from: :awaiting }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
# Shipments' state machine
|
|
7
|
+
#
|
|
8
|
+
# for each event the following instance methods are dynamically implemented:
|
|
9
|
+
# #<event_name>
|
|
10
|
+
# #<event_name>!
|
|
11
|
+
# #can_<event_name>?
|
|
12
|
+
#
|
|
13
|
+
# for each state the following instance methods are implemented:
|
|
14
|
+
# #<state_name>?
|
|
15
|
+
#
|
|
16
|
+
module Shipment
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
state_machine initial: :pending, use_transactions: false do
|
|
21
|
+
event :ready do
|
|
22
|
+
transition from: :pending, to: :shipped, if: :can_transition_from_pending_to_shipped?
|
|
23
|
+
transition from: :pending, to: :ready, if: :can_transition_from_pending_to_ready?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
event :pend do
|
|
27
|
+
transition from: :ready, to: :pending
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
event :ship do
|
|
31
|
+
transition from: [:ready, :canceled], to: :shipped
|
|
32
|
+
end
|
|
33
|
+
after_transition to: :shipped, do: :after_ship
|
|
34
|
+
|
|
35
|
+
event :cancel do
|
|
36
|
+
transition to: :canceled, from: [:pending, :ready]
|
|
37
|
+
end
|
|
38
|
+
after_transition to: :canceled, do: :after_cancel
|
|
39
|
+
|
|
40
|
+
event :resume do
|
|
41
|
+
transition from: :canceled, to: :ready, if: :can_transition_from_canceled_to_ready?
|
|
42
|
+
transition from: :canceled, to: :pending
|
|
43
|
+
end
|
|
44
|
+
after_transition from: :canceled, to: [:pending, :ready, :shipped], do: :after_resume
|
|
45
|
+
|
|
46
|
+
after_transition do |shipment, transition|
|
|
47
|
+
shipment.state_changes.create!(
|
|
48
|
+
previous_state: transition.from,
|
|
49
|
+
next_state: transition.to,
|
|
50
|
+
name: 'shipment'
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -15,16 +15,9 @@ module Spree
|
|
|
15
15
|
EMAIL_REGEXP = /\A([^@\.]|[^@\.]([^@\s]*)[^@\.])@([^@\s]+\.)+[^@\s]+\z/
|
|
16
16
|
|
|
17
17
|
def validate_each(record, attribute, value)
|
|
18
|
-
unless value
|
|
18
|
+
unless EMAIL_REGEXP.match? value
|
|
19
19
|
record.errors.add(attribute, :invalid, { value: value }.merge!(options))
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
|
-
|
|
25
|
-
# @private
|
|
26
|
-
EmailValidator = ActiveSupport::Deprecation::DeprecatedConstantProxy.new(
|
|
27
|
-
'EmailValidator',
|
|
28
|
-
'Spree::EmailValidator',
|
|
29
|
-
message: "EmailValidator is deprecated! Use Spree::EmailValidator instead.\nChange `validates :email, email: true` to `validates :email, 'spree/email' => true`\n"
|
|
30
|
-
)
|
data/lib/spree/core/version.rb
CHANGED
data/lib/spree/money.rb
CHANGED
|
@@ -82,9 +82,9 @@ module Spree
|
|
|
82
82
|
# Maintain compatibility by checking html option renamed to html_wrap.
|
|
83
83
|
if options[:html] || options[:html] == false
|
|
84
84
|
Spree::Deprecation.warn <<-WARN.squish, caller
|
|
85
|
-
Spree::Money#to_html called with Spree::Money#to_html(html: #{options[:html]}),
|
|
85
|
+
Spree::Money#to_html called with Spree::Money#to_html(html: #{options[:html].inspect}),
|
|
86
86
|
which will not be supported in the future.
|
|
87
|
-
Instead use :html_wrap e.g. Spree::Money#to_html(html_wrap: #{options[:html]})
|
|
87
|
+
Instead use :html_wrap e.g. Spree::Money#to_html(html_wrap: #{options[:html].inspect})
|
|
88
88
|
WARN
|
|
89
89
|
end
|
|
90
90
|
if options[:html_wrap] || options[:html]
|
|
@@ -11,6 +11,9 @@ module Spree
|
|
|
11
11
|
can :update_email, Spree.user_class do |user|
|
|
12
12
|
user.spree_roles.none?
|
|
13
13
|
end
|
|
14
|
+
can :update_password, Spree.user_class do |user|
|
|
15
|
+
user.spree_roles.none?
|
|
16
|
+
end
|
|
14
17
|
|
|
15
18
|
cannot [:delete, :destroy], Spree.user_class
|
|
16
19
|
can :manage, Spree::StoreCredit
|
|
@@ -117,10 +117,10 @@ module Spree
|
|
|
117
117
|
:meta_description, :meta_keywords, :meta_title, :child_index
|
|
118
118
|
]
|
|
119
119
|
|
|
120
|
-
#
|
|
120
|
+
# Intentionally leaving off email here to prevent privilege escalation
|
|
121
121
|
# by changing a user with higher priveleges' email to one a lower-priveleged
|
|
122
|
-
# admin owns.
|
|
123
|
-
# controller level
|
|
122
|
+
# admin owns. Creating a user with an email is handled separate at the
|
|
123
|
+
# controller level.
|
|
124
124
|
@@user_attributes = [:password, :password_confirmation]
|
|
125
125
|
|
|
126
126
|
@@variant_attributes = [
|
|
@@ -13,6 +13,7 @@ Rails.env = 'test'
|
|
|
13
13
|
require 'solidus_core'
|
|
14
14
|
|
|
15
15
|
RAILS_52_OR_ABOVE = Gem::Version.new(Rails.version) >= Gem::Version.new('5.2')
|
|
16
|
+
RAILS_6_OR_ABOVE = Gem::Version.new(Rails.version) >= Gem::Version.new('6.0')
|
|
16
17
|
|
|
17
18
|
# @private
|
|
18
19
|
class ApplicationController < ActionController::Base
|
|
@@ -64,7 +65,9 @@ module DummyApp
|
|
|
64
65
|
|
|
65
66
|
if RAILS_52_OR_ABOVE
|
|
66
67
|
config.action_controller.default_protect_from_forgery = true
|
|
67
|
-
|
|
68
|
+
unless RAILS_6_OR_ABOVE
|
|
69
|
+
config.active_record.sqlite3.represent_boolean_as_integer = true
|
|
70
|
+
end
|
|
68
71
|
end
|
|
69
72
|
|
|
70
73
|
# Avoid issues if an old spec/dummy still exists
|
|
@@ -9,6 +9,7 @@ FactoryBot.define do
|
|
|
9
9
|
factory :inventory_unit, class: 'Spree::InventoryUnit' do
|
|
10
10
|
transient do
|
|
11
11
|
order { nil }
|
|
12
|
+
stock_location { nil }
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
variant
|
|
@@ -20,7 +21,13 @@ FactoryBot.define do
|
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
state { 'on_hand' }
|
|
23
|
-
shipment
|
|
24
|
+
shipment do
|
|
25
|
+
if stock_location
|
|
26
|
+
build(:shipment, state: 'pending', order: line_item.order, stock_location: stock_location)
|
|
27
|
+
else
|
|
28
|
+
build(:shipment, state: 'pending', order: line_item.order)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
24
31
|
# return_authorization
|
|
25
32
|
end
|
|
26
33
|
end
|
|
@@ -27,8 +27,15 @@ FactoryBot.define do
|
|
|
27
27
|
Spree::Promotion::Actions::CreateItemAdjustments.create!(calculator: calculator, promotion: promotion)
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
|
+
|
|
30
31
|
factory :promotion_with_item_adjustment, traits: [:with_line_item_adjustment]
|
|
31
32
|
|
|
33
|
+
trait :with_free_shipping do
|
|
34
|
+
after(:create) do |promotion|
|
|
35
|
+
Spree::Promotion::Actions::FreeShipping.create!(promotion: promotion)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
32
39
|
trait :with_order_adjustment do
|
|
33
40
|
transient do
|
|
34
41
|
weighted_order_adjustment_amount { 10 }
|
|
@@ -17,7 +17,7 @@ FactoryBot.define do
|
|
|
17
17
|
|
|
18
18
|
after(:build) do |package, evaluator|
|
|
19
19
|
evaluator.variants_contents.each do |variant, count|
|
|
20
|
-
package.add_multiple build_list(:inventory_unit, count, variant: variant)
|
|
20
|
+
package.add_multiple build_list(:inventory_unit, count, variant: variant, stock_location: evaluator.stock_location)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
data/solidus_core.gemspec
CHANGED
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
|
17
17
|
s.files = `git ls-files`.split("\n")
|
|
18
18
|
s.require_path = 'lib'
|
|
19
19
|
|
|
20
|
-
s.required_ruby_version
|
|
20
|
+
s.required_ruby_version = '>= 2.4.0'
|
|
21
21
|
s.required_rubygems_version = '>= 1.8.23'
|
|
22
22
|
|
|
23
23
|
%w[
|
|
@@ -36,7 +36,7 @@ Gem::Specification.new do |s|
|
|
|
36
36
|
s.add_dependency 'friendly_id', '~> 5.0'
|
|
37
37
|
s.add_dependency 'kaminari-activerecord', '~> 1.1'
|
|
38
38
|
s.add_dependency 'monetize', '~> 1.8'
|
|
39
|
-
s.add_dependency 'paperclip',
|
|
39
|
+
s.add_dependency 'paperclip', '>= 4.2'
|
|
40
40
|
s.add_dependency 'paranoia', '~> 2.4'
|
|
41
41
|
s.add_dependency 'ransack', '~> 2.0'
|
|
42
42
|
s.add_dependency 'state_machines-activerecord', '~> 0.6'
|
|
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
|
4
4
|
require 'spree/core/environment_extension'
|
|
5
5
|
|
|
6
6
|
RSpec.describe Spree::Core::EnvironmentExtension do
|
|
7
|
-
let(:base) { Class.new }
|
|
7
|
+
let(:base) { Class.new { def self.to_s; 'ExampleClass'; end } }
|
|
8
8
|
subject! { base.include(described_class).new }
|
|
9
9
|
|
|
10
10
|
describe '.add_class_set' do
|
|
@@ -32,4 +32,15 @@ RSpec.describe Spree::Core::EnvironmentExtension do
|
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
|
+
|
|
36
|
+
describe '#add_class' do
|
|
37
|
+
it 'is deprecated' do
|
|
38
|
+
expect(Spree::Deprecation).to receive(:warn) do |message, _caller|
|
|
39
|
+
expect(message).to include('ExampleClass.add_class_set(:foo)')
|
|
40
|
+
end
|
|
41
|
+
expect(base).to receive(:add_class_set).with(:foo)
|
|
42
|
+
|
|
43
|
+
base.new.add_class(:foo)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
35
46
|
end
|
|
@@ -39,6 +39,24 @@ RSpec.describe Spree::Core::StockConfiguration do
|
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
describe '#location_filter_class' do
|
|
43
|
+
let(:stock_configuration) { described_class.new }
|
|
44
|
+
subject { stock_configuration.location_filter_class }
|
|
45
|
+
|
|
46
|
+
it "returns Spree::Stock::LocationFilter::Active" do
|
|
47
|
+
is_expected.to be ::Spree::Stock::LocationFilter::Active
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "with another constant name assiged" do
|
|
51
|
+
MyFilter = Class.new
|
|
52
|
+
before { stock_configuration.location_filter_class = MyFilter.to_s }
|
|
53
|
+
|
|
54
|
+
it "returns the constant" do
|
|
55
|
+
is_expected.to be MyFilter
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
42
60
|
describe '#location_sorter_class' do
|
|
43
61
|
let(:stock_configuration) { described_class.new }
|
|
44
62
|
subject { stock_configuration.location_sorter_class }
|
|
@@ -56,4 +74,22 @@ RSpec.describe Spree::Core::StockConfiguration do
|
|
|
56
74
|
end
|
|
57
75
|
end
|
|
58
76
|
end
|
|
77
|
+
|
|
78
|
+
describe '#allocator_class' do
|
|
79
|
+
let(:stock_configuration) { described_class.new }
|
|
80
|
+
subject { stock_configuration.allocator_class }
|
|
81
|
+
|
|
82
|
+
it "returns Spree::Stock::Allocator::OnHandFirst" do
|
|
83
|
+
is_expected.to be ::Spree::Stock::Allocator::OnHandFirst
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context "with another constant name assiged" do
|
|
87
|
+
MyAllocator = Class.new
|
|
88
|
+
before { stock_configuration.allocator_class = MyAllocator.to_s }
|
|
89
|
+
|
|
90
|
+
it "returns the constant" do
|
|
91
|
+
is_expected.to be MyAllocator
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
59
95
|
end
|