solidus_core 2.9.6 → 2.10.3

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 (217) 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_address_book.rb +2 -2
  6. data/app/models/concerns/spree/user_methods.rb +2 -2
  7. data/app/models/spree/address.rb +13 -17
  8. data/app/models/spree/adjustment.rb +20 -9
  9. data/app/models/spree/asset.rb +1 -1
  10. data/app/models/spree/base.rb +0 -2
  11. data/app/models/spree/calculator.rb +1 -1
  12. data/app/models/spree/calculator/price_sack.rb +1 -1
  13. data/app/models/spree/calculator/shipping/flexi_rate.rb +2 -2
  14. data/app/models/spree/calculator/tiered_flat_rate.rb +5 -5
  15. data/app/models/spree/calculator/tiered_percent.rb +6 -6
  16. data/app/models/spree/carton.rb +3 -3
  17. data/app/models/spree/classification.rb +2 -2
  18. data/app/models/spree/credit_card.rb +4 -4
  19. data/app/models/spree/customer_return.rb +1 -1
  20. data/app/models/spree/image/paperclip_attachment.rb +1 -1
  21. data/app/models/spree/inventory_unit.rb +5 -23
  22. data/app/models/spree/line_item.rb +4 -4
  23. data/app/models/spree/line_item_action.rb +2 -2
  24. data/app/models/spree/log_entry.rb +1 -1
  25. data/app/models/spree/option_value.rb +1 -1
  26. data/app/models/spree/option_values_variant.rb +2 -2
  27. data/app/models/spree/order.rb +11 -27
  28. data/app/models/spree/order/checkout.rb +1 -1
  29. data/app/models/spree/order/payments.rb +2 -2
  30. data/app/models/spree/order_cancellations.rb +1 -1
  31. data/app/models/spree/order_capturing.rb +2 -2
  32. data/app/models/spree/order_contents.rb +2 -2
  33. data/app/models/spree/order_mutex.rb +1 -1
  34. data/app/models/spree/order_promotion.rb +3 -3
  35. data/app/models/spree/order_shipping.rb +1 -1
  36. data/app/models/spree/order_taxation.rb +3 -3
  37. data/app/models/spree/payment.rb +8 -45
  38. data/app/models/spree/payment/processing.rb +3 -3
  39. data/app/models/spree/payment_capture_event.rb +1 -1
  40. data/app/models/spree/payment_method.rb +5 -2
  41. data/app/models/spree/payment_method/bogus_credit_card.rb +1 -1
  42. data/app/models/spree/payment_source.rb +1 -1
  43. data/app/models/spree/price.rb +2 -2
  44. data/app/models/spree/product.rb +5 -5
  45. data/app/models/spree/product/scopes.rb +218 -210
  46. data/app/models/spree/product_option_type.rb +2 -2
  47. data/app/models/spree/product_promotion_rule.rb +2 -2
  48. data/app/models/spree/product_property.rb +2 -2
  49. data/app/models/spree/promotion.rb +28 -13
  50. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +1 -1
  51. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  52. data/app/models/spree/promotion/rules/option_value.rb +2 -2
  53. data/app/models/spree/promotion/rules/product.rb +3 -3
  54. data/app/models/spree/promotion_action.rb +2 -2
  55. data/app/models/spree/promotion_chooser.rb +2 -2
  56. data/app/models/spree/promotion_code.rb +11 -10
  57. data/app/models/spree/promotion_code/batch_builder.rb +3 -3
  58. data/app/models/spree/promotion_code_batch.rb +1 -1
  59. data/app/models/spree/promotion_rule.rb +2 -2
  60. data/app/models/spree/promotion_rule_role.rb +2 -2
  61. data/app/models/spree/promotion_rule_store.rb +2 -2
  62. data/app/models/spree/promotion_rule_taxon.rb +2 -2
  63. data/app/models/spree/promotion_rule_user.rb +2 -2
  64. data/app/models/spree/refund.rb +5 -5
  65. data/app/models/spree/reimbursement.rb +5 -13
  66. data/app/models/spree/reimbursement/credit.rb +2 -2
  67. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
  68. data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
  69. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
  70. data/app/models/spree/return_authorization.rb +4 -10
  71. data/app/models/spree/return_item.rb +13 -52
  72. data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
  73. data/app/models/spree/role_user.rb +2 -2
  74. data/app/models/spree/shipment.rb +7 -41
  75. data/app/models/spree/shipping_calculator.rb +0 -4
  76. data/app/models/spree/shipping_manifest.rb +3 -3
  77. data/app/models/spree/shipping_method.rb +2 -2
  78. data/app/models/spree/shipping_method_category.rb +2 -2
  79. data/app/models/spree/shipping_method_stock_location.rb +2 -2
  80. data/app/models/spree/shipping_method_zone.rb +2 -2
  81. data/app/models/spree/shipping_rate.rb +2 -2
  82. data/app/models/spree/shipping_rate_tax.rb +2 -2
  83. data/app/models/spree/state.rb +2 -2
  84. data/app/models/spree/state_change.rb +2 -2
  85. data/app/models/spree/stock/differentiator.rb +1 -1
  86. data/app/models/spree/stock/package.rb +1 -1
  87. data/app/models/spree/stock_item.rb +3 -3
  88. data/app/models/spree/stock_location.rb +2 -2
  89. data/app/models/spree/stock_movement.rb +2 -2
  90. data/app/models/spree/stock_quantities.rb +13 -12
  91. data/app/models/spree/store_credit.rb +8 -8
  92. data/app/models/spree/store_credit_event.rb +3 -3
  93. data/app/models/spree/store_payment_method.rb +2 -2
  94. data/app/models/spree/store_shipping_method.rb +2 -2
  95. data/app/models/spree/tax_calculator/default.rb +0 -4
  96. data/app/models/spree/tax_calculator/shipping_rate.rb +0 -3
  97. data/app/models/spree/tax_rate.rb +5 -1
  98. data/app/models/spree/tax_rate_tax_category.rb +2 -2
  99. data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
  100. data/app/models/spree/unit_cancel.rb +5 -2
  101. data/app/models/spree/user_address.rb +2 -2
  102. data/app/models/spree/user_last_url_storer.rb +46 -0
  103. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
  104. data/app/models/spree/user_stock_location.rb +2 -2
  105. data/app/models/spree/variant.rb +10 -10
  106. data/app/models/spree/variant/scopes.rb +37 -29
  107. data/app/models/spree/variant_property_rule.rb +1 -1
  108. data/app/models/spree/variant_property_rule_condition.rb +2 -2
  109. data/app/models/spree/variant_property_rule_value.rb +2 -2
  110. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
  111. data/app/models/spree/wallet_payment_source.rb +2 -2
  112. data/app/models/spree/zone.rb +1 -1
  113. data/app/models/spree/zone_member.rb +2 -2
  114. data/config/initializers/inflections.rb +5 -0
  115. data/config/initializers/money.rb +2 -0
  116. data/config/locales/en.yml +34 -3
  117. data/lib/generators/spree/dummy/dummy_generator.rb +2 -0
  118. data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +8 -0
  119. data/lib/spree/app_configuration.rb +18 -3
  120. data/lib/spree/core.rb +12 -0
  121. data/lib/spree/core/controller_helpers/auth.rb +1 -13
  122. data/lib/spree/core/engine.rb +2 -2
  123. data/lib/spree/core/importer/order.rb +28 -28
  124. data/lib/spree/core/importer/product.rb +2 -2
  125. data/lib/spree/core/product_filters.rb +15 -15
  126. data/lib/spree/core/role_configuration.rb +2 -2
  127. data/lib/spree/core/search/variant.rb +1 -1
  128. data/lib/spree/core/state_machines.rb +78 -0
  129. data/lib/spree/core/state_machines/inventory_unit.rb +42 -0
  130. data/lib/spree/core/state_machines/payment.rb +61 -0
  131. data/lib/spree/core/state_machines/reimbursement.rb +33 -0
  132. data/lib/spree/core/state_machines/return_authorization.rb +32 -0
  133. data/lib/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
  134. data/lib/spree/core/state_machines/return_item/reception_status.rb +42 -0
  135. data/lib/spree/core/state_machines/shipment.rb +58 -0
  136. data/lib/spree/core/stock_configuration.rb +1 -0
  137. data/lib/spree/core/validators/email.rb +1 -8
  138. data/lib/spree/core/version.rb +1 -1
  139. data/lib/spree/money.rb +2 -2
  140. data/lib/spree/permission_sets/default_customer.rb +1 -1
  141. data/lib/spree/permission_sets/user_management.rb +3 -0
  142. data/lib/spree/permitted_attributes.rb +3 -3
  143. data/lib/spree/preferences/static_model_preferences.rb +2 -2
  144. data/lib/spree/testing_support/dummy_app.rb +4 -1
  145. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +6 -2
  146. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +8 -1
  147. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -0
  148. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
  149. data/lib/spree/testing_support/factories/user_factory.rb +4 -1
  150. data/solidus_core.gemspec +6 -6
  151. data/spec/lib/search/base_spec.rb +5 -1
  152. data/spec/lib/search/variant_spec.rb +1 -1
  153. data/spec/lib/spree/core/stock_configuration_spec.rb +36 -0
  154. data/spec/lib/spree/core/validators/email_spec.rb +18 -18
  155. data/spec/lib/spree/event_spec.rb +15 -3
  156. data/spec/models/spree/ability_spec.rb +1 -1
  157. data/spec/models/spree/address_spec.rb +23 -0
  158. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +1 -1
  159. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +1 -1
  160. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +1 -1
  161. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +2 -2
  162. data/spec/models/spree/calculator/shipping/per_item_spec.rb +1 -1
  163. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +24 -15
  164. data/spec/models/spree/carton_spec.rb +10 -2
  165. data/spec/models/spree/classification_spec.rb +21 -9
  166. data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
  167. data/spec/models/spree/concerns/user_methods_spec.rb +5 -4
  168. data/spec/models/spree/credit_card_spec.rb +2 -2
  169. data/spec/models/spree/customer_return_spec.rb +1 -1
  170. data/spec/models/spree/order/checkout_spec.rb +1 -1
  171. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +5 -5
  172. data/spec/models/spree/order/payment_spec.rb +1 -1
  173. data/spec/models/spree/order_contents_spec.rb +1 -1
  174. data/spec/models/spree/order_inventory_spec.rb +3 -3
  175. data/spec/models/spree/order_merger_spec.rb +3 -3
  176. data/spec/models/spree/order_shipping_spec.rb +1 -1
  177. data/spec/models/spree/order_spec.rb +14 -21
  178. data/spec/models/spree/order_updater_spec.rb +4 -3
  179. data/spec/models/spree/payment_create_spec.rb +6 -16
  180. data/spec/models/spree/payment_spec.rb +12 -12
  181. data/spec/models/spree/permission_sets/user_management_spec.rb +2 -0
  182. data/spec/models/spree/preference_spec.rb +4 -4
  183. data/spec/models/spree/preferences/preferable_spec.rb +3 -3
  184. data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -2
  185. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +2 -2
  186. data/spec/models/spree/promotion/rules/nth_order_spec.rb +2 -2
  187. data/spec/models/spree/promotion_rule_spec.rb +6 -6
  188. data/spec/models/spree/promotion_spec.rb +71 -54
  189. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +3 -3
  190. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
  191. data/spec/models/spree/return_item_spec.rb +11 -11
  192. data/spec/models/spree/returns_calculator_spec.rb +2 -2
  193. data/spec/models/spree/shipment_spec.rb +6 -6
  194. data/spec/models/spree/shipping_calculator_spec.rb +1 -13
  195. data/spec/models/spree/shipping_method_spec.rb +32 -0
  196. data/spec/models/spree/stock/availability_validator_spec.rb +2 -2
  197. data/spec/models/spree/stock/differentiator_spec.rb +2 -2
  198. data/spec/models/spree/stock/estimator_spec.rb +3 -3
  199. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +4 -4
  200. data/spec/models/spree/stock/package_spec.rb +28 -28
  201. data/spec/models/spree/stock/quantifier_spec.rb +2 -2
  202. data/spec/models/spree/stock/simple_coordinator_spec.rb +11 -11
  203. data/spec/models/spree/stock/splitter/base_spec.rb +4 -4
  204. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +7 -7
  205. data/spec/models/spree/stock_quantities_spec.rb +1 -1
  206. data/spec/models/spree/store_credit_spec.rb +8 -8
  207. data/spec/models/spree/tax_category_spec.rb +1 -1
  208. data/spec/models/spree/tax_rate_spec.rb +1 -0
  209. data/spec/models/spree/taxon_spec.rb +2 -2
  210. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
  211. data/spec/models/spree/unit_cancel_spec.rb +5 -0
  212. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +31 -0
  213. data/spec/models/spree/user_last_url_storer_spec.rb +60 -0
  214. data/spec/models/spree/user_spec.rb +3 -3
  215. metadata +49 -43
  216. data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -148
  217. data/spec/models/spree/order/updating_spec.rb +0 -18
@@ -158,7 +158,8 @@ module Spree
158
158
  amount: -500,
159
159
  finalized: true,
160
160
  label: 'Some other credit')
161
- line_item.adjustments.each { |a| a.update_column(:eligible, true) }
161
+
162
+ line_item.adjustments.each { |item| item.update_column(:eligible, true) }
162
163
 
163
164
  order.recalculate
164
165
 
@@ -172,7 +173,7 @@ module Spree
172
173
  create_adjustment('Promotion A', -200)
173
174
  create_adjustment('Promotion B', -200)
174
175
  end
175
- line_item.adjustments.each { |a| a.update_column(:eligible, true) }
176
+ line_item.adjustments.each { |item| item.update_column(:eligible, true) }
176
177
 
177
178
  order.recalculate
178
179
 
@@ -186,7 +187,7 @@ module Spree
186
187
  create_adjustment('Promotion A', -200)
187
188
  create_adjustment('Promotion B', -200)
188
189
  end
189
- line_item.adjustments.each { |a| a.update_column(:eligible, true) }
190
+ line_item.adjustments.each { |item| item.update_column(:eligible, true) }
190
191
 
191
192
  order.recalculate
192
193
 
@@ -122,7 +122,7 @@ module Spree
122
122
  end
123
123
 
124
124
  context 'the order has no user' do
125
- before { order.update_attributes!(user_id: nil) }
125
+ before { order.update!(user_id: nil) }
126
126
  it 'errors' do
127
127
  expect { new_payment }.to raise_error(ActiveRecord::RecordNotFound)
128
128
  end
@@ -130,7 +130,7 @@ module Spree
130
130
 
131
131
  context 'the order and the credit card have no user' do
132
132
  before do
133
- order.update_attributes!(user_id: nil)
133
+ order.update!(user_id: nil)
134
134
  credit_card.update!(user_id: nil)
135
135
  end
136
136
  it 'errors' do
@@ -156,20 +156,10 @@ module Spree
156
156
  context "unpermitted" do
157
157
  let(:attributes) { ActionController::Parameters.new(valid_attributes) }
158
158
 
159
- if Rails.gem_version < Gem::Version.new('5.1')
160
- it "ignores all attributes" do
161
- expect(new_payment).to have_attributes(
162
- amount: 0,
163
- payment_method: nil,
164
- source: nil
165
- )
166
- end
167
- else
168
- it "raises an exception" do
169
- expect {
170
- new_payment
171
- }.to raise_exception(ActionController::UnfilteredParameters)
172
- end
159
+ it "raises an exception" do
160
+ expect {
161
+ new_payment
162
+ }.to raise_exception(ActionController::UnfilteredParameters)
173
163
  end
174
164
  end
175
165
 
@@ -134,7 +134,7 @@ RSpec.describe Spree::Payment, type: :model do
134
134
  describe "#process!" do
135
135
  context 'with autocapture' do
136
136
  before do
137
- payment.payment_method.update_attributes!(auto_capture: true)
137
+ payment.payment_method.update!(auto_capture: true)
138
138
  end
139
139
 
140
140
  it "should purchase" do
@@ -145,11 +145,11 @@ RSpec.describe Spree::Payment, type: :model do
145
145
 
146
146
  context 'without autocapture' do
147
147
  before do
148
- payment.payment_method.update_attributes!(auto_capture: false)
148
+ payment.payment_method.update!(auto_capture: false)
149
149
  end
150
150
 
151
151
  context 'when in the checkout state' do
152
- before { payment.update_attributes!(state: 'checkout') }
152
+ before { payment.update!(state: 'checkout') }
153
153
 
154
154
  it "authorizes" do
155
155
  payment.process!
@@ -158,7 +158,7 @@ RSpec.describe Spree::Payment, type: :model do
158
158
  end
159
159
 
160
160
  context 'when in the processing state' do
161
- before { payment.update_attributes!(state: 'processing') }
161
+ before { payment.update!(state: 'processing') }
162
162
 
163
163
  it "does not authorize" do
164
164
  payment.process!
@@ -167,7 +167,7 @@ RSpec.describe Spree::Payment, type: :model do
167
167
  end
168
168
 
169
169
  context 'when in the pending state' do
170
- before { payment.update_attributes!(state: 'pending') }
170
+ before { payment.update!(state: 'pending') }
171
171
 
172
172
  it "does not re-authorize" do
173
173
  expect(payment).to_not receive(:authorize!)
@@ -177,7 +177,7 @@ RSpec.describe Spree::Payment, type: :model do
177
177
  end
178
178
 
179
179
  context 'when in a failed state' do
180
- before { payment.update_attributes!(state: 'failed') }
180
+ before { payment.update!(state: 'failed') }
181
181
 
182
182
  it "raises an exception" do
183
183
  expect {
@@ -187,7 +187,7 @@ RSpec.describe Spree::Payment, type: :model do
187
187
  end
188
188
 
189
189
  context 'when in the completed state' do
190
- before { payment.update_attributes!(state: 'completed') }
190
+ before { payment.update!(state: 'completed') }
191
191
 
192
192
  it "authorizes" do
193
193
  payment.process!
@@ -253,7 +253,7 @@ RSpec.describe Spree::Payment, type: :model do
253
253
 
254
254
  context 'when the source is a credit card without an address' do
255
255
  let(:card) { create(:credit_card, address: nil) }
256
- before { order.update_attributes!(bill_address: address) }
256
+ before { order.update!(bill_address: address) }
257
257
  let(:address) { create(:address) }
258
258
 
259
259
  it 'send the order bill address' do
@@ -278,7 +278,7 @@ RSpec.describe Spree::Payment, type: :model do
278
278
 
279
279
  let(:store_credit_payment) { create(:store_credit_payment) }
280
280
  let(:store_credit_payment_method) { create(:store_credit_payment_method) }
281
- before { order.update_attributes!(bill_address: address) }
281
+ before { order.update!(bill_address: address) }
282
282
  let(:address) { create(:address) }
283
283
 
284
284
  it 'send the order bill address' do
@@ -932,7 +932,7 @@ RSpec.describe Spree::Payment, type: :model do
932
932
  end
933
933
 
934
934
  context 'the order has no user' do
935
- before { order.update_attributes!(user_id: nil) }
935
+ before { order.update!(user_id: nil) }
936
936
  it 'errors' do
937
937
  expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
938
938
  end
@@ -940,7 +940,7 @@ RSpec.describe Spree::Payment, type: :model do
940
940
 
941
941
  context 'the order and the credit card have no user' do
942
942
  before do
943
- order.update_attributes!(user_id: nil)
943
+ order.update!(user_id: nil)
944
944
  credit_card.update!(user_id: nil)
945
945
  end
946
946
  it 'errors' do
@@ -976,7 +976,7 @@ RSpec.describe Spree::Payment, type: :model do
976
976
  # Sets the payment's order to a different Ruby object entirely
977
977
  payment.order = Spree::Order.find(payment.order_id)
978
978
  email = 'foo@example.com'
979
- order.update_attributes(email: email)
979
+ order.update(email: email)
980
980
  expect(payment.gateway_options[:email]).to eq(email)
981
981
  end
982
982
  end
@@ -25,11 +25,13 @@ RSpec.describe Spree::PermissionSets::UserManagement do
25
25
  context 'when the user does not have a role' do
26
26
  let(:user) { create(:user) }
27
27
  it { is_expected.to be_able_to(:update_email, user) }
28
+ it { is_expected.to be_able_to(:update_password, user) }
28
29
  end
29
30
 
30
31
  context 'when the user has a role' do
31
32
  let(:user) { create(:user, spree_roles: [create(:role)]) }
32
33
  it { is_expected.not_to be_able_to(:update_email, user) }
34
+ it { is_expected.not_to be_able_to(:update_password, user) }
33
35
  end
34
36
 
35
37
  it { is_expected.not_to be_able_to(:delete, Spree.user_class) }
@@ -12,10 +12,10 @@ RSpec.describe Spree::Preference, type: :model do
12
12
 
13
13
  describe "type coversion for values" do
14
14
  def round_trip_preference(key, value)
15
- p = Spree::Preference.new
16
- p.value = value
17
- p.key = key
18
- p.save
15
+ element = Spree::Preference.new
16
+ element.value = value
17
+ element.key = key
18
+ element.save
19
19
 
20
20
  Spree::Preference.find_by(key: key)
21
21
  end
@@ -272,9 +272,9 @@ RSpec.describe Spree::Preferences::Preferable, type: :model do
272
272
  before(:all) do
273
273
  class CreatePrefTest < ActiveRecord::Migration[4.2]
274
274
  def self.up
275
- create_table :pref_tests do |t|
276
- t.string :col
277
- t.text :preferences
275
+ create_table :pref_tests do |item|
276
+ item.string :col
277
+ item.text :preferences
278
278
  end
279
279
  end
280
280
 
@@ -30,8 +30,8 @@ module Spree
30
30
  end
31
31
 
32
32
  subject do
33
- klass.new.tap do |o|
34
- o.preference_source = preference_source
33
+ klass.new.tap do |item|
34
+ item.preference_source = preference_source
35
35
  end
36
36
  end
37
37
 
@@ -42,10 +42,10 @@ RSpec.describe Spree::Promotion::Rules::FirstRepeatPurchaseSince do
42
42
  let(:order_completion_date_2) { 1.day.ago }
43
43
  before do
44
44
  old_order_1 = create :completed_order_with_totals, user: user
45
- old_order_1.update_attributes(completed_at: order_completion_date_1)
45
+ old_order_1.update(completed_at: order_completion_date_1)
46
46
 
47
47
  old_order_2 = create :completed_order_with_totals, user: user
48
- old_order_2.update_attributes(completed_at: order_completion_date_2)
48
+ old_order_2.update(completed_at: order_completion_date_2)
49
49
  end
50
50
 
51
51
  context "the last completed order was greater than the preferred days ago" do
@@ -40,7 +40,7 @@ RSpec.describe Spree::Promotion::Rules::NthOrder do
40
40
  context "when the user has completed orders" do
41
41
  before do
42
42
  old_order = create :completed_order_with_totals, user: user
43
- old_order.update_attributes(completed_at: 1.day.ago)
43
+ old_order.update(completed_at: 1.day.ago)
44
44
  end
45
45
 
46
46
  context "when this order will be the 'nth' order" do
@@ -49,7 +49,7 @@ RSpec.describe Spree::Promotion::Rules::NthOrder do
49
49
 
50
50
  context "when this order is completed and is still the 'nth' order" do
51
51
  before do
52
- order.update_attributes(completed_at: Time.current)
52
+ order.update(completed_at: Time.current)
53
53
  end
54
54
 
55
55
  it { is_expected.to be true }
@@ -17,13 +17,13 @@ module Spree
17
17
  end
18
18
 
19
19
  it "validates unique rules for a promotion" do
20
- p1 = TestRule.new
21
- p1.promotion_id = 1
22
- p1.save
20
+ promotion_one = TestRule.new
21
+ promotion_one.promotion_id = 1
22
+ promotion_one.save
23
23
 
24
- p2 = TestRule.new
25
- p2.promotion_id = 1
26
- expect(p2).not_to be_valid
24
+ promotion_two = TestRule.new
25
+ promotion_two.promotion_id = 1
26
+ expect(promotion_two).not_to be_valid
27
27
  end
28
28
 
29
29
  it "generates its own partial path" do
@@ -434,12 +434,12 @@ RSpec.describe Spree::Promotion, type: :model do
434
434
  end
435
435
 
436
436
  context 'when expires_at date is not already reached' do
437
- let(:expires_at) { Time.current + 1.days }
437
+ let(:expires_at) { Time.current + 1.day }
438
438
  it { is_expected.to be_falsey }
439
439
  end
440
440
 
441
441
  context 'when expires_at date is in the past' do
442
- let(:expires_at) { Time.current - 1.days }
442
+ let(:expires_at) { Time.current - 1.day }
443
443
  it { is_expected.to be_truthy }
444
444
  end
445
445
  end
@@ -454,12 +454,12 @@ RSpec.describe Spree::Promotion, type: :model do
454
454
  end
455
455
 
456
456
  context 'when expires_at date is not already reached' do
457
- let(:expires_at) { Time.current + 1.days }
457
+ let(:expires_at) { Time.current + 1.day }
458
458
  it { is_expected.to be_truthy }
459
459
  end
460
460
 
461
461
  context 'when expires_at date is in the past' do
462
- let(:expires_at) { Time.current - 1.days }
462
+ let(:expires_at) { Time.current - 1.day }
463
463
  it { is_expected.to be_falsey }
464
464
  end
465
465
  end
@@ -569,80 +569,69 @@ RSpec.describe Spree::Promotion, type: :model do
569
569
 
570
570
  context "#eligible?" do
571
571
  subject do
572
- promotion.eligible?(promotable)
572
+ promotion.eligible?(promotable, promotion_code: promotion.codes.first)
573
573
  end
574
574
 
575
- let(:promotable) { create :order }
575
+ shared_examples "a promotable" do
576
+ context "when empty" do
577
+ it { is_expected.to be true }
578
+ end
576
579
 
577
- it { is_expected.to be true }
580
+ context "when promotion is expired" do
581
+ before { promotion.expires_at = Time.current - 10.days }
578
582
 
579
- context "when promotion is expired" do
580
- before { promotion.expires_at = Time.current - 10.days }
581
- it { is_expected.to be false }
582
- end
583
+ it { is_expected.to be false }
584
+ end
583
585
 
584
- context "when the promotion's usage limit is exceeded" do
585
- let(:order) { FactoryBot.create(:completed_order_with_promotion, promotion: promotion) }
586
- let(:promotion) { FactoryBot.create(:promotion, :with_order_adjustment) }
586
+ context "when promotion's usage limit is exceeded" do
587
+ before do
588
+ promotion.usage_limit = 1
589
+ create(:completed_order_with_promotion, promotion: promotion)
590
+ end
587
591
 
588
- before do
589
- FactoryBot.create(
590
- :completed_order_with_promotion,
591
- promotion: promotion
592
- )
593
- promotion.usage_limit = 1
592
+ it { is_expected.to be false }
594
593
  end
595
594
 
596
- it "returns false" do
597
- expect(promotion.eligible?(promotable)).to eq(false)
595
+ context "when promotion code's usage limit is exceeded" do
596
+ before do
597
+ promotion.per_code_usage_limit = 1
598
+ create(:completed_order_with_promotion, promotion: promotion)
599
+ promotion.codes.first.adjustments.update_all(eligible: true)
600
+ end
601
+
602
+ it { is_expected.to be false }
598
603
  end
599
- end
600
604
 
601
- context "when the promotion code's usage limit is exceeded" do
602
- let(:order) { FactoryBot.create(:completed_order_with_promotion, promotion: promotion) }
603
- let(:promotion) { create(:promotion, :with_order_adjustment, code: 'abc123', per_code_usage_limit: 1) }
604
- let(:promotion_code) { promotion.codes.first }
605
+ context "when promotion is at last usage on the same order" do
606
+ let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
607
+ let(:promotable) { order }
605
608
 
606
- before do
607
- FactoryBot.create(
608
- :completed_order_with_promotion,
609
- promotion: promotion
610
- )
611
- promotion_code.adjustments.update_all(eligible: true)
612
- end
609
+ before do
610
+ promotion.usage_limit = 1
611
+ end
613
612
 
614
- it "returns false" do
615
- expect(promotion.eligible?(promotable, promotion_code: promotion_code)).to eq(false)
613
+ it { is_expected.to be true }
616
614
  end
617
- end
618
615
 
619
- context "when promotable is a Spree::LineItem" do
620
- let(:promotable) { create :line_item }
621
- let(:product) { promotable.product }
616
+ context "when promotion code is at last usage on the same order" do
617
+ let(:order) { create(:completed_order_with_promotion, promotion: promotion) }
618
+ let(:promotable) { order }
622
619
 
623
- before do
624
- product.promotionable = promotionable
625
- end
620
+ before do
621
+ promotion.per_code_usage_limit = 1
622
+ end
626
623
 
627
- context "and product is promotionable" do
628
- let(:promotionable) { true }
629
624
  it { is_expected.to be true }
630
625
  end
631
-
632
- context "and product is not promotionable" do
633
- let(:promotionable) { false }
634
- it { is_expected.to be false }
635
- end
636
626
  end
637
627
 
638
628
  context "when promotable is a Spree::Order" do
629
+ let(:promotion) { create(:promotion, :with_order_adjustment) }
639
630
  let(:promotable) { create :order }
640
631
 
641
- context "and it is empty" do
642
- it { is_expected.to be true }
643
- end
632
+ it_behaves_like "a promotable"
644
633
 
645
- context "and it contains items" do
634
+ context "when it contains items" do
646
635
  let!(:line_item) { create(:line_item, order: promotable) }
647
636
  let!(:line_item2) { create(:line_item, order: promotable) }
648
637
 
@@ -650,6 +639,7 @@ RSpec.describe Spree::Promotion, type: :model do
650
639
  before do
651
640
  line_item.product.update_column(:promotionable, false)
652
641
  end
642
+
653
643
  it { is_expected.to be false }
654
644
  end
655
645
 
@@ -658,6 +648,7 @@ RSpec.describe Spree::Promotion, type: :model do
658
648
  line_item.product.update_column(:promotionable, false)
659
649
  line_item2.product.update_column(:promotionable, false)
660
650
  end
651
+
661
652
  it { is_expected.to be false }
662
653
  end
663
654
 
@@ -666,6 +657,32 @@ RSpec.describe Spree::Promotion, type: :model do
666
657
  end
667
658
  end
668
659
  end
660
+
661
+ context "when promotable is a Spree::LineItem" do
662
+ let(:promotion) { create(:promotion, :with_line_item_adjustment) }
663
+ let(:promotable) { create(:line_item) }
664
+
665
+ it_behaves_like "a promotable"
666
+
667
+ context "and product is promotionable" do
668
+ before { promotable.product.promotionable = true }
669
+
670
+ it { is_expected.to be true }
671
+ end
672
+
673
+ context "and product is not promotionable" do
674
+ before { promotable.product.promotionable = false }
675
+
676
+ it { is_expected.to be false }
677
+ end
678
+ end
679
+
680
+ context "when promotable is a Spree::Shipment" do
681
+ let(:promotion) { create(:promotion, :with_free_shipping) }
682
+ let(:promotable) { create(:shipment) }
683
+
684
+ it_behaves_like "a promotable"
685
+ end
669
686
  end
670
687
 
671
688
  context "#eligible_rules" do