spree_core 3.3.0.rc1 → 3.3.0.rc2

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 (220) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +1 -1
  3. data/app/mailers/spree/base_mailer.rb +5 -0
  4. data/app/models/spree/ability.rb +4 -1
  5. data/app/models/spree/image.rb +6 -2
  6. data/app/models/spree/order.rb +10 -9
  7. data/app/models/spree/order/payments.rb +1 -1
  8. data/app/models/spree/payment_method/store_credit.rb +4 -0
  9. data/app/models/spree/shipment.rb +2 -0
  10. data/app/views/spree/shared/_base_mailer_header.html.erb +5 -1
  11. data/app/views/spree/shared/_mailer_line_item.html.erb +5 -1
  12. data/config/routes.rb +0 -3
  13. data/lib/spree/core/components.rb +17 -0
  14. data/lib/spree/core/controller_helpers/auth.rb +3 -1
  15. data/lib/spree/core/engine.rb +1 -0
  16. data/lib/spree/core/validators/email.rb +1 -5
  17. data/lib/spree/core/version.rb +1 -1
  18. data/spree_core.gemspec +1 -1
  19. metadata +4 -204
  20. data/lib/spree/testing_support/shoulda_matcher_configuration.rb +0 -6
  21. data/spec/fixtures/thinking-cat.jpg +0 -0
  22. data/spec/helpers/base_helper_spec.rb +0 -200
  23. data/spec/helpers/products_helper_spec.rb +0 -289
  24. data/spec/lib/calculated_adjustments_spec.rb +0 -7
  25. data/spec/lib/i18n_spec.rb +0 -123
  26. data/spec/lib/search/base_spec.rb +0 -86
  27. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -103
  28. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -110
  29. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -17
  30. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -72
  31. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -39
  32. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -22
  33. data/spec/lib/spree/core/importer/order_spec.rb +0 -607
  34. data/spec/lib/spree/core/number_generator_spec.rb +0 -139
  35. data/spec/lib/spree/core/token_generator_spec.rb +0 -24
  36. data/spec/lib/spree/core/validators/email_spec.rb +0 -54
  37. data/spec/lib/spree/core_spec.rb +0 -23
  38. data/spec/lib/spree/localized_number_spec.rb +0 -54
  39. data/spec/lib/spree/migrations_spec.rb +0 -36
  40. data/spec/lib/spree/money_spec.rb +0 -122
  41. data/spec/lib/tasks/exchanges_spec.rb +0 -136
  42. data/spec/mailers/order_mailer_spec.rb +0 -122
  43. data/spec/mailers/reimbursement_mailer_spec.rb +0 -52
  44. data/spec/mailers/shipment_mailer_spec.rb +0 -81
  45. data/spec/mailers/test_mailer_spec.rb +0 -38
  46. data/spec/models/spree/ability_spec.rb +0 -251
  47. data/spec/models/spree/address_spec.rb +0 -402
  48. data/spec/models/spree/adjustable/adjuster/base_spec.rb +0 -10
  49. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +0 -211
  50. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +0 -86
  51. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +0 -26
  52. data/spec/models/spree/adjustment_spec.rb +0 -189
  53. data/spec/models/spree/app_configuration_spec.rb +0 -26
  54. data/spec/models/spree/asset_spec.rb +0 -28
  55. data/spec/models/spree/calculator/default_tax_spec.rb +0 -152
  56. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -25
  57. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -47
  58. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -41
  59. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -15
  60. data/spec/models/spree/calculator/price_sack_spec.rb +0 -30
  61. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -47
  62. data/spec/models/spree/calculator/shipping.rb +0 -8
  63. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -23
  64. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -13
  65. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -52
  66. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -20
  67. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -29
  68. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -40
  69. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -51
  70. data/spec/models/spree/calculator_spec.rb +0 -69
  71. data/spec/models/spree/classification_spec.rb +0 -93
  72. data/spec/models/spree/concerns/display_money_spec.rb +0 -43
  73. data/spec/models/spree/concerns/user_methods_spec.rb +0 -82
  74. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +0 -66
  75. data/spec/models/spree/country_spec.rb +0 -55
  76. data/spec/models/spree/credit_card_spec.rb +0 -328
  77. data/spec/models/spree/customer_return_spec.rb +0 -240
  78. data/spec/models/spree/exchange_spec.rb +0 -75
  79. data/spec/models/spree/gateway/bogus_simple.rb +0 -20
  80. data/spec/models/spree/gateway/bogus_spec.rb +0 -13
  81. data/spec/models/spree/gateway_spec.rb +0 -61
  82. data/spec/models/spree/image_spec.rb +0 -8
  83. data/spec/models/spree/inventory_unit_spec.rb +0 -256
  84. data/spec/models/spree/line_item_spec.rb +0 -348
  85. data/spec/models/spree/option_type_prototype_spec.rb +0 -9
  86. data/spec/models/spree/option_type_spec.rb +0 -14
  87. data/spec/models/spree/option_value_spec.rb +0 -18
  88. data/spec/models/spree/order/address_spec.rb +0 -50
  89. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  90. data/spec/models/spree/order/callbacks_spec.rb +0 -42
  91. data/spec/models/spree/order/checkout_spec.rb +0 -770
  92. data/spec/models/spree/order/currency_updater_spec.rb +0 -32
  93. data/spec/models/spree/order/finalizing_spec.rb +0 -114
  94. data/spec/models/spree/order/helpers_spec.rb +0 -5
  95. data/spec/models/spree/order/payment_spec.rb +0 -214
  96. data/spec/models/spree/order/risk_assessment_spec.rb +0 -84
  97. data/spec/models/spree/order/shipments_spec.rb +0 -43
  98. data/spec/models/spree/order/state_machine_spec.rb +0 -212
  99. data/spec/models/spree/order/store_credit_spec.rb +0 -457
  100. data/spec/models/spree/order/tax_spec.rb +0 -84
  101. data/spec/models/spree/order/totals_spec.rb +0 -24
  102. data/spec/models/spree/order/updating_spec.rb +0 -18
  103. data/spec/models/spree/order/validations_spec.rb +0 -15
  104. data/spec/models/spree/order_contents_spec.rb +0 -332
  105. data/spec/models/spree/order_inventory_spec.rb +0 -247
  106. data/spec/models/spree/order_merger_spec.rb +0 -135
  107. data/spec/models/spree/order_spec.rb +0 -1067
  108. data/spec/models/spree/order_updater_spec.rb +0 -305
  109. data/spec/models/spree/payment/gateway_options_spec.rb +0 -127
  110. data/spec/models/spree/payment/store_credit_spec.rb +0 -60
  111. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -291
  112. data/spec/models/spree/payment_method_spec.rb +0 -108
  113. data/spec/models/spree/payment_spec.rb +0 -922
  114. data/spec/models/spree/preference_spec.rb +0 -80
  115. data/spec/models/spree/preferences/configuration_spec.rb +0 -30
  116. data/spec/models/spree/preferences/preferable_spec.rb +0 -344
  117. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -58
  118. data/spec/models/spree/preferences/store_spec.rb +0 -46
  119. data/spec/models/spree/price_spec.rb +0 -128
  120. data/spec/models/spree/product/scopes_spec.rb +0 -174
  121. data/spec/models/spree/product_duplicator_spec.rb +0 -102
  122. data/spec/models/spree/product_filter_spec.rb +0 -26
  123. data/spec/models/spree/product_option_type_spec.rb +0 -9
  124. data/spec/models/spree/product_promotion_rule_spec.rb +0 -9
  125. data/spec/models/spree/product_property_spec.rb +0 -26
  126. data/spec/models/spree/product_spec.rb +0 -626
  127. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -113
  128. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -148
  129. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +0 -86
  130. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -36
  131. data/spec/models/spree/promotion/rules/country_spec.rb +0 -36
  132. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -75
  133. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -282
  134. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -42
  135. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -90
  136. data/spec/models/spree/promotion/rules/product_spec.rb +0 -143
  137. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -102
  138. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -27
  139. data/spec/models/spree/promotion/rules/user_spec.rb +0 -45
  140. data/spec/models/spree/promotion_action_spec.rb +0 -10
  141. data/spec/models/spree/promotion_category_spec.rb +0 -17
  142. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -102
  143. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -323
  144. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +0 -48
  145. data/spec/models/spree/promotion_handler/page_spec.rb +0 -44
  146. data/spec/models/spree/promotion_rule_spec.rb +0 -29
  147. data/spec/models/spree/promotion_rule_taxon_spec.rb +0 -9
  148. data/spec/models/spree/promotion_rule_user_spec.rb +0 -9
  149. data/spec/models/spree/promotion_spec.rb +0 -674
  150. data/spec/models/spree/property_prototype_spec.rb +0 -9
  151. data/spec/models/spree/property_spec.rb +0 -5
  152. data/spec/models/spree/prototype_spec.rb +0 -5
  153. data/spec/models/spree/prototype_taxon_spec.rb +0 -9
  154. data/spec/models/spree/refund_reason_spec.rb +0 -20
  155. data/spec/models/spree/refund_spec.rb +0 -195
  156. data/spec/models/spree/reimbursement/credit_spec.rb +0 -36
  157. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -140
  158. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -83
  159. data/spec/models/spree/reimbursement_performer_spec.rb +0 -30
  160. data/spec/models/spree/reimbursement_spec.rb +0 -188
  161. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -63
  162. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -53
  163. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -46
  164. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -55
  165. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -101
  166. data/spec/models/spree/return_authorization_reason_spec.rb +0 -7
  167. data/spec/models/spree/return_authorization_spec.rb +0 -230
  168. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -77
  169. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -58
  170. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -61
  171. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -32
  172. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -29
  173. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -35
  174. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -65
  175. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  176. data/spec/models/spree/return_item_spec.rb +0 -734
  177. data/spec/models/spree/returns_calculator_spec.rb +0 -14
  178. data/spec/models/spree/role_spec.rb +0 -7
  179. data/spec/models/spree/shipment_spec.rb +0 -744
  180. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  181. data/spec/models/spree/shipping_category_spec.rb +0 -19
  182. data/spec/models/spree/shipping_method_spec.rb +0 -125
  183. data/spec/models/spree/shipping_rate_spec.rb +0 -140
  184. data/spec/models/spree/state_spec.rb +0 -29
  185. data/spec/models/spree/stock/availability_validator_spec.rb +0 -42
  186. data/spec/models/spree/stock/content_item_spec.rb +0 -31
  187. data/spec/models/spree/stock/coordinator_spec.rb +0 -61
  188. data/spec/models/spree/stock/differentiator_spec.rb +0 -39
  189. data/spec/models/spree/stock/estimator_spec.rb +0 -202
  190. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -37
  191. data/spec/models/spree/stock/package_spec.rb +0 -182
  192. data/spec/models/spree/stock/packer_spec.rb +0 -70
  193. data/spec/models/spree/stock/prioritizer_spec.rb +0 -125
  194. data/spec/models/spree/stock/quantifier_spec.rb +0 -126
  195. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -29
  196. data/spec/models/spree/stock/splitter/base_spec.rb +0 -21
  197. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -47
  198. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -32
  199. data/spec/models/spree/stock_item_spec.rb +0 -465
  200. data/spec/models/spree/stock_location_spec.rb +0 -243
  201. data/spec/models/spree/stock_movement_spec.rb +0 -120
  202. data/spec/models/spree/stock_transfer_spec.rb +0 -50
  203. data/spec/models/spree/store_credit_event_spec.rb +0 -101
  204. data/spec/models/spree/store_credit_spec.rb +0 -798
  205. data/spec/models/spree/store_spec.rb +0 -78
  206. data/spec/models/spree/tax_category_spec.rb +0 -32
  207. data/spec/models/spree/tax_rate_spec.rb +0 -561
  208. data/spec/models/spree/taxon_spec.rb +0 -93
  209. data/spec/models/spree/taxonomy_spec.rb +0 -18
  210. data/spec/models/spree/tracker_spec.rb +0 -21
  211. data/spec/models/spree/user_spec.rb +0 -203
  212. data/spec/models/spree/variant_spec.rb +0 -818
  213. data/spec/models/spree/zone_member_spec.rb +0 -38
  214. data/spec/models/spree/zone_spec.rb +0 -472
  215. data/spec/spec_helper.rb +0 -82
  216. data/spec/support/big_decimal.rb +0 -5
  217. data/spec/support/concerns/adjustment_source.rb +0 -23
  218. data/spec/support/concerns/default_price.rb +0 -37
  219. data/spec/support/rake.rb +0 -13
  220. data/spec/support/test_gateway.rb +0 -2
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Spree::ReturnItem::EligibilityValidator::RMARequired, type: :model do
4
- let(:return_item) { create(:return_item) }
5
- let(:validator) { Spree::ReturnItem::EligibilityValidator::RMARequired.new(return_item) }
6
-
7
- describe "#eligible_for_return?" do
8
- subject { validator.eligible_for_return? }
9
-
10
- context "there is an rma on the return item" do
11
- it "returns true" do
12
- expect(subject).to be true
13
- end
14
- end
15
-
16
- context "there is no rma on the return item" do
17
- before { allow(return_item).to receive(:return_authorization).and_return(nil) }
18
-
19
- it "returns false" do
20
- expect(subject).to be false
21
- end
22
-
23
- it "sets an error" do
24
- subject
25
- expect(validator.errors[:rma_required]).to eq Spree.t('return_item_rma_ineligible')
26
- end
27
- end
28
- end
29
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Spree::ReturnItem::EligibilityValidator::TimeSincePurchase, type: :model do
4
- let(:inventory_unit) { create(:inventory_unit, order: create(:shipped_order)) }
5
- let(:return_item) { create(:return_item, inventory_unit: inventory_unit) }
6
- let(:validator) { Spree::ReturnItem::EligibilityValidator::TimeSincePurchase.new(return_item) }
7
-
8
- describe "#eligible_for_return?" do
9
- subject { validator.eligible_for_return? }
10
-
11
- context "it is within the return timeframe" do
12
- it "returns true" do
13
- completed_at = return_item.inventory_unit.order.completed_at - (Spree::Config[:return_eligibility_number_of_days].days / 2)
14
- return_item.inventory_unit.order.update_attributes(completed_at: completed_at)
15
- expect(subject).to be true
16
- end
17
- end
18
-
19
- context "it is past the return timeframe" do
20
- before do
21
- completed_at = return_item.inventory_unit.order.completed_at - Spree::Config[:return_eligibility_number_of_days].days - 1.day
22
- return_item.inventory_unit.order.update_attributes(completed_at: completed_at)
23
- end
24
-
25
- it "returns false" do
26
- expect(subject).to be false
27
- end
28
-
29
- it "sets an error" do
30
- subject
31
- expect(validator.errors[:number_of_days]).to eq Spree.t('return_item_time_period_ineligible')
32
- end
33
- end
34
- end
35
- end
@@ -1,65 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Spree
4
- module ReturnItem::ExchangeVariantEligibility
5
- describe SameOptionValue, type: :model do
6
- describe ".eligible_variants" do
7
- let(:color_option_type) { create(:option_type, name: "color") }
8
- let(:waist_option_type) { create(:option_type, name: "waist") }
9
- let(:inseam_option_type) { create(:option_type, name: "inseam") }
10
-
11
- let(:blue_option_value) { create(:option_value, name: "blue", option_type: color_option_type) }
12
- let(:red_option_value) { create(:option_value, name: "red", option_type: color_option_type) }
13
-
14
- let(:three_two_waist_option_value) { create(:option_value, name: 32, option_type: waist_option_type) }
15
- let(:three_four_waist_option_value) { create(:option_value, name: 34, option_type: waist_option_type) }
16
-
17
- let(:three_zero_inseam_option_value) { create(:option_value, name: 30, option_type: inseam_option_type) }
18
- let(:three_one_inseam_option_value) { create(:option_value, name: 31, option_type: inseam_option_type) }
19
-
20
- let(:product) { create(:product, option_types: [color_option_type, waist_option_type, inseam_option_type]) }
21
-
22
- let!(:variant) { create(:variant, product: product, option_values: [blue_option_value, three_two_waist_option_value, three_zero_inseam_option_value]) }
23
- let!(:same_option_values_variant) { create(:variant, product: product, option_values: [blue_option_value, three_two_waist_option_value, three_one_inseam_option_value]) }
24
- let!(:different_color_option_value_variant) { create(:variant, product: product, option_values: [red_option_value, three_two_waist_option_value, three_one_inseam_option_value]) }
25
- let!(:different_waist_option_value_variant) { create(:variant, product: product, option_values: [blue_option_value, three_four_waist_option_value, three_one_inseam_option_value]) }
26
-
27
- before do
28
- @original_option_type_restrictions = SameOptionValue.option_type_restrictions
29
- SameOptionValue.option_type_restrictions = ["color", "waist"]
30
- end
31
-
32
- after { SameOptionValue.option_type_restrictions = @original_option_type_restrictions }
33
-
34
- subject { SameOptionValue.eligible_variants(variant.reload) }
35
-
36
- it "returns all other variants for the same product with the same option value for the specified option type" do
37
- Spree::StockItem.update_all(count_on_hand: 10)
38
-
39
- expect(subject.sort).to eq [variant, same_option_values_variant].sort
40
- end
41
-
42
- it "does not return variants for another product" do
43
- other_product_variant = create(:variant)
44
- expect(subject).not_to include other_product_variant
45
- end
46
-
47
- context "no option value restrictions are specified" do
48
- before do
49
- @original_option_type_restrictions = SameOptionValue.option_type_restrictions
50
- SameOptionValue.option_type_restrictions = []
51
- end
52
-
53
- after { SameOptionValue.option_type_restrictions = @original_option_type_restrictions }
54
-
55
- it "returns all variants for the product" do
56
- Spree::StockItem.update_all(count_on_hand: 10)
57
-
58
- expect(subject.sort).to eq [variant, same_option_values_variant, different_waist_option_value_variant, different_color_option_value_variant].sort
59
- end
60
- end
61
- end
62
- end
63
- end
64
- end
65
-
@@ -1,43 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Spree
4
- module ReturnItem::ExchangeVariantEligibility
5
- describe SameProduct, type: :model do
6
- describe ".eligible_variants" do
7
-
8
- context "product has no variants" do
9
- it "returns the master variant for the same product" do
10
- product = create(:product)
11
- product.master.stock_items.first.update_column(:count_on_hand, 10)
12
-
13
- expect(SameProduct.eligible_variants(product.master)).to eq [product.master]
14
- end
15
- end
16
-
17
- context "product has variants" do
18
- it "returns all variants for the same product" do
19
- product = create(:product, variants: 3.times.map { create(:variant) })
20
- product.variants.map { |v| v.stock_items.first.update_column(:count_on_hand, 10) }
21
-
22
- expect(SameProduct.eligible_variants(product.variants.first).sort).to eq product.variants.sort
23
- end
24
- end
25
-
26
- it "does not return variants for another product" do
27
- variant = create(:variant)
28
- other_product_variant = create(:variant)
29
- expect(SameProduct.eligible_variants(variant)).not_to include other_product_variant
30
- end
31
-
32
- it "only returns variants that are on hand" do
33
- product = create(:product, variants: 2.times.map { create(:variant) })
34
- in_stock_variant = product.variants.first
35
-
36
- in_stock_variant.stock_items.first.update_column(:count_on_hand, 10)
37
- expect(SameProduct.eligible_variants(in_stock_variant)).to eq [in_stock_variant]
38
- end
39
- end
40
-
41
- end
42
- end
43
- end
@@ -1,734 +0,0 @@
1
- require 'spec_helper'
2
-
3
- shared_examples "an invalid state transition" do |status, expected_status|
4
- let(:status) { status }
5
-
6
- it "cannot transition to #{expected_status}" do
7
- expect { subject }.to raise_error(StateMachines::InvalidTransition)
8
- end
9
- end
10
-
11
- describe Spree::ReturnItem, type: :model do
12
-
13
- all_reception_statuses = Spree::ReturnItem.state_machines[:reception_status].states.map(&:name).map(&:to_s)
14
- all_acceptance_statuses = Spree::ReturnItem.state_machines[:acceptance_status].states.map(&:name).map(&:to_s)
15
-
16
- before do
17
- allow_any_instance_of(Spree::Order).to receive_messages(return!: true)
18
- end
19
-
20
- describe '#receive!' do
21
- let(:now) { Time.current }
22
- let(:inventory_unit) { create(:inventory_unit, state: 'shipped') }
23
- let(:return_item) { create(:return_item, inventory_unit: inventory_unit) }
24
-
25
- before do
26
- inventory_unit.update_attributes!(state: 'shipped')
27
- return_item.update_attributes!(reception_status: 'awaiting')
28
- allow(return_item).to receive(:eligible_for_return?).and_return(true)
29
- end
30
-
31
- subject { return_item.receive! }
32
-
33
-
34
- it 'returns the inventory unit' do
35
- subject
36
- expect(inventory_unit.reload.state).to eq 'returned'
37
- end
38
-
39
- it 'attempts to accept the return item' do
40
- expect(return_item).to receive(:attempt_accept)
41
- subject
42
- end
43
-
44
- context 'with a stock location' do
45
- let(:stock_item) { inventory_unit.find_stock_item }
46
- let!(:customer_return) { create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: inventory_unit.shipment.stock_location_id) }
47
-
48
- before do
49
- inventory_unit.update_attributes!(state: 'shipped')
50
- return_item.update_attributes!(reception_status: 'awaiting')
51
- end
52
-
53
- it 'increases the count on hand' do
54
- expect { subject }.to change { stock_item.reload.count_on_hand }.by(1)
55
- end
56
-
57
- context "when the variant is not resellable" do
58
- before { return_item.update_attributes(resellable: false) }
59
- it { expect { subject }.not_to change { stock_item.reload.count_on_hand } }
60
- end
61
-
62
- context 'when variant does not track inventory' do
63
- before do
64
- inventory_unit.update_attributes!(state: 'shipped')
65
- inventory_unit.variant.update_attributes!(track_inventory: false)
66
- return_item.update_attributes!(reception_status: 'awaiting')
67
- end
68
-
69
- it 'does not increase the count on hand' do
70
- expect { subject }.to_not change { stock_item.reload.count_on_hand }
71
- end
72
- end
73
-
74
- context 'when the restock_inventory preference is false' do
75
- before do
76
- Spree::Config[:restock_inventory] = false
77
- end
78
-
79
- it 'does not increase the count on hand' do
80
- expect { subject }.to_not change { stock_item.reload.count_on_hand }
81
- end
82
- end
83
- end
84
- end
85
-
86
- describe "#display_pre_tax_amount" do
87
- let(:pre_tax_amount) { 21.22 }
88
- let(:return_item) { build(:return_item, pre_tax_amount: pre_tax_amount) }
89
-
90
- it "returns a Spree::Money" do
91
- expect(return_item.display_pre_tax_amount).to eq(Spree::Money.new(pre_tax_amount))
92
- end
93
- end
94
-
95
- describe ".default_refund_amount_calculator" do
96
- it "defaults to the default refund amount calculator" do
97
- expect(Spree::ReturnItem.refund_amount_calculator).to eq Spree::Calculator::Returns::DefaultRefundAmount
98
- end
99
- end
100
-
101
- describe "pre_tax_amount calculations on create" do
102
- let(:inventory_unit) { build(:inventory_unit) }
103
- before { subject.save! }
104
-
105
- context "pre tax amount is not specified" do
106
- subject { build(:return_item, inventory_unit: inventory_unit) }
107
-
108
- context "not an exchange" do
109
- it { expect(subject.pre_tax_amount).to eq Spree::Calculator::Returns::DefaultRefundAmount.new.compute(subject) }
110
- end
111
-
112
- context "an exchange" do
113
- subject { build(:exchange_return_item) }
114
-
115
- it { expect(subject.pre_tax_amount).to eq 0.0 }
116
- end
117
- end
118
-
119
- context "pre tax amount is specified" do
120
- subject { build(:return_item, inventory_unit: inventory_unit, pre_tax_amount: 100) }
121
-
122
- it { expect(subject.pre_tax_amount).to eq 100 }
123
- end
124
- end
125
-
126
- describe ".from_inventory_unit" do
127
- let(:inventory_unit) { build(:inventory_unit) }
128
-
129
- subject { Spree::ReturnItem.from_inventory_unit(inventory_unit) }
130
-
131
- context "with a cancelled return item" do
132
- let!(:return_item) { create(:return_item, inventory_unit: inventory_unit, reception_status: 'cancelled') }
133
-
134
- it { is_expected.not_to be_persisted }
135
- end
136
-
137
- context "with a non-cancelled return item" do
138
- let!(:return_item) { create(:return_item, inventory_unit: inventory_unit) }
139
-
140
- it { is_expected.to be_persisted }
141
- end
142
- end
143
-
144
- describe "reception_status state_machine" do
145
- subject(:return_item) { create(:return_item) }
146
-
147
- it "starts off in the awaiting state" do
148
- expect(return_item).to be_awaiting
149
- end
150
- end
151
-
152
- describe "acceptance_status state_machine" do
153
- subject(:return_item) { create(:return_item) }
154
-
155
- it "starts off in the pending state" do
156
- expect(return_item).to be_pending
157
- end
158
- end
159
-
160
- describe "#receive" do
161
- let(:inventory_unit) { create(:inventory_unit, order: create(:shipped_order)) }
162
- let(:return_item) { create(:return_item, reception_status: status, inventory_unit: inventory_unit) }
163
-
164
- subject { return_item.receive! }
165
-
166
- context "awaiting status" do
167
- let(:status) { 'awaiting' }
168
-
169
- before do
170
- expect(return_item.inventory_unit).to receive(:return!)
171
- end
172
-
173
- before { subject }
174
-
175
- it "transitions successfully" do
176
- expect(return_item).to be_received
177
- end
178
- end
179
-
180
- (all_reception_statuses - ['awaiting']).each do |invalid_transition_status|
181
- context "return_item has a reception status of #{invalid_transition_status}" do
182
- it_behaves_like "an invalid state transition", invalid_transition_status, 'received'
183
- end
184
- end
185
- end
186
-
187
- describe "#cancel" do
188
- let(:return_item) { create(:return_item, reception_status: status) }
189
-
190
- subject { return_item.cancel! }
191
-
192
- context "awaiting status" do
193
- let(:status) { 'awaiting' }
194
-
195
- before { subject }
196
-
197
- it "transitions successfully" do
198
- expect(return_item).to be_cancelled
199
- end
200
- end
201
-
202
- (all_reception_statuses - ['awaiting']).each do |invalid_transition_status|
203
- context "return_item has a reception status of #{invalid_transition_status}" do
204
- it_behaves_like "an invalid state transition", invalid_transition_status, 'cancelled'
205
- end
206
- end
207
- end
208
-
209
- describe "#give" do
210
- let(:return_item) { create(:return_item, reception_status: status) }
211
-
212
- subject { return_item.give! }
213
-
214
- context "awaiting status" do
215
- let(:status) { 'awaiting' }
216
-
217
- before { subject }
218
-
219
- it "transitions successfully" do
220
- expect(return_item).to be_given_to_customer
221
- end
222
- end
223
-
224
- (all_reception_statuses - ['awaiting']).each do |invalid_transition_status|
225
- context "return_item has a reception status of #{invalid_transition_status}" do
226
- it_behaves_like "an invalid state transition", invalid_transition_status, 'give_to_customer'
227
- end
228
- end
229
- end
230
-
231
- describe "#attempt_accept" do
232
- let(:return_item) { create(:return_item, acceptance_status: status) }
233
- let(:validator_errors) { {} }
234
- let(:validator_double) { double(errors: validator_errors) }
235
-
236
- subject { return_item.attempt_accept! }
237
-
238
- before do
239
- allow(return_item).to receive(:validator).and_return(validator_double)
240
- end
241
-
242
- context "pending status" do
243
- let(:status) { 'pending' }
244
-
245
- before do
246
- allow(return_item).to receive(:eligible_for_return?).and_return(true)
247
- subject
248
- end
249
-
250
- it "transitions successfully" do
251
- expect(return_item).to be_accepted
252
- end
253
-
254
- it "has no acceptance status errors" do
255
- expect(return_item.acceptance_status_errors).to be_empty
256
- end
257
- end
258
-
259
- (all_acceptance_statuses - ['accepted', 'pending']).each do |invalid_transition_status|
260
- context "return_item has an acceptance status of #{invalid_transition_status}" do
261
- it_behaves_like "an invalid state transition", invalid_transition_status, 'accepted'
262
- end
263
- end
264
-
265
- context "not eligible for return" do
266
- let(:status) { 'pending' }
267
- let(:validator_errors) { { number_of_days: "Return Item is outside the eligible time period" } }
268
-
269
- before do
270
- allow(return_item).to receive(:eligible_for_return?).and_return(false)
271
- end
272
-
273
- context "manual intervention required" do
274
- before do
275
- allow(return_item).to receive(:requires_manual_intervention?).and_return(true)
276
- subject
277
- end
278
-
279
- it "transitions to manual intervention required" do
280
- expect(return_item).to be_manual_intervention_required
281
- end
282
-
283
- it "sets the acceptance status errors" do
284
- expect(return_item.acceptance_status_errors).to eq validator_errors
285
- end
286
- end
287
-
288
- context "manual intervention not required" do
289
- before do
290
- allow(return_item).to receive(:requires_manual_intervention?).and_return(false)
291
- subject
292
- end
293
-
294
- it "transitions to rejected" do
295
- expect(return_item).to be_rejected
296
- end
297
-
298
- it "sets the acceptance status errors" do
299
- expect(return_item.acceptance_status_errors).to eq validator_errors
300
- end
301
- end
302
- end
303
- end
304
-
305
- describe "#reject" do
306
- let(:return_item) { create(:return_item, acceptance_status: status) }
307
-
308
- subject { return_item.reject! }
309
-
310
- context "pending status" do
311
- let(:status) { 'pending' }
312
-
313
- before { subject }
314
-
315
- it "transitions successfully" do
316
- expect(return_item).to be_rejected
317
- end
318
-
319
- it "has no acceptance status errors" do
320
- expect(return_item.acceptance_status_errors).to be_empty
321
- end
322
- end
323
-
324
- (all_acceptance_statuses - ['accepted', 'pending', 'manual_intervention_required']).each do |invalid_transition_status|
325
- context "return_item has an acceptance status of #{invalid_transition_status}" do
326
- it_behaves_like "an invalid state transition", invalid_transition_status, 'rejected'
327
- end
328
- end
329
- end
330
-
331
- describe "#accept" do
332
- let(:return_item) { create(:return_item, acceptance_status: status) }
333
-
334
- subject { return_item.accept! }
335
-
336
- context "pending status" do
337
- let(:status) { 'pending' }
338
-
339
- before { subject }
340
-
341
- it "transitions successfully" do
342
- expect(return_item).to be_accepted
343
- end
344
-
345
- it "has no acceptance status errors" do
346
- expect(return_item.acceptance_status_errors).to be_empty
347
- end
348
- end
349
-
350
- (all_acceptance_statuses - ['accepted', 'pending', 'manual_intervention_required']).each do |invalid_transition_status|
351
- context "return_item has an acceptance status of #{invalid_transition_status}" do
352
- it_behaves_like "an invalid state transition", invalid_transition_status, 'accepted'
353
- end
354
- end
355
- end
356
-
357
- describe "#require_manual_intervention" do
358
- let(:return_item) { create(:return_item, acceptance_status: status) }
359
-
360
- subject { return_item.require_manual_intervention! }
361
-
362
- context "pending status" do
363
- let(:status) { 'pending' }
364
-
365
- before { subject }
366
-
367
- it "transitions successfully" do
368
- expect(return_item).to be_manual_intervention_required
369
- end
370
-
371
- it "has no acceptance status errors" do
372
- expect(return_item.acceptance_status_errors).to be_empty
373
- end
374
- end
375
-
376
- (all_acceptance_statuses - ['accepted', 'pending', 'manual_intervention_required']).each do |invalid_transition_status|
377
- context "return_item has an acceptance status of #{invalid_transition_status}" do
378
- it_behaves_like "an invalid state transition", invalid_transition_status, 'manual_intervention_required'
379
- end
380
- end
381
- end
382
-
383
- describe 'validity for reimbursements' do
384
- let(:return_item) { create(:return_item, acceptance_status: acceptance_status) }
385
- let(:acceptance_status) { 'pending' }
386
-
387
- before { return_item.reimbursement = build(:reimbursement) }
388
-
389
- subject { return_item }
390
-
391
- context 'when acceptance_status is accepted' do
392
- let(:acceptance_status) { 'accepted' }
393
-
394
- it 'is valid' do
395
- expect(subject).to be_valid
396
- end
397
- end
398
-
399
- context 'when acceptance_status is accepted' do
400
- let(:acceptance_status) { 'pending' }
401
-
402
- it 'is valid' do
403
- expect(subject).to_not be_valid
404
- expect(subject.errors.messages).to eq({reimbursement: [I18n.t(:cannot_be_associated_unless_accepted, scope: 'activerecord.errors.models.spree/return_item.attributes.reimbursement')]})
405
- end
406
- end
407
- end
408
-
409
- describe "#exchange_requested?" do
410
- context "exchange variant exists" do
411
- before { allow(subject).to receive(:exchange_variant) { mock_model(Spree::Variant) } }
412
- it { expect(subject.exchange_requested?).to eq true }
413
- end
414
- context "exchange variant does not exist" do
415
- before { allow(subject).to receive(:exchange_variant) { nil } }
416
- it { expect(subject.exchange_requested?).to eq false }
417
- end
418
- end
419
-
420
- describe "#exchange_processed?" do
421
- context "exchange inventory unit exists" do
422
- before { allow(subject).to receive(:exchange_inventory_units) { [mock_model(Spree::InventoryUnit)] } }
423
- it { expect(subject.exchange_processed?).to eq true }
424
- end
425
- context "exchange inventory unit does not exist" do
426
- before { allow(subject).to receive(:exchange_inventory_units) { [] } }
427
- it { expect(subject.exchange_processed?).to eq false }
428
- end
429
- end
430
-
431
- describe "#exchange_required?" do
432
- context "exchange has been requested and not yet processed" do
433
- before do
434
- allow(subject).to receive(:exchange_requested?) { true }
435
- allow(subject).to receive(:exchange_processed?) { false }
436
- end
437
-
438
- it { expect(subject.exchange_required?).to be true }
439
- end
440
-
441
- context "exchange has not been requested" do
442
- before { allow(subject).to receive(:exchange_requested?) { false } }
443
- it { expect(subject.exchange_required?).to be false }
444
- end
445
-
446
- context "exchange has been requested and processed" do
447
- before do
448
- allow(subject).to receive(:exchange_requested?) { true }
449
- allow(subject).to receive(:exchange_processed?) { true }
450
- end
451
- it { expect(subject.exchange_required?).to be false }
452
- end
453
- end
454
-
455
- describe "#eligible_exchange_variants" do
456
- it "uses the exchange variant calculator to compute possible variants to exchange for" do
457
- return_item = build(:return_item)
458
- expect(Spree::ReturnItem.exchange_variant_engine).to receive(:eligible_variants).with(return_item.variant)
459
- return_item.eligible_exchange_variants
460
- end
461
- end
462
-
463
- describe ".exchange_variant_engine" do
464
- it "defaults to the same product calculator" do
465
- expect(Spree::ReturnItem.exchange_variant_engine).to eq Spree::ReturnItem::ExchangeVariantEligibility::SameProduct
466
- end
467
- end
468
-
469
- describe "exchange pre_tax_amount" do
470
- let(:return_item) { build(:return_item) }
471
-
472
- context "the return item is intended to be exchanged" do
473
- before do
474
- return_item.inventory_unit.variant.update_column(:track_inventory, false)
475
- return_item.exchange_variant = return_item.inventory_unit.variant
476
- end
477
-
478
- it do
479
- return_item.pre_tax_amount = 5.0
480
- return_item.save!
481
- expect(return_item.reload.pre_tax_amount).to eq 0.0
482
- end
483
- end
484
-
485
- context "the return item is not intended to be exchanged" do
486
- it do
487
- return_item.pre_tax_amount = 5.0
488
- return_item.save!
489
- expect(return_item.reload.pre_tax_amount).to eq 5.0
490
- end
491
- end
492
- end
493
-
494
- describe "#build_default_exchange_inventory_unit" do
495
- let(:return_item) { build(:return_item) }
496
- subject { return_item.build_default_exchange_inventory_unit }
497
-
498
- context "the return item is intended to be exchanged" do
499
- before { allow(return_item).to receive(:exchange_variant).and_return(mock_model(Spree::Variant)) }
500
-
501
- context "an exchange inventory unit already exists" do
502
- before do
503
- allow(return_item).to receive(:exchange_inventory_units).and_return([mock_model(Spree::InventoryUnit)])
504
- end
505
-
506
- it { expect(subject).to be_nil }
507
- end
508
-
509
- context "no exchange inventory unit exists" do
510
- it "builds a pending inventory unit with references to the return item, variant, and previous inventory unit" do
511
- expect(subject.variant).to eq return_item.exchange_variant
512
- expect(subject.pending).to eq true
513
- expect(subject).not_to be_persisted
514
- expect(subject.original_return_item).to eq return_item
515
- expect(subject.line_item).to eq return_item.inventory_unit.line_item
516
- expect(subject.order).to eq return_item.inventory_unit.order
517
- end
518
- end
519
- end
520
-
521
- context "the return item is not intended to be exchanged" do
522
- it { expect(subject).to be_nil }
523
- end
524
- end
525
-
526
- describe "#exchange_shipments" do
527
- it "returns the exchange inventory unit's shipment" do
528
- inventory_unit = build(:inventory_unit)
529
- subject.exchange_inventory_units << inventory_unit
530
- expect(subject.exchange_shipments).to include inventory_unit.shipment
531
- end
532
- end
533
-
534
- describe "#shipment" do
535
- it "returns the inventory unit's shipment" do
536
- inventory_unit = build(:inventory_unit)
537
- subject.inventory_unit = inventory_unit
538
- expect(subject.shipment).to eq inventory_unit.shipment
539
- end
540
- end
541
-
542
- describe 'inventory_unit uniqueness' do
543
- let!(:old_return_item) { create(:return_item, reception_status: old_reception_status) }
544
- let(:old_reception_status) { 'awaiting' }
545
-
546
- subject do
547
- build(:return_item, {
548
- return_authorization: old_return_item.return_authorization,
549
- inventory_unit: old_return_item.inventory_unit,
550
- })
551
- end
552
-
553
- context 'with other awaiting return items exist for the same inventory unit' do
554
- let(:old_reception_status) { 'awaiting' }
555
-
556
- it 'cancels the others' do
557
- expect {
558
- subject.save!
559
- }.to change { old_return_item.reload.reception_status }.from('awaiting').to('cancelled')
560
- end
561
-
562
- it 'does not cancel itself' do
563
- subject.save!
564
- expect(subject).to be_awaiting
565
- end
566
- end
567
-
568
- context 'with other cancelled return items exist for the same inventory unit' do
569
- let(:old_reception_status) { 'cancelled' }
570
-
571
- it 'succeeds' do
572
- expect { subject.save! }.to_not raise_error
573
- end
574
- end
575
-
576
- context 'with other received return items exist for the same inventory unit' do
577
- let(:old_reception_status) { 'received' }
578
-
579
- it 'is invalid' do
580
- expect(subject).to_not be_valid
581
- expect(subject.errors.to_a).to eq ["Inventory unit #{subject.inventory_unit_id} has already been taken by return item #{old_return_item.id}"]
582
- end
583
- end
584
-
585
- context 'with other given_to_customer return items exist for the same inventory unit' do
586
- let(:old_reception_status) { 'given_to_customer' }
587
-
588
- it 'is invalid' do
589
- expect(subject).to_not be_valid
590
- expect(subject.errors.to_a).to eq ["Inventory unit #{subject.inventory_unit_id} has already been taken by return item #{old_return_item.id}"]
591
- end
592
- end
593
- end
594
-
595
- describe "valid exchange variant" do
596
- subject { return_item }
597
-
598
- before { subject.save }
599
-
600
- context "return item doesn't have an exchange variant" do
601
- let(:return_item) { create(:return_item) }
602
-
603
- it "is valid" do
604
- expect(subject).to be_valid
605
- end
606
- end
607
-
608
- context "return item has an exchange variant" do
609
- let(:return_item) { create(:exchange_return_item) }
610
- let(:exchange_variant) { create(:on_demand_variant, product: return_item.inventory_unit.variant.product) }
611
-
612
- context "the exchange variant is eligible" do
613
- before { return_item.exchange_variant = exchange_variant }
614
-
615
- it "is valid" do
616
- expect(subject).to be_valid
617
- end
618
- end
619
-
620
- context "the exchange variant is not eligible" do
621
- context "new return item" do
622
- let(:return_item) { build(:return_item) }
623
- let(:exchange_variant) { create(:variant, product: return_item.inventory_unit.variant.product) }
624
-
625
- before { return_item.exchange_variant = exchange_variant }
626
-
627
- it "is invalid" do
628
- expect(subject).to_not be_valid
629
- end
630
-
631
- it "adds an error message about the invalid exchange variant" do
632
- subject.valid?
633
- expect(subject.errors.to_a).to eq ["Invalid exchange variant."]
634
- end
635
- end
636
-
637
- context "the exchange variant has been updated" do
638
- before do
639
- other_variant = create(:variant)
640
- return_item.exchange_variant_id = other_variant.id
641
- subject.valid?
642
- end
643
-
644
- it "is invalid" do
645
- expect(subject).to_not be_valid
646
- end
647
-
648
- it "adds an error message about the invalid exchange variant" do
649
- expect(subject.errors.to_a).to eq ["Invalid exchange variant."]
650
- end
651
- end
652
-
653
- context "the exchange variant has not been updated" do
654
- before do
655
- other_variant = create(:variant)
656
- return_item.update_column(:exchange_variant_id, other_variant.id)
657
- return_item.reload
658
- subject.valid?
659
- end
660
-
661
- it "is valid" do
662
- expect(subject).to be_valid
663
- end
664
- end
665
- end
666
- end
667
- end
668
-
669
- describe "included tax in total" do
670
- let(:inventory_unit) { create(:inventory_unit, state: 'shipped') }
671
- let(:return_item) do
672
- create(
673
- :return_item,
674
- inventory_unit: inventory_unit,
675
- included_tax_total: 10
676
- )
677
- end
678
-
679
- it 'includes included tax total' do
680
- expect(return_item.pre_tax_amount).to eq 10
681
- expect(return_item.included_tax_total).to eq 10
682
- expect(return_item.total).to eq 20
683
- end
684
- end
685
-
686
- describe '#process_inventory_unit!' do
687
- let(:inventory_unit) { create(:inventory_unit, state: 'shipped') }
688
- let(:return_item) { create(:return_item, inventory_unit: inventory_unit, reception_status: 'awaiting') }
689
- let!(:stock_item) { inventory_unit.find_stock_item }
690
- before { return_item.update_attributes!(reception_status: 'awaiting') }
691
-
692
- subject { return_item.send(:process_inventory_unit!) }
693
-
694
- it { expect { subject }.to change { inventory_unit.state }.to('returned').from('shipped') }
695
-
696
- context 'stock should restock' do
697
- let(:stock_movement_attributes) do
698
- {
699
- stock_item_id: stock_item.id,
700
- quantity: 1,
701
- originator: return_item.return_authorization
702
- }
703
- end
704
-
705
- it { expect(subject).to eq(Spree::StockMovement.find_by(stock_movement_attributes)) }
706
- end
707
-
708
- context 'stock should not restock' do
709
- context 'return_item is not resellable' do
710
- before { return_item.resellable = false }
711
- it { expect(subject).to be_nil }
712
- it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
713
- end
714
-
715
- context 'variant should not track inventory' do
716
- before { return_item.variant.track_inventory = false }
717
- it { expect(subject).to be_nil }
718
- it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
719
- end
720
-
721
- context 'stock_item not present' do
722
- before { stock_item.destroy }
723
- it { expect(subject).to be_nil }
724
- it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
725
- end
726
-
727
- context 'when restock inventory preference false' do
728
- before { Spree::Config[:restock_inventory] = false }
729
- it { expect(subject).to be_nil }
730
- it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
731
- end
732
- end
733
- end
734
- end