solidus_core 2.9.6 → 2.10.3
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_address_book.rb +2 -2
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/spree/address.rb +13 -17
- data/app/models/spree/adjustment.rb +20 -9
- data/app/models/spree/asset.rb +1 -1
- data/app/models/spree/base.rb +0 -2
- data/app/models/spree/calculator.rb +1 -1
- 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 +3 -3
- data/app/models/spree/classification.rb +2 -2
- data/app/models/spree/credit_card.rb +4 -4
- data/app/models/spree/customer_return.rb +1 -1
- data/app/models/spree/image/paperclip_attachment.rb +1 -1
- data/app/models/spree/inventory_unit.rb +5 -23
- data/app/models/spree/line_item.rb +4 -4
- data/app/models/spree/line_item_action.rb +2 -2
- data/app/models/spree/log_entry.rb +1 -1
- data/app/models/spree/option_value.rb +1 -1
- data/app/models/spree/option_values_variant.rb +2 -2
- data/app/models/spree/order.rb +11 -27
- data/app/models/spree/order/checkout.rb +1 -1
- data/app/models/spree/order/payments.rb +2 -2
- data/app/models/spree/order_cancellations.rb +1 -1
- data/app/models/spree/order_capturing.rb +2 -2
- data/app/models/spree/order_contents.rb +2 -2
- data/app/models/spree/order_mutex.rb +1 -1
- data/app/models/spree/order_promotion.rb +3 -3
- data/app/models/spree/order_shipping.rb +1 -1
- data/app/models/spree/order_taxation.rb +3 -3
- data/app/models/spree/payment.rb +8 -45
- data/app/models/spree/payment/processing.rb +3 -3
- data/app/models/spree/payment_capture_event.rb +1 -1
- data/app/models/spree/payment_method.rb +5 -2
- data/app/models/spree/payment_method/bogus_credit_card.rb +1 -1
- data/app/models/spree/payment_source.rb +1 -1
- data/app/models/spree/price.rb +2 -2
- data/app/models/spree/product.rb +5 -5
- data/app/models/spree/product/scopes.rb +218 -210
- data/app/models/spree/product_option_type.rb +2 -2
- data/app/models/spree/product_promotion_rule.rb +2 -2
- data/app/models/spree/product_property.rb +2 -2
- data/app/models/spree/promotion.rb +28 -13
- 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 +2 -2
- data/app/models/spree/promotion_chooser.rb +2 -2
- data/app/models/spree/promotion_code.rb +11 -10
- data/app/models/spree/promotion_code/batch_builder.rb +3 -3
- data/app/models/spree/promotion_code_batch.rb +1 -1
- data/app/models/spree/promotion_rule.rb +2 -2
- data/app/models/spree/promotion_rule_role.rb +2 -2
- data/app/models/spree/promotion_rule_store.rb +2 -2
- data/app/models/spree/promotion_rule_taxon.rb +2 -2
- data/app/models/spree/promotion_rule_user.rb +2 -2
- data/app/models/spree/refund.rb +5 -5
- data/app/models/spree/reimbursement.rb +5 -13
- data/app/models/spree/reimbursement/credit.rb +2 -2
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
- data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
- data/app/models/spree/return_authorization.rb +4 -10
- data/app/models/spree/return_item.rb +13 -52
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/role_user.rb +2 -2
- data/app/models/spree/shipment.rb +7 -41
- data/app/models/spree/shipping_calculator.rb +0 -4
- data/app/models/spree/shipping_manifest.rb +3 -3
- data/app/models/spree/shipping_method.rb +2 -2
- data/app/models/spree/shipping_method_category.rb +2 -2
- data/app/models/spree/shipping_method_stock_location.rb +2 -2
- data/app/models/spree/shipping_method_zone.rb +2 -2
- data/app/models/spree/shipping_rate.rb +2 -2
- data/app/models/spree/shipping_rate_tax.rb +2 -2
- data/app/models/spree/state.rb +2 -2
- data/app/models/spree/state_change.rb +2 -2
- 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 +3 -3
- data/app/models/spree/stock_location.rb +2 -2
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/stock_quantities.rb +13 -12
- data/app/models/spree/store_credit.rb +8 -8
- data/app/models/spree/store_credit_event.rb +3 -3
- data/app/models/spree/store_payment_method.rb +2 -2
- data/app/models/spree/store_shipping_method.rb +2 -2
- 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 +5 -1
- data/app/models/spree/tax_rate_tax_category.rb +2 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
- data/app/models/spree/unit_cancel.rb +5 -2
- data/app/models/spree/user_address.rb +2 -2
- 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/user_stock_location.rb +2 -2
- data/app/models/spree/variant.rb +10 -10
- data/app/models/spree/variant/scopes.rb +37 -29
- data/app/models/spree/variant_property_rule.rb +1 -1
- data/app/models/spree/variant_property_rule_condition.rb +2 -2
- data/app/models/spree/variant_property_rule_value.rb +2 -2
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
- data/app/models/spree/wallet_payment_source.rb +2 -2
- data/app/models/spree/zone.rb +1 -1
- data/app/models/spree/zone_member.rb +2 -2
- data/config/initializers/inflections.rb +5 -0
- data/config/initializers/money.rb +2 -0
- data/config/locales/en.yml +34 -3
- data/lib/generators/spree/dummy/dummy_generator.rb +2 -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/importer/order.rb +28 -28
- data/lib/spree/core/importer/product.rb +2 -2
- 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/default_customer.rb +1 -1
- 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/dummy_app/rake_tasks.rb +6 -2
- 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/lib/spree/testing_support/factories/user_factory.rb +4 -1
- data/solidus_core.gemspec +6 -6
- data/spec/lib/search/base_spec.rb +5 -1
- data/spec/lib/search/variant_spec.rb +1 -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/lib/spree/event_spec.rb +15 -3
- data/spec/models/spree/ability_spec.rb +1 -1
- data/spec/models/spree/address_spec.rb +23 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +1 -1
- 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 +10 -2
- 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 +5 -4
- data/spec/models/spree/credit_card_spec.rb +2 -2
- data/spec/models/spree/customer_return_spec.rb +1 -1
- data/spec/models/spree/order/checkout_spec.rb +1 -1
- data/spec/models/spree/order/outstanding_balance_integration_spec.rb +5 -5
- data/spec/models/spree/order/payment_spec.rb +1 -1
- data/spec/models/spree/order_contents_spec.rb +1 -1
- data/spec/models/spree/order_inventory_spec.rb +3 -3
- data/spec/models/spree/order_merger_spec.rb +3 -3
- data/spec/models/spree/order_shipping_spec.rb +1 -1
- data/spec/models/spree/order_spec.rb +14 -21
- data/spec/models/spree/order_updater_spec.rb +4 -3
- data/spec/models/spree/payment_create_spec.rb +6 -16
- data/spec/models/spree/payment_spec.rb +12 -12
- 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/rules/first_repeat_purchase_since_spec.rb +2 -2
- data/spec/models/spree/promotion/rules/nth_order_spec.rb +2 -2
- data/spec/models/spree/promotion_rule_spec.rb +6 -6
- data/spec/models/spree/promotion_spec.rb +71 -54
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +3 -3
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
- data/spec/models/spree/return_item_spec.rb +11 -11
- data/spec/models/spree/returns_calculator_spec.rb +2 -2
- data/spec/models/spree/shipment_spec.rb +6 -6
- 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/inventory_units_finalizer_spec.rb +4 -4
- data/spec/models/spree/stock/package_spec.rb +28 -28
- data/spec/models/spree/stock/quantifier_spec.rb +2 -2
- 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 +8 -8
- data/spec/models/spree/tax_category_spec.rb +1 -1
- data/spec/models/spree/tax_rate_spec.rb +1 -0
- data/spec/models/spree/taxon_spec.rb +2 -2
- data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
- data/spec/models/spree/unit_cancel_spec.rb +5 -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
- data/spec/models/spree/user_spec.rb +3 -3
- metadata +49 -43
- data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -148
- data/spec/models/spree/order/updating_spec.rb +0 -18
|
@@ -158,7 +158,8 @@ module Spree
|
|
|
158
158
|
amount: -500,
|
|
159
159
|
finalized: true,
|
|
160
160
|
label: 'Some other credit')
|
|
161
|
-
|
|
161
|
+
|
|
162
|
+
line_item.adjustments.each { |item| item.update_column(:eligible, true) }
|
|
162
163
|
|
|
163
164
|
order.recalculate
|
|
164
165
|
|
|
@@ -172,7 +173,7 @@ module Spree
|
|
|
172
173
|
create_adjustment('Promotion A', -200)
|
|
173
174
|
create_adjustment('Promotion B', -200)
|
|
174
175
|
end
|
|
175
|
-
line_item.adjustments.each { |
|
|
176
|
+
line_item.adjustments.each { |item| item.update_column(:eligible, true) }
|
|
176
177
|
|
|
177
178
|
order.recalculate
|
|
178
179
|
|
|
@@ -186,7 +187,7 @@ module Spree
|
|
|
186
187
|
create_adjustment('Promotion A', -200)
|
|
187
188
|
create_adjustment('Promotion B', -200)
|
|
188
189
|
end
|
|
189
|
-
line_item.adjustments.each { |
|
|
190
|
+
line_item.adjustments.each { |item| item.update_column(:eligible, true) }
|
|
190
191
|
|
|
191
192
|
order.recalculate
|
|
192
193
|
|
|
@@ -122,7 +122,7 @@ module Spree
|
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
context 'the order has no user' do
|
|
125
|
-
before { order.
|
|
125
|
+
before { order.update!(user_id: nil) }
|
|
126
126
|
it 'errors' do
|
|
127
127
|
expect { new_payment }.to raise_error(ActiveRecord::RecordNotFound)
|
|
128
128
|
end
|
|
@@ -130,7 +130,7 @@ module Spree
|
|
|
130
130
|
|
|
131
131
|
context 'the order and the credit card have no user' do
|
|
132
132
|
before do
|
|
133
|
-
order.
|
|
133
|
+
order.update!(user_id: nil)
|
|
134
134
|
credit_card.update!(user_id: nil)
|
|
135
135
|
end
|
|
136
136
|
it 'errors' do
|
|
@@ -156,20 +156,10 @@ module Spree
|
|
|
156
156
|
context "unpermitted" do
|
|
157
157
|
let(:attributes) { ActionController::Parameters.new(valid_attributes) }
|
|
158
158
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
payment_method: nil,
|
|
164
|
-
source: nil
|
|
165
|
-
)
|
|
166
|
-
end
|
|
167
|
-
else
|
|
168
|
-
it "raises an exception" do
|
|
169
|
-
expect {
|
|
170
|
-
new_payment
|
|
171
|
-
}.to raise_exception(ActionController::UnfilteredParameters)
|
|
172
|
-
end
|
|
159
|
+
it "raises an exception" do
|
|
160
|
+
expect {
|
|
161
|
+
new_payment
|
|
162
|
+
}.to raise_exception(ActionController::UnfilteredParameters)
|
|
173
163
|
end
|
|
174
164
|
end
|
|
175
165
|
|
|
@@ -134,7 +134,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
134
134
|
describe "#process!" do
|
|
135
135
|
context 'with autocapture' do
|
|
136
136
|
before do
|
|
137
|
-
payment.payment_method.
|
|
137
|
+
payment.payment_method.update!(auto_capture: true)
|
|
138
138
|
end
|
|
139
139
|
|
|
140
140
|
it "should purchase" do
|
|
@@ -145,11 +145,11 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
145
145
|
|
|
146
146
|
context 'without autocapture' do
|
|
147
147
|
before do
|
|
148
|
-
payment.payment_method.
|
|
148
|
+
payment.payment_method.update!(auto_capture: false)
|
|
149
149
|
end
|
|
150
150
|
|
|
151
151
|
context 'when in the checkout state' do
|
|
152
|
-
before { payment.
|
|
152
|
+
before { payment.update!(state: 'checkout') }
|
|
153
153
|
|
|
154
154
|
it "authorizes" do
|
|
155
155
|
payment.process!
|
|
@@ -158,7 +158,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
context 'when in the processing state' do
|
|
161
|
-
before { payment.
|
|
161
|
+
before { payment.update!(state: 'processing') }
|
|
162
162
|
|
|
163
163
|
it "does not authorize" do
|
|
164
164
|
payment.process!
|
|
@@ -167,7 +167,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
167
167
|
end
|
|
168
168
|
|
|
169
169
|
context 'when in the pending state' do
|
|
170
|
-
before { payment.
|
|
170
|
+
before { payment.update!(state: 'pending') }
|
|
171
171
|
|
|
172
172
|
it "does not re-authorize" do
|
|
173
173
|
expect(payment).to_not receive(:authorize!)
|
|
@@ -177,7 +177,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
177
177
|
end
|
|
178
178
|
|
|
179
179
|
context 'when in a failed state' do
|
|
180
|
-
before { payment.
|
|
180
|
+
before { payment.update!(state: 'failed') }
|
|
181
181
|
|
|
182
182
|
it "raises an exception" do
|
|
183
183
|
expect {
|
|
@@ -187,7 +187,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
187
187
|
end
|
|
188
188
|
|
|
189
189
|
context 'when in the completed state' do
|
|
190
|
-
before { payment.
|
|
190
|
+
before { payment.update!(state: 'completed') }
|
|
191
191
|
|
|
192
192
|
it "authorizes" do
|
|
193
193
|
payment.process!
|
|
@@ -253,7 +253,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
253
253
|
|
|
254
254
|
context 'when the source is a credit card without an address' do
|
|
255
255
|
let(:card) { create(:credit_card, address: nil) }
|
|
256
|
-
before { order.
|
|
256
|
+
before { order.update!(bill_address: address) }
|
|
257
257
|
let(:address) { create(:address) }
|
|
258
258
|
|
|
259
259
|
it 'send the order bill address' do
|
|
@@ -278,7 +278,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
278
278
|
|
|
279
279
|
let(:store_credit_payment) { create(:store_credit_payment) }
|
|
280
280
|
let(:store_credit_payment_method) { create(:store_credit_payment_method) }
|
|
281
|
-
before { order.
|
|
281
|
+
before { order.update!(bill_address: address) }
|
|
282
282
|
let(:address) { create(:address) }
|
|
283
283
|
|
|
284
284
|
it 'send the order bill address' do
|
|
@@ -932,7 +932,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
932
932
|
end
|
|
933
933
|
|
|
934
934
|
context 'the order has no user' do
|
|
935
|
-
before { order.
|
|
935
|
+
before { order.update!(user_id: nil) }
|
|
936
936
|
it 'errors' do
|
|
937
937
|
expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
|
|
938
938
|
end
|
|
@@ -940,7 +940,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
940
940
|
|
|
941
941
|
context 'the order and the credit card have no user' do
|
|
942
942
|
before do
|
|
943
|
-
order.
|
|
943
|
+
order.update!(user_id: nil)
|
|
944
944
|
credit_card.update!(user_id: nil)
|
|
945
945
|
end
|
|
946
946
|
it 'errors' do
|
|
@@ -976,7 +976,7 @@ RSpec.describe Spree::Payment, type: :model do
|
|
|
976
976
|
# Sets the payment's order to a different Ruby object entirely
|
|
977
977
|
payment.order = Spree::Order.find(payment.order_id)
|
|
978
978
|
email = 'foo@example.com'
|
|
979
|
-
order.
|
|
979
|
+
order.update(email: email)
|
|
980
980
|
expect(payment.gateway_options[:email]).to eq(email)
|
|
981
981
|
end
|
|
982
982
|
end
|
|
@@ -25,11 +25,13 @@ RSpec.describe Spree::PermissionSets::UserManagement do
|
|
|
25
25
|
context 'when the user does not have a role' do
|
|
26
26
|
let(:user) { create(:user) }
|
|
27
27
|
it { is_expected.to be_able_to(:update_email, user) }
|
|
28
|
+
it { is_expected.to be_able_to(:update_password, user) }
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
context 'when the user has a role' do
|
|
31
32
|
let(:user) { create(:user, spree_roles: [create(:role)]) }
|
|
32
33
|
it { is_expected.not_to be_able_to(:update_email, user) }
|
|
34
|
+
it { is_expected.not_to be_able_to(:update_password, user) }
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
it { is_expected.not_to be_able_to(:delete, Spree.user_class) }
|
|
@@ -12,10 +12,10 @@ RSpec.describe Spree::Preference, type: :model do
|
|
|
12
12
|
|
|
13
13
|
describe "type coversion for values" do
|
|
14
14
|
def round_trip_preference(key, value)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
element = Spree::Preference.new
|
|
16
|
+
element.value = value
|
|
17
|
+
element.key = key
|
|
18
|
+
element.save
|
|
19
19
|
|
|
20
20
|
Spree::Preference.find_by(key: key)
|
|
21
21
|
end
|
|
@@ -272,9 +272,9 @@ RSpec.describe Spree::Preferences::Preferable, type: :model do
|
|
|
272
272
|
before(:all) do
|
|
273
273
|
class CreatePrefTest < ActiveRecord::Migration[4.2]
|
|
274
274
|
def self.up
|
|
275
|
-
create_table :pref_tests do |
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
create_table :pref_tests do |item|
|
|
276
|
+
item.string :col
|
|
277
|
+
item.text :preferences
|
|
278
278
|
end
|
|
279
279
|
end
|
|
280
280
|
|
|
@@ -42,10 +42,10 @@ RSpec.describe Spree::Promotion::Rules::FirstRepeatPurchaseSince do
|
|
|
42
42
|
let(:order_completion_date_2) { 1.day.ago }
|
|
43
43
|
before do
|
|
44
44
|
old_order_1 = create :completed_order_with_totals, user: user
|
|
45
|
-
old_order_1.
|
|
45
|
+
old_order_1.update(completed_at: order_completion_date_1)
|
|
46
46
|
|
|
47
47
|
old_order_2 = create :completed_order_with_totals, user: user
|
|
48
|
-
old_order_2.
|
|
48
|
+
old_order_2.update(completed_at: order_completion_date_2)
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
context "the last completed order was greater than the preferred days ago" do
|
|
@@ -40,7 +40,7 @@ RSpec.describe Spree::Promotion::Rules::NthOrder do
|
|
|
40
40
|
context "when the user has completed orders" do
|
|
41
41
|
before do
|
|
42
42
|
old_order = create :completed_order_with_totals, user: user
|
|
43
|
-
old_order.
|
|
43
|
+
old_order.update(completed_at: 1.day.ago)
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
context "when this order will be the 'nth' order" do
|
|
@@ -49,7 +49,7 @@ RSpec.describe Spree::Promotion::Rules::NthOrder do
|
|
|
49
49
|
|
|
50
50
|
context "when this order is completed and is still the 'nth' order" do
|
|
51
51
|
before do
|
|
52
|
-
order.
|
|
52
|
+
order.update(completed_at: Time.current)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
it { is_expected.to be true }
|
|
@@ -17,13 +17,13 @@ module Spree
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
it "validates unique rules for a promotion" do
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
promotion_one = TestRule.new
|
|
21
|
+
promotion_one.promotion_id = 1
|
|
22
|
+
promotion_one.save
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
expect(
|
|
24
|
+
promotion_two = TestRule.new
|
|
25
|
+
promotion_two.promotion_id = 1
|
|
26
|
+
expect(promotion_two).not_to be_valid
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
it "generates its own partial path" do
|
|
@@ -434,12 +434,12 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
434
434
|
end
|
|
435
435
|
|
|
436
436
|
context 'when expires_at date is not already reached' do
|
|
437
|
-
let(:expires_at) { Time.current + 1.
|
|
437
|
+
let(:expires_at) { Time.current + 1.day }
|
|
438
438
|
it { is_expected.to be_falsey }
|
|
439
439
|
end
|
|
440
440
|
|
|
441
441
|
context 'when expires_at date is in the past' do
|
|
442
|
-
let(:expires_at) { Time.current - 1.
|
|
442
|
+
let(:expires_at) { Time.current - 1.day }
|
|
443
443
|
it { is_expected.to be_truthy }
|
|
444
444
|
end
|
|
445
445
|
end
|
|
@@ -454,12 +454,12 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
454
454
|
end
|
|
455
455
|
|
|
456
456
|
context 'when expires_at date is not already reached' do
|
|
457
|
-
let(:expires_at) { Time.current + 1.
|
|
457
|
+
let(:expires_at) { Time.current + 1.day }
|
|
458
458
|
it { is_expected.to be_truthy }
|
|
459
459
|
end
|
|
460
460
|
|
|
461
461
|
context 'when expires_at date is in the past' do
|
|
462
|
-
let(:expires_at) { Time.current - 1.
|
|
462
|
+
let(:expires_at) { Time.current - 1.day }
|
|
463
463
|
it { is_expected.to be_falsey }
|
|
464
464
|
end
|
|
465
465
|
end
|
|
@@ -569,80 +569,69 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
569
569
|
|
|
570
570
|
context "#eligible?" do
|
|
571
571
|
subject do
|
|
572
|
-
promotion.eligible?(promotable)
|
|
572
|
+
promotion.eligible?(promotable, promotion_code: promotion.codes.first)
|
|
573
573
|
end
|
|
574
574
|
|
|
575
|
-
|
|
575
|
+
shared_examples "a promotable" do
|
|
576
|
+
context "when empty" do
|
|
577
|
+
it { is_expected.to be true }
|
|
578
|
+
end
|
|
576
579
|
|
|
577
|
-
|
|
580
|
+
context "when promotion is expired" do
|
|
581
|
+
before { promotion.expires_at = Time.current - 10.days }
|
|
578
582
|
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
it { is_expected.to be false }
|
|
582
|
-
end
|
|
583
|
+
it { is_expected.to be false }
|
|
584
|
+
end
|
|
583
585
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
586
|
+
context "when promotion's usage limit is exceeded" do
|
|
587
|
+
before do
|
|
588
|
+
promotion.usage_limit = 1
|
|
589
|
+
create(:completed_order_with_promotion, promotion: promotion)
|
|
590
|
+
end
|
|
587
591
|
|
|
588
|
-
|
|
589
|
-
FactoryBot.create(
|
|
590
|
-
:completed_order_with_promotion,
|
|
591
|
-
promotion: promotion
|
|
592
|
-
)
|
|
593
|
-
promotion.usage_limit = 1
|
|
592
|
+
it { is_expected.to be false }
|
|
594
593
|
end
|
|
595
594
|
|
|
596
|
-
|
|
597
|
-
|
|
595
|
+
context "when promotion code's usage limit is exceeded" do
|
|
596
|
+
before do
|
|
597
|
+
promotion.per_code_usage_limit = 1
|
|
598
|
+
create(:completed_order_with_promotion, promotion: promotion)
|
|
599
|
+
promotion.codes.first.adjustments.update_all(eligible: true)
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
it { is_expected.to be false }
|
|
598
603
|
end
|
|
599
|
-
end
|
|
600
604
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
let(:promotion_code) { promotion.codes.first }
|
|
605
|
+
context "when promotion is at last usage on the same order" do
|
|
606
|
+
let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
|
|
607
|
+
let(:promotable) { order }
|
|
605
608
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
promotion: promotion
|
|
610
|
-
)
|
|
611
|
-
promotion_code.adjustments.update_all(eligible: true)
|
|
612
|
-
end
|
|
609
|
+
before do
|
|
610
|
+
promotion.usage_limit = 1
|
|
611
|
+
end
|
|
613
612
|
|
|
614
|
-
|
|
615
|
-
expect(promotion.eligible?(promotable, promotion_code: promotion_code)).to eq(false)
|
|
613
|
+
it { is_expected.to be true }
|
|
616
614
|
end
|
|
617
|
-
end
|
|
618
615
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
616
|
+
context "when promotion code is at last usage on the same order" do
|
|
617
|
+
let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
|
|
618
|
+
let(:promotable) { order }
|
|
622
619
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
620
|
+
before do
|
|
621
|
+
promotion.per_code_usage_limit = 1
|
|
622
|
+
end
|
|
626
623
|
|
|
627
|
-
context "and product is promotionable" do
|
|
628
|
-
let(:promotionable) { true }
|
|
629
624
|
it { is_expected.to be true }
|
|
630
625
|
end
|
|
631
|
-
|
|
632
|
-
context "and product is not promotionable" do
|
|
633
|
-
let(:promotionable) { false }
|
|
634
|
-
it { is_expected.to be false }
|
|
635
|
-
end
|
|
636
626
|
end
|
|
637
627
|
|
|
638
628
|
context "when promotable is a Spree::Order" do
|
|
629
|
+
let(:promotion) { create(:promotion, :with_order_adjustment) }
|
|
639
630
|
let(:promotable) { create :order }
|
|
640
631
|
|
|
641
|
-
|
|
642
|
-
it { is_expected.to be true }
|
|
643
|
-
end
|
|
632
|
+
it_behaves_like "a promotable"
|
|
644
633
|
|
|
645
|
-
context "
|
|
634
|
+
context "when it contains items" do
|
|
646
635
|
let!(:line_item) { create(:line_item, order: promotable) }
|
|
647
636
|
let!(:line_item2) { create(:line_item, order: promotable) }
|
|
648
637
|
|
|
@@ -650,6 +639,7 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
650
639
|
before do
|
|
651
640
|
line_item.product.update_column(:promotionable, false)
|
|
652
641
|
end
|
|
642
|
+
|
|
653
643
|
it { is_expected.to be false }
|
|
654
644
|
end
|
|
655
645
|
|
|
@@ -658,6 +648,7 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
658
648
|
line_item.product.update_column(:promotionable, false)
|
|
659
649
|
line_item2.product.update_column(:promotionable, false)
|
|
660
650
|
end
|
|
651
|
+
|
|
661
652
|
it { is_expected.to be false }
|
|
662
653
|
end
|
|
663
654
|
|
|
@@ -666,6 +657,32 @@ RSpec.describe Spree::Promotion, type: :model do
|
|
|
666
657
|
end
|
|
667
658
|
end
|
|
668
659
|
end
|
|
660
|
+
|
|
661
|
+
context "when promotable is a Spree::LineItem" do
|
|
662
|
+
let(:promotion) { create(:promotion, :with_line_item_adjustment) }
|
|
663
|
+
let(:promotable) { create(:line_item) }
|
|
664
|
+
|
|
665
|
+
it_behaves_like "a promotable"
|
|
666
|
+
|
|
667
|
+
context "and product is promotionable" do
|
|
668
|
+
before { promotable.product.promotionable = true }
|
|
669
|
+
|
|
670
|
+
it { is_expected.to be true }
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
context "and product is not promotionable" do
|
|
674
|
+
before { promotable.product.promotionable = false }
|
|
675
|
+
|
|
676
|
+
it { is_expected.to be false }
|
|
677
|
+
end
|
|
678
|
+
end
|
|
679
|
+
|
|
680
|
+
context "when promotable is a Spree::Shipment" do
|
|
681
|
+
let(:promotion) { create(:promotion, :with_free_shipping) }
|
|
682
|
+
let(:promotable) { create(:shipment) }
|
|
683
|
+
|
|
684
|
+
it_behaves_like "a promotable"
|
|
685
|
+
end
|
|
669
686
|
end
|
|
670
687
|
|
|
671
688
|
context "#eligible_rules" do
|