spree_core 3.0.5 → 3.0.6

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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/javascripts/spree.js.coffee.erb +1 -1
  6. data/app/models/spree/ability.rb +1 -1
  7. data/app/models/spree/base.rb +3 -1
  8. data/app/models/spree/order_updater.rb +2 -1
  9. data/app/models/spree/price.rb +7 -12
  10. data/app/models/spree/product.rb +3 -2
  11. data/app/models/spree/reimbursement.rb +1 -1
  12. data/app/models/spree/state.rb +2 -0
  13. data/app/models/spree/zone.rb +1 -1
  14. data/lib/spree/core/version.rb +1 -1
  15. data/lib/spree/testing_support/shoulda_matcher_configuration.rb +6 -0
  16. data/script/rails +9 -0
  17. data/spec/fixtures/thinking-cat.jpg +0 -0
  18. data/spec/helpers/base_helper_spec.rb +137 -0
  19. data/spec/helpers/products_helper_spec.rb +224 -0
  20. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  21. data/spec/lib/i18n_spec.rb +123 -0
  22. data/spec/lib/search/base_spec.rb +86 -0
  23. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +101 -0
  24. data/spec/lib/spree/core/controller_helpers/order_spec.rb +95 -0
  25. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  26. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  27. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  28. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  29. data/spec/lib/spree/core/importer/order_spec.rb +502 -0
  30. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  31. data/spec/lib/spree/localized_number_spec.rb +38 -0
  32. data/spec/lib/spree/migrations_spec.rb +34 -0
  33. data/spec/lib/spree/money_spec.rb +122 -0
  34. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  35. data/spec/mailers/order_mailer_spec.rb +124 -0
  36. data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
  37. data/spec/mailers/shipment_mailer_spec.rb +63 -0
  38. data/spec/mailers/test_mailer_spec.rb +24 -0
  39. data/spec/models/spree/ability_spec.rb +246 -0
  40. data/spec/models/spree/address_spec.rb +291 -0
  41. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +286 -0
  42. data/spec/models/spree/adjustment_spec.rb +163 -0
  43. data/spec/models/spree/app_configuration_spec.rb +23 -0
  44. data/spec/models/spree/asset_spec.rb +25 -0
  45. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  46. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  47. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  48. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  49. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  50. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  51. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  52. data/spec/models/spree/calculator/shipping.rb +8 -0
  53. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  54. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  55. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  56. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  57. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  58. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  59. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  60. data/spec/models/spree/calculator_spec.rb +69 -0
  61. data/spec/models/spree/classification_spec.rb +93 -0
  62. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  63. data/spec/models/spree/country_spec.rb +18 -0
  64. data/spec/models/spree/credit_card_spec.rb +324 -0
  65. data/spec/models/spree/customer_return_spec.rb +262 -0
  66. data/spec/models/spree/exchange_spec.rb +75 -0
  67. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  68. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  69. data/spec/models/spree/gateway_spec.rb +54 -0
  70. data/spec/models/spree/image_spec.rb +5 -0
  71. data/spec/models/spree/inventory_unit_spec.rb +242 -0
  72. data/spec/models/spree/line_item_spec.rb +267 -0
  73. data/spec/models/spree/option_type_spec.rb +14 -0
  74. data/spec/models/spree/option_value_spec.rb +13 -0
  75. data/spec/models/spree/order/address_spec.rb +50 -0
  76. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  77. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  78. data/spec/models/spree/order/checkout_spec.rb +764 -0
  79. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  80. data/spec/models/spree/order/finalizing_spec.rb +117 -0
  81. data/spec/models/spree/order/helpers_spec.rb +5 -0
  82. data/spec/models/spree/order/payment_spec.rb +214 -0
  83. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  84. data/spec/models/spree/order/shipments_spec.rb +43 -0
  85. data/spec/models/spree/order/state_machine_spec.rb +216 -0
  86. data/spec/models/spree/order/tax_spec.rb +84 -0
  87. data/spec/models/spree/order/totals_spec.rb +24 -0
  88. data/spec/models/spree/order/updating_spec.rb +18 -0
  89. data/spec/models/spree/order/validations_spec.rb +15 -0
  90. data/spec/models/spree/order_contents_spec.rb +256 -0
  91. data/spec/models/spree/order_inventory_spec.rb +228 -0
  92. data/spec/models/spree/order_merger_spec.rb +133 -0
  93. data/spec/models/spree/order_spec.rb +954 -0
  94. data/spec/models/spree/order_updater_spec.rb +283 -0
  95. data/spec/models/spree/payment/gateway_options_spec.rb +119 -0
  96. data/spec/models/spree/payment_method_spec.rb +95 -0
  97. data/spec/models/spree/payment_spec.rb +926 -0
  98. data/spec/models/spree/preference_spec.rb +80 -0
  99. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  100. data/spec/models/spree/preferences/preferable_spec.rb +348 -0
  101. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  102. data/spec/models/spree/preferences/store_spec.rb +46 -0
  103. data/spec/models/spree/price_spec.rb +42 -0
  104. data/spec/models/spree/product/scopes_spec.rb +148 -0
  105. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  106. data/spec/models/spree/product_filter_spec.rb +26 -0
  107. data/spec/models/spree/product_option_type_spec.rb +5 -0
  108. data/spec/models/spree/product_property_spec.rb +11 -0
  109. data/spec/models/spree/product_spec.rb +474 -0
  110. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
  111. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  112. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  113. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  114. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  115. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  116. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  117. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  118. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  119. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  120. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  121. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  122. data/spec/models/spree/promotion_action_spec.rb +10 -0
  123. data/spec/models/spree/promotion_category_spec.rb +17 -0
  124. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  125. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  126. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  127. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  128. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  129. data/spec/models/spree/promotion_spec.rb +603 -0
  130. data/spec/models/spree/property_spec.rb +5 -0
  131. data/spec/models/spree/prototype_spec.rb +5 -0
  132. data/spec/models/spree/refund_spec.rb +195 -0
  133. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  134. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  135. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  136. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  137. data/spec/models/spree/reimbursement_spec.rb +215 -0
  138. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  139. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  140. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  141. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  142. data/spec/models/spree/return_authorization_spec.rb +250 -0
  143. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  144. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  145. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  146. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  147. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  148. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  149. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  150. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  151. data/spec/models/spree/return_item_spec.rb +682 -0
  152. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  153. data/spec/models/spree/shipment_spec.rb +740 -0
  154. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  155. data/spec/models/spree/shipping_category_spec.rb +5 -0
  156. data/spec/models/spree/shipping_method_spec.rb +88 -0
  157. data/spec/models/spree/shipping_rate_spec.rb +141 -0
  158. data/spec/models/spree/state_spec.rb +18 -0
  159. data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
  160. data/spec/models/spree/stock/content_item_spec.rb +22 -0
  161. data/spec/models/spree/stock/coordinator_spec.rb +51 -0
  162. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  163. data/spec/models/spree/stock/estimator_spec.rb +154 -0
  164. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  165. data/spec/models/spree/stock/package_spec.rb +194 -0
  166. data/spec/models/spree/stock/packer_spec.rb +70 -0
  167. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  168. data/spec/models/spree/stock/quantifier_spec.rb +97 -0
  169. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  170. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  171. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  172. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  173. data/spec/models/spree/stock_item_spec.rb +410 -0
  174. data/spec/models/spree/stock_location_spec.rb +243 -0
  175. data/spec/models/spree/stock_movement_spec.rb +56 -0
  176. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  177. data/spec/models/spree/store_spec.rb +50 -0
  178. data/spec/models/spree/tax_category_spec.rb +27 -0
  179. data/spec/models/spree/tax_rate_spec.rb +382 -0
  180. data/spec/models/spree/taxon_spec.rb +74 -0
  181. data/spec/models/spree/taxonomy_spec.rb +18 -0
  182. data/spec/models/spree/tracker_spec.rb +21 -0
  183. data/spec/models/spree/user_spec.rb +130 -0
  184. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +24 -0
  185. data/spec/models/spree/variant_spec.rb +523 -0
  186. data/spec/models/spree/zone_spec.rb +444 -0
  187. data/spec/spec_helper.rb +74 -0
  188. data/spec/support/big_decimal.rb +5 -0
  189. data/spec/support/concerns/adjustment_source_spec.rb +23 -0
  190. data/spec/support/concerns/default_price_spec.rb +28 -0
  191. data/spec/support/rake.rb +13 -0
  192. data/spec/support/test_gateway.rb +2 -0
  193. data/spree_core.gemspec +48 -0
  194. metadata +185 -4
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Property, :type => :model do
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Prototype, :type => :model do
4
+
5
+ end
@@ -0,0 +1,195 @@
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) }
14
+
15
+ let(:refund_reason) { create(:refund_reason) }
16
+
17
+ let(:gateway_response) {
18
+ ActiveMerchant::Billing::Response.new(
19
+ gateway_response_success,
20
+ gateway_response_message,
21
+ gateway_response_params,
22
+ gateway_response_options
23
+ )
24
+ }
25
+ let(:gateway_response_success) { true }
26
+ let(:gateway_response_message) { "" }
27
+ let(:gateway_response_params) { {} }
28
+ let(:gateway_response_options) { {} }
29
+
30
+ subject { create(:refund, payment: payment, amount: amount, reason: refund_reason, transaction_id: nil) }
31
+
32
+ before do
33
+ allow(payment.payment_method)
34
+ .to receive(:credit)
35
+ .with(amount_in_cents, payment.source, payment.transaction_id, {originator: an_instance_of(Spree::Refund)})
36
+ .and_return(gateway_response)
37
+ end
38
+
39
+ context "transaction id exists on creation" do
40
+ let(:transaction_id) { "12kfjas0" }
41
+ subject { create(:refund, payment: payment, amount: amount, reason: refund_reason, transaction_id: transaction_id) }
42
+
43
+ it "creates a refund record" do
44
+ expect{ subject }.to change { Spree::Refund.count }.by(1)
45
+ end
46
+
47
+ it "maintains the transaction id" do
48
+ expect(subject.reload.transaction_id).to eq transaction_id
49
+ end
50
+
51
+ it "saves the amount" do
52
+ expect(subject.reload.amount).to eq amount
53
+ end
54
+
55
+ it "creates a log entry" do
56
+ expect(subject.log_entries).to be_present
57
+ end
58
+
59
+ it "does not attempt to process a transaction" do
60
+ expect(payment.payment_method).not_to receive(:credit)
61
+ subject
62
+ end
63
+
64
+ end
65
+
66
+ context "processing is successful" do
67
+ let(:gateway_response_options) { { authorization: authorization } }
68
+
69
+ it 'should create a refund' do
70
+ expect{ subject }.to change{ Spree::Refund.count }.by(1)
71
+ end
72
+
73
+ it 'return the newly created refund' do
74
+ expect(subject).to be_a(Spree::Refund)
75
+ end
76
+
77
+ it 'should save the returned authorization value' do
78
+ expect(subject.reload.transaction_id).to eq authorization
79
+ end
80
+
81
+ it 'should save the passed amount as the refund amount' do
82
+ expect(subject.amount).to eq amount
83
+ end
84
+
85
+ it 'should create a log entry' do
86
+ expect(subject.log_entries).to be_present
87
+ end
88
+
89
+ it "attempts to process a transaction" do
90
+ expect(payment.payment_method).to receive(:credit).once
91
+ subject
92
+ end
93
+
94
+ it 'should update the payment total' do
95
+ expect(payment.order.updater).to receive(:update)
96
+ subject
97
+ end
98
+
99
+ end
100
+
101
+ context "processing fails" do
102
+ let(:gateway_response_success) { false }
103
+ let(:gateway_response_message) { "failure message" }
104
+
105
+ it 'should raise error and not create a refund' do
106
+ expect do
107
+ expect { subject }.to raise_error(Spree::Core::GatewayError, gateway_response_message)
108
+ end.to_not change{ Spree::Refund.count }
109
+ end
110
+ end
111
+
112
+ context 'without payment profiles supported' do
113
+ before do
114
+ allow(payment.payment_method).to receive(:payment_profiles_supported?) { false }
115
+ end
116
+
117
+ it 'should not supply the payment source' do
118
+ expect(payment.payment_method)
119
+ .to receive(:credit)
120
+ .with(amount * 100, payment.transaction_id, {originator: an_instance_of(Spree::Refund)})
121
+ .and_return(gateway_response)
122
+
123
+ subject
124
+ end
125
+ end
126
+
127
+ context 'with payment profiles supported' do
128
+ before do
129
+ allow(payment.payment_method).to receive(:payment_profiles_supported?) { true }
130
+ end
131
+
132
+ it 'should supply the payment source' do
133
+ expect(payment.payment_method)
134
+ .to receive(:credit)
135
+ .with(amount_in_cents, payment.source, payment.transaction_id, {originator: an_instance_of(Spree::Refund)})
136
+ .and_return(gateway_response)
137
+
138
+ subject
139
+ end
140
+ end
141
+
142
+ context 'with an activemerchant gateway connection error' do
143
+ before do
144
+ message = double("gateway_error")
145
+ expect(payment.payment_method).to receive(:credit).with(
146
+ amount_in_cents,
147
+ payment.source,
148
+ payment.transaction_id,
149
+ originator: an_instance_of(Spree::Refund)
150
+ ).and_raise(ActiveMerchant::ConnectionError.new(message, nil))
151
+ end
152
+
153
+ it 'raises Spree::Core::GatewayError' do
154
+ expect { subject }.to raise_error(Spree::Core::GatewayError, Spree.t(:unable_to_connect_to_gateway))
155
+ end
156
+ end
157
+
158
+ context 'with amount too large' do
159
+ let(:payment_amount) { 10 }
160
+ let(:amount) { payment_amount*2 }
161
+
162
+ it 'is invalid' do
163
+ expect { subject }.to raise_error { |error|
164
+ expect(error).to be_a(ActiveRecord::RecordInvalid)
165
+ expect(error.record.errors.full_messages).to eq ["Amount #{I18n.t('activerecord.errors.models.spree/refund.attributes.amount.greater_than_allowed')}"]
166
+ }
167
+ end
168
+ end
169
+ end
170
+
171
+ describe 'total_amount_reimbursed_for' do
172
+ let(:customer_return) { reimbursement.customer_return}
173
+ let(:reimbursement) { create(:reimbursement) }
174
+ let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
175
+
176
+ subject { Spree::Refund.total_amount_reimbursed_for(reimbursement) }
177
+
178
+ context 'with reimbursements performed' do
179
+ before { reimbursement.perform! }
180
+
181
+ it 'returns the total amount' do
182
+ amount = Spree::Refund.total_amount_reimbursed_for(reimbursement)
183
+ expect(amount).to be > 0
184
+ expect(amount).to eq reimbursement.total
185
+ end
186
+ end
187
+
188
+ context 'without reimbursements performed' do
189
+ it 'returns zero' do
190
+ amount = Spree::Refund.total_amount_reimbursed_for(reimbursement)
191
+ expect(amount).to eq 0
192
+ end
193
+ end
194
+ end
195
+ 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