solidus_core 1.3.2 → 1.4.0.beta1
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/README.md +15 -0
- data/app/helpers/spree/base_helper.rb +6 -2
- data/app/mailers/spree/base_mailer.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +1 -1
- data/app/mailers/spree/order_mailer.rb +2 -2
- data/app/mailers/spree/reimbursement_mailer.rb +7 -7
- data/app/mailers/spree/test_mailer.rb +3 -2
- data/app/models/concerns/spree/user_payment_source.rb +1 -1
- data/app/models/spree/address.rb +14 -4
- data/app/models/spree/adjustment.rb +11 -19
- data/app/models/spree/app_configuration.rb +23 -1
- data/app/models/spree/base.rb +9 -0
- data/app/models/spree/country.rb +2 -2
- data/app/models/spree/exchange.rb +1 -1
- data/app/models/spree/gateway.rb +1 -1
- data/app/models/spree/item_adjustments.rb +7 -0
- data/app/models/spree/line_item.rb +1 -13
- data/app/models/spree/order/checkout.rb +19 -16
- data/app/models/spree/order/payments.rb +0 -2
- data/app/models/spree/order.rb +7 -21
- data/app/models/spree/order_contents.rb +60 -4
- data/app/models/spree/order_merger.rb +2 -4
- data/app/models/spree/order_shipping.rb +1 -1
- data/app/models/spree/order_update_attributes.rb +0 -2
- data/app/models/spree/order_updater.rb +14 -11
- data/app/models/spree/payment.rb +2 -3
- data/app/models/spree/payment_create.rb +5 -2
- data/app/models/spree/payment_method/store_credit.rb +6 -5
- data/app/models/spree/product/scopes.rb +2 -1
- data/app/models/spree/product.rb +2 -5
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -3
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
- data/app/models/spree/promotion/rules/option_value.rb +2 -3
- data/app/models/spree/promotion/rules/product.rb +9 -3
- data/app/models/spree/promotion/rules/taxon.rb +33 -7
- data/app/models/spree/promotion/rules/user.rb +2 -3
- data/app/models/spree/promotion.rb +16 -6
- data/app/models/spree/promotion_handler/coupon.rb +1 -1
- data/app/models/spree/shipment.rb +12 -16
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/package.rb +0 -1
- data/app/models/spree/stock_item.rb +2 -6
- data/app/models/spree/store.rb +2 -1
- data/app/models/spree/tax_rate.rb +1 -1
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +29 -0
- data/app/models/spree/wallet/default_payment_builder.rb +26 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +46 -0
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +1 -1
- data/app/views/spree/shared/_base_mailer_footer.html.erb +1 -20
- data/app/views/spree/shared/_base_mailer_header.html.erb +1 -31
- data/config/initializers/spree_user.rb +1 -1
- data/config/locales/en.yml +58 -34
- data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +1 -1
- data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +15 -3
- data/db/migrate/20160527070401_rename_shipment_address_field.rb +7 -0
- data/db/migrate/20160616232103_remove_user_id_from_promotion_rules.rb +11 -0
- data/db/migrate/20160718205341_add_payment_id_index_to_spree_refunds.rb +5 -0
- data/db/migrate/20160718205859_add_reimbursement_id_index_to_spree_refunds.rb +5 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/database.yml +3 -1
- data/lib/generators/spree/dummy/templates/rails/test.rb +4 -2
- data/lib/generators/spree/install/install_generator.rb +6 -16
- data/lib/spree/core/controller_helpers/auth.rb +1 -1
- data/lib/spree/core/controller_helpers/common.rb +1 -1
- data/lib/spree/core/controller_helpers/order.rb +2 -2
- data/lib/spree/core/current_store.rb +5 -1
- data/lib/spree/core/delegate_belongs_to.rb +1 -1
- data/lib/spree/core/routes.rb +6 -32
- data/lib/spree/core/search/base.rb +2 -2
- data/lib/spree/core/stock_configuration.rb +6 -0
- data/lib/spree/core/version.rb +2 -2
- data/lib/spree/core.rb +2 -1
- data/lib/spree/i18n.rb +7 -0
- data/lib/spree/mailer_previews/carton_preview.rb +2 -1
- data/lib/spree/mailer_previews/order_preview.rb +8 -3
- data/lib/spree/mailer_previews/reimbursement_preview.rb +11 -0
- data/lib/spree/migrations.rb +13 -7
- data/lib/spree/permitted_attributes.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +6 -1
- data/lib/spree/testing_support/common_rake.rb +3 -7
- data/lib/spree/testing_support/controller_requests.rb +8 -0
- data/lib/spree/testing_support/factories/order_factory.rb +30 -8
- data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_factory.rb +6 -0
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -0
- data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +3 -1
- data/solidus_core.gemspec +3 -3
- data/spec/helpers/base_helper_spec.rb +18 -2
- data/spec/lib/i18n_spec.rb +4 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +16 -4
- data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +75 -59
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +1 -1
- data/spec/lib/spree/core/importer/order_spec.rb +4 -2
- data/spec/lib/spree/core/stock_configuration_spec.rb +17 -0
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +195 -0
- data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +6 -0
- data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +6 -0
- data/spec/lib/spree/migrations_spec.rb +3 -9
- data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +1 -1
- data/spec/mailers/carton_mailer_spec.rb +1 -1
- data/spec/mailers/order_mailer_spec.rb +2 -2
- data/spec/mailers/reimbursement_mailer_spec.rb +1 -1
- data/spec/models/spree/address_spec.rb +22 -0
- data/spec/models/spree/adjustment_spec.rb +0 -10
- data/spec/models/spree/carton_spec.rb +1 -1
- data/spec/models/spree/country_spec.rb +9 -1
- data/spec/models/spree/gateway/bogus_spec.rb +1 -1
- data/spec/models/spree/item_adjustments_spec.rb +33 -0
- data/spec/models/spree/line_item_spec.rb +2 -21
- data/spec/models/spree/order/checkout_spec.rb +32 -45
- data/spec/models/spree/order/payment_spec.rb +1 -16
- data/spec/models/spree/order_cancellations_spec.rb +8 -3
- data/spec/models/spree/order_contents_spec.rb +48 -0
- data/spec/models/spree/order_merger_spec.rb +8 -5
- data/spec/models/spree/order_shipping_spec.rb +3 -4
- data/spec/models/spree/order_spec.rb +23 -59
- data/spec/models/spree/order_update_attributes_spec.rb +1 -5
- data/spec/models/spree/order_updater_spec.rb +39 -11
- data/spec/models/spree/payment_create_spec.rb +61 -0
- data/spec/models/spree/payment_method/store_credit_spec.rb +23 -10
- data/spec/models/spree/payment_spec.rb +17 -4
- data/spec/models/spree/product_spec.rb +1 -1
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +8 -13
- data/spec/models/spree/promotion/rules/product_spec.rb +33 -0
- data/spec/models/spree/promotion/rules/taxon_spec.rb +52 -8
- data/spec/models/spree/promotion_spec.rb +18 -12
- data/spec/models/spree/return_authorization_spec.rb +0 -16
- data/spec/models/spree/shipment_spec.rb +57 -36
- data/spec/models/spree/stock/coordinator_spec.rb +0 -5
- data/spec/models/spree/stock/package_spec.rb +0 -1
- data/spec/models/spree/stock_item_spec.rb +35 -145
- data/spec/models/spree/store_spec.rb +24 -10
- data/spec/models/spree/tax_rate_spec.rb +2 -2
- data/spec/models/spree/user_spec.rb +1 -1
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +20 -12
- data/spec/support/concerns/working_factories.rb +4 -0
- metadata +30 -10
- data/config/routes.rb +0 -1
|
@@ -43,6 +43,12 @@ module Spree
|
|
|
43
43
|
expect(new_payment.source.payment_method_id).to eq payment_method.id
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
it "doesn't modify passed-in hash" do
|
|
47
|
+
original = attributes.dup
|
|
48
|
+
new_payment
|
|
49
|
+
expect(original).to eq(attributes)
|
|
50
|
+
end
|
|
51
|
+
|
|
46
52
|
context "when payment source not valid" do
|
|
47
53
|
let(:attributes) do
|
|
48
54
|
{
|
|
@@ -126,5 +132,60 @@ module Spree
|
|
|
126
132
|
end
|
|
127
133
|
end
|
|
128
134
|
end
|
|
135
|
+
|
|
136
|
+
context "with strong params" do
|
|
137
|
+
let(:valid_attributes) do
|
|
138
|
+
{
|
|
139
|
+
amount: 100,
|
|
140
|
+
payment_method: payment_method,
|
|
141
|
+
source_attributes: {
|
|
142
|
+
expiry: "01 / 99",
|
|
143
|
+
number: '1234567890123',
|
|
144
|
+
verification_value: '123',
|
|
145
|
+
name: 'Foo Bar'
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
context "unpermitted" do
|
|
151
|
+
let(:attributes) { ActionController::Parameters.new(valid_attributes) }
|
|
152
|
+
|
|
153
|
+
it "ignores all attributes" do
|
|
154
|
+
expect(new_payment).to have_attributes(
|
|
155
|
+
amount: 0,
|
|
156
|
+
payment_method: nil,
|
|
157
|
+
source: nil
|
|
158
|
+
)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
context "partially permitted" do
|
|
163
|
+
let(:attributes) do
|
|
164
|
+
ActionController::Parameters.new(valid_attributes).permit(:amount)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "only uses permitted attributes" do
|
|
168
|
+
expect(new_payment).to have_attributes(
|
|
169
|
+
amount: 100, # permitted
|
|
170
|
+
payment_method: nil, # unpermitted
|
|
171
|
+
source: nil # unpermitted
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
context "all permitted" do
|
|
177
|
+
let(:attributes) do
|
|
178
|
+
ActionController::Parameters.new(valid_attributes).permit!
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "creates a payment with all attributes" do
|
|
182
|
+
expect(new_payment).to have_attributes(
|
|
183
|
+
amount: 100,
|
|
184
|
+
payment_method: payment_method,
|
|
185
|
+
source: kind_of(CreditCard)
|
|
186
|
+
)
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
129
190
|
end
|
|
130
191
|
end
|
|
@@ -251,10 +251,17 @@ describe Spree::PaymentMethod::StoreCredit do
|
|
|
251
251
|
Spree::PaymentMethod::StoreCredit.new.cancel(auth_code)
|
|
252
252
|
end
|
|
253
253
|
|
|
254
|
-
let(:store_credit) { create(:store_credit, amount_used: captured_amount) }
|
|
254
|
+
let(:store_credit) { create(:store_credit, amount: original_amount, amount_used: captured_amount) }
|
|
255
255
|
let(:auth_code) { "1-SC-20141111111111" }
|
|
256
|
+
let(:original_amount) { 100.0 }
|
|
256
257
|
let(:captured_amount) { 10.0 }
|
|
257
258
|
|
|
259
|
+
shared_examples "a spree payment method" do
|
|
260
|
+
it "returns an ActiveMerchant::Billing::Response" do
|
|
261
|
+
expect(subject).to be_instance_of(ActiveMerchant::Billing::Response)
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
258
265
|
context "capture event found" do
|
|
259
266
|
let!(:store_credit_event) {
|
|
260
267
|
create(:store_credit_capture_event,
|
|
@@ -263,9 +270,12 @@ describe Spree::PaymentMethod::StoreCredit do
|
|
|
263
270
|
store_credit: store_credit)
|
|
264
271
|
}
|
|
265
272
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
273
|
+
it_behaves_like "a spree payment method"
|
|
274
|
+
|
|
275
|
+
it "refunds the capture amount" do
|
|
276
|
+
expect { subject }.to change{ store_credit.reload.amount_remaining }.
|
|
277
|
+
from(original_amount - captured_amount).
|
|
278
|
+
to(original_amount)
|
|
269
279
|
end
|
|
270
280
|
end
|
|
271
281
|
|
|
@@ -278,9 +288,12 @@ describe Spree::PaymentMethod::StoreCredit do
|
|
|
278
288
|
store_credit: store_credit)
|
|
279
289
|
}
|
|
280
290
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
291
|
+
it_behaves_like "a spree payment method"
|
|
292
|
+
|
|
293
|
+
it "refunds the capture amount" do
|
|
294
|
+
expect { subject }.to change{ store_credit.reload.amount_remaining }.
|
|
295
|
+
from(original_amount - captured_amount).
|
|
296
|
+
to(original_amount)
|
|
284
297
|
end
|
|
285
298
|
end
|
|
286
299
|
|
|
@@ -289,9 +302,9 @@ describe Spree::PaymentMethod::StoreCredit do
|
|
|
289
302
|
Spree::PaymentMethod::StoreCredit.new.cancel('INVALID')
|
|
290
303
|
end
|
|
291
304
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
305
|
+
it_behaves_like "a spree payment method"
|
|
306
|
+
|
|
307
|
+
it { expect(subject.success?).to be(false) }
|
|
295
308
|
end
|
|
296
309
|
end
|
|
297
310
|
end
|
|
@@ -655,13 +655,12 @@ describe Spree::Payment, type: :model do
|
|
|
655
655
|
end
|
|
656
656
|
|
|
657
657
|
context "completed orders" do
|
|
658
|
-
let(:payment_method) { create(:check_payment_method) }
|
|
659
658
|
before { allow(order).to receive_messages completed?: true }
|
|
660
659
|
|
|
661
660
|
it "updates payment_state and shipments" do
|
|
662
661
|
expect(order.updater).to receive(:update_payment_state)
|
|
663
662
|
expect(order.updater).to receive(:update_shipment_state)
|
|
664
|
-
Spree::Payment.create
|
|
663
|
+
Spree::Payment.create(amount: 100, order: order)
|
|
665
664
|
end
|
|
666
665
|
end
|
|
667
666
|
|
|
@@ -688,7 +687,7 @@ describe Spree::Payment, type: :model do
|
|
|
688
687
|
context "with multiple payment attempts" do
|
|
689
688
|
let(:attributes) { attributes_for(:credit_card) }
|
|
690
689
|
around do |example|
|
|
691
|
-
|
|
690
|
+
Spree::Deprecation.silence{ example.run }
|
|
692
691
|
end
|
|
693
692
|
|
|
694
693
|
it "should not try to create profiles on old failed payment attempts" do
|
|
@@ -749,7 +748,7 @@ describe Spree::Payment, type: :model do
|
|
|
749
748
|
describe "#apply_source_attributes" do
|
|
750
749
|
# This method is deprecated
|
|
751
750
|
around do |example|
|
|
752
|
-
|
|
751
|
+
Spree::Deprecation.silence do
|
|
753
752
|
example.run
|
|
754
753
|
end
|
|
755
754
|
end
|
|
@@ -1161,4 +1160,18 @@ describe Spree::Payment, type: :model do
|
|
|
1161
1160
|
end
|
|
1162
1161
|
end
|
|
1163
1162
|
end
|
|
1163
|
+
|
|
1164
|
+
describe "#payment_method" do
|
|
1165
|
+
context 'with a soft-deleted payment method' do
|
|
1166
|
+
before do
|
|
1167
|
+
gateway.save!
|
|
1168
|
+
payment.save!
|
|
1169
|
+
gateway.destroy
|
|
1170
|
+
end
|
|
1171
|
+
|
|
1172
|
+
it "works with a soft deleted payment method" do
|
|
1173
|
+
expect(payment.reload.payment_method).to eq(gateway)
|
|
1174
|
+
end
|
|
1175
|
+
end
|
|
1176
|
+
end
|
|
1164
1177
|
end
|
|
@@ -47,7 +47,7 @@ describe Spree::Product, type: :model do
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
it "should touch taxons" do
|
|
50
|
-
taxon = create(:taxon,
|
|
50
|
+
taxon = create(:taxon, product_ids: [product.id])
|
|
51
51
|
taxon.update_columns(updated_at: 1.day.ago)
|
|
52
52
|
product.taxons.reload
|
|
53
53
|
expect { subject }.to change{ taxon.reload.updated_at }
|
|
@@ -5,8 +5,9 @@ module Spree
|
|
|
5
5
|
module Actions
|
|
6
6
|
describe CreateItemAdjustments, type: :model do
|
|
7
7
|
let(:order) { create(:order) }
|
|
8
|
-
let(:promotion) { create(:promotion) }
|
|
9
|
-
let(:
|
|
8
|
+
let(:promotion) { create(:promotion, :with_line_item_adjustment, adjustment_rate: adjustment_amount) }
|
|
9
|
+
let(:adjustment_amount) { 10 }
|
|
10
|
+
let(:action) { promotion.actions.first! }
|
|
10
11
|
let!(:line_item) { create(:line_item, order: order) }
|
|
11
12
|
let(:payload) { { order: order, promotion: promotion } }
|
|
12
13
|
|
|
@@ -18,9 +19,7 @@ module Spree
|
|
|
18
19
|
context "#perform" do
|
|
19
20
|
# Regression test for https://github.com/spree/spree/issues/3966
|
|
20
21
|
context "when calculator computes 0" do
|
|
21
|
-
|
|
22
|
-
allow(action).to receive_messages compute_amount: 0
|
|
23
|
-
end
|
|
22
|
+
let(:adjustment_amount) { 0 }
|
|
24
23
|
|
|
25
24
|
it "does not create an adjustment when calculator returns 0" do
|
|
26
25
|
action.perform(payload)
|
|
@@ -29,20 +28,17 @@ module Spree
|
|
|
29
28
|
end
|
|
30
29
|
|
|
31
30
|
context "when calculator returns a non-zero value" do
|
|
32
|
-
|
|
33
|
-
promotion.promotion_actions = [action]
|
|
34
|
-
allow(action).to receive_messages compute_amount: 10
|
|
35
|
-
end
|
|
31
|
+
let(:adjustment_amount) { 10 }
|
|
36
32
|
|
|
37
33
|
it "creates adjustment with item as adjustable" do
|
|
38
34
|
action.perform(payload)
|
|
39
35
|
expect(action.adjustments.count).to eq(1)
|
|
40
|
-
expect(line_item.
|
|
36
|
+
expect(line_item.adjustments).to eq(action.adjustments)
|
|
41
37
|
end
|
|
42
38
|
|
|
43
39
|
it "creates adjustment with self as source" do
|
|
44
40
|
action.perform(payload)
|
|
45
|
-
expect(line_item.
|
|
41
|
+
expect(line_item.adjustments.first.source).to eq action
|
|
46
42
|
end
|
|
47
43
|
|
|
48
44
|
it "does not perform twice on the same item" do
|
|
@@ -83,8 +79,7 @@ module Spree
|
|
|
83
79
|
end
|
|
84
80
|
|
|
85
81
|
context "when a promotion code is used" do
|
|
86
|
-
let(:promotion_code) { create(:promotion_code) }
|
|
87
|
-
let(:promotion) { promotion_code.promotion }
|
|
82
|
+
let!(:promotion_code) { create(:promotion_code, promotion: promotion) }
|
|
88
83
|
let(:payload) { { order: order, promotion: promotion, promotion_code: promotion_code } }
|
|
89
84
|
|
|
90
85
|
it "should connect the adjustment to the promotion_code" do
|
|
@@ -84,6 +84,28 @@ describe Spree::Promotion::Rules::Product, type: :model do
|
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
|
+
|
|
88
|
+
context "with an invalid match policy" do
|
|
89
|
+
let(:rule) do
|
|
90
|
+
Spree::Promotion::Rules::Product.create!(
|
|
91
|
+
promotion: create(:promotion),
|
|
92
|
+
product_promotion_rules: [
|
|
93
|
+
Spree::ProductPromotionRule.new(product: product),
|
|
94
|
+
],
|
|
95
|
+
).tap do |rule|
|
|
96
|
+
rule.preferred_match_policy = 'invalid'
|
|
97
|
+
rule.save!(validate: false)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
let(:product) { order.line_items.first!.product }
|
|
101
|
+
let(:order) { create(:order_with_line_items, line_items_count: 1) }
|
|
102
|
+
|
|
103
|
+
it 'raises' do
|
|
104
|
+
expect {
|
|
105
|
+
rule.eligible?(order)
|
|
106
|
+
}.to raise_error('unexpected match policy: "invalid"')
|
|
107
|
+
end
|
|
108
|
+
end
|
|
87
109
|
end
|
|
88
110
|
|
|
89
111
|
describe '#actionable?' do
|
|
@@ -139,5 +161,16 @@ describe Spree::Promotion::Rules::Product, type: :model do
|
|
|
139
161
|
it { is_expected.to be_truthy }
|
|
140
162
|
end
|
|
141
163
|
end
|
|
164
|
+
|
|
165
|
+
context 'with an invalid match policy' do
|
|
166
|
+
let(:rule_options) { super().merge(preferred_match_policy: 'invalid') }
|
|
167
|
+
let(:line_item) { rule_line_item }
|
|
168
|
+
|
|
169
|
+
it 'raises' do
|
|
170
|
+
expect {
|
|
171
|
+
rule.actionable?(line_item)
|
|
172
|
+
}.to raise_error('unexpected match policy: "invalid"')
|
|
173
|
+
end
|
|
174
|
+
end
|
|
142
175
|
end
|
|
143
176
|
end
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Spree::Promotion::Rules::Taxon, type: :model do
|
|
4
|
-
let(:rule)
|
|
4
|
+
let(:rule) do
|
|
5
|
+
Spree::Promotion::Rules::Taxon.create!(promotion: create(:promotion))
|
|
6
|
+
end
|
|
5
7
|
|
|
6
|
-
context '#
|
|
8
|
+
context '#eligible?(order)' do
|
|
7
9
|
let(:taxon){ create :taxon, name: 'first' }
|
|
8
10
|
let(:taxon2){ create :taxon, name: 'second' }
|
|
9
11
|
let(:order){ create :order_with_line_items }
|
|
10
12
|
|
|
11
|
-
before do
|
|
12
|
-
rule.save
|
|
13
|
-
end
|
|
14
|
-
|
|
15
13
|
context 'with any match policy' do
|
|
16
14
|
before do
|
|
17
|
-
rule.preferred_match_policy
|
|
15
|
+
rule.update!(preferred_match_policy: 'any')
|
|
18
16
|
end
|
|
19
17
|
|
|
20
18
|
it 'is eligible if order does have any prefered taxon' do
|
|
@@ -62,7 +60,7 @@ describe Spree::Promotion::Rules::Taxon, type: :model do
|
|
|
62
60
|
|
|
63
61
|
context 'with all match policy' do
|
|
64
62
|
before do
|
|
65
|
-
rule.preferred_match_policy
|
|
63
|
+
rule.update!(preferred_match_policy: 'all')
|
|
66
64
|
end
|
|
67
65
|
|
|
68
66
|
it 'is eligible order has all prefered taxons' do
|
|
@@ -98,5 +96,51 @@ describe Spree::Promotion::Rules::Taxon, type: :model do
|
|
|
98
96
|
it{ expect(rule).to be_eligible(order) }
|
|
99
97
|
end
|
|
100
98
|
end
|
|
99
|
+
|
|
100
|
+
context 'with an invalid match policy' do
|
|
101
|
+
before do
|
|
102
|
+
order.products.first.taxons << taxon
|
|
103
|
+
rule.taxons << taxon
|
|
104
|
+
rule.preferred_match_policy = 'invalid'
|
|
105
|
+
rule.save!(validate: false)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'logs a warning and uses "any" policy' do
|
|
109
|
+
expect(Spree::Deprecation).to(
|
|
110
|
+
receive(:warn).
|
|
111
|
+
with(/has unexpected match policy "invalid"/)
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
expect(
|
|
115
|
+
rule.eligible?(order)
|
|
116
|
+
).to be_truthy
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe '#actionable?' do
|
|
122
|
+
let(:line_item) { order.line_items.first! }
|
|
123
|
+
let(:order) { create :order_with_line_items }
|
|
124
|
+
let(:taxon) { create :taxon, name: 'first' }
|
|
125
|
+
|
|
126
|
+
before do
|
|
127
|
+
rule.preferred_match_policy = 'invalid'
|
|
128
|
+
rule.save!(validate: false)
|
|
129
|
+
line_item.product.taxons << taxon
|
|
130
|
+
rule.taxons << taxon
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context 'with an invalid match policy' do
|
|
134
|
+
it 'logs a warning and uses "any" policy' do
|
|
135
|
+
expect(Spree::Deprecation).to(
|
|
136
|
+
receive(:warn).
|
|
137
|
+
with(/has unexpected match policy "invalid"/)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
expect(
|
|
141
|
+
rule.actionable?(line_item)
|
|
142
|
+
).to be_truthy
|
|
143
|
+
end
|
|
144
|
+
end
|
|
101
145
|
end
|
|
102
146
|
end
|
|
@@ -294,35 +294,35 @@ describe Spree::Promotion, type: :model do
|
|
|
294
294
|
end
|
|
295
295
|
end
|
|
296
296
|
|
|
297
|
-
context "#
|
|
297
|
+
context "#inactive" do
|
|
298
298
|
it "should not be exipired" do
|
|
299
|
-
expect(promotion).not_to
|
|
299
|
+
expect(promotion).not_to be_inactive
|
|
300
300
|
end
|
|
301
301
|
|
|
302
|
-
it "should be
|
|
302
|
+
it "should be inactive if it hasn't started yet" do
|
|
303
303
|
promotion.starts_at = Time.current + 1.day
|
|
304
|
-
expect(promotion).to
|
|
304
|
+
expect(promotion).to be_inactive
|
|
305
305
|
end
|
|
306
306
|
|
|
307
|
-
it "should be
|
|
307
|
+
it "should be inactive if it has already ended" do
|
|
308
308
|
promotion.expires_at = Time.current - 1.day
|
|
309
|
-
expect(promotion).to
|
|
309
|
+
expect(promotion).to be_inactive
|
|
310
310
|
end
|
|
311
311
|
|
|
312
|
-
it "should not be
|
|
312
|
+
it "should not be inactive if it has started already" do
|
|
313
313
|
promotion.starts_at = Time.current - 1.day
|
|
314
|
-
expect(promotion).not_to
|
|
314
|
+
expect(promotion).not_to be_inactive
|
|
315
315
|
end
|
|
316
316
|
|
|
317
|
-
it "should not be
|
|
317
|
+
it "should not be inactive if it has not ended yet" do
|
|
318
318
|
promotion.expires_at = Time.current + 1.day
|
|
319
|
-
expect(promotion).not_to
|
|
319
|
+
expect(promotion).not_to be_inactive
|
|
320
320
|
end
|
|
321
321
|
|
|
322
|
-
it "should not be
|
|
322
|
+
it "should not be inactive if current time is within starts_at and expires_at range" do
|
|
323
323
|
promotion.starts_at = Time.current - 1.day
|
|
324
324
|
promotion.expires_at = Time.current + 1.day
|
|
325
|
-
expect(promotion).not_to
|
|
325
|
+
expect(promotion).not_to be_inactive
|
|
326
326
|
end
|
|
327
327
|
end
|
|
328
328
|
|
|
@@ -664,6 +664,12 @@ describe Spree::Promotion, type: :model do
|
|
|
664
664
|
it { is_expected.not_to be }
|
|
665
665
|
end
|
|
666
666
|
end
|
|
667
|
+
|
|
668
|
+
context 'when the line item has an non-promotionable product' do
|
|
669
|
+
let(:rules) { [true_rule] }
|
|
670
|
+
let(:line_item) { build(:line_item) { |li| li.product.promotionable = false } }
|
|
671
|
+
it { is_expected.not_to be }
|
|
672
|
+
end
|
|
667
673
|
end
|
|
668
674
|
end
|
|
669
675
|
|
|
@@ -160,22 +160,6 @@ describe Spree::ReturnAuthorization, type: :model do
|
|
|
160
160
|
end
|
|
161
161
|
end
|
|
162
162
|
|
|
163
|
-
context "can_receive?" do
|
|
164
|
-
before do
|
|
165
|
-
pending "TODO: get this method into our fork"
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
it "should allow_receive when inventory units assigned" do
|
|
169
|
-
allow(return_authorization).to receive_messages(inventory_units: [1, 2, 3])
|
|
170
|
-
expect(return_authorization.can_receive?).to be true
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
it "should not allow_receive with no inventory units" do
|
|
174
|
-
allow(return_authorization).to receive_messages(inventory_units: [])
|
|
175
|
-
expect(return_authorization.can_receive?).to be false
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
163
|
describe "#refundable_amount" do
|
|
180
164
|
let(:line_item_price) { 5.0 }
|
|
181
165
|
let(:line_item_count) { return_authorization.order.line_items.count }
|
|
@@ -9,21 +9,41 @@ describe Spree::Shipment, type: :model do
|
|
|
9
9
|
order.shipments.create!(
|
|
10
10
|
state: 'pending',
|
|
11
11
|
cost: 1,
|
|
12
|
-
address: order.ship_address,
|
|
13
12
|
inventory_units: order.inventory_units,
|
|
14
|
-
shipping_rates: [
|
|
15
|
-
Spree::ShippingRate.new(
|
|
16
|
-
shipping_method: shipping_method,
|
|
17
|
-
selected: true
|
|
18
|
-
)
|
|
19
|
-
],
|
|
13
|
+
shipping_rates: [shipping_rate],
|
|
20
14
|
stock_location: stock_location
|
|
21
15
|
)
|
|
22
16
|
end
|
|
17
|
+
let(:shipping_rate) do
|
|
18
|
+
Spree::ShippingRate.create!(
|
|
19
|
+
shipping_method: shipping_method,
|
|
20
|
+
selected: true
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
23
|
|
|
24
24
|
let(:variant) { mock_model(Spree::Variant) }
|
|
25
25
|
let(:line_item) { mock_model(Spree::LineItem, variant: variant) }
|
|
26
26
|
|
|
27
|
+
context '#transfer_to_location' do
|
|
28
|
+
it 'transfers unit to a new shipment with given location' do
|
|
29
|
+
order = create(:completed_order_with_totals, line_items_count: 2)
|
|
30
|
+
shipment = order.shipments.first
|
|
31
|
+
variant = order.inventory_units.map(&:variant).first
|
|
32
|
+
|
|
33
|
+
aggregate_failures("verifying new shipment attributes") do
|
|
34
|
+
expect do
|
|
35
|
+
shipment.transfer_to_location(variant, 1, stock_location)
|
|
36
|
+
end.to change { Spree::Shipment.count }.by(1)
|
|
37
|
+
|
|
38
|
+
new_shipment = order.shipments.last
|
|
39
|
+
expect(new_shipment.number).to_not eq(shipment.number)
|
|
40
|
+
expect(new_shipment.stock_location).to eq(stock_location)
|
|
41
|
+
expect(new_shipment.line_items.count).to eq(1)
|
|
42
|
+
expect(new_shipment.line_items.first.variant).to eq(variant)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
27
47
|
# Regression test for https://github.com/spree/spree/issues/4063
|
|
28
48
|
context "number generation" do
|
|
29
49
|
before { allow(order).to receive :update! }
|
|
@@ -101,6 +121,7 @@ describe Spree::Shipment, type: :model do
|
|
|
101
121
|
it 'should equal line items final amount with tax' do
|
|
102
122
|
shipment = create(:shipment, order: create(:order_with_totals))
|
|
103
123
|
create :tax_adjustment, adjustable: shipment.order.line_items.first, order: shipment.order
|
|
124
|
+
shipment.order.update!
|
|
104
125
|
expect(shipment.item_cost).to eql(11.0)
|
|
105
126
|
end
|
|
106
127
|
end
|
|
@@ -454,7 +475,7 @@ describe Spree::Shipment, type: :model do
|
|
|
454
475
|
context "when the shipment is canceled" do
|
|
455
476
|
let(:address){ create(:address) }
|
|
456
477
|
let(:order){ create(:order_with_line_items, ship_address: address) }
|
|
457
|
-
let(:shipment_with_inventory_units) { create(:shipment, order: order,
|
|
478
|
+
let(:shipment_with_inventory_units) { create(:shipment, order: order, state: 'canceled') }
|
|
458
479
|
let(:subject) { shipment_with_inventory_units.ship! }
|
|
459
480
|
before do
|
|
460
481
|
allow(order).to receive(:update!)
|
|
@@ -565,32 +586,6 @@ describe Spree::Shipment, type: :model do
|
|
|
565
586
|
end
|
|
566
587
|
end
|
|
567
588
|
|
|
568
|
-
context "after_save" do
|
|
569
|
-
context "line item changes" do
|
|
570
|
-
before do
|
|
571
|
-
shipment.cost = shipment.cost + 10
|
|
572
|
-
end
|
|
573
|
-
|
|
574
|
-
it "triggers adjustment total recalculation" do
|
|
575
|
-
expect(shipment).to receive(:recalculate_adjustments)
|
|
576
|
-
shipment.save
|
|
577
|
-
end
|
|
578
|
-
|
|
579
|
-
it "does not trigger adjustment recalculation if shipment has shipped" do
|
|
580
|
-
shipment.state = 'shipped'
|
|
581
|
-
expect(shipment).not_to receive(:recalculate_adjustments)
|
|
582
|
-
shipment.save
|
|
583
|
-
end
|
|
584
|
-
end
|
|
585
|
-
|
|
586
|
-
context "line item does not change" do
|
|
587
|
-
it "does not trigger adjustment total recalculation" do
|
|
588
|
-
expect(shipment).not_to receive(:recalculate_adjustments)
|
|
589
|
-
shipment.save
|
|
590
|
-
end
|
|
591
|
-
end
|
|
592
|
-
end
|
|
593
|
-
|
|
594
589
|
context "currency" do
|
|
595
590
|
it "returns the order currency" do
|
|
596
591
|
expect(shipment.currency).to eq(order.currency)
|
|
@@ -682,7 +677,6 @@ describe Spree::Shipment, type: :model do
|
|
|
682
677
|
let(:unshippable_shipment) do
|
|
683
678
|
create(
|
|
684
679
|
:shipment,
|
|
685
|
-
address: create(:address),
|
|
686
680
|
stock_location: stock_location,
|
|
687
681
|
inventory_units: [build(:inventory_unit)]
|
|
688
682
|
)
|
|
@@ -698,7 +692,7 @@ describe Spree::Shipment, type: :model do
|
|
|
698
692
|
it 'does not send a confirmation email' do
|
|
699
693
|
expect {
|
|
700
694
|
unshippable_shipment.ready!
|
|
701
|
-
unshippable_shipment.inventory_units
|
|
695
|
+
unshippable_shipment.inventory_units.reload.each do |unit|
|
|
702
696
|
expect(unit.state).to eq('shipped')
|
|
703
697
|
end
|
|
704
698
|
}.not_to change{ ActionMailer::Base.deliveries.count }
|
|
@@ -782,4 +776,31 @@ describe Spree::Shipment, type: :model do
|
|
|
782
776
|
expect(shipments.first).to eq(wizard_shipment)
|
|
783
777
|
end
|
|
784
778
|
end
|
|
779
|
+
|
|
780
|
+
describe '#selected_shipping_rate_id=' do
|
|
781
|
+
let!(:air_shipping_method) { create(:shipping_method, name: "Air") }
|
|
782
|
+
let(:new_rate) { shipment.add_shipping_method(air_shipping_method) }
|
|
783
|
+
|
|
784
|
+
context 'when the id exists' do
|
|
785
|
+
it 'sets the new shipping rate as selected' do
|
|
786
|
+
expect {
|
|
787
|
+
shipment.selected_shipping_rate_id = new_rate.id
|
|
788
|
+
}.to change { new_rate.selected }.from(false).to(true)
|
|
789
|
+
end
|
|
790
|
+
|
|
791
|
+
it 'sets the old shipping rate as not selected' do
|
|
792
|
+
expect {
|
|
793
|
+
shipment.selected_shipping_rate_id = new_rate.id
|
|
794
|
+
}.to change { shipping_rate.selected }.from(true).to(false)
|
|
795
|
+
end
|
|
796
|
+
end
|
|
797
|
+
|
|
798
|
+
context 'when the id does not exist' do
|
|
799
|
+
it 'raises a RecordNotFound error' do
|
|
800
|
+
expect {
|
|
801
|
+
shipment.selected_shipping_rate_id = -1
|
|
802
|
+
}.to raise_error(ArgumentError)
|
|
803
|
+
end
|
|
804
|
+
end
|
|
805
|
+
end
|
|
785
806
|
end
|
|
@@ -26,11 +26,6 @@ module Spree
|
|
|
26
26
|
expect(subject.shipments.size).to eq(1)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
it "puts the order's ship address on the shipments" do
|
|
30
|
-
shipments = subject.shipments
|
|
31
|
-
expect(shipments.map(&:address)).to eq [order.ship_address]
|
|
32
|
-
end
|
|
33
|
-
|
|
34
29
|
it "builds a shipment for all active stock locations" do
|
|
35
30
|
subject.shipments.count == StockLocation.count
|
|
36
31
|
end
|