solidus_core 2.10.0.beta1 → 2.10.5

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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +4 -4
  3. data/app/helpers/spree/products_helper.rb +2 -1
  4. data/app/jobs/spree/promotion_code_batch_job.rb +2 -2
  5. data/app/models/concerns/spree/user_methods.rb +2 -2
  6. data/app/models/spree/address.rb +11 -15
  7. data/app/models/spree/adjustment.rb +11 -0
  8. data/app/models/spree/calculator/price_sack.rb +1 -1
  9. data/app/models/spree/calculator/shipping/flexi_rate.rb +2 -2
  10. data/app/models/spree/calculator/tiered_flat_rate.rb +5 -5
  11. data/app/models/spree/calculator/tiered_percent.rb +6 -6
  12. data/app/models/spree/carton.rb +1 -1
  13. data/app/models/spree/credit_card.rb +2 -2
  14. data/app/models/spree/inventory_unit.rb +1 -19
  15. data/app/models/spree/line_item.rb +1 -1
  16. data/app/models/spree/order.rb +3 -2
  17. data/app/models/spree/order/checkout.rb +1 -1
  18. data/app/models/spree/order/payments.rb +2 -2
  19. data/app/models/spree/order_capturing.rb +2 -2
  20. data/app/models/spree/order_taxation.rb +2 -2
  21. data/app/models/spree/payment.rb +4 -41
  22. data/app/models/spree/payment/processing.rb +2 -2
  23. data/app/models/spree/payment_method.rb +2 -2
  24. data/app/models/spree/product.rb +3 -3
  25. data/app/models/spree/product/scopes.rb +9 -8
  26. data/app/models/spree/promotion.rb +27 -12
  27. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +1 -1
  28. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  29. data/app/models/spree/promotion/rules/option_value.rb +2 -2
  30. data/app/models/spree/promotion/rules/product.rb +3 -3
  31. data/app/models/spree/promotion_action.rb +1 -1
  32. data/app/models/spree/promotion_chooser.rb +2 -2
  33. data/app/models/spree/promotion_code.rb +9 -8
  34. data/app/models/spree/promotion_code/batch_builder.rb +3 -3
  35. data/app/models/spree/promotion_rule.rb +1 -1
  36. data/app/models/spree/refund.rb +2 -2
  37. data/app/models/spree/reimbursement.rb +3 -11
  38. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
  39. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
  40. data/app/models/spree/return_authorization.rb +1 -7
  41. data/app/models/spree/return_item.rb +3 -42
  42. data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
  43. data/app/models/spree/shipment.rb +4 -38
  44. data/app/models/spree/shipping_calculator.rb +0 -4
  45. data/app/models/spree/shipping_method.rb +1 -1
  46. data/app/models/spree/state.rb +1 -1
  47. data/app/models/spree/stock/differentiator.rb +1 -1
  48. data/app/models/spree/stock/package.rb +1 -1
  49. data/app/models/spree/stock_item.rb +1 -1
  50. data/app/models/spree/stock_quantities.rb +13 -12
  51. data/app/models/spree/tax_calculator/default.rb +0 -4
  52. data/app/models/spree/tax_calculator/shipping_rate.rb +0 -3
  53. data/app/models/spree/tax_rate.rb +4 -0
  54. data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
  55. data/app/models/spree/user_last_url_storer.rb +46 -0
  56. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
  57. data/app/models/spree/variant.rb +9 -9
  58. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
  59. data/app/models/spree/zone.rb +1 -1
  60. data/config/initializers/money.rb +2 -0
  61. data/config/locales/en.yml +12 -0
  62. data/lib/generators/spree/install/install_generator.rb +3 -0
  63. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +8 -0
  64. data/lib/spree/app_configuration.rb +18 -3
  65. data/lib/spree/core.rb +12 -0
  66. data/lib/spree/core/controller_helpers/auth.rb +1 -13
  67. data/lib/spree/core/controller_helpers/strong_parameters.rb +21 -7
  68. data/lib/spree/core/engine.rb +2 -2
  69. data/lib/spree/core/environment_extension.rb +9 -0
  70. data/lib/spree/core/importer/order.rb +27 -26
  71. data/lib/spree/core/product_filters.rb +15 -15
  72. data/lib/spree/core/role_configuration.rb +2 -2
  73. data/lib/spree/core/search/variant.rb +1 -1
  74. data/lib/spree/core/state_machines.rb +78 -0
  75. data/lib/spree/core/state_machines/inventory_unit.rb +42 -0
  76. data/lib/spree/core/state_machines/payment.rb +61 -0
  77. data/lib/spree/core/state_machines/reimbursement.rb +33 -0
  78. data/lib/spree/core/state_machines/return_authorization.rb +32 -0
  79. data/lib/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
  80. data/lib/spree/core/state_machines/return_item/reception_status.rb +42 -0
  81. data/lib/spree/core/state_machines/shipment.rb +58 -0
  82. data/lib/spree/core/stock_configuration.rb +1 -0
  83. data/lib/spree/core/validators/email.rb +1 -8
  84. data/lib/spree/core/version.rb +1 -1
  85. data/lib/spree/money.rb +2 -2
  86. data/lib/spree/permission_sets/user_management.rb +3 -0
  87. data/lib/spree/permitted_attributes.rb +78 -9
  88. data/lib/spree/preferences/static_model_preferences.rb +2 -2
  89. data/lib/spree/testing_support/dummy_app.rb +4 -1
  90. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +8 -1
  91. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -0
  92. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
  93. data/lib/spree/testing_support/factories/user_factory.rb +4 -1
  94. data/solidus_core.gemspec +4 -4
  95. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +8 -1
  96. data/spec/lib/spree/core/environment_extension_spec.rb +12 -1
  97. data/spec/lib/spree/core/stock_configuration_spec.rb +36 -0
  98. data/spec/lib/spree/core/validators/email_spec.rb +18 -18
  99. data/spec/lib/spree/permitted_attributes_spec.rb +41 -0
  100. data/spec/models/spree/ability_spec.rb +1 -1
  101. data/spec/models/spree/address_spec.rb +23 -0
  102. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +1 -1
  103. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +1 -1
  104. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +2 -2
  105. data/spec/models/spree/calculator/shipping/per_item_spec.rb +1 -1
  106. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +24 -15
  107. data/spec/models/spree/carton_spec.rb +8 -0
  108. data/spec/models/spree/classification_spec.rb +21 -9
  109. data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
  110. data/spec/models/spree/concerns/user_methods_spec.rb +2 -1
  111. data/spec/models/spree/order_merger_spec.rb +3 -3
  112. data/spec/models/spree/order_spec.rb +8 -15
  113. data/spec/models/spree/order_updater_spec.rb +4 -3
  114. data/spec/models/spree/payment_create_spec.rb +4 -14
  115. data/spec/models/spree/permission_sets/user_management_spec.rb +2 -0
  116. data/spec/models/spree/preference_spec.rb +4 -4
  117. data/spec/models/spree/preferences/preferable_spec.rb +3 -3
  118. data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -2
  119. data/spec/models/spree/promotion/rules/taxon_spec.rb +1 -0
  120. data/spec/models/spree/promotion_rule_spec.rb +6 -6
  121. data/spec/models/spree/promotion_spec.rb +73 -52
  122. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
  123. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
  124. data/spec/models/spree/returns_calculator_spec.rb +2 -2
  125. data/spec/models/spree/shipping_calculator_spec.rb +1 -13
  126. data/spec/models/spree/shipping_method_spec.rb +32 -0
  127. data/spec/models/spree/stock/availability_validator_spec.rb +2 -2
  128. data/spec/models/spree/stock/differentiator_spec.rb +2 -2
  129. data/spec/models/spree/stock/estimator_spec.rb +3 -3
  130. data/spec/models/spree/stock/package_spec.rb +28 -28
  131. data/spec/models/spree/stock/simple_coordinator_spec.rb +11 -11
  132. data/spec/models/spree/stock/splitter/base_spec.rb +4 -4
  133. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +7 -7
  134. data/spec/models/spree/stock_quantities_spec.rb +1 -1
  135. data/spec/models/spree/store_credit_spec.rb +1 -1
  136. data/spec/models/spree/tax_rate_spec.rb +1 -0
  137. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
  138. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +31 -0
  139. data/spec/models/spree/user_last_url_storer_spec.rb +60 -0
  140. metadata +41 -35
  141. data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -162
  142. data/spec/models/spree/order/updating_spec.rb +0 -18
@@ -57,7 +57,7 @@ module Spree
57
57
  context "multiple payment methods" do
58
58
  let(:simulate) { true }
59
59
  let!(:check_payment) { create(:check_payment, order: reimbursement.order, amount: 5.0, state: "completed") }
60
- let(:payment) { reimbursement.order.payments.detect { |p| p.payment_method.is_a? Spree::PaymentMethod::BogusCreditCard } }
60
+ let(:payment) { reimbursement.order.payments.detect { |item| item.payment_method.is_a? Spree::PaymentMethod::BogusCreditCard } }
61
61
  let(:refund_amount) { 10.0 }
62
62
 
63
63
  let(:refund_payment_methods) { subject.map { |refund| refund.payment.payment_method } }
@@ -18,7 +18,7 @@ module Spree
18
18
  context "product has variants" do
19
19
  it "returns all variants for the same product" do
20
20
  product = create(:product, variants: Array.new(3) { create(:variant) })
21
- product.variants.map { |v| v.stock_items.first.update_column(:count_on_hand, 10) }
21
+ product.variants.map { |value| value.stock_items.first.update_column(:count_on_hand, 10) }
22
22
 
23
23
  expect(SameProduct.eligible_variants(product.variants.first).sort).to eq product.variants.sort
24
24
  end
@@ -5,9 +5,9 @@ require 'rails_helper'
5
5
  module Spree
6
6
  RSpec.describe ReturnsCalculator, type: :model do
7
7
  let(:return_item) { build(:return_item) }
8
- subject { ReturnsCalculator.new }
8
+ subject { described_class.new }
9
9
 
10
- it 'compute_shipment must be overridden' do
10
+ it 'compute must be overridden' do
11
11
  expect {
12
12
  subject.compute(return_item)
13
13
  }.to raise_error NotImplementedError
@@ -21,25 +21,13 @@ module Spree
21
21
  )
22
22
  end
23
23
 
24
- subject { ShippingCalculator.new }
25
-
26
- it 'computes with a shipment' do
27
- shipment = mock_model(Spree::Shipment)
28
- expect(subject).to receive(:compute_shipment).with(shipment)
29
- subject.compute(shipment)
30
- end
24
+ subject { described_class.new }
31
25
 
32
26
  it 'computes with a package' do
33
27
  expect(subject).to receive(:compute_package).with(package)
34
28
  subject.compute(package)
35
29
  end
36
30
 
37
- it 'compute_shipment must be overridden' do
38
- expect {
39
- subject.compute_shipment(shipment)
40
- }.to raise_error NameError
41
- end
42
-
43
31
  it 'compute_package must be overridden' do
44
32
  expect {
45
33
  subject.compute_package(package)
@@ -257,4 +257,36 @@ RSpec.describe Spree::ShippingMethod, type: :model do
257
257
  it { should == 'back_end' }
258
258
  end
259
259
  end
260
+
261
+ describe '.available_to_store' do
262
+ let(:store) { create(:store) }
263
+ let(:first_shipping_method) { create(:shipping_method, stores: [store]) }
264
+ let(:second_shipping_method) { create(:shipping_method, stores: [store]) }
265
+
266
+ subject { [first_shipping_method, second_shipping_method] }
267
+
268
+ it 'raises an exception if no store is passed as argument' do
269
+ expect {
270
+ described_class.available_to_store(nil)
271
+ }.to raise_exception(ArgumentError, 'You must provide a store')
272
+ end
273
+
274
+ context 'when the store has no shipping methods associated' do
275
+ before { store.shipping_methods = [] }
276
+
277
+ it 'returns all shipping methods' do
278
+ expect(store.shipping_methods).to eq([])
279
+ expect(described_class.available_to_store(store)).to eq(subject)
280
+ end
281
+ end
282
+
283
+ context 'when the store has shipping methods associated' do
284
+ before { create(:shipping_method) }
285
+
286
+ it 'returns the associated records' do
287
+ expect(store.shipping_methods).to eq(subject)
288
+ expect(described_class.available_to_store(store)).to eq(subject)
289
+ end
290
+ end
291
+ end
260
292
  end
@@ -115,8 +115,8 @@ module Spree
115
115
  let(:stock_location) { order.shipments.first.stock_location }
116
116
 
117
117
  before do
118
- shipment2 = order.shipments.create!(stock_location: order.shipments.first.stock_location)
119
- order.contents.add(variant, 1, shipment: shipment2)
118
+ shipment_two = order.shipments.create!(stock_location: order.shipments.first.stock_location)
119
+ order.contents.add(variant, 1, shipment: shipment_two)
120
120
  variant.stock_items.first.update_columns(count_on_hand: count_on_hand, backorderable: false)
121
121
  end
122
122
 
@@ -19,11 +19,11 @@ module Spree
19
19
  let(:order) { mock_model(Order, line_items: [line_item1, line_item2]) }
20
20
 
21
21
  let(:package1) do
22
- Package.new(stock_location).tap { |p| p.add(inventory_unit1) }
22
+ Package.new(stock_location).tap { |package| package.add(inventory_unit1) }
23
23
  end
24
24
 
25
25
  let(:package2) do
26
- Package.new(stock_location).tap { |p| p.add(inventory_unit2) }
26
+ Package.new(stock_location).tap { |package| package.add(inventory_unit2) }
27
27
  end
28
28
 
29
29
  let(:packages) { [package1, package2] }
@@ -8,8 +8,8 @@ module Spree
8
8
  let(:shipping_rate) { 4.00 }
9
9
  let!(:shipping_method) { create(:shipping_method, cost: shipping_rate, currency: currency) }
10
10
  let(:package) do
11
- build(:stock_package, contents: inventory_units.map { |i| ContentItem.new(i) }).tap do |p|
12
- p.shipment = p.to_shipment
11
+ build(:stock_package, contents: inventory_units.map { |unit| ContentItem.new(unit) }).tap do |package|
12
+ package.shipment = package.to_shipment
13
13
  end
14
14
  end
15
15
  let(:order) { create(:order_with_line_items, shipping_method: shipping_method) }
@@ -61,7 +61,7 @@ module Spree
61
61
  end
62
62
 
63
63
  context "when the order's ship address is in a different zone" do
64
- before { shipping_method.zones.each{ |z| z.members.delete_all } }
64
+ before { shipping_method.zones.each{ |zone| zone.members.delete_all } }
65
65
  it_should_behave_like "shipping rate doesn't match"
66
66
  end
67
67
 
@@ -51,41 +51,41 @@ module Spree
51
51
  end
52
52
 
53
53
  it 'builds the correct list of shipping methods based on stock location and categories' do
54
- category1 = create(:shipping_category)
55
- category2 = create(:shipping_category)
56
- method1 = create(:shipping_method, available_to_all: true)
57
- method2 = create(:shipping_method, stock_locations: [stock_location])
58
- method1.shipping_categories = [category1, category2]
59
- method2.shipping_categories = [category1, category2]
60
- variant1 = mock_model(Variant, shipping_category_id: category1.id)
61
- variant2 = mock_model(Variant, shipping_category_id: category2.id)
62
- variant3 = mock_model(Variant, shipping_category_id: nil)
63
- contents = [ContentItem.new(build(:inventory_unit, variant: variant1)),
64
- ContentItem.new(build(:inventory_unit, variant: variant1)),
65
- ContentItem.new(build(:inventory_unit, variant: variant2)),
66
- ContentItem.new(build(:inventory_unit, variant: variant3))]
54
+ category_one = create(:shipping_category)
55
+ category_two = create(:shipping_category)
56
+ method_one = create(:shipping_method, available_to_all: true)
57
+ method_two = create(:shipping_method, stock_locations: [stock_location])
58
+ method_one.shipping_categories = [category_one, category_two]
59
+ method_two.shipping_categories = [category_one, category_two]
60
+ variant_one = mock_model(Variant, shipping_category_id: category_one.id)
61
+ variant_two = mock_model(Variant, shipping_category_id: category_two.id)
62
+ variant_three = mock_model(Variant, shipping_category_id: nil)
63
+ contents = [ContentItem.new(build(:inventory_unit, variant: variant_one)),
64
+ ContentItem.new(build(:inventory_unit, variant: variant_one)),
65
+ ContentItem.new(build(:inventory_unit, variant: variant_two)),
66
+ ContentItem.new(build(:inventory_unit, variant: variant_three))]
67
67
 
68
68
  package = Package.new(stock_location, contents)
69
- expect(package.shipping_methods).to match_array([method1, method2])
69
+ expect(package.shipping_methods).to match_array([method_one, method_two])
70
70
  end
71
71
  # Contains regression test for https://github.com/spree/spree/issues/2804
72
72
  it 'builds a list of shipping methods common to all categories' do
73
- category1 = create(:shipping_category)
74
- category2 = create(:shipping_category)
75
- method1 = create(:shipping_method)
76
- method2 = create(:shipping_method)
77
- method1.shipping_categories = [category1, category2]
78
- method2.shipping_categories = [category1]
79
- variant1 = mock_model(Variant, shipping_category_id: category1.id)
80
- variant2 = mock_model(Variant, shipping_category_id: category2.id)
81
- variant3 = mock_model(Variant, shipping_category_id: nil)
82
- contents = [ContentItem.new(build(:inventory_unit, variant: variant1)),
83
- ContentItem.new(build(:inventory_unit, variant: variant1)),
84
- ContentItem.new(build(:inventory_unit, variant: variant2)),
85
- ContentItem.new(build(:inventory_unit, variant: variant3))]
73
+ category_one = create(:shipping_category)
74
+ category_two = create(:shipping_category)
75
+ method_one = create(:shipping_method)
76
+ method_two = create(:shipping_method)
77
+ method_one.shipping_categories = [category_one, category_two]
78
+ method_two.shipping_categories = [category_one]
79
+ variant_one = mock_model(Variant, shipping_category_id: category_one.id)
80
+ variant_two = mock_model(Variant, shipping_category_id: category_two.id)
81
+ variant_three = mock_model(Variant, shipping_category_id: nil)
82
+ contents = [ContentItem.new(build(:inventory_unit, variant: variant_one)),
83
+ ContentItem.new(build(:inventory_unit, variant: variant_one)),
84
+ ContentItem.new(build(:inventory_unit, variant: variant_two)),
85
+ ContentItem.new(build(:inventory_unit, variant: variant_three))]
86
86
 
87
87
  package = Package.new(stock_location, contents)
88
- expect(package.shipping_methods).to match_array([method1])
88
+ expect(package.shipping_methods).to match_array([method_one])
89
89
  end
90
90
 
91
91
  it 'builds an empty list of shipping methods when no categories' do
@@ -90,8 +90,8 @@ module Spree
90
90
 
91
91
  expect(shipments.size).to eq 2
92
92
 
93
- location_1_shipment = shipments.detect { |p| p.stock_location == stock_location_1 }
94
- location_2_shipment = shipments.detect { |p| p.stock_location == stock_location_2 }
93
+ location_1_shipment = shipments.detect { |shipment| shipment.stock_location == stock_location_1 }
94
+ location_2_shipment = shipments.detect { |shipment| shipment.stock_location == stock_location_2 }
95
95
 
96
96
  expect(location_1_shipment).to be_present
97
97
  expect(location_2_shipment).to be_present
@@ -107,8 +107,8 @@ module Spree
107
107
  let!(:variant) { create(:variant, track_inventory: true) }
108
108
 
109
109
  before do
110
- stock_item1 = variant.stock_items.create!(stock_location: stock_location_1, backorderable: false)
111
- stock_item1.set_count_on_hand(location_1_inventory)
110
+ stock_item_one = variant.stock_items.create!(stock_location: stock_location_1, backorderable: false)
111
+ stock_item_one.set_count_on_hand(location_1_inventory)
112
112
  end
113
113
 
114
114
  let!(:order) { create(:order) }
@@ -119,7 +119,7 @@ module Spree
119
119
  shared_examples "a fulfillable package" do
120
120
  it "packages correctly" do
121
121
  expect(shipments).not_to be_empty
122
- inventory_units = shipments.flat_map { |s| s.inventory_units }
122
+ inventory_units = shipments.flat_map { |shipment| shipment.inventory_units }
123
123
  expect(inventory_units.size).to eq(5)
124
124
  expect(inventory_units.uniq.size).to eq(5)
125
125
  end
@@ -157,8 +157,8 @@ module Spree
157
157
  context 'with two stock locations' do
158
158
  let!(:stock_location_2) { create(:stock_location, propagate_all_variants: false, active: true) }
159
159
  before do
160
- stock_item2 = variant.stock_items.create!(stock_location: stock_location_2, backorderable: false)
161
- stock_item2.set_count_on_hand(location_2_inventory)
160
+ stock_item_two = variant.stock_items.create!(stock_location: stock_location_2, backorderable: false)
161
+ stock_item_two.set_count_on_hand(location_2_inventory)
162
162
  end
163
163
 
164
164
  context "with no inventory" do
@@ -214,11 +214,11 @@ module Spree
214
214
  let!(:stock_location_2) { create(:stock_location, propagate_all_variants: false, active: true) }
215
215
  let!(:stock_location_3) { create(:stock_location, propagate_all_variants: false, active: true) }
216
216
  before do
217
- stock_item2 = variant.stock_items.create!(stock_location: stock_location_2, backorderable: false)
218
- stock_item2.set_count_on_hand(location_2_inventory)
217
+ stock_item_two = variant.stock_items.create!(stock_location: stock_location_2, backorderable: false)
218
+ stock_item_two.set_count_on_hand(location_2_inventory)
219
219
 
220
- stock_item3 = variant.stock_items.create!(stock_location: stock_location_3, backorderable: false)
221
- stock_item3.set_count_on_hand(location_3_inventory)
220
+ stock_item_three = variant.stock_items.create!(stock_location: stock_location_3, backorderable: false)
221
+ stock_item_three.set_count_on_hand(location_3_inventory)
222
222
  end
223
223
 
224
224
  # Regression test for https://github.com/solidusio/solidus/issues/2122
@@ -9,12 +9,12 @@ module Spree
9
9
  let(:stock_location) { mock_model(Spree::StockLocation) }
10
10
 
11
11
  it 'continues to splitter chain' do
12
- splitter1 = Base.new(stock_location)
13
- splitter2 = Base.new(stock_location, splitter1)
12
+ splitter_one = Base.new(stock_location)
13
+ splitter_two = Base.new(stock_location, splitter_one)
14
14
  packages = []
15
15
 
16
- expect(splitter1).to receive(:split).with(packages)
17
- splitter2.split(packages)
16
+ expect(splitter_one).to receive(:split).with(packages)
17
+ splitter_two.split(packages)
18
18
  end
19
19
  end
20
20
  end
@@ -29,15 +29,15 @@ module Spree
29
29
  subject { described_class.new(stock_location) }
30
30
 
31
31
  it 'splits each package by shipping category' do
32
- package1 = Package.new(stock_location)
33
- 4.times { package1.add inventory_unit1 }
34
- 8.times { package1.add inventory_unit2 }
32
+ package_one = Package.new(stock_location)
33
+ 4.times { package_one.add inventory_unit1 }
34
+ 8.times { package_one.add inventory_unit2 }
35
35
 
36
- package2 = Package.new(stock_location)
37
- 6.times { package2.add inventory_unit1 }
38
- 9.times { package2.add inventory_unit2, :backordered }
36
+ package_two = Package.new(stock_location)
37
+ 6.times { package_two.add inventory_unit1 }
38
+ 9.times { package_two.add inventory_unit2, :backordered }
39
39
 
40
- packages = subject.split([package1, package2])
40
+ packages = subject.split([package_one, package_two])
41
41
  expect(packages[0].quantity).to eq 4
42
42
  expect(packages[1].quantity).to eq 8
43
43
  expect(packages[2].quantity).to eq 6
@@ -12,7 +12,7 @@ RSpec.describe Spree::StockQuantities, type: :model do
12
12
 
13
13
  describe "#each" do
14
14
  def expect_each
15
- expect { |b| subject.each(&b) }
15
+ expect { |item| subject.each(&item) }
16
16
  end
17
17
 
18
18
  context "with no items" do
@@ -777,7 +777,7 @@ RSpec.describe Spree::StoreCredit do
777
777
  let!(:store_credits) do
778
778
  [
779
779
  create(:store_credit, user: user, amount: store_credit_amount),
780
- create(:store_credit, user: user, amount: additional_store_credit_amount)
780
+ create(:store_credit, user: user.reload, amount: additional_store_credit_amount)
781
781
  ]
782
782
  end
783
783
 
@@ -153,6 +153,7 @@ RSpec.describe Spree::TaxRate, type: :model do
153
153
 
154
154
  describe 'adjustments' do
155
155
  before do
156
+ expect(Spree::Deprecation).to receive(:warn)
156
157
  tax_rate.adjust(nil, item)
157
158
  end
158
159
 
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe "Spree::Taxon::PaperclipAttachment", type: :model do
6
+ describe "#destroy_attachment" do
7
+ let(:taxon) { create(:taxon) }
8
+
9
+ context "when trying to destroy a valid attachment definition" do
10
+ context "and taxon has a file attached " do
11
+ it "removes the attachment" do
12
+ taxon.update(icon: File.new(Rails.root.join('..', '..', 'spec', 'fixtures', 'thinking-cat.jpg')))
13
+ expect(taxon.destroy_attachment(:icon)).to be_truthy
14
+ end
15
+ end
16
+ context "and the taxon does not have any file attached yet" do
17
+ it "returns false" do
18
+ expect(taxon.destroy_attachment(:icon)).to be_falsey
19
+ end
20
+ end
21
+ end
22
+
23
+ context "when trying to destroy an invalid attachment" do
24
+ it 'returns false' do
25
+ expect(taxon.destroy_attachment(:foo)).to be_falsey
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Spree::UserLastUrlStorer::Rules::AuthenticationRule do
6
+ describe '#match?' do
7
+ let(:login_path) { '/sign_in' }
8
+ let(:request) { double(fullpath: fullpath) }
9
+ let(:controller) do
10
+ double(
11
+ request: request,
12
+ spree_login_path: login_path,
13
+ controller_name: 'controller_double'
14
+ )
15
+ end
16
+
17
+ subject { described_class.match?(controller) }
18
+
19
+ context 'when the request full path is an authentication route' do
20
+ let!(:fullpath) { login_path }
21
+
22
+ it { is_expected.to be true }
23
+ end
24
+
25
+ context 'when the request full path is not an authentication route' do
26
+ let!(:fullpath) { '/products/baseball-cap' }
27
+
28
+ it { is_expected.to be false }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe Spree::UserLastUrlStorer do
6
+ subject { described_class.new(controller) }
7
+
8
+ let(:fullpath) { '/products/baseball-cap' }
9
+ let(:session) { {} }
10
+ let(:request) { double(fullpath: fullpath) }
11
+ let(:controller) do
12
+ instance_double(
13
+ ApplicationController,
14
+ request: request,
15
+ session: session,
16
+ controller_name: 'app_controller_double'
17
+ )
18
+ end
19
+
20
+ module CustomRule
21
+ def self.match?(_controller)
22
+ true
23
+ end
24
+ end
25
+
26
+ after :each do
27
+ described_class.rules.delete('CustomRule')
28
+ end
29
+
30
+ describe '::rules' do
31
+ it 'includes default rules' do
32
+ rule = Spree::UserLastUrlStorer::Rules::AuthenticationRule
33
+ expect(described_class.rules).to include(rule)
34
+ end
35
+
36
+ it 'can add new rules' do
37
+ described_class.rules << CustomRule
38
+ expect(described_class.rules).to include(CustomRule)
39
+ end
40
+ end
41
+
42
+ describe '#store_location' do
43
+ context 'when at least one rule matches' do
44
+ it 'does not set the path value into the session' do
45
+ described_class.rules << CustomRule
46
+ subject.store_location
47
+ expect(session[:spree_user_return_to]).to be_nil
48
+ end
49
+ end
50
+
51
+ context 'when no rule matches' do
52
+ it 'sets the path value into the session' do
53
+ described_class.rules << CustomRule
54
+ described_class.rules.delete('CustomRule')
55
+ subject.store_location
56
+ expect(session[:spree_user_return_to]).to eql fullpath
57
+ end
58
+ end
59
+ end
60
+ end