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
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
3
+
4
+ module Spree
5
+ class Calculator
6
+ describe PercentPerItem, type: :model do
7
+ it_behaves_like 'a calculator with a description'
8
+ end
9
+ end
10
+ end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  describe Spree::Calculator::PriceSack, type: :model do
4
5
  let(:calculator) do
@@ -9,6 +10,8 @@ describe Spree::Calculator::PriceSack, type: :model do
9
10
  calculator
10
11
  end
11
12
 
13
+ it_behaves_like 'a calculator with a description'
14
+
12
15
  let(:order) { stub_model(Spree::Order) }
13
16
  let(:shipment) { stub_model(Spree::Shipment, amount: 10) }
14
17
 
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  describe Spree::Calculator::Returns::DefaultRefundAmount, type: :model do
4
5
  let(:line_item_quantity) { 2 }
@@ -9,6 +10,8 @@ describe Spree::Calculator::Returns::DefaultRefundAmount, type: :model do
9
10
  let(:calculator) { Spree::Calculator::Returns::DefaultRefundAmount.new }
10
11
  let(:order) { line_item.order }
11
12
 
13
+ it_behaves_like 'a calculator with a description'
14
+
12
15
  subject { calculator.compute(return_item) }
13
16
 
14
17
  context "not an exchange" do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  module Spree
4
5
  module Calculator::Shipping
@@ -6,6 +7,8 @@ module Spree
6
7
  let(:variant1) { build(:variant, price: 10.11) }
7
8
  let(:variant2) { build(:variant, price: 20.2222) }
8
9
 
10
+ it_behaves_like 'a calculator with a description'
11
+
9
12
  let(:line_item1) { build(:line_item, variant: variant1) }
10
13
  let(:line_item2) { build(:line_item, variant: variant2) }
11
14
 
@@ -1,10 +1,13 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  module Spree
4
5
  module Calculator::Shipping
5
6
  describe FlatRate, type: :model do
6
7
  subject { Calculator::Shipping::FlatRate.new(preferred_amount: 4.00) }
7
8
 
9
+ it_behaves_like 'a calculator with a description'
10
+
8
11
  it 'always returns the same rate' do
9
12
  expect(subject.compute(build(:stock_package_fulfilled))).to eql 4.00
10
13
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  module Spree
4
5
  module Calculator::Shipping
@@ -6,6 +7,8 @@ module Spree
6
7
  let(:variant1) { build(:variant, price: 10) }
7
8
  let(:variant2) { build(:variant, price: 20) }
8
9
 
10
+ it_behaves_like 'a calculator with a description'
11
+
9
12
  let(:package) do
10
13
  build(:stock_package, variants_contents: { variant1 => 4, variant2 => 6 })
11
14
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  module Spree
4
5
  module Calculator::Shipping
@@ -6,6 +7,8 @@ module Spree
6
7
  let(:variant1) { build(:variant) }
7
8
  let(:variant2) { build(:variant) }
8
9
 
10
+ it_behaves_like 'a calculator with a description'
11
+
9
12
  let(:package) do
10
13
  build(:stock_package, variants_contents: { variant1 => 5, variant2 => 3 })
11
14
  end
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
- describe Spree::Calculator::PriceSack, type: :model do
4
+ describe Spree::Calculator::Shipping::PriceSack, type: :model do
4
5
  let(:calculator) do
5
6
  calculator = Spree::Calculator::PriceSack.new
6
7
  calculator.preferred_minimal_amount = 5
@@ -9,6 +10,8 @@ describe Spree::Calculator::PriceSack, type: :model do
9
10
  calculator
10
11
  end
11
12
 
13
+ it_behaves_like 'a calculator with a description'
14
+
12
15
  let(:order) { stub_model(Spree::Order) }
13
16
  let(:shipment) { stub_model(Spree::Shipment, amount: 10) }
14
17
 
@@ -1,8 +1,11 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  describe Spree::Calculator::TieredFlatRate, type: :model do
4
5
  let(:calculator) { Spree::Calculator::TieredFlatRate.new }
5
6
 
7
+ it_behaves_like 'a calculator with a description'
8
+
6
9
  describe "#valid?" do
7
10
  subject { calculator.valid? }
8
11
  context "when tiers is a hash" do
@@ -1,8 +1,11 @@
1
1
  require 'spec_helper'
2
+ require 'shared_examples/calculator_shared_examples'
2
3
 
3
4
  describe Spree::Calculator::TieredPercent, type: :model do
4
5
  let(:calculator) { Spree::Calculator::TieredPercent.new }
5
6
 
7
+ it_behaves_like 'a calculator with a description'
8
+
6
9
  describe "#valid?" do
7
10
  subject { calculator.valid? }
8
11
  context "when base percent is less than zero" do
@@ -160,6 +160,28 @@ describe Spree::CreditCard, type: :model do
160
160
  end
161
161
  end
162
162
 
163
+ describe "#verification_value=" do
164
+ it "accepts a valid 3-digit value" do
165
+ credit_card.verification_value = "123"
166
+ expect(credit_card.verification_value).to eq("123")
167
+ end
168
+
169
+ it "accepts a valid 4-digit value" do
170
+ credit_card.verification_value = "1234"
171
+ expect(credit_card.verification_value).to eq("1234")
172
+ end
173
+
174
+ it "stringifies an integer" do
175
+ credit_card.verification_value = 123
176
+ expect(credit_card.verification_value).to eq("123")
177
+ end
178
+
179
+ it "strips any whitespace" do
180
+ credit_card.verification_value = ' 1 2 3 '
181
+ expect(credit_card.verification_value).to eq('123')
182
+ end
183
+ end
184
+
163
185
  # Regression test for https://github.com/spree/spree/issues/3847 and https://github.com/spree/spree/issues/3896
164
186
  describe "#expiry=" do
165
187
  it "can set with a 2-digit month and year" do
@@ -235,6 +257,10 @@ describe Spree::CreditCard, type: :model do
235
257
  credit_card.cc_type = ''
236
258
  expect(credit_card.cc_type).to eq('master')
237
259
 
260
+ credit_card.number = '2221000000000000'
261
+ credit_card.cc_type = ''
262
+ expect(credit_card.cc_type).to eq('master')
263
+
238
264
  credit_card.number = '378282246310005'
239
265
  credit_card.cc_type = ''
240
266
  expect(credit_card.cc_type).to eq('american_express')
@@ -299,7 +325,7 @@ describe Spree::CreditCard, type: :model do
299
325
  expect(am_card.month).to eq(Time.current.month)
300
326
  expect(am_card.first_name).to eq("Ludwig")
301
327
  expect(am_card.last_name).to eq("van Beethoven")
302
- expect(am_card.verification_value).to eq(123)
328
+ expect(am_card.verification_value).to eq("123")
303
329
  end
304
330
  end
305
331
 
@@ -35,41 +35,6 @@ describe Spree::LineItem, type: :model do
35
35
  end
36
36
  end
37
37
 
38
- context "#create" do
39
- let(:variant) { create(:variant) }
40
-
41
- before do
42
- create(:tax_rate, zone: order.tax_zone, tax_category: variant.tax_category)
43
- end
44
-
45
- context "when order has a tax zone" do
46
- before do
47
- expect(order.tax_zone).to be_present
48
- end
49
-
50
- it "creates a tax adjustment" do
51
- order.contents.add(variant)
52
- line_item = order.find_line_item_by_variant(variant)
53
- expect(line_item.adjustments.tax.count).to eq(1)
54
- end
55
- end
56
-
57
- context "when order does not have a tax zone" do
58
- before do
59
- order.bill_address = nil
60
- order.ship_address = nil
61
- order.save
62
- expect(order.reload.tax_zone).to be_nil
63
- end
64
-
65
- it "does not create a tax adjustment" do
66
- order.contents.add(variant)
67
- line_item = order.find_line_item_by_variant(variant)
68
- expect(line_item.adjustments.tax.count).to eq(0)
69
- end
70
- end
71
- end
72
-
73
38
  describe 'line item creation' do
74
39
  let(:variant) { create :variant }
75
40
 
@@ -102,7 +67,6 @@ describe Spree::LineItem, type: :model do
102
67
  before(:context) do
103
68
  Spree::LineItem.class_eval do
104
69
  def copy_price
105
- self.currency = "USD"
106
70
  self.cost_price = 10
107
71
  self.price = 20
108
72
  end
@@ -163,66 +127,95 @@ describe Spree::LineItem, type: :model do
163
127
  end
164
128
  end
165
129
 
166
- context 'setting the currency' do
167
- let(:line_item) { order.line_items.first }
130
+ context 'setting a line item price' do
131
+ let(:store) { create(:store, default: true) }
132
+ let(:order) { Spree::Order.new(currency: "RUB", store: store) }
133
+ let(:variant) { Spree::Variant.new(product: Spree::Product.new) }
134
+ let(:line_item) { Spree::LineItem.new(order: order, variant: variant) }
168
135
 
169
- context "currency same as order.currency" do
170
- it "is a valid line item" do
171
- line_item.currency = order.currency
172
- line_item.valid?
136
+ before { expect(variant).to receive(:price_for).at_least(:once).and_return(price) }
173
137
 
174
- expect(line_item.error_on(:currency).size).to eq(0)
138
+ context "when a price exists in order currency" do
139
+ let(:price) { Spree::Money.new(99.00, currency: "RUB") }
140
+
141
+ it "is a valid line item" do
142
+ expect(line_item.valid?).to be_truthy
143
+ expect(line_item.error_on(:price).size).to eq(0)
175
144
  end
176
145
  end
177
146
 
178
- context "currency different than order.currency" do
179
- it "is not a valid line item" do
180
- expect(Spree::Deprecation).to receive(:warn).at_least(:once)
181
- line_item.currency = "RUB"
182
- line_item.valid?
147
+ context "when a price does not exist in order currency" do
148
+ let(:price) { nil }
183
149
 
184
- expect(line_item.error_on(:currency).size).to eq(1)
150
+ it "is not a valid line item" do
151
+ expect(line_item.valid?).to be_falsey
152
+ expect(line_item.error_on(:price).size).to eq(1)
185
153
  end
186
154
  end
187
155
  end
188
156
 
189
157
  describe "#options=" do
190
- it "can handle updating a blank line item with no order" do
191
- line_item.options = { price: 123 }
192
- end
158
+ let(:options) { { price: 123, quantity: 5 } }
193
159
 
194
160
  it "updates the data provided in the options" do
195
- line_item.options = { price: 123 }
161
+ line_item.options = options
162
+
196
163
  expect(line_item.price).to eq 123
164
+ expect(line_item.quantity).to eq 5
197
165
  end
198
166
 
199
- it "updates the price based on the options provided" do
200
- expect(line_item).to receive(:gift_wrap=).with(true)
201
- expect(line_item).to receive(:money_price=)
202
- line_item.options = { gift_wrap: true }
167
+ context "when price is not provided" do
168
+ let(:options) { { quantity: 5 } }
169
+
170
+ it "sets price anyway, retrieving it from line item options" do
171
+ expect(line_item.variant)
172
+ .to receive(:price_for)
173
+ .and_return(Spree::Money.new(123, currency: "USD"))
174
+
175
+ line_item.options = options
176
+
177
+ expect(line_item.price).to eq 123
178
+ expect(line_item.quantity).to eq 5
179
+ end
203
180
  end
204
181
  end
205
182
 
206
183
  describe 'money_price=' do
207
- let(:line_item) { Spree::LineItem.new }
208
- let(:new_price) { Spree::Money.new(99.00, currency: "RUB") }
184
+ let(:currency) { "USD" }
185
+ let(:new_price) { Spree::Money.new(99.00, currency: currency) }
209
186
 
210
- it 'assigns a new price and currency' do
187
+ it 'assigns a new price' do
211
188
  line_item.money_price = new_price
212
189
  expect(line_item.price).to eq(new_price.cents / 100.0)
213
- expect(line_item.currency).to eq(new_price.currency.iso_code)
190
+ end
191
+
192
+ context 'when the new price is nil' do
193
+ let(:new_price) { nil }
194
+
195
+ it 'makes the line item price empty' do
196
+ line_item.money_price = new_price
197
+ expect(line_item.price).to be_nil
198
+ end
199
+ end
200
+
201
+ context 'when the price has a currency different from the order currency' do
202
+ let(:currency) { "RUB" }
203
+
204
+ it 'raises an exception' do
205
+ expect {
206
+ line_item.money_price = new_price
207
+ }.to raise_exception Spree::LineItem::CurrencyMismatch
208
+ end
214
209
  end
215
210
  end
216
211
 
217
212
  describe "#pricing_options" do
218
- let(:line_item) { Spree::LineItem.new(currency: "RUB") }
219
-
220
213
  subject { line_item.pricing_options }
221
214
 
222
215
  it { is_expected.to be_a(Spree::Config.pricing_options_class) }
223
216
 
224
- it "holds the line items's currency" do
225
- expect(subject.currency).to eq("RUB")
217
+ it "holds the order currency" do
218
+ expect(subject.currency).to eq("USD")
226
219
  end
227
220
  end
228
221
  end
@@ -183,7 +183,8 @@ describe Spree::Order, type: :model do
183
183
  end
184
184
 
185
185
  it "recalculates tax and updates totals" do
186
- create(:tax_rate, tax_category: line_item.tax_category, amount: 0.05, zone: order.tax_zone)
186
+ zone = create(:zone, countries: [order.tax_address.country])
187
+ create(:tax_rate, tax_category: line_item.tax_category, amount: 0.05, zone: zone)
187
188
  order.next!
188
189
  expect(order).to have_attributes(
189
190
  adjustment_total: 0.5,
@@ -22,8 +22,8 @@ module Spree
22
22
  expect(order.payment_state).to eq('paid')
23
23
  expect(order.payment_total).to eq(100)
24
24
 
25
- expect(payment_1.reload).to be_completed
26
- expect(payment_2.reload).to be_completed
25
+ expect(payment_1).to be_completed
26
+ expect(payment_2).to be_completed
27
27
  end
28
28
 
29
29
  it 'does not go over total for order' do
@@ -37,18 +37,17 @@ module Spree
37
37
  expect(order.payment_state).to eq('paid')
38
38
  expect(order.payment_total).to eq(100)
39
39
 
40
- expect(payment_1.reload).to be_completed
41
- expect(payment_2.reload).to be_completed
42
- expect(payment_3.reload).to be_checkout
40
+ expect(payment_1).to be_completed
41
+ expect(payment_2).to be_completed
42
+ expect(payment_3).to be_checkout
43
43
  end
44
44
 
45
45
  it "does not use failed payments" do
46
- create(:payment, order: order, amount: 50)
47
- create(:payment, order: order, amount: 50, state: 'failed')
48
- order.payments.reload
46
+ payment1 = create(:payment, order: order, amount: 50)
47
+ payment2 = create(:payment, order: order, amount: 50, state: 'failed')
49
48
 
50
- expect(order.payments[0]).to receive(:process!).and_call_original
51
- expect(order.payments[1]).not_to receive(:process!)
49
+ expect(payment1).to receive(:process!).and_call_original
50
+ expect(payment2).not_to receive(:process!)
52
51
 
53
52
  order.process_payments!
54
53
 
@@ -12,7 +12,9 @@ module Spree
12
12
 
13
13
  context "when no zones exist" do
14
14
  it "should return nil" do
15
- expect(order.tax_zone).to be_nil
15
+ Spree::Deprecation.silence do
16
+ expect(order.tax_zone).to be_nil
17
+ end
16
18
  end
17
19
  end
18
20
 
@@ -22,7 +24,9 @@ module Spree
22
24
  it "should calculate using ship_address" do
23
25
  expect(Spree::Zone).to receive(:match).at_least(:once).with(ship_address)
24
26
  expect(Spree::Zone).not_to receive(:match).with(bill_address)
25
- order.tax_zone
27
+ Spree::Deprecation.silence do
28
+ order.tax_zone
29
+ end
26
30
  end
27
31
  end
28
32
 
@@ -32,7 +36,9 @@ module Spree
32
36
  it "should calculate using bill_address" do
33
37
  expect(Spree::Zone).to receive(:match).at_least(:once).with(bill_address)
34
38
  expect(Spree::Zone).not_to receive(:match).with(ship_address)
35
- order.tax_zone
39
+ Spree::Deprecation.silence do
40
+ order.tax_zone
41
+ end
36
42
  end
37
43
  end
38
44
 
@@ -46,7 +52,9 @@ module Spree
46
52
  before { allow(Spree::Zone).to receive_messages(match: zone) }
47
53
 
48
54
  it "should return the matching zone" do
49
- expect(order.tax_zone).to eq(zone)
55
+ Spree::Deprecation.silence do
56
+ expect(order.tax_zone).to eq(zone)
57
+ end
50
58
  end
51
59
  end
52
60
 
@@ -54,7 +62,9 @@ module Spree
54
62
  before { allow(Spree::Zone).to receive_messages(match: nil) }
55
63
 
56
64
  it "should return the default tax zone" do
57
- expect(order.tax_zone).to eq(@default_zone)
65
+ Spree::Deprecation.silence do
66
+ expect(order.tax_zone).to eq(@default_zone)
67
+ end
58
68
  end
59
69
  end
60
70
  end
@@ -66,7 +76,9 @@ module Spree
66
76
  before { allow(Spree::Zone).to receive_messages(match: zone) }
67
77
 
68
78
  it "should return the matching zone" do
69
- expect(order.tax_zone).to eq(zone)
79
+ Spree::Deprecation.silence do
80
+ expect(order.tax_zone).to eq(zone)
81
+ end
70
82
  end
71
83
  end
72
84
 
@@ -74,10 +86,13 @@ module Spree
74
86
  before { allow(Spree::Zone).to receive_messages(match: nil) }
75
87
 
76
88
  it "should return nil" do
77
- expect(order.tax_zone).to be_nil
89
+ Spree::Deprecation.silence do
90
+ expect(order.tax_zone).to be_nil
91
+ end
78
92
  end
79
93
  end
80
94
  end
95
+
81
96
  end
82
97
  end
83
98
  end