solidus_core 2.0.3 → 2.1.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 +62 -3
- data/app/assets/javascripts/spree.js.coffee.erb +4 -1
- data/app/helpers/spree/base_helper.rb +7 -48
- data/app/models/spree/address.rb +5 -1
- data/app/models/spree/adjustment.rb +3 -3
- data/app/models/spree/app_configuration.rb +13 -0
- data/app/models/spree/calculator.rb +3 -2
- data/app/models/spree/calculator/default_tax.rb +6 -10
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -4
- data/app/models/spree/calculator/flat_rate.rb +0 -4
- data/app/models/spree/calculator/flexi_rate.rb +0 -4
- data/app/models/spree/calculator/free_shipping.rb +0 -3
- data/app/models/spree/calculator/percent_on_line_item.rb +0 -4
- data/app/models/spree/calculator/percent_per_item.rb +0 -4
- data/app/models/spree/calculator/price_sack.rb +0 -4
- data/app/models/spree/calculator/returns/default_refund_amount.rb +0 -3
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +0 -4
- data/app/models/spree/calculator/shipping/flat_rate.rb +0 -4
- data/app/models/spree/calculator/shipping/flexi_rate.rb +0 -4
- data/app/models/spree/calculator/shipping/per_item.rb +0 -4
- data/app/models/spree/calculator/shipping/price_sack.rb +0 -4
- data/app/models/spree/calculator/tiered_flat_rate.rb +0 -4
- data/app/models/spree/calculator/tiered_percent.rb +0 -4
- data/app/models/spree/credit_card.rb +27 -14
- data/app/models/spree/gateway.rb +4 -0
- data/app/models/spree/inventory_unit.rb +2 -0
- data/app/models/spree/line_item.rb +31 -26
- data/app/models/spree/option_type.rb +0 -3
- data/app/models/spree/order.rb +28 -31
- data/app/models/spree/order/checkout.rb +0 -2
- data/app/models/spree/order_contents.rb +0 -45
- data/app/models/spree/order_merger.rb +6 -6
- data/app/models/spree/order_update_attributes.rb +0 -2
- data/app/models/spree/order_updater.rb +91 -13
- data/app/models/spree/payment.rb +9 -2
- data/app/models/spree/payment/processing.rb +15 -9
- data/app/models/spree/payment_method.rb +48 -5
- data/app/models/spree/price.rb +7 -9
- data/app/models/spree/product.rb +1 -25
- data/app/models/spree/promotion.rb +22 -14
- data/app/models/spree/promotion/actions/create_adjustment.rb +12 -1
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +15 -1
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +5 -3
- data/app/models/spree/promotion/actions/free_shipping.rb +14 -0
- data/app/models/spree/promotion/rules/taxon.rb +7 -2
- data/app/models/spree/promotion/rules/user_role.rb +43 -0
- data/app/models/spree/promotion_action.rb +19 -2
- data/app/models/spree/promotion_handler/coupon.rb +1 -4
- data/app/models/spree/promotion_handler/free_shipping.rb +22 -17
- data/app/models/spree/promotion_rule_role.rb +6 -0
- data/app/models/spree/property.rb +0 -3
- data/app/models/spree/return_authorization.rb +2 -0
- data/app/models/spree/shipment.rb +5 -21
- data/app/models/spree/shipping_method.rb +23 -2
- data/app/models/spree/shipping_rate.rb +3 -0
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock_location.rb +3 -0
- data/app/models/spree/store.rb +7 -0
- data/app/models/spree/tax/item_adjuster.rb +27 -12
- data/app/models/spree/tax/order_adjuster.rb +2 -5
- data/app/models/spree/tax/tax_helpers.rb +4 -8
- data/app/models/spree/tax_rate.rb +1 -15
- data/app/models/spree/taxon.rb +0 -3
- data/app/models/spree/transfer_item.rb +1 -1
- data/app/models/spree/user_class_handle.rb +14 -9
- data/app/models/spree/variant/pricing_options.rb +1 -1
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
- data/app/models/spree/zone.rb +20 -13
- data/config/locales/en.yml +144 -62
- data/db/migrate/20120831092320_spree_one_two.rb +0 -7
- data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +0 -2
- data/db/migrate/20160924135758_remove_is_default_from_prices.rb +5 -0
- data/db/migrate/20161009141333_remove_currency_from_line_items.rb +5 -0
- data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +28 -0
- data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +20 -0
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +4 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +0 -2
- data/lib/spree/core.rb +0 -5
- data/lib/spree/core/controller_helpers/pricing.rb +2 -1
- data/lib/spree/core/engine.rb +14 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/deprecation.rb +1 -1
- data/lib/spree/localized_number.rb +3 -2
- data/lib/spree/permission_sets/configuration_display.rb +0 -1
- data/lib/spree/permission_sets/configuration_management.rb +0 -1
- data/lib/spree/permission_sets/product_display.rb +0 -1
- data/lib/spree/permission_sets/product_management.rb +0 -1
- data/lib/spree/permission_sets/user_management.rb +2 -4
- data/lib/spree/permitted_attributes.rb +3 -2
- data/lib/spree/testing_support/capybara_ext.rb +0 -12
- data/lib/spree/testing_support/factories/address_factory.rb +1 -1
- data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
- data/lib/spree/testing_support/factories/payment_factory.rb +4 -0
- data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -1
- data/lib/spree/testing_support/factories/user_factory.rb +2 -2
- data/solidus_core.gemspec +4 -3
- data/spec/helpers/base_helper_spec.rb +0 -40
- data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +16 -0
- data/spec/lib/spree/core/importer/order_spec.rb +27 -18
- data/spec/lib/spree/core/price_migrator_spec.rb +3 -1
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +16 -0
- data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -2
- data/spec/lib/tasks/exchanges_spec.rb +4 -2
- data/spec/lib/tasks/migrations/create_vat_prices_spec.rb +5 -3
- data/spec/models/spree/adjustment_spec.rb +136 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +13 -7
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +3 -0
- data/spec/models/spree/calculator/flat_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/flexi_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/free_shipping_spec.rb +6 -0
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +9 -4
- data/spec/models/spree/calculator/percent_per_item_spec.rb +10 -0
- data/spec/models/spree/calculator/price_sack_spec.rb +3 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +3 -0
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +4 -1
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +3 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +3 -0
- data/spec/models/spree/credit_card_spec.rb +27 -1
- data/spec/models/spree/line_item_spec.rb +58 -65
- data/spec/models/spree/order/checkout_spec.rb +2 -1
- data/spec/models/spree/order/payment_spec.rb +9 -10
- data/spec/models/spree/order/tax_spec.rb +22 -7
- data/spec/models/spree/order/updating_spec.rb +1 -3
- data/spec/models/spree/order_cancellations_spec.rb +6 -4
- data/spec/models/spree/order_contents_spec.rb +34 -50
- data/spec/models/spree/order_inventory_spec.rb +3 -5
- data/spec/models/spree/order_merger_spec.rb +20 -0
- data/spec/models/spree/order_spec.rb +28 -64
- data/spec/models/spree/order_update_attributes_spec.rb +1 -5
- data/spec/models/spree/order_updater_spec.rb +251 -0
- data/spec/models/spree/payment_method_spec.rb +178 -28
- data/spec/models/spree/payment_spec.rb +35 -19
- data/spec/models/spree/permission_sets/configuration_display.rb +0 -4
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -2
- data/spec/models/spree/permission_sets/product_display_spec.rb +0 -4
- data/spec/models/spree/permission_sets/product_management_spec.rb +0 -2
- data/spec/models/spree/permission_sets/user_management_spec.rb +9 -2
- data/spec/models/spree/price_spec.rb +16 -1
- data/spec/models/spree/product_spec.rb +0 -75
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +20 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +39 -15
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +203 -22
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +22 -3
- data/spec/models/spree/promotion/rules/taxon_spec.rb +26 -0
- data/spec/models/spree/promotion/rules/user_role_spec.rb +86 -0
- data/spec/models/spree/promotion_action_spec.rb +38 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +36 -33
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +21 -22
- data/spec/models/spree/promotion_spec.rb +46 -6
- data/spec/models/spree/reimbursement_spec.rb +1 -1
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +2 -2
- data/spec/models/spree/shipment_spec.rb +68 -50
- data/spec/models/spree/shipping_method_spec.rb +41 -0
- data/spec/models/spree/shipping_rate_spec.rb +9 -3
- data/spec/models/spree/stock/estimator_spec.rb +4 -2
- data/spec/models/spree/store_credit_spec.rb +3 -3
- data/spec/models/spree/tax/item_adjuster_spec.rb +31 -21
- data/spec/models/spree/tax/order_adjuster_spec.rb +6 -10
- data/spec/models/spree/tax/taxation_integration_spec.rb +19 -0
- data/spec/models/spree/tax_rate_spec.rb +5 -26
- data/spec/models/spree/transfer_item_spec.rb +11 -0
- data/spec/models/spree/variant/pricing_options_spec.rb +7 -17
- data/spec/models/spree/variant_spec.rb +2 -4
- data/spec/models/spree/zone_spec.rb +60 -20
- data/spec/shared_examples/calculator_shared_examples.rb +8 -0
- metadata +19 -24
- data/app/models/spree/item_adjustments.rb +0 -89
- data/app/models/spree/option_type_prototype.rb +0 -6
- data/app/models/spree/property_prototype.rb +0 -6
- data/app/models/spree/prototype.rb +0 -14
- data/app/models/spree/prototype_taxon.rb +0 -6
- data/app/models/spree/tracker.rb +0 -8
- data/db/migrate/20150128032538_remove_environment_from_tracker.rb +0 -6
- data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +0 -1
- data/lib/spree/core/delegate_belongs_to.rb +0 -94
- data/lib/spree/testing_support/factories/prototype_factory.rb +0 -8
- data/lib/spree/testing_support/factories/tracker_factory.rb +0 -6
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -24
- data/spec/lib/spree/core/testing_support/factories/prototype_factory_spec.rb +0 -12
- data/spec/lib/spree/core/testing_support/factories/tracker_factory_spec.rb +0 -12
- data/spec/models/spree/item_adjustments_spec.rb +0 -306
- data/spec/models/spree/tracker_spec.rb +0 -21
|
@@ -59,5 +59,21 @@ describe Spree::Core::ControllerHelpers::Pricing, type: :controller do
|
|
|
59
59
|
it { is_expected.to eq('EUR') }
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
|
+
|
|
63
|
+
context "country_iso" do
|
|
64
|
+
subject { controller.current_pricing_options.country_iso }
|
|
65
|
+
|
|
66
|
+
let(:store) { FactoryGirl.create(:store, cart_tax_country_iso: cart_tax_country_iso) }
|
|
67
|
+
|
|
68
|
+
context "when the store has a cart tax country set" do
|
|
69
|
+
let(:cart_tax_country_iso) { "DE" }
|
|
70
|
+
it { is_expected.to eq("DE") }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "when the store has no cart tax country set" do
|
|
74
|
+
let(:cart_tax_country_iso) { nil }
|
|
75
|
+
it { is_expected.to be_nil }
|
|
76
|
+
end
|
|
77
|
+
end
|
|
62
78
|
end
|
|
63
79
|
end
|
|
@@ -119,13 +119,11 @@ module Spree
|
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
it 'handles line_item updating exceptions' do
|
|
122
|
-
line_items['0'][:
|
|
122
|
+
line_items['0'][:price] = 'an invalid price'
|
|
123
123
|
params = { line_items_attributes: line_items }
|
|
124
124
|
|
|
125
125
|
expect {
|
|
126
|
-
|
|
127
|
-
Importer::Order.import(user, params)
|
|
128
|
-
end
|
|
126
|
+
Importer::Order.import(user, params)
|
|
129
127
|
}.to raise_exception ActiveRecord::RecordInvalid
|
|
130
128
|
end
|
|
131
129
|
|
|
@@ -169,26 +167,37 @@ module Spree
|
|
|
169
167
|
end
|
|
170
168
|
|
|
171
169
|
context "with a different currency" do
|
|
172
|
-
|
|
170
|
+
let(:params) { { currency: "GBP" } }
|
|
173
171
|
|
|
174
172
|
it "sets the order currency" do
|
|
175
|
-
params = {
|
|
176
|
-
currency: "GBP"
|
|
177
|
-
}
|
|
178
173
|
order = Importer::Order.import(user, params)
|
|
179
174
|
expect(order.currency).to eq "GBP"
|
|
180
175
|
end
|
|
181
176
|
|
|
182
|
-
|
|
183
|
-
params
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
177
|
+
context "when a line item price is specified" do
|
|
178
|
+
let(:params) { { currency: "GBP", line_items_attributes: line_items } }
|
|
179
|
+
|
|
180
|
+
before { line_items["0"][:price] = 1.99 }
|
|
181
|
+
|
|
182
|
+
context "and price is present in the order currency" do
|
|
183
|
+
before { variant.prices.create(currency: "GBP", amount: 18.99) }
|
|
184
|
+
|
|
185
|
+
it "assigns a price correctly" do
|
|
186
|
+
order = Importer::Order.import(user, params)
|
|
187
|
+
|
|
188
|
+
expect(order.currency).to eq "GBP"
|
|
189
|
+
expect(order.line_items.first.price).to eq 1.99
|
|
190
|
+
expect(order.line_items.first.currency).to eq "GBP"
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
context "and no price is present in the order currency" do
|
|
195
|
+
it "raises an exception" do
|
|
196
|
+
expect {
|
|
197
|
+
Importer::Order.import(user, params)
|
|
198
|
+
}.to raise_exception ActiveRecord::RecordInvalid
|
|
199
|
+
end
|
|
200
|
+
end
|
|
192
201
|
end
|
|
193
202
|
end
|
|
194
203
|
|
|
@@ -114,7 +114,9 @@ describe Spree::PriceMigrator do
|
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
before do
|
|
117
|
-
Spree::
|
|
117
|
+
Spree::Deprecation.silence do
|
|
118
|
+
Spree::PriceMigrator.migrate_default_vat_prices
|
|
119
|
+
end
|
|
118
120
|
order.contents.add(variant)
|
|
119
121
|
end
|
|
120
122
|
|
|
@@ -75,6 +75,22 @@ RSpec.describe 'order factory' do
|
|
|
75
75
|
)
|
|
76
76
|
end
|
|
77
77
|
end
|
|
78
|
+
|
|
79
|
+
context 'when shipments should be taxed' do
|
|
80
|
+
let!(:ship_address) { create(:address) }
|
|
81
|
+
let!(:tax_zone) { create(:global_zone) } # will include the above address
|
|
82
|
+
let!(:tax_rate) { create(:tax_rate, amount: 0.10, zone: tax_zone, tax_category: tax_category) }
|
|
83
|
+
|
|
84
|
+
let(:tax_category) { create(:tax_category) }
|
|
85
|
+
let(:shipping_method) { create(:shipping_method, tax_category: tax_category, zones: [tax_zone]) }
|
|
86
|
+
|
|
87
|
+
it 'shipments get a tax adjustment' do
|
|
88
|
+
order = create(factory, ship_address: ship_address, shipping_method: shipping_method)
|
|
89
|
+
shipment = order.shipments[0]
|
|
90
|
+
|
|
91
|
+
expect(shipment.additional_tax_total).to be > 0
|
|
92
|
+
end
|
|
93
|
+
end
|
|
78
94
|
end
|
|
79
95
|
|
|
80
96
|
describe 'order ready to complete' do
|
|
@@ -49,11 +49,9 @@ describe Spree::UnreturnedItemCharger do
|
|
|
49
49
|
context 'in tax zone' do
|
|
50
50
|
let!(:tax_zone) { create(:zone, countries: [ship_address.country]) }
|
|
51
51
|
let!(:tax_rate) { create(:tax_rate, zone: tax_zone, tax_category: original_variant.tax_category) }
|
|
52
|
-
before { tax_zone.update_attributes!(default_tax: true) }
|
|
53
52
|
|
|
54
53
|
it "applies tax" do
|
|
55
54
|
exchange_order = exchange_shipment.order
|
|
56
|
-
exchange_order.create_tax_charge!
|
|
57
55
|
exchange_order.update!
|
|
58
56
|
subject
|
|
59
57
|
expect(new_order.additional_tax_total).to be > 0
|
|
@@ -27,7 +27,8 @@ describe "exchanges:charge_unreturned_items" do
|
|
|
27
27
|
let(:return_item_1) { build(:exchange_return_item, inventory_unit: order.inventory_units.first) }
|
|
28
28
|
let(:return_item_2) { build(:exchange_return_item, inventory_unit: order.inventory_units.last) }
|
|
29
29
|
let!(:rma) { create(:return_authorization, order: order, return_items: [return_item_1, return_item_2]) }
|
|
30
|
-
let
|
|
30
|
+
let(:zone) { create(:zone, countries: [order.tax_address.country])}
|
|
31
|
+
let!(:tax_rate) { create(:tax_rate, zone: zone, tax_category: return_item_2.exchange_variant.tax_category) }
|
|
31
32
|
before do
|
|
32
33
|
rma.save!
|
|
33
34
|
Spree::Shipment.last.ship!
|
|
@@ -44,7 +45,8 @@ describe "exchanges:charge_unreturned_items" do
|
|
|
44
45
|
let(:return_item_1) { build(:exchange_return_item, inventory_unit: order.inventory_units.first) }
|
|
45
46
|
let(:return_item_2) { build(:exchange_return_item, inventory_unit: order.inventory_units.last) }
|
|
46
47
|
let!(:rma) { create(:return_authorization, order: order, return_items: [return_item_1, return_item_2]) }
|
|
47
|
-
let
|
|
48
|
+
let(:zone) { create(:zone, countries: [order.tax_address.country])}
|
|
49
|
+
let!(:tax_rate) { create(:tax_rate, zone: zone, tax_category: return_item_2.exchange_variant.tax_category) }
|
|
48
50
|
|
|
49
51
|
before do
|
|
50
52
|
rma.save!
|
|
@@ -20,9 +20,11 @@ describe 'solidus:migrations:create_vat_prices' do
|
|
|
20
20
|
let!(:zone) { create(:zone, :with_country, default_tax: true) }
|
|
21
21
|
|
|
22
22
|
it 'runs' do
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
Spree::Deprecation.silence do
|
|
24
|
+
expect { task.invoke }.to output(
|
|
25
|
+
"Creating differentiated prices for VAT countries ... Success.\n"
|
|
26
|
+
).to_stdout
|
|
27
|
+
end
|
|
26
28
|
end
|
|
27
29
|
end
|
|
28
30
|
end
|
|
@@ -157,4 +157,140 @@ describe Spree::Adjustment, type: :model do
|
|
|
157
157
|
end
|
|
158
158
|
end
|
|
159
159
|
end
|
|
160
|
+
|
|
161
|
+
describe 'repairing adjustment associations' do
|
|
162
|
+
context 'on create' do
|
|
163
|
+
let(:adjustable) { order }
|
|
164
|
+
let(:adjustment_source) { promotion.actions[0] }
|
|
165
|
+
let(:order) { create(:order) }
|
|
166
|
+
let(:promotion) { create(:promotion, :with_line_item_adjustment) }
|
|
167
|
+
|
|
168
|
+
def expect_deprecation_warning
|
|
169
|
+
expect(Spree::Deprecation).to(
|
|
170
|
+
receive(:warn).
|
|
171
|
+
with(
|
|
172
|
+
/Adjustment \d+ was not added to #{adjustable.class} #{adjustable.id}/,
|
|
173
|
+
instance_of(Array),
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
context 'when adding adjustments via the wrong association' do
|
|
179
|
+
def create_adjustment
|
|
180
|
+
adjustment_source.adjustments.create!(
|
|
181
|
+
amount: 10,
|
|
182
|
+
adjustable: adjustable,
|
|
183
|
+
order: order,
|
|
184
|
+
label: 'some label',
|
|
185
|
+
)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
context 'when adjustable.adjustments is loaded' do
|
|
189
|
+
before { adjustable.adjustments.to_a }
|
|
190
|
+
|
|
191
|
+
it 'repairs adjustable.adjustments' do
|
|
192
|
+
expect_deprecation_warning
|
|
193
|
+
adjustment = create_adjustment
|
|
194
|
+
expect(adjustable.adjustments).to include(adjustment)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
context 'when the adjustment is destroyed before after_commit runs' do
|
|
198
|
+
it 'does not repair' do
|
|
199
|
+
expect(Spree::Deprecation).not_to receive(:warn)
|
|
200
|
+
Spree::Adjustment.transaction do
|
|
201
|
+
adjustment = create_adjustment
|
|
202
|
+
adjustment.destroy!
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
context 'when adjustable.adjustments is not loaded' do
|
|
209
|
+
it 'does repair' do
|
|
210
|
+
expect(Spree::Deprecation).not_to receive(:warn)
|
|
211
|
+
create_adjustment
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
context 'when adding adjustments via the correct association' do
|
|
217
|
+
def create_adjustment
|
|
218
|
+
adjustable.adjustments.create!(
|
|
219
|
+
amount: 10,
|
|
220
|
+
source: adjustment_source,
|
|
221
|
+
order: order,
|
|
222
|
+
label: 'some label',
|
|
223
|
+
)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
context 'when adjustable.adjustments is loaded' do
|
|
227
|
+
before { adjustable.adjustments.to_a }
|
|
228
|
+
|
|
229
|
+
it 'does not repair' do
|
|
230
|
+
expect(Spree::Deprecation).not_to receive(:warn)
|
|
231
|
+
create_adjustment
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
context 'when adjustable.adjustments is not loaded' do
|
|
236
|
+
it 'does not repair' do
|
|
237
|
+
expect(Spree::Deprecation).not_to receive(:warn)
|
|
238
|
+
create_adjustment
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
context 'on destroy' do
|
|
245
|
+
let(:adjustment) { create(:adjustment) }
|
|
246
|
+
let(:adjustable) { adjustment.adjustable }
|
|
247
|
+
|
|
248
|
+
def expect_deprecation_warning(adjustable)
|
|
249
|
+
expect(Spree::Deprecation).to(
|
|
250
|
+
receive(:warn).
|
|
251
|
+
with(
|
|
252
|
+
/Adjustment #{adjustment.id} was not removed from #{adjustable.class} #{adjustable.id}/,
|
|
253
|
+
instance_of(Array),
|
|
254
|
+
)
|
|
255
|
+
)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
context 'when destroying adjustments not via association' do
|
|
259
|
+
context 'when adjustable.adjustments is loaded' do
|
|
260
|
+
before { adjustable.adjustments.to_a }
|
|
261
|
+
|
|
262
|
+
it 'repairs adjustable.adjustments' do
|
|
263
|
+
expect_deprecation_warning(adjustable)
|
|
264
|
+
adjustment.destroy!
|
|
265
|
+
expect(adjustable.adjustments).not_to include(adjustment)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
context 'when adjustable.adjustments is not loaded' do
|
|
270
|
+
it 'does not repair' do
|
|
271
|
+
expect(Spree::Deprecation).not_to receive(:warn)
|
|
272
|
+
adjustment.destroy!
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
context 'when destroying adjustments via the association' do
|
|
278
|
+
context 'when adjustable.adjustments is loaded' do
|
|
279
|
+
before { adjustable.adjustments.to_a }
|
|
280
|
+
|
|
281
|
+
it 'does not repair' do
|
|
282
|
+
expect(Spree::Deprecation).not_to receive(:warn)
|
|
283
|
+
adjustable.adjustments.destroy(adjustment)
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
context 'when adjustable.adjustments is not loaded' do
|
|
288
|
+
it 'does not repair' do
|
|
289
|
+
expect(Spree::Deprecation).not_to receive(:warn)
|
|
290
|
+
adjustable.adjustments.destroy(adjustment)
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
end
|
|
160
296
|
end
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'shared_examples/calculator_shared_examples'
|
|
2
3
|
|
|
3
4
|
describe Spree::Calculator::DefaultTax, type: :model do
|
|
4
5
|
let(:address) { create(:address) }
|
|
5
|
-
let!(:zone) { create(:zone, name: "Country Zone", default_tax:
|
|
6
|
+
let!(:zone) { create(:zone, name: "Country Zone", default_tax: default_tax, countries: [tax_rate_country]) }
|
|
6
7
|
let(:tax_rate_country) { address.country }
|
|
7
8
|
let(:tax_category) { create(:tax_category) }
|
|
8
9
|
let!(:rate) { create(:tax_rate, tax_category: tax_category, amount: 0.05, included_in_price: included_in_price, zone: zone) }
|
|
9
10
|
let(:included_in_price) { false }
|
|
11
|
+
let(:default_tax) { false }
|
|
10
12
|
subject(:calculator) { Spree::Calculator::DefaultTax.new(calculable: rate ) }
|
|
11
13
|
|
|
14
|
+
it_behaves_like 'a calculator with a description'
|
|
15
|
+
|
|
12
16
|
context "#compute" do
|
|
13
17
|
context "when given an order" do
|
|
14
18
|
let(:order) do
|
|
@@ -70,17 +74,17 @@ describe Spree::Calculator::DefaultTax, type: :model do
|
|
|
70
74
|
end
|
|
71
75
|
|
|
72
76
|
context "when the order's tax address is outside the default VAT zone" do
|
|
73
|
-
let(:
|
|
77
|
+
let(:default_tax) { true }
|
|
74
78
|
let(:default_vat_country) { create(:country, iso: "DE") }
|
|
75
79
|
|
|
76
80
|
before do
|
|
77
81
|
rate.zone.update(countries: [default_vat_country])
|
|
78
|
-
# The order has to be reloaded here because of tax zone caching.
|
|
79
|
-
order.reload
|
|
80
82
|
end
|
|
81
83
|
|
|
82
84
|
it 'creates a negative amount, indicating a VAT refund' do
|
|
83
|
-
|
|
85
|
+
Spree::Deprecation.silence do
|
|
86
|
+
expect(subject.compute(order)).to eq(-2.86)
|
|
87
|
+
end
|
|
84
88
|
end
|
|
85
89
|
end
|
|
86
90
|
end
|
|
@@ -108,15 +112,17 @@ describe Spree::Calculator::DefaultTax, type: :model do
|
|
|
108
112
|
end
|
|
109
113
|
|
|
110
114
|
context "when the order's tax address is outside the default VAT zone" do
|
|
111
|
-
let!(:order_zone) { create(:zone, countries: [address.country]) }
|
|
112
115
|
let(:default_vat_country) { create(:country, iso: "DE") }
|
|
116
|
+
let(:default_tax) { true }
|
|
113
117
|
|
|
114
118
|
before do
|
|
115
119
|
rate.zone.update(countries: [default_vat_country])
|
|
116
120
|
end
|
|
117
121
|
|
|
118
122
|
it 'creates a negative amount, indicating a VAT refund' do
|
|
119
|
-
|
|
123
|
+
Spree::Deprecation.silence do
|
|
124
|
+
expect(subject.compute(item)).to eq(-1.43)
|
|
125
|
+
end
|
|
120
126
|
end
|
|
121
127
|
end
|
|
122
128
|
end
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'shared_examples/calculator_shared_examples'
|
|
2
3
|
|
|
3
4
|
describe Spree::Calculator::FlatPercentItemTotal, type: :model do
|
|
4
5
|
let(:calculator) { Spree::Calculator::FlatPercentItemTotal.new }
|
|
5
6
|
let(:line_item) { mock_model Spree::LineItem }
|
|
6
7
|
|
|
8
|
+
it_behaves_like 'a calculator with a description'
|
|
9
|
+
|
|
7
10
|
before { allow(calculator).to receive_messages preferred_flat_percent: 10 }
|
|
8
11
|
|
|
9
12
|
context "compute" do
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'shared_examples/calculator_shared_examples'
|
|
2
3
|
|
|
3
4
|
describe Spree::Calculator::FlatRate, type: :model do
|
|
4
5
|
let(:calculator) { Spree::Calculator::FlatRate.new }
|
|
5
6
|
|
|
7
|
+
it_behaves_like 'a calculator with a description'
|
|
8
|
+
|
|
6
9
|
let(:order) do
|
|
7
10
|
mock_model(
|
|
8
11
|
Spree::Order, quantity: 10, currency: "USD"
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'shared_examples/calculator_shared_examples'
|
|
2
3
|
|
|
3
4
|
describe Spree::Calculator::FlexiRate, type: :model do
|
|
4
5
|
let(:calculator) { Spree::Calculator::FlexiRate.new }
|
|
5
6
|
|
|
7
|
+
it_behaves_like 'a calculator with a description'
|
|
8
|
+
|
|
6
9
|
let(:order) do
|
|
7
10
|
mock_model(
|
|
8
11
|
Spree::Order, quantity: 10
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'shared_examples/calculator_shared_examples'
|
|
2
3
|
|
|
3
4
|
module Spree
|
|
4
5
|
class Calculator
|
|
5
6
|
describe PercentOnLineItem, type: :model do
|
|
6
|
-
|
|
7
|
+
context "compute" do
|
|
8
|
+
let(:line_item) { double("LineItem", amount: 100) }
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
before { subject.preferred_percent = 15 }
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
it "computes based on item price and quantity" do
|
|
13
|
+
expect(subject.compute(line_item)).to eq 15
|
|
14
|
+
end
|
|
12
15
|
end
|
|
16
|
+
|
|
17
|
+
it_behaves_like 'a calculator with a description'
|
|
13
18
|
end
|
|
14
19
|
end
|
|
15
20
|
end
|