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.
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