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,250 @@
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_authorization_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_authorization_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
+ return_authorization.save
21
+ expect(return_authorization.errors[:order]).to eq(["has no shipped units"])
22
+ end
23
+
24
+ context "expedited exchanges are configured" do
25
+ let(:order) { create(:shipped_order, line_items_count: 2) }
26
+ let(:exchange_return_item) { create(:exchange_return_item, inventory_unit: order.inventory_units.first) }
27
+ let(:return_item) { create(:return_item, inventory_unit: order.inventory_units.last) }
28
+ subject { create(:return_authorization, order: order, return_items: [exchange_return_item, return_item]) }
29
+
30
+ before do
31
+ @expediteted_exchanges_config = Spree::Config[:expedited_exchanges]
32
+ Spree::Config[:expedited_exchanges] = true
33
+ @pre_exchange_hooks = subject.class.pre_expedited_exchange_hooks
34
+ end
35
+
36
+ after do
37
+ Spree::Config[:expedited_exchanges] = @expediteted_exchanges_config
38
+ subject.class.pre_expedited_exchange_hooks = @pre_exchange_hooks
39
+ end
40
+
41
+ context "no items to exchange" do
42
+ subject { create(:return_authorization, order: order) }
43
+
44
+ it "does not create a reimbursement" do
45
+ expect{subject.save}.to_not change { Spree::Reimbursement.count }
46
+ end
47
+ end
48
+
49
+ context "items to exchange" do
50
+ it "calls pre_expedited_exchange hooks with the return items to exchange" do
51
+ hook = double(:as_null_object)
52
+ expect(hook).to receive(:call).with [exchange_return_item]
53
+ subject.class.pre_expedited_exchange_hooks = [hook]
54
+ subject.save
55
+ end
56
+
57
+ it "attempts to accept all return items requiring exchange" do
58
+ expect(exchange_return_item).to receive :attempt_accept
59
+ expect(return_item).not_to receive :attempt_accept
60
+ subject.save
61
+ end
62
+
63
+ it "performs an exchange reimbursement for the exchange return items" do
64
+ subject.save
65
+ reimbursement = Spree::Reimbursement.last
66
+ expect(reimbursement.order).to eq subject.order
67
+ expect(reimbursement.return_items).to eq [exchange_return_item]
68
+ expect(exchange_return_item.reload.exchange_shipment).to be_present
69
+ end
70
+
71
+ context "the reimbursement fails" do
72
+ before do
73
+ allow_any_instance_of(Spree::Reimbursement).to receive(:save) { false }
74
+ allow_any_instance_of(Spree::Reimbursement).to receive(:errors) { double(full_messages: "foo") }
75
+ end
76
+
77
+ it "puts errors on the return authorization" do
78
+ subject.save
79
+ expect(subject.errors[:base]).to include "foo"
80
+ end
81
+ end
82
+ end
83
+
84
+ end
85
+ end
86
+
87
+ describe ".before_create" do
88
+ describe "#generate_number" do
89
+ context "number is assigned" do
90
+ let(:return_authorization) { Spree::ReturnAuthorization.new(number: '123') }
91
+
92
+ it "should return the assigned number" do
93
+ return_authorization.save
94
+ expect(return_authorization.number).to eq('123')
95
+ end
96
+ end
97
+
98
+ context "number is not assigned" do
99
+ let(:return_authorization) { Spree::ReturnAuthorization.new(number: nil) }
100
+
101
+ before { allow(return_authorization).to receive_messages valid?: true }
102
+
103
+ it "should assign number with random RA number" do
104
+ return_authorization.save
105
+ expect(return_authorization.number).to match(/RA\d{9}/)
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ context "#currency" do
112
+ before { allow(order).to receive(:currency) { "ABC" } }
113
+ it "returns the order currency" do
114
+ expect(return_authorization.currency).to eq("ABC")
115
+ end
116
+ end
117
+
118
+ describe "#pre_tax_total" do
119
+ let(:pre_tax_amount_1) { 15.0 }
120
+ let!(:return_item_1) { create(:return_item, return_authorization: return_authorization, pre_tax_amount: pre_tax_amount_1) }
121
+
122
+ let(:pre_tax_amount_2) { 50.0 }
123
+ let!(:return_item_2) { create(:return_item, return_authorization: return_authorization, pre_tax_amount: pre_tax_amount_2) }
124
+
125
+ let(:pre_tax_amount_3) { 5.0 }
126
+ let!(:return_item_3) { create(:return_item, return_authorization: return_authorization, pre_tax_amount: pre_tax_amount_3) }
127
+
128
+ subject { return_authorization.pre_tax_total }
129
+
130
+ it "sums it's associated return_item's pre-tax amounts" do
131
+ expect(subject).to eq (pre_tax_amount_1 + pre_tax_amount_2 + pre_tax_amount_3)
132
+ end
133
+ end
134
+
135
+ describe "#display_pre_tax_total" do
136
+ it "returns a Spree::Money" do
137
+ allow(return_authorization).to receive_messages(pre_tax_total: 21.22)
138
+ expect(return_authorization.display_pre_tax_total).to eq(Spree::Money.new(21.22))
139
+ end
140
+ end
141
+
142
+ describe "#refundable_amount" do
143
+ let(:weighted_line_item_pre_tax_amount) { 5.0 }
144
+ let(:line_item_count) { return_authorization.order.line_items.count }
145
+
146
+ subject { return_authorization.refundable_amount }
147
+
148
+ before do
149
+ return_authorization.order.line_items.update_all(pre_tax_amount: weighted_line_item_pre_tax_amount)
150
+ return_authorization.order.update_attribute(:promo_total, promo_total)
151
+ end
152
+
153
+ context "no promotions" do
154
+ let(:promo_total) { 0.0 }
155
+ it "returns the pre-tax line item total" do
156
+ expect(subject).to eq (weighted_line_item_pre_tax_amount * line_item_count)
157
+ end
158
+ end
159
+
160
+ context "promotions" do
161
+ let(:promo_total) { -10.0 }
162
+ it "returns the pre-tax line item total minus the order level promotion value" do
163
+ expect(subject).to eq (weighted_line_item_pre_tax_amount * line_item_count) + promo_total
164
+ end
165
+ end
166
+ end
167
+
168
+ describe "#customer_returned_items?" do
169
+ before do
170
+ allow_any_instance_of(Spree::Order).to receive_messages(return!: true)
171
+ end
172
+
173
+ subject { return_authorization.customer_returned_items? }
174
+
175
+ context "has associated customer returns" do
176
+ let(:customer_return) { create(:customer_return) }
177
+ let(:return_authorization) { customer_return.return_authorizations.first }
178
+
179
+ it "returns true" do
180
+ expect(subject).to eq true
181
+ end
182
+ end
183
+
184
+ context "does not have associated customer returns" do
185
+ let(:return_authorization) { create(:return_authorization) }
186
+
187
+ it "returns false" do
188
+ expect(subject).to eq false
189
+ end
190
+ end
191
+ end
192
+
193
+ describe 'cancel_return_items' do
194
+ let(:return_authorization) { create(:return_authorization, return_items: return_items) }
195
+ let(:return_items) { [return_item] }
196
+ let(:return_item) { create(:return_item) }
197
+
198
+ subject {
199
+ return_authorization.cancel!
200
+ }
201
+
202
+ it 'cancels the associated return items' do
203
+ subject
204
+ expect(return_item.reception_status).to eq 'cancelled'
205
+ end
206
+
207
+ context 'some return items cannot be cancelled' do
208
+ let(:return_items) { [return_item, return_item_2] }
209
+ let(:return_item_2) { create(:return_item, reception_status: 'received') }
210
+
211
+ it 'cancels those that can be cancelled' do
212
+ subject
213
+ expect(return_item.reception_status).to eq 'cancelled'
214
+ expect(return_item_2.reception_status).to eq 'received'
215
+ end
216
+ end
217
+ end
218
+
219
+ describe '#can_cancel?' do
220
+ subject { create(:return_authorization, return_items: return_items).can_cancel? }
221
+ let(:return_items) { [return_item_1, return_item_2] }
222
+ let(:return_item_1) { create(:return_item) }
223
+ let(:return_item_2) { create(:return_item) }
224
+
225
+ context 'all items can be cancelled' do
226
+ it 'returns true' do
227
+ expect(subject).to eq true
228
+ end
229
+ end
230
+
231
+ context 'at least one return item can be cancelled' do
232
+ let(:return_item_2) { create(:return_item, reception_status: 'received') }
233
+
234
+ it { should eq true }
235
+ end
236
+
237
+ context 'no items can be cancelled' do
238
+ let(:return_item_1) { create(:return_item, reception_status: 'received') }
239
+ let(:return_item_2) { create(:return_item, reception_status: 'received') }
240
+
241
+ it { should eq false }
242
+ end
243
+
244
+ context 'when return_authorization has no return_items' do
245
+ let(:return_items) { [] }
246
+
247
+ it { should eq true }
248
+ end
249
+ end
250
+ 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
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ReturnItem::EligibilityValidator::InventoryShipped do
4
+ let(:return_item) { create(:return_item) }
5
+ let(:validator) { Spree::ReturnItem::EligibilityValidator::InventoryShipped.new(return_item) }
6
+
7
+ describe "#eligible_for_return?" do
8
+ before { allow(return_item.inventory_unit).to receive(:shipped?).and_return(true) }
9
+
10
+ subject { validator.eligible_for_return? }
11
+
12
+ context "the associated inventory unit is shipped" do
13
+ it "returns true" do
14
+ expect(subject).to eq true
15
+ end
16
+ end
17
+
18
+ context "the associated inventory unit is not shipped" do
19
+ before { allow(return_item.inventory_unit).to receive(:shipped?).and_return(false) }
20
+
21
+ it "returns false" do
22
+ expect(subject).to eq false
23
+ end
24
+
25
+ it "sets an error" do
26
+ subject
27
+ expect(validator.errors[:inventory_unit_shipped]).to eq Spree.t('return_item_inventory_unit_ineligible')
28
+ end
29
+ end
30
+ end
31
+
32
+ describe "#requires_manual_intervention?" do
33
+ subject { validator.requires_manual_intervention? }
34
+
35
+ context "not eligible for return" do
36
+ before do
37
+ allow(return_item.inventory_unit).to receive(:shipped?).and_return(false)
38
+ validator.eligible_for_return?
39
+ end
40
+
41
+ it 'returns true if errors were added' do
42
+ expect(subject).to eq true
43
+ end
44
+ end
45
+
46
+ context "eligible for return" do
47
+ before do
48
+ allow(return_item.inventory_unit).to receive(:shipped?).and_return(true)
49
+ validator.eligible_for_return?
50
+ end
51
+
52
+ it 'returns false if no errors were added' do
53
+ expect(subject).to eq false
54
+ end
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ReturnItem::EligibilityValidator::NoReimbursements do
4
+ let(:validator) { Spree::ReturnItem::EligibilityValidator::NoReimbursements.new(return_item) }
5
+
6
+ describe "#eligible_for_return?" do
7
+
8
+ subject { validator.eligible_for_return? }
9
+
10
+ context "inventory unit has already been reimbursed" do
11
+ let(:reimbursement) { create(:reimbursement) }
12
+ let(:return_item) { reimbursement.return_items.last }
13
+
14
+ it "returns false" do
15
+ expect(subject).to eq false
16
+ end
17
+
18
+ it "sets an error" do
19
+ subject
20
+ expect(validator.errors[:inventory_unit_reimbursed]).to eq Spree.t('return_item_inventory_unit_reimbursed')
21
+ end
22
+ end
23
+
24
+ context "inventory unit has not been reimbursed" do
25
+ let(:return_item) { create(:return_item) }
26
+
27
+ it "returns true" do
28
+ expect(subject).to eq true
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "#requires_manual_intervention?" do
34
+ subject { validator.requires_manual_intervention? }
35
+
36
+ context "not eligible for return" do
37
+ let(:reimbursement) { create(:reimbursement) }
38
+ let(:return_item) { reimbursement.return_items.last }
39
+
40
+ before do
41
+ validator.eligible_for_return?
42
+ end
43
+
44
+ it 'returns true if errors were added' do
45
+ expect(subject).to eq true
46
+ end
47
+ end
48
+
49
+ context "eligible for return" do
50
+ let(:return_item) { create(:return_item) }
51
+
52
+ before do
53
+ validator.eligible_for_return?
54
+ end
55
+
56
+ it 'returns false if no errors were added' do
57
+ expect(subject).to eq false
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::ReturnItem::EligibilityValidator::OrderCompleted do
4
+ let(:inventory_unit) { create(:inventory_unit, order: order) }
5
+ let(:return_item) { create(:return_item, inventory_unit: inventory_unit) }
6
+ let(:validator) { Spree::ReturnItem::EligibilityValidator::OrderCompleted.new(return_item) }
7
+
8
+ describe "#eligible_for_return?" do
9
+ subject { validator.eligible_for_return? }
10
+
11
+ context "the order was completed" do
12
+ let(:order) { create(:completed_order_with_totals) }
13
+
14
+ it "returns true" do
15
+ expect(subject).to be true
16
+ end
17
+ end
18
+
19
+ context "the order is not completed" do
20
+ let(:order) { create(:order) }
21
+
22
+ it "returns false" do
23
+ expect(subject).to be false
24
+ end
25
+
26
+ it "sets an error" do
27
+ subject
28
+ expect(validator.errors[:order_not_completed]).to eq Spree.t('return_item_order_not_completed')
29
+ end
30
+ end
31
+ end
32
+ end