solidus_core 2.0.3 → 2.1.0.beta1

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

Potentially problematic release.


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

Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +62 -3
  3. data/app/assets/javascripts/spree.js.coffee.erb +4 -1
  4. data/app/helpers/spree/base_helper.rb +7 -48
  5. data/app/models/spree/address.rb +5 -1
  6. data/app/models/spree/adjustment.rb +3 -3
  7. data/app/models/spree/app_configuration.rb +13 -0
  8. data/app/models/spree/calculator.rb +3 -2
  9. data/app/models/spree/calculator/default_tax.rb +6 -10
  10. data/app/models/spree/calculator/flat_percent_item_total.rb +0 -4
  11. data/app/models/spree/calculator/flat_rate.rb +0 -4
  12. data/app/models/spree/calculator/flexi_rate.rb +0 -4
  13. data/app/models/spree/calculator/free_shipping.rb +0 -3
  14. data/app/models/spree/calculator/percent_on_line_item.rb +0 -4
  15. data/app/models/spree/calculator/percent_per_item.rb +0 -4
  16. data/app/models/spree/calculator/price_sack.rb +0 -4
  17. data/app/models/spree/calculator/returns/default_refund_amount.rb +0 -3
  18. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +0 -4
  19. data/app/models/spree/calculator/shipping/flat_rate.rb +0 -4
  20. data/app/models/spree/calculator/shipping/flexi_rate.rb +0 -4
  21. data/app/models/spree/calculator/shipping/per_item.rb +0 -4
  22. data/app/models/spree/calculator/shipping/price_sack.rb +0 -4
  23. data/app/models/spree/calculator/tiered_flat_rate.rb +0 -4
  24. data/app/models/spree/calculator/tiered_percent.rb +0 -4
  25. data/app/models/spree/credit_card.rb +27 -14
  26. data/app/models/spree/gateway.rb +4 -0
  27. data/app/models/spree/inventory_unit.rb +2 -0
  28. data/app/models/spree/line_item.rb +31 -26
  29. data/app/models/spree/option_type.rb +0 -3
  30. data/app/models/spree/order.rb +28 -31
  31. data/app/models/spree/order/checkout.rb +0 -2
  32. data/app/models/spree/order_contents.rb +0 -45
  33. data/app/models/spree/order_merger.rb +6 -6
  34. data/app/models/spree/order_update_attributes.rb +0 -2
  35. data/app/models/spree/order_updater.rb +91 -13
  36. data/app/models/spree/payment.rb +9 -2
  37. data/app/models/spree/payment/processing.rb +15 -9
  38. data/app/models/spree/payment_method.rb +48 -5
  39. data/app/models/spree/price.rb +7 -9
  40. data/app/models/spree/product.rb +1 -25
  41. data/app/models/spree/promotion.rb +22 -14
  42. data/app/models/spree/promotion/actions/create_adjustment.rb +12 -1
  43. data/app/models/spree/promotion/actions/create_item_adjustments.rb +15 -1
  44. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +5 -3
  45. data/app/models/spree/promotion/actions/free_shipping.rb +14 -0
  46. data/app/models/spree/promotion/rules/taxon.rb +7 -2
  47. data/app/models/spree/promotion/rules/user_role.rb +43 -0
  48. data/app/models/spree/promotion_action.rb +19 -2
  49. data/app/models/spree/promotion_handler/coupon.rb +1 -4
  50. data/app/models/spree/promotion_handler/free_shipping.rb +22 -17
  51. data/app/models/spree/promotion_rule_role.rb +6 -0
  52. data/app/models/spree/property.rb +0 -3
  53. data/app/models/spree/return_authorization.rb +2 -0
  54. data/app/models/spree/shipment.rb +5 -21
  55. data/app/models/spree/shipping_method.rb +23 -2
  56. data/app/models/spree/shipping_rate.rb +3 -0
  57. data/app/models/spree/stock/estimator.rb +1 -1
  58. data/app/models/spree/stock_location.rb +3 -0
  59. data/app/models/spree/store.rb +7 -0
  60. data/app/models/spree/tax/item_adjuster.rb +27 -12
  61. data/app/models/spree/tax/order_adjuster.rb +2 -5
  62. data/app/models/spree/tax/tax_helpers.rb +4 -8
  63. data/app/models/spree/tax_rate.rb +1 -15
  64. data/app/models/spree/taxon.rb +0 -3
  65. data/app/models/spree/transfer_item.rb +1 -1
  66. data/app/models/spree/user_class_handle.rb +14 -9
  67. data/app/models/spree/variant/pricing_options.rb +1 -1
  68. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
  69. data/app/models/spree/zone.rb +20 -13
  70. data/config/locales/en.yml +144 -62
  71. data/db/migrate/20120831092320_spree_one_two.rb +0 -7
  72. data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +0 -2
  73. data/db/migrate/20160924135758_remove_is_default_from_prices.rb +5 -0
  74. data/db/migrate/20161009141333_remove_currency_from_line_items.rb +5 -0
  75. data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +28 -0
  76. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +20 -0
  77. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +4 -0
  78. data/lib/generators/spree/dummy/dummy_generator.rb +0 -2
  79. data/lib/spree/core.rb +0 -5
  80. data/lib/spree/core/controller_helpers/pricing.rb +2 -1
  81. data/lib/spree/core/engine.rb +14 -0
  82. data/lib/spree/core/version.rb +1 -1
  83. data/lib/spree/deprecation.rb +1 -1
  84. data/lib/spree/localized_number.rb +3 -2
  85. data/lib/spree/permission_sets/configuration_display.rb +0 -1
  86. data/lib/spree/permission_sets/configuration_management.rb +0 -1
  87. data/lib/spree/permission_sets/product_display.rb +0 -1
  88. data/lib/spree/permission_sets/product_management.rb +0 -1
  89. data/lib/spree/permission_sets/user_management.rb +2 -4
  90. data/lib/spree/permitted_attributes.rb +3 -2
  91. data/lib/spree/testing_support/capybara_ext.rb +0 -12
  92. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  93. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
  94. data/lib/spree/testing_support/factories/payment_factory.rb +4 -0
  95. data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -1
  96. data/lib/spree/testing_support/factories/user_factory.rb +2 -2
  97. data/solidus_core.gemspec +4 -3
  98. data/spec/helpers/base_helper_spec.rb +0 -40
  99. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +16 -0
  100. data/spec/lib/spree/core/importer/order_spec.rb +27 -18
  101. data/spec/lib/spree/core/price_migrator_spec.rb +3 -1
  102. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +16 -0
  103. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -2
  104. data/spec/lib/tasks/exchanges_spec.rb +4 -2
  105. data/spec/lib/tasks/migrations/create_vat_prices_spec.rb +5 -3
  106. data/spec/models/spree/adjustment_spec.rb +136 -0
  107. data/spec/models/spree/calculator/default_tax_spec.rb +13 -7
  108. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +3 -0
  109. data/spec/models/spree/calculator/flat_rate_spec.rb +3 -0
  110. data/spec/models/spree/calculator/flexi_rate_spec.rb +3 -0
  111. data/spec/models/spree/calculator/free_shipping_spec.rb +6 -0
  112. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +9 -4
  113. data/spec/models/spree/calculator/percent_per_item_spec.rb +10 -0
  114. data/spec/models/spree/calculator/price_sack_spec.rb +3 -0
  115. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +3 -0
  116. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +3 -0
  117. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +3 -0
  118. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +3 -0
  119. data/spec/models/spree/calculator/shipping/per_item_spec.rb +3 -0
  120. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +4 -1
  121. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +3 -0
  122. data/spec/models/spree/calculator/tiered_percent_spec.rb +3 -0
  123. data/spec/models/spree/credit_card_spec.rb +27 -1
  124. data/spec/models/spree/line_item_spec.rb +58 -65
  125. data/spec/models/spree/order/checkout_spec.rb +2 -1
  126. data/spec/models/spree/order/payment_spec.rb +9 -10
  127. data/spec/models/spree/order/tax_spec.rb +22 -7
  128. data/spec/models/spree/order/updating_spec.rb +1 -3
  129. data/spec/models/spree/order_cancellations_spec.rb +6 -4
  130. data/spec/models/spree/order_contents_spec.rb +34 -50
  131. data/spec/models/spree/order_inventory_spec.rb +3 -5
  132. data/spec/models/spree/order_merger_spec.rb +20 -0
  133. data/spec/models/spree/order_spec.rb +28 -64
  134. data/spec/models/spree/order_update_attributes_spec.rb +1 -5
  135. data/spec/models/spree/order_updater_spec.rb +251 -0
  136. data/spec/models/spree/payment_method_spec.rb +178 -28
  137. data/spec/models/spree/payment_spec.rb +35 -19
  138. data/spec/models/spree/permission_sets/configuration_display.rb +0 -4
  139. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -2
  140. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -4
  141. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -2
  142. data/spec/models/spree/permission_sets/user_management_spec.rb +9 -2
  143. data/spec/models/spree/price_spec.rb +16 -1
  144. data/spec/models/spree/product_spec.rb +0 -75
  145. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +20 -0
  146. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +39 -15
  147. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +203 -22
  148. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +22 -3
  149. data/spec/models/spree/promotion/rules/taxon_spec.rb +26 -0
  150. data/spec/models/spree/promotion/rules/user_role_spec.rb +86 -0
  151. data/spec/models/spree/promotion_action_spec.rb +38 -0
  152. data/spec/models/spree/promotion_handler/coupon_spec.rb +36 -33
  153. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +21 -22
  154. data/spec/models/spree/promotion_spec.rb +46 -6
  155. data/spec/models/spree/reimbursement_spec.rb +1 -1
  156. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +2 -2
  157. data/spec/models/spree/shipment_spec.rb +68 -50
  158. data/spec/models/spree/shipping_method_spec.rb +41 -0
  159. data/spec/models/spree/shipping_rate_spec.rb +9 -3
  160. data/spec/models/spree/stock/estimator_spec.rb +4 -2
  161. data/spec/models/spree/store_credit_spec.rb +3 -3
  162. data/spec/models/spree/tax/item_adjuster_spec.rb +31 -21
  163. data/spec/models/spree/tax/order_adjuster_spec.rb +6 -10
  164. data/spec/models/spree/tax/taxation_integration_spec.rb +19 -0
  165. data/spec/models/spree/tax_rate_spec.rb +5 -26
  166. data/spec/models/spree/transfer_item_spec.rb +11 -0
  167. data/spec/models/spree/variant/pricing_options_spec.rb +7 -17
  168. data/spec/models/spree/variant_spec.rb +2 -4
  169. data/spec/models/spree/zone_spec.rb +60 -20
  170. data/spec/shared_examples/calculator_shared_examples.rb +8 -0
  171. metadata +19 -24
  172. data/app/models/spree/item_adjustments.rb +0 -89
  173. data/app/models/spree/option_type_prototype.rb +0 -6
  174. data/app/models/spree/property_prototype.rb +0 -6
  175. data/app/models/spree/prototype.rb +0 -14
  176. data/app/models/spree/prototype_taxon.rb +0 -6
  177. data/app/models/spree/tracker.rb +0 -8
  178. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +0 -6
  179. data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +0 -1
  180. data/lib/spree/core/delegate_belongs_to.rb +0 -94
  181. data/lib/spree/testing_support/factories/prototype_factory.rb +0 -8
  182. data/lib/spree/testing_support/factories/tracker_factory.rb +0 -6
  183. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -24
  184. data/spec/lib/spree/core/testing_support/factories/prototype_factory_spec.rb +0 -12
  185. data/spec/lib/spree/core/testing_support/factories/tracker_factory_spec.rb +0 -12
  186. data/spec/models/spree/item_adjustments_spec.rb +0 -306
  187. 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'][:currency] = 'GBP'
122
+ line_items['0'][:price] = 'an invalid price'
123
123
  params = { line_items_attributes: line_items }
124
124
 
125
125
  expect {
126
- Spree::Deprecation.silence do
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
- before { variant.prices.create(currency: "GBP", amount: 18.99) }
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
- it "can handle it when a line order price is specified" do
183
- params = {
184
- currency: "GBP",
185
- line_items_attributes: line_items
186
- }
187
- line_items["0"].merge! currency: "GBP", price: 1.99
188
- order = Importer::Order.import(user, params)
189
- expect(order.currency).to eq "GBP"
190
- expect(order.line_items.first.price).to eq 1.99
191
- expect(order.line_items.first.currency).to eq "GBP"
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::PriceMigrator.migrate_default_vat_prices
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!(:tax_rate) { create(:tax_rate, zone: order.tax_zone, tax_category: return_item_2.exchange_variant.tax_category) }
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!(:tax_rate) { create(:tax_rate, zone: order.tax_zone, tax_category: return_item_2.exchange_variant.tax_category) }
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
- expect { task.invoke }.to output(
24
- "Creating differentiated prices for VAT countries ... Success.\n"
25
- ).to_stdout
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: true, countries: [tax_rate_country]) }
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(:order_zone) { create(:zone, countries: [address.country]) }
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
- expect(subject.compute(order)).to eq(-2.86)
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
- expect(subject.compute(item)).to eq(-1.43)
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
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
3
+
4
+ describe Spree::Calculator::FreeShipping, type: :model do
5
+ it_behaves_like 'a calculator with a description'
6
+ end
@@ -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
- let(:line_item) { double("LineItem", amount: 100) }
7
+ context "compute" do
8
+ let(:line_item) { double("LineItem", amount: 100) }
7
9
 
8
- before { subject.preferred_percent = 15 }
10
+ before { subject.preferred_percent = 15 }
9
11
 
10
- it "computes based on item price and quantity" do
11
- expect(subject.compute(line_item)).to eq 15
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