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,204 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Refund, :type => :model do
4
+
5
+ describe 'create' do
6
+ let(:amount) { 100.0 }
7
+ let(:amount_in_cents) { amount * 100 }
8
+
9
+ let(:authorization) { generate(:refund_transaction_id) }
10
+
11
+ let(:payment) { create(:payment, amount: payment_amount, payment_method: payment_method) }
12
+ let(:payment_amount) { amount*2 }
13
+ let(:payment_method) { create(:credit_card_payment_method, environment: payment_method_environment) }
14
+ let(:payment_method_environment) { 'test' }
15
+
16
+ let(:refund_reason) { create(:refund_reason) }
17
+
18
+ let(:gateway_response) {
19
+ ActiveMerchant::Billing::Response.new(
20
+ gateway_response_success,
21
+ gateway_response_message,
22
+ gateway_response_params,
23
+ gateway_response_options
24
+ )
25
+ }
26
+ let(:gateway_response_success) { true }
27
+ let(:gateway_response_message) { "" }
28
+ let(:gateway_response_params) { {} }
29
+ let(:gateway_response_options) { {} }
30
+
31
+ subject { create(:refund, payment: payment, amount: amount, reason: refund_reason, transaction_id: nil) }
32
+
33
+ before do
34
+ allow(payment.payment_method)
35
+ .to receive(:credit)
36
+ .with(amount_in_cents, payment.source, payment.transaction_id, {originator: an_instance_of(Spree::Refund)})
37
+ .and_return(gateway_response)
38
+ end
39
+
40
+ context "transaction id exists on creation" do
41
+ let(:transaction_id) { "12kfjas0" }
42
+ subject { create(:refund, payment: payment, amount: amount, reason: refund_reason, transaction_id: transaction_id) }
43
+
44
+ it "creates a refund record" do
45
+ expect{ subject }.to change { Spree::Refund.count }.by(1)
46
+ end
47
+
48
+ it "maintains the transaction id" do
49
+ expect(subject.reload.transaction_id).to eq transaction_id
50
+ end
51
+
52
+ it "saves the amount" do
53
+ expect(subject.reload.amount).to eq amount
54
+ end
55
+
56
+ it "creates a log entry" do
57
+ expect(subject.log_entries).to be_present
58
+ end
59
+
60
+ it "does not attempt to process a transaction" do
61
+ expect(payment.payment_method).not_to receive(:credit)
62
+ subject
63
+ end
64
+
65
+ end
66
+
67
+ context "processing is successful" do
68
+ let(:gateway_response_options) { { authorization: authorization } }
69
+
70
+ it 'should create a refund' do
71
+ expect{ subject }.to change{ Spree::Refund.count }.by(1)
72
+ end
73
+
74
+ it 'return the newly created refund' do
75
+ expect(subject).to be_a(Spree::Refund)
76
+ end
77
+
78
+ it 'should save the returned authorization value' do
79
+ expect(subject.reload.transaction_id).to eq authorization
80
+ end
81
+
82
+ it 'should save the passed amount as the refund amount' do
83
+ expect(subject.amount).to eq amount
84
+ end
85
+
86
+ it 'should create a log entry' do
87
+ expect(subject.log_entries).to be_present
88
+ end
89
+
90
+ it "attempts to process a transaction" do
91
+ expect(payment.payment_method).to receive(:credit).once
92
+ subject
93
+ end
94
+
95
+ it 'should update the payment total' do
96
+ expect(payment.order.updater).to receive(:update)
97
+ subject
98
+ end
99
+
100
+ end
101
+
102
+ context "processing fails" do
103
+ let(:gateway_response_success) { false }
104
+ let(:gateway_response_message) { "failure message" }
105
+
106
+ it 'should raise error and not create a refund' do
107
+ expect do
108
+ expect { subject }.to raise_error(Spree::Core::GatewayError, gateway_response_message)
109
+ end.to_not change{ Spree::Refund.count }
110
+ end
111
+ end
112
+
113
+ context 'without payment profiles supported' do
114
+ before do
115
+ allow(payment.payment_method).to receive(:payment_profiles_supported?) { false }
116
+ end
117
+
118
+ it 'should not supply the payment source' do
119
+ expect(payment.payment_method)
120
+ .to receive(:credit)
121
+ .with(amount * 100, payment.transaction_id, {originator: an_instance_of(Spree::Refund)})
122
+ .and_return(gateway_response)
123
+
124
+ subject
125
+ end
126
+ end
127
+
128
+ context 'with payment profiles supported' do
129
+ before do
130
+ allow(payment.payment_method).to receive(:payment_profiles_supported?) { true }
131
+ end
132
+
133
+ it 'should supply the payment source' do
134
+ expect(payment.payment_method)
135
+ .to receive(:credit)
136
+ .with(amount_in_cents, payment.source, payment.transaction_id, {originator: an_instance_of(Spree::Refund)})
137
+ .and_return(gateway_response)
138
+
139
+ subject
140
+ end
141
+ end
142
+
143
+ context 'with an activemerchant gateway connection error' do
144
+ before do
145
+ expect(payment.payment_method)
146
+ .to receive(:credit)
147
+ .with(amount_in_cents, payment.source, payment.transaction_id, {originator: an_instance_of(Spree::Refund)})
148
+ .and_raise(ActiveMerchant::ConnectionError.new("foo", nil))
149
+ end
150
+
151
+ it 'raises Spree::Core::GatewayError' do
152
+ expect { subject }.to raise_error(Spree::Core::GatewayError, Spree.t(:unable_to_connect_to_gateway))
153
+ end
154
+ end
155
+
156
+ context 'with the incorrect payment method environment' do
157
+ let(:payment_method_environment) { 'development' }
158
+
159
+ it 'raises a Spree::Core::GatewayError' do
160
+ expect { subject }.to raise_error { |error|
161
+ expect(error).to be_a(ActiveRecord::RecordInvalid)
162
+ expect(error.record.errors.full_messages).to eq [Spree.t(:gateway_config_unavailable) + " - test"]
163
+ }
164
+ end
165
+ end
166
+
167
+ context 'with amount too large' do
168
+ let(:payment_amount) { 10 }
169
+ let(:amount) { payment_amount*2 }
170
+
171
+ it 'is invalid' do
172
+ expect { subject }.to raise_error { |error|
173
+ expect(error).to be_a(ActiveRecord::RecordInvalid)
174
+ expect(error.record.errors.full_messages).to eq ["Amount #{I18n.t('activerecord.errors.models.spree/refund.attributes.amount.greater_than_allowed')}"]
175
+ }
176
+ end
177
+ end
178
+ end
179
+
180
+ describe 'total_amount_reimbursed_for' do
181
+ let(:customer_return) { reimbursement.customer_return}
182
+ let(:reimbursement) { create(:reimbursement) }
183
+ let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
184
+
185
+ subject { Spree::Refund.total_amount_reimbursed_for(reimbursement) }
186
+
187
+ context 'with reimbursements performed' do
188
+ before { reimbursement.perform! }
189
+
190
+ it 'returns the total amount' do
191
+ amount = Spree::Refund.total_amount_reimbursed_for(reimbursement)
192
+ expect(amount).to be > 0
193
+ expect(amount).to eq reimbursement.total
194
+ end
195
+ end
196
+
197
+ context 'without reimbursements performed' do
198
+ it 'returns zero' do
199
+ amount = Spree::Refund.total_amount_reimbursed_for(reimbursement)
200
+ expect(amount).to eq 0
201
+ end
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Reimbursement::Credit, :type => :model do
5
+ context 'class methods' do
6
+ describe '.total_amount_reimbursed_for' do
7
+ subject { Spree::Reimbursement::Credit.total_amount_reimbursed_for(reimbursement) }
8
+
9
+ let(:reimbursement) { create(:reimbursement) }
10
+ let(:credit_double) { double(amount: 99.99) }
11
+
12
+ before { allow(reimbursement).to receive(:credits).and_return([credit_double, credit_double])}
13
+
14
+ it 'should sum the amounts of all of the reimbursements credits' do
15
+ expect(subject).to eq BigDecimal.new('199.98')
16
+ end
17
+ end
18
+ end
19
+
20
+ describe '#description' do
21
+ let(:credit) { Spree::Reimbursement::Credit.new(amount: 100, creditable: mock_model(Spree::PaymentMethod::Check)) }
22
+
23
+ it "should be the creditable's class name" do
24
+ expect(credit.description).to eq 'Check'
25
+ end
26
+ end
27
+
28
+ describe '#display_amount' do
29
+ let(:credit) { Spree::Reimbursement::Credit.new(amount: 100) }
30
+
31
+ it 'should be a money object' do
32
+ expect(credit.display_amount).to eq Spree::Money.new(100, currency: "USD")
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,140 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Reimbursement::ReimbursementTypeEngine, :type => :model do
5
+ describe '#calculate_reimbursement_types' do
6
+ let(:return_item) { create(:return_item) }
7
+ let(:return_items) { [ return_item ] }
8
+ let(:reimbursement_type_engine) { Spree::Reimbursement::ReimbursementTypeEngine.new(return_items) }
9
+ let(:expired_reimbursement_type) { Spree::ReimbursementType::OriginalPayment }
10
+ let(:override_reimbursement_type) { Spree::ReimbursementType::OriginalPayment.new }
11
+ let(:preferred_reimbursement_type) { Spree::ReimbursementType::OriginalPayment.new }
12
+ let(:calculated_reimbursement_types) { subject }
13
+ let(:all_reimbursement_types) {[
14
+ reimbursement_type_engine.default_reimbursement_type,
15
+ reimbursement_type_engine.exchange_reimbursement_type,
16
+ expired_reimbursement_type,
17
+ override_reimbursement_type,
18
+ preferred_reimbursement_type
19
+ ]}
20
+
21
+ subject { reimbursement_type_engine.calculate_reimbursement_types }
22
+
23
+ shared_examples_for "reimbursement type hash" do
24
+ it "contain all keys that respond to reimburse" do
25
+ calculated_reimbursement_types.keys.each do |r_type|
26
+ expect(r_type).to respond_to :reimburse
27
+ end
28
+ end
29
+ end
30
+
31
+ before do
32
+ reimbursement_type_engine.expired_reimbursement_type = expired_reimbursement_type
33
+ allow(return_item.inventory_unit.shipment).to receive(:shipped_at).and_return(Date.yesterday)
34
+ allow(return_item).to receive(:exchange_required?).and_return(false)
35
+ end
36
+
37
+ context 'the return item requires exchange' do
38
+ before { allow(return_item).to receive(:exchange_required?).and_return(true) }
39
+
40
+ it 'returns a hash with the exchange reimbursement type associated to the return items' do
41
+ expect(calculated_reimbursement_types[reimbursement_type_engine.exchange_reimbursement_type]).to eq(return_items)
42
+ end
43
+
44
+ it 'the return items are not included in any of the other reimbursement types' do
45
+ (all_reimbursement_types - [reimbursement_type_engine.exchange_reimbursement_type]).each do |r_type|
46
+ expect(calculated_reimbursement_types[r_type]).to eq([])
47
+ end
48
+ end
49
+
50
+ it_should_behave_like 'reimbursement type hash'
51
+ end
52
+
53
+ context 'the return item does not require exchange' do
54
+ context 'the return item has an override reimbursement type' do
55
+ before { allow(return_item).to receive(:override_reimbursement_type).and_return(override_reimbursement_type) }
56
+
57
+ it 'returns a hash with the override reimbursement type associated to the return items' do
58
+ expect(calculated_reimbursement_types[override_reimbursement_type.class]).to eq(return_items)
59
+ end
60
+
61
+ it 'the return items are not included in any of the other reimbursement types' do
62
+ (all_reimbursement_types - [override_reimbursement_type.class]).each do |r_type|
63
+ expect(calculated_reimbursement_types[r_type]).to eq([])
64
+ end
65
+ end
66
+
67
+ it_should_behave_like 'reimbursement type hash'
68
+ end
69
+
70
+ context 'the return item does not have an override reimbursement type' do
71
+ context 'the return item has a preferred reimbursement type' do
72
+ before { allow(return_item).to receive(:preferred_reimbursement_type).and_return(preferred_reimbursement_type) }
73
+
74
+ context 'the reimbursement type is not valid for the return item' do
75
+ before { expect(reimbursement_type_engine).to receive(:valid_preferred_reimbursement_type?).and_return(false) }
76
+
77
+ it 'returns a hash with no return items associated to the preferred reimbursement type' do
78
+ expect(calculated_reimbursement_types[preferred_reimbursement_type]).to eq([])
79
+ end
80
+
81
+ it 'the return items are not included in any of the other reimbursement types' do
82
+ (all_reimbursement_types - [preferred_reimbursement_type]).each do |r_type|
83
+ expect(calculated_reimbursement_types[r_type]).to eq([])
84
+ end
85
+ end
86
+
87
+ it_should_behave_like 'reimbursement type hash'
88
+ end
89
+
90
+ context 'the reimbursement type is valid for the return item' do
91
+ it 'returns a hash with the expired reimbursement type associated to the return items' do
92
+ expect(calculated_reimbursement_types[preferred_reimbursement_type.class]).to eq(return_items)
93
+ end
94
+
95
+ it 'the return items are not included in any of the other reimbursement types' do
96
+ (all_reimbursement_types - [preferred_reimbursement_type.class]).each do |r_type|
97
+ expect(calculated_reimbursement_types[r_type]).to eq([])
98
+ end
99
+ end
100
+
101
+ it_should_behave_like 'reimbursement type hash'
102
+ end
103
+ end
104
+
105
+ context 'the return item does not have a preferred reimbursement type' do
106
+ context 'the return item is past the time constraint' do
107
+ before { allow(reimbursement_type_engine).to receive(:past_reimbursable_time_period?).and_return(true) }
108
+
109
+ it 'returns a hash with the expired reimbursement type associated to the return items' do
110
+ expect(calculated_reimbursement_types[expired_reimbursement_type]).to eq(return_items)
111
+ end
112
+
113
+ it 'the return items are not included in any of the other reimbursement types' do
114
+ (all_reimbursement_types - [expired_reimbursement_type]).each do |r_type|
115
+ expect(calculated_reimbursement_types[r_type]).to eq([])
116
+ end
117
+ end
118
+
119
+ it_should_behave_like 'reimbursement type hash'
120
+ end
121
+
122
+ context 'the return item is within the time constraint' do
123
+ it 'returns a hash with the default reimbursement type associated to the return items' do
124
+ expect(calculated_reimbursement_types[reimbursement_type_engine.default_reimbursement_type]).to eq(return_items)
125
+ end
126
+
127
+ it 'the return items are not included in any of the other reimbursement types' do
128
+ (all_reimbursement_types - [reimbursement_type_engine.default_reimbursement_type]).each do |r_type|
129
+ expect(calculated_reimbursement_types[r_type]).to eq([])
130
+ end
131
+ end
132
+
133
+ it_should_behave_like 'reimbursement type hash'
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Reimbursement::ReimbursementTypeValidator, :type => :model do
5
+ class DummyClass
6
+ include Spree::Reimbursement::ReimbursementTypeValidator
7
+
8
+ class_attribute :expired_reimbursement_type
9
+ self.expired_reimbursement_type = Spree::ReimbursementType::Credit
10
+
11
+ class_attribute :refund_time_constraint
12
+ self.refund_time_constraint = 90.days
13
+ end
14
+
15
+ let(:return_item) do
16
+ create(
17
+ :return_item,
18
+ preferred_reimbursement_type: preferred_reimbursement_type
19
+ )
20
+ end
21
+ let(:dummy) { DummyClass.new }
22
+ let(:preferred_reimbursement_type) { Spree::ReimbursementType::Credit.new }
23
+
24
+ describe '#valid_preferred_reimbursement_type?' do
25
+ before do
26
+ allow(dummy).to receive(:past_reimbursable_time_period?).and_return(true)
27
+ end
28
+
29
+ subject { dummy.valid_preferred_reimbursement_type?(return_item) }
30
+
31
+ context 'is valid' do
32
+ it 'if it is not past the reimbursable time period' do
33
+ allow(dummy).to receive(:past_reimbursable_time_period?).and_return(false)
34
+ expect(subject).to be true
35
+ end
36
+
37
+ it 'if the return items preferred method of reimbursement is the expired method of reimbursement' do
38
+ expect(subject).to be true
39
+ end
40
+ end
41
+
42
+ context 'is invalid' do
43
+ it 'if the return item is past the eligible time period and the preferred method of reimbursement is not the expired method of reimbursement' do
44
+ return_item.preferred_reimbursement_type =
45
+ Spree::ReimbursementType::OriginalPayment.new
46
+ expect(subject).to be false
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#past_reimbursable_time_period?' do
52
+ subject { dummy.past_reimbursable_time_period?(return_item) }
53
+
54
+ before do
55
+ allow(return_item).to receive_message_chain(:inventory_unit, :shipment, :shipped_at).and_return(shipped_at)
56
+ end
57
+
58
+ context 'it has not shipped' do
59
+ let(:shipped_at) { nil }
60
+
61
+ it 'is not past the reimbursable time period' do
62
+ expect(subject).to be_falsey
63
+ end
64
+ end
65
+
66
+ context 'it has shipped and it is more recent than the time constraint' do
67
+ let(:shipped_at) { (dummy.refund_time_constraint - 1.day).ago }
68
+
69
+ it 'is not past the reimbursable time period' do
70
+ expect(subject).to be false
71
+ end
72
+ end
73
+
74
+ context 'it has shipped and it is further in the past than the time constraint' do
75
+ let(:shipped_at) { (dummy.refund_time_constraint + 1.day).ago }
76
+
77
+ it 'is past the reimbursable time period' do
78
+ expect(subject).to be true
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end