solidus_core 1.0.2 → 1.0.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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +16 -0
  5. data/script/rails +9 -0
  6. data/solidus_core.gemspec +48 -0
  7. data/spec/fixtures/thinking-cat.jpg +0 -0
  8. data/spec/helpers/base_helper_spec.rb +173 -0
  9. data/spec/helpers/order_helper_spec.rb +12 -0
  10. data/spec/helpers/products_helper_spec.rb +220 -0
  11. data/spec/helpers/taxons_helper_spec.rb +17 -0
  12. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  13. data/spec/lib/i18n_spec.rb +123 -0
  14. data/spec/lib/search/base_spec.rb +86 -0
  15. data/spec/lib/search/variant_spec.rb +92 -0
  16. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  17. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -0
  18. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  19. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  20. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  21. data/spec/lib/spree/core/current_store_spec.rb +36 -0
  22. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +138 -0
  25. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  26. data/spec/lib/spree/localized_number_spec.rb +38 -0
  27. data/spec/lib/spree/migrations_spec.rb +36 -0
  28. data/spec/lib/spree/money_spec.rb +127 -0
  29. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  30. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  31. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  32. data/spec/mailers/carton_mailer_spec.rb +43 -0
  33. data/spec/mailers/order_mailer_spec.rb +122 -0
  34. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  35. data/spec/mailers/test_mailer_spec.rb +15 -0
  36. data/spec/models/spree/ability_spec.rb +276 -0
  37. data/spec/models/spree/address_spec.rb +250 -0
  38. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  39. data/spec/models/spree/adjustment_spec.rb +177 -0
  40. data/spec/models/spree/app_configuration_spec.rb +20 -0
  41. data/spec/models/spree/asset_spec.rb +24 -0
  42. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  43. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  44. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  45. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  46. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  47. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  48. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  49. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  50. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  51. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  52. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  53. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  54. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  55. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  56. data/spec/models/spree/calculator_spec.rb +36 -0
  57. data/spec/models/spree/carton_spec.rb +133 -0
  58. data/spec/models/spree/classification_spec.rb +15 -0
  59. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  60. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  61. data/spec/models/spree/credit_card_spec.rb +334 -0
  62. data/spec/models/spree/customer_return_spec.rb +276 -0
  63. data/spec/models/spree/exchange_spec.rb +79 -0
  64. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  65. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  66. data/spec/models/spree/gateway_spec.rb +82 -0
  67. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  68. data/spec/models/spree/item_adjustments_spec.rb +256 -0
  69. data/spec/models/spree/line_item_spec.rb +191 -0
  70. data/spec/models/spree/option_type_spec.rb +14 -0
  71. data/spec/models/spree/option_value_spec.rb +22 -0
  72. data/spec/models/spree/order/address_spec.rb +50 -0
  73. data/spec/models/spree/order/adjustments_spec.rb +39 -0
  74. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  75. data/spec/models/spree/order/checkout_spec.rb +902 -0
  76. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  77. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  78. data/spec/models/spree/order/payment_spec.rb +210 -0
  79. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  80. data/spec/models/spree/order/state_machine_spec.rb +221 -0
  81. data/spec/models/spree/order/tax_spec.rb +84 -0
  82. data/spec/models/spree/order/totals_spec.rb +24 -0
  83. data/spec/models/spree/order/updating_spec.rb +18 -0
  84. data/spec/models/spree/order/validations_spec.rb +15 -0
  85. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  86. data/spec/models/spree/order_capturing_spec.rb +116 -0
  87. data/spec/models/spree/order_contents_spec.rb +265 -0
  88. data/spec/models/spree/order_inventory_spec.rb +228 -0
  89. data/spec/models/spree/order_mutex_spec.rb +85 -0
  90. data/spec/models/spree/order_promotion_spec.rb +31 -0
  91. data/spec/models/spree/order_shipping_spec.rb +247 -0
  92. data/spec/models/spree/order_spec.rb +1412 -0
  93. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  94. data/spec/models/spree/order_updater_spec.rb +299 -0
  95. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  96. data/spec/models/spree/payment_method_spec.rb +96 -0
  97. data/spec/models/spree/payment_spec.rb +1044 -0
  98. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  99. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  100. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  101. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  102. data/spec/models/spree/permission_sets/order_display_spec.rb +49 -0
  103. data/spec/models/spree/permission_sets/order_management_spec.rb +36 -0
  104. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  105. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  106. data/spec/models/spree/permission_sets/promotion_display_spec.rb +34 -0
  107. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  108. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  109. data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +132 -0
  110. data/spec/models/spree/permission_sets/stock_display_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/stock_management_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/user_display_spec.rb +36 -0
  113. data/spec/models/spree/permission_sets/user_management_spec.rb +28 -0
  114. data/spec/models/spree/preference_spec.rb +80 -0
  115. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  116. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  117. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  118. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  119. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  120. data/spec/models/spree/preferences/store_spec.rb +39 -0
  121. data/spec/models/spree/price_spec.rb +42 -0
  122. data/spec/models/spree/product/scopes_spec.rb +148 -0
  123. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  124. data/spec/models/spree/product_filter_spec.rb +26 -0
  125. data/spec/models/spree/product_property_spec.rb +20 -0
  126. data/spec/models/spree/product_spec.rb +437 -0
  127. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  128. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  129. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  130. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  131. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  132. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  133. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  134. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  135. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  136. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  137. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  138. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  139. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  140. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  141. data/spec/models/spree/promotion_category_spec.rb +17 -0
  142. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  143. data/spec/models/spree/promotion_code_spec.rb +187 -0
  144. data/spec/models/spree/promotion_handler/cart_spec.rb +114 -0
  145. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  146. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  147. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  148. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  149. data/spec/models/spree/promotion_spec.rb +767 -0
  150. data/spec/models/spree/refund_spec.rb +204 -0
  151. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  152. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  153. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  154. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  155. data/spec/models/spree/reimbursement_spec.rb +231 -0
  156. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  157. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  158. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  159. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  160. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  161. data/spec/models/spree/return_authorization_spec.rb +290 -0
  162. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  163. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  164. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  165. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  166. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  167. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  168. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  169. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  170. data/spec/models/spree/return_item_spec.rb +775 -0
  171. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  172. data/spec/models/spree/shipment_spec.rb +709 -0
  173. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  174. data/spec/models/spree/shipping_method_spec.rb +88 -0
  175. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  176. data/spec/models/spree/state_spec.rb +14 -0
  177. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  178. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  179. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  180. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  181. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  182. data/spec/models/spree/stock/package_spec.rb +163 -0
  183. data/spec/models/spree/stock/packer_spec.rb +91 -0
  184. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  185. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  186. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  187. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  188. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  189. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  190. data/spec/models/spree/stock_item_spec.rb +426 -0
  191. data/spec/models/spree/stock_location_spec.rb +279 -0
  192. data/spec/models/spree/stock_movement_spec.rb +56 -0
  193. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  194. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  195. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  196. data/spec/models/spree/store_credit_spec.rb +876 -0
  197. data/spec/models/spree/store_spec.rb +55 -0
  198. data/spec/models/spree/tax_category_spec.rb +27 -0
  199. data/spec/models/spree/tax_rate_spec.rb +378 -0
  200. data/spec/models/spree/taxon_spec.rb +74 -0
  201. data/spec/models/spree/taxonomy_spec.rb +18 -0
  202. data/spec/models/spree/tracker_spec.rb +21 -0
  203. data/spec/models/spree/transfer_item_spec.rb +264 -0
  204. data/spec/models/spree/unit_cancel_spec.rb +148 -0
  205. data/spec/models/spree/user_spec.rb +223 -0
  206. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  207. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  208. data/spec/models/spree/variant_spec.rb +546 -0
  209. data/spec/models/spree/zone_spec.rb +305 -0
  210. data/spec/spec_helper.rb +78 -0
  211. data/spec/support/big_decimal.rb +5 -0
  212. data/spec/support/concerns/default_price.rb +34 -0
  213. data/spec/support/dummy_ability.rb +4 -0
  214. data/spec/support/test_gateway.rb +2 -0
  215. metadata +229 -3
  216. data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +0 -8
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe ReimbursementType::StoreCredit do
5
+ let(:reimbursement) { create(:reimbursement, return_items_count: 2) }
6
+ let(:return_item) { reimbursement.return_items.first }
7
+ let(:return_item2) { reimbursement.return_items.last }
8
+ let(:payment) { reimbursement.order.payments.first }
9
+ let(:simulate) { false }
10
+ let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
11
+
12
+ let!(:primary_credit_type) { create(:primary_credit_type) }
13
+ let!(:created_by_user) { create(:user, email: Spree::StoreCredit::DEFAULT_CREATED_BY_EMAIL) }
14
+ let!(:default_reimbursement_category) { create(:store_credit_category) }
15
+
16
+ subject { Spree::ReimbursementType::StoreCredit.reimburse(reimbursement, [return_item, return_item2], simulate)}
17
+
18
+ before do
19
+ reimbursement.update!(total: reimbursement.calculated_total)
20
+ end
21
+
22
+ describe '.reimburse' do
23
+ context 'simulate is true' do
24
+ let(:simulate) { true }
25
+
26
+ context 'for store credits that the customer used' do
27
+ before do
28
+ expect(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([payment])
29
+ end
30
+
31
+ it 'creates readonly refunds for all store credit payments' do
32
+ expect(subject.map(&:class)).to eq [Spree::Refund]
33
+ expect(subject.map(&:readonly?)).to eq [true]
34
+ end
35
+
36
+ it 'does not save to the database' do
37
+ expect { subject }.to_not change { payment.refunds.count }
38
+ end
39
+ end
40
+
41
+ context 'for return items that were not paid for with store credit' do
42
+ before do
43
+ expect(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([])
44
+ end
45
+
46
+ context 'creates one readonly lump credit for all outstanding balance payable to the customer' do
47
+ it 'creates a credit that is read only' do
48
+ expect(subject.map(&:class)).to eq [Spree::Reimbursement::Credit]
49
+ expect(subject.map(&:readonly?)).to eq [true]
50
+ end
51
+
52
+ it 'creates a credit which amounts to the sum of the return items rounded down' do
53
+ expect(return_item).to receive(:total).and_return(10.0076)
54
+ expect(return_item2).to receive(:total).and_return(10.0023)
55
+ expect(subject.sum(&:amount)).to eq 20.0
56
+ end
57
+ end
58
+
59
+ it 'does not save to the database' do
60
+ expect { subject }.to_not change { Spree::Reimbursement::Credit.count }
61
+ end
62
+ end
63
+ end
64
+
65
+ context 'simulate is false' do
66
+ let(:simulate) { false }
67
+
68
+ context 'for store credits that the customer used' do
69
+ before do
70
+ expect(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([payment])
71
+ end
72
+
73
+ it 'performs refunds for all store credit payments' do
74
+ expect { subject }.to change { payment.refunds.count }.by(1)
75
+ expect(payment.refunds.sum(:amount)).to eq reimbursement.return_items.to_a.sum(&:total)
76
+ end
77
+ end
78
+
79
+ context 'for return items that were not paid for with store credit' do
80
+ before do
81
+ expect(Spree::ReimbursementType::StoreCredit).to receive(:store_credit_payments).and_return([])
82
+ end
83
+
84
+ it 'creates one lump credit for all outstanding balance payable to the customer' do
85
+ expect { subject }.to change { Spree::Reimbursement::Credit.count }.by(1)
86
+ expect(subject.sum(&:amount)).to eq reimbursement.return_items.to_a.sum(&:total)
87
+ end
88
+
89
+ it "creates a store credit with the same currency as the reimbursement's order" do
90
+ expect { subject }.to change { Spree::StoreCredit.count }.by(1)
91
+ expect(Spree::StoreCredit.last.currency).to eq reimbursement.order.currency
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,290 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ReturnAuthorization, :type => :model do
4
+ let(:order) { create(:shipped_order) }
5
+ let(:stock_location) { create(:stock_location) }
6
+ let(:rma_reason) { create(:return_reason) }
7
+ let(:inventory_unit_1) { order.inventory_units.first }
8
+
9
+ let(:variant) { order.variants.first }
10
+ let(:return_authorization) do
11
+ Spree::ReturnAuthorization.new(order: order,
12
+ stock_location_id: stock_location.id,
13
+ return_reason_id: rma_reason.id)
14
+ end
15
+
16
+ context "save" do
17
+ let(:order) { Spree::Order.create }
18
+
19
+ it "should be invalid when order has no inventory units" do
20
+ order.inventory_units.each(&:delete)
21
+ return_authorization.save
22
+ expect(return_authorization.errors[:order]).to eq(["has no shipped units"])
23
+ end
24
+
25
+ context "an inventory unit is already being exchanged" do
26
+ let(:order) { create(:shipped_order, line_items_count: 2) }
27
+ let!(:previous_exchange_return_item) { create(:exchange_return_item, inventory_unit: order.inventory_units.last) }
28
+ let(:return_item) { create(:return_item, inventory_unit: order.inventory_units.last) }
29
+ let(:return_authorization) { build(:return_authorization, order: order, return_items: [return_item]) }
30
+
31
+ it "should be invalid" do
32
+ return_authorization.save
33
+ expect(return_authorization.errors['base']).to include('Return items cannot be created for inventory units that are already awaiting exchange.')
34
+ end
35
+ end
36
+
37
+ context "an inventory unit is not being exchanged" do
38
+ let(:order) { create(:shipped_order, line_items_count: 2) }
39
+ let(:return_item) { create(:return_item, inventory_unit: order.inventory_units.last) }
40
+ let(:return_authorization) { build(:return_authorization, order: order, return_items: [return_item]) }
41
+
42
+ it "is valid" do
43
+ return_authorization.save
44
+ expect(return_authorization.errors['base'].size).to eq 0
45
+ end
46
+ end
47
+
48
+ context "expedited exchanges are configured" do
49
+ let(:order) { create(:shipped_order, line_items_count: 2) }
50
+ let(:exchange_return_item) { build(:exchange_return_item, inventory_unit: order.inventory_units.first) }
51
+ let(:return_item) { build(:return_item, inventory_unit: order.inventory_units.last) }
52
+ subject { create(:return_authorization, order: order, return_items: [exchange_return_item, return_item]) }
53
+
54
+ before do
55
+ @expediteted_exchanges_config = Spree::Config[:expedited_exchanges]
56
+ Spree::Config[:expedited_exchanges] = true
57
+ @pre_exchange_hooks = subject.class.pre_expedited_exchange_hooks
58
+ end
59
+
60
+ after do
61
+ Spree::Config[:expedited_exchanges] = @expediteted_exchanges_config
62
+ subject.class.pre_expedited_exchange_hooks = @pre_exchange_hooks
63
+ end
64
+
65
+ context "no items to exchange" do
66
+ subject { create(:return_authorization, order: order) }
67
+
68
+ it "does not create a reimbursement" do
69
+ expect{subject.save}.to_not change { Spree::Reimbursement.count }
70
+ end
71
+ end
72
+
73
+ context "items to exchange" do
74
+ it "calls pre_expedited_exchange hooks with the return items to exchange" do
75
+ hook = double(:as_null_object)
76
+ expect(hook).to receive(:call).with [exchange_return_item]
77
+ subject.class.pre_expedited_exchange_hooks = [hook]
78
+ subject.save
79
+ end
80
+
81
+ it "attempts to accept all return items requiring exchange" do
82
+ expect(exchange_return_item).to receive :attempt_accept
83
+ expect(return_item).not_to receive :attempt_accept
84
+ subject.save
85
+ end
86
+
87
+ it "performs an exchange reimbursement for the exchange return items" do
88
+ subject.save
89
+ reimbursement = Spree::Reimbursement.last
90
+ expect(reimbursement.order).to eq subject.order
91
+ expect(reimbursement.return_items).to eq [exchange_return_item]
92
+ expect(exchange_return_item.reload.exchange_shipment).to be_present
93
+ end
94
+
95
+ context "the reimbursement fails" do
96
+ before do
97
+ allow_any_instance_of(Spree::Reimbursement).to receive(:save) { false }
98
+ allow_any_instance_of(Spree::Reimbursement).to receive(:errors) { double(full_messages: "foo") }
99
+ end
100
+
101
+ it "puts errors on the return authorization" do
102
+ subject.save
103
+ expect(subject.errors[:base]).to include "foo"
104
+ end
105
+ end
106
+ end
107
+
108
+ end
109
+ end
110
+
111
+ describe ".before_create" do
112
+ describe "#generate_number" do
113
+ context "number is assigned" do
114
+ let(:return_authorization) { Spree::ReturnAuthorization.new(number: '123') }
115
+
116
+ it "should return the assigned number" do
117
+ return_authorization.save
118
+ expect(return_authorization.number).to eq('123')
119
+ end
120
+ end
121
+
122
+ context "number is not assigned" do
123
+ let(:return_authorization) { Spree::ReturnAuthorization.new(number: nil) }
124
+
125
+ before { allow(return_authorization).to receive_messages valid?: true }
126
+
127
+ it "should assign number with random RA number" do
128
+ return_authorization.save
129
+ expect(return_authorization.number).to match(/RA\d{9}/)
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ context "#currency" do
136
+ before { allow(order).to receive(:currency) { "ABC" } }
137
+ it "returns the order currency" do
138
+ expect(return_authorization.currency).to eq("ABC")
139
+ end
140
+ end
141
+
142
+ describe "#pre_tax_total" do
143
+ let(:pre_tax_amount_1) { 15.0 }
144
+ let!(:return_item_1) { create(:return_item, return_authorization: return_authorization, pre_tax_amount: pre_tax_amount_1) }
145
+
146
+ let(:pre_tax_amount_2) { 50.0 }
147
+ let!(:return_item_2) { create(:return_item, return_authorization: return_authorization, pre_tax_amount: pre_tax_amount_2) }
148
+
149
+ let(:pre_tax_amount_3) { 5.0 }
150
+ let!(:return_item_3) { create(:return_item, return_authorization: return_authorization, pre_tax_amount: pre_tax_amount_3) }
151
+
152
+ subject { return_authorization.pre_tax_total }
153
+
154
+ it "sums it's associated return_item's pre-tax amounts" do
155
+ expect(subject).to eq (pre_tax_amount_1 + pre_tax_amount_2 + pre_tax_amount_3)
156
+ end
157
+ end
158
+
159
+ describe "#display_pre_tax_total" do
160
+ it "returns a Spree::Money" do
161
+ allow(return_authorization).to receive_messages(pre_tax_total: 21.22)
162
+ expect(return_authorization.display_pre_tax_total).to eq(Spree::Money.new(21.22))
163
+ end
164
+ end
165
+
166
+ context "can_receive?" do
167
+ before do
168
+ pending "TODO: get this method into our fork"
169
+ end
170
+
171
+ it "should allow_receive when inventory units assigned" do
172
+ allow(return_authorization).to receive_messages(:inventory_units => [1,2,3])
173
+ expect(return_authorization.can_receive?).to be true
174
+ end
175
+
176
+ it "should not allow_receive with no inventory units" do
177
+ allow(return_authorization).to receive_messages(:inventory_units => [])
178
+ expect(return_authorization.can_receive?).to be false
179
+ end
180
+ end
181
+
182
+ describe "#refundable_amount" do
183
+ let(:weighted_line_item_pre_tax_amount) { 5.0 }
184
+ let(:line_item_count) { return_authorization.order.line_items.count }
185
+
186
+ subject { return_authorization.refundable_amount }
187
+
188
+ before do
189
+ return_authorization.order.line_items.update_all(pre_tax_amount: weighted_line_item_pre_tax_amount)
190
+ return_authorization.order.update_attribute(:promo_total, promo_total)
191
+ end
192
+
193
+ context "no promotions" do
194
+ let(:promo_total) { 0.0 }
195
+ it "returns the pre-tax line item total" do
196
+ expect(subject).to eq (weighted_line_item_pre_tax_amount * line_item_count)
197
+ end
198
+ end
199
+
200
+ context "promotions" do
201
+ let(:promo_total) { -10.0 }
202
+ it "returns the pre-tax line item total minus the order level promotion value" do
203
+ expect(subject).to eq (weighted_line_item_pre_tax_amount * line_item_count) + promo_total
204
+ end
205
+ end
206
+ end
207
+
208
+ describe "#customer_returned_items?" do
209
+ before do
210
+ allow_any_instance_of(Spree::Order).to receive_messages(return!: true)
211
+ end
212
+
213
+ subject { return_authorization.customer_returned_items? }
214
+
215
+ context "has associated customer returns" do
216
+ let(:customer_return) { create(:customer_return) }
217
+ let(:return_authorization) { customer_return.return_authorizations.first }
218
+
219
+ it "returns true" do
220
+ expect(subject).to eq true
221
+ end
222
+ end
223
+
224
+ context "does not have associated customer returns" do
225
+ let(:return_authorization) { create(:return_authorization) }
226
+
227
+ it "returns false" do
228
+ expect(subject).to eq false
229
+ end
230
+ end
231
+ end
232
+
233
+ describe 'cancel_return_items' do
234
+ let(:return_authorization) { create(:return_authorization, return_items: return_items) }
235
+ let(:return_items) { [return_item] }
236
+ let(:return_item) { create(:return_item) }
237
+
238
+ subject {
239
+ return_authorization.cancel!
240
+ }
241
+
242
+ it 'cancels the associated return items' do
243
+ subject
244
+ expect(return_item.reception_status).to eq 'cancelled'
245
+ end
246
+
247
+ context 'some return items cannot be cancelled' do
248
+ let(:return_items) { [return_item, return_item_2] }
249
+ let(:return_item_2) { create(:return_item, reception_status: 'received') }
250
+
251
+ it 'cancels those that can be cancelled' do
252
+ subject
253
+ expect(return_item.reception_status).to eq 'cancelled'
254
+ expect(return_item_2.reception_status).to eq 'received'
255
+ end
256
+ end
257
+ end
258
+
259
+ describe '#can_cancel?' do
260
+ subject { create(:return_authorization, return_items: return_items).can_cancel? }
261
+ let(:return_items) { [return_item_1, return_item_2] }
262
+ let(:return_item_1) { create(:return_item) }
263
+ let(:return_item_2) { create(:return_item) }
264
+
265
+ context 'all items can be cancelled' do
266
+ it 'returns true' do
267
+ expect(subject).to eq true
268
+ end
269
+ end
270
+
271
+ context 'at least one return item can be cancelled' do
272
+ let(:return_item_2) { create(:return_item, reception_status: 'received') }
273
+
274
+ it { is_expected.to eq true }
275
+ end
276
+
277
+ context 'no items can be cancelled' do
278
+ let(:return_item_1) { create(:return_item, reception_status: 'received') }
279
+ let(:return_item_2) { create(:return_item, reception_status: 'received') }
280
+
281
+ it { is_expected.to eq false }
282
+ end
283
+
284
+ context 'when return_authorization has no return_items' do
285
+ let(:return_items) { [] }
286
+
287
+ it { is_expected.to eq true }
288
+ end
289
+ end
290
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ReturnItem::EligibilityValidator::Default, :type => :model do
4
+ let(:return_item) { create(:return_item) }
5
+ let(:validator) { Spree::ReturnItem::EligibilityValidator::Default.new(return_item) }
6
+
7
+ let(:time_eligibility_class) { double("TimeEligibilityValidatorClass") }
8
+ let(:rma_eligibility_class) { double("RMAEligibilityValidatorClass") }
9
+
10
+ let(:time_eligibility_instance) { double(errors: time_error) }
11
+ let(:rma_eligibility_instance) { double(errors: rma_error) }
12
+
13
+ let(:time_error) {{}}
14
+ let(:rma_error) {{}}
15
+
16
+ before do
17
+ validator.permitted_eligibility_validators = [ time_eligibility_class, rma_eligibility_class ]
18
+
19
+ expect(time_eligibility_class).to receive(:new).and_return(time_eligibility_instance)
20
+ expect(rma_eligibility_class).to receive(:new).and_return(rma_eligibility_instance)
21
+ end
22
+
23
+ describe "#eligible_for_return?" do
24
+ subject { validator.eligible_for_return? }
25
+
26
+ it "checks that all permitted eligibility validators are eligible for return" do
27
+ expect(time_eligibility_instance).to receive(:eligible_for_return?).and_return(true)
28
+ expect(rma_eligibility_instance).to receive(:eligible_for_return?).and_return(true)
29
+
30
+ expect(subject).to be true
31
+ end
32
+ end
33
+
34
+ describe "#requires_manual_intervention?" do
35
+ subject { validator.requires_manual_intervention? }
36
+
37
+ context "any of the permitted eligibility validators require manual intervention" do
38
+ it "returns true" do
39
+ expect(time_eligibility_instance).to receive(:requires_manual_intervention?).and_return(false)
40
+ expect(rma_eligibility_instance).to receive(:requires_manual_intervention?).and_return(true)
41
+
42
+ expect(subject).to be true
43
+ end
44
+ end
45
+
46
+ context "no permitted eligibility validators require manual intervention" do
47
+ it "returns false" do
48
+ expect(time_eligibility_instance).to receive(:requires_manual_intervention?).and_return(false)
49
+ expect(rma_eligibility_instance).to receive(:requires_manual_intervention?).and_return(false)
50
+
51
+ expect(subject).to be false
52
+ end
53
+ end
54
+ end
55
+
56
+ describe "#errors" do
57
+ subject { validator.errors }
58
+
59
+ context "the validator errors are empty" do
60
+ it "returns an empty hash" do
61
+ expect(subject).to eq({})
62
+ end
63
+ end
64
+
65
+ context "the validators have errors" do
66
+ let(:time_error) { { time: time_error_text }}
67
+ let(:rma_error) { { rma: rma_error_text }}
68
+
69
+ let(:time_error_text) { "Time eligibility error" }
70
+ let(:rma_error_text) { "RMA eligibility error" }
71
+
72
+ it "gathers all errors from permitted eligibility validators into a single errors hash" do
73
+ expect(subject).to eq({time: time_error_text, rma: rma_error_text})
74
+ end
75
+ end
76
+ end
77
+ end