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,262 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::CustomerReturn, :type => :model do
4
+ before do
5
+ allow_any_instance_of(Spree::Order).to receive_messages(return!: true)
6
+ end
7
+
8
+ describe ".validation" do
9
+ describe "#must_have_return_authorization" do
10
+ let(:customer_return) { build(:customer_return) }
11
+
12
+ let(:inventory_unit) { build(:inventory_unit) }
13
+ let(:return_item) { build(:return_item, inventory_unit: inventory_unit) }
14
+
15
+ subject { customer_return.valid? }
16
+
17
+ before do
18
+ customer_return.return_items << return_item
19
+ end
20
+
21
+ context "return item does not belong to return authorization" do
22
+ before do
23
+ return_item.return_authorization = nil
24
+ end
25
+
26
+ it "is not valid" do
27
+ expect(subject).to eq false
28
+ end
29
+
30
+ it "adds an error message" do
31
+ subject
32
+ expect(customer_return.errors.full_messages).to include(Spree.t(:missing_return_authorization, item_name: inventory_unit.variant.name))
33
+ end
34
+ end
35
+
36
+ context "return item belongs to return authorization" do
37
+ it "is valid" do
38
+ expect(subject).to eq true
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "#return_items_belong_to_same_order" do
44
+ let(:customer_return) { build(:customer_return) }
45
+
46
+ let(:first_inventory_unit) { build(:inventory_unit) }
47
+ let(:first_return_item) { build(:return_item, inventory_unit: first_inventory_unit) }
48
+
49
+ let(:second_inventory_unit) { build(:inventory_unit, order: second_order) }
50
+ let(:second_return_item) { build(:return_item, inventory_unit: second_inventory_unit) }
51
+
52
+ subject { customer_return.valid? }
53
+
54
+ before do
55
+ customer_return.return_items << first_return_item
56
+ customer_return.return_items << second_return_item
57
+ end
58
+
59
+ context "return items are part of different orders" do
60
+ let(:second_order) { create(:order) }
61
+
62
+ it "is not valid" do
63
+ expect(subject).to eq false
64
+ end
65
+
66
+ it "adds an error message" do
67
+ subject
68
+ expect(customer_return.errors.full_messages).to include(Spree.t(:return_items_cannot_be_associated_with_multiple_orders))
69
+ end
70
+ end
71
+
72
+ context "return items are part of the same order" do
73
+ let(:second_order) { first_inventory_unit.order }
74
+
75
+ it "is valid" do
76
+ expect(subject).to eq true
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ describe ".before_create" do
83
+ describe "#generate_number" do
84
+ context "number is assigned" do
85
+ let(:customer_return) { Spree::CustomerReturn.new(number: '123') }
86
+
87
+ it "should return the assigned number" do
88
+ customer_return.save
89
+ expect(customer_return.number).to eq('123')
90
+ end
91
+ end
92
+
93
+ context "number is not assigned" do
94
+ let(:customer_return) { Spree::CustomerReturn.new(number: nil) }
95
+
96
+ before do
97
+ allow(customer_return).to receive_messages(valid?: true, process_return!: true)
98
+ end
99
+
100
+ it "should assign number with random CR number" do
101
+ customer_return.save
102
+ expect(customer_return.number).to match(/CR\d{9}/)
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ describe "#pre_tax_total" do
109
+ let(:pre_tax_amount) { 15.0 }
110
+ let(:customer_return) { create(:customer_return, line_items_count: 2) }
111
+
112
+ before do
113
+ Spree::ReturnItem.where(customer_return_id: customer_return.id).update_all(pre_tax_amount: pre_tax_amount)
114
+ end
115
+
116
+ subject { customer_return.pre_tax_total }
117
+
118
+ it "returns the sum of the return item's pre_tax_amount" do
119
+ expect(subject).to eq (pre_tax_amount * 2)
120
+ end
121
+ end
122
+
123
+ describe "#display_pre_tax_total" do
124
+ let(:customer_return) { Spree::CustomerReturn.new }
125
+
126
+ it "returns a Spree::Money" do
127
+ allow(customer_return).to receive_messages(pre_tax_total: 21.22)
128
+ expect(customer_return.display_pre_tax_total).to eq(Spree::Money.new(21.22))
129
+ end
130
+ end
131
+
132
+ describe "#order" do
133
+ let(:return_item) { create(:return_item) }
134
+ let(:customer_return) { build(:customer_return, return_items: [return_item]) }
135
+
136
+ subject { customer_return.order }
137
+
138
+ it "returns the order associated with the return item's inventory unit" do
139
+ expect(subject).to eq return_item.inventory_unit.order
140
+ end
141
+ end
142
+
143
+ describe "#order_id" do
144
+ subject { customer_return.order_id }
145
+
146
+ context "return item is not associated yet" do
147
+ let(:customer_return) { build(:customer_return) }
148
+
149
+ it "is nil" do
150
+ expect(subject).to be_nil
151
+ end
152
+ end
153
+
154
+ context "has an associated return item" do
155
+ let(:return_item) { create(:return_item) }
156
+ let(:customer_return) { build(:customer_return, return_items: [return_item]) }
157
+
158
+ it "is the return item's inventory unit's order id" do
159
+ expect(subject).to eq return_item.inventory_unit.order.id
160
+ end
161
+ end
162
+ end
163
+
164
+ context ".after_save" do
165
+ let(:inventory_unit) { create(:inventory_unit, state: 'shipped', order: create(:shipped_order)) }
166
+ let(:return_item) { create(:return_item, inventory_unit: inventory_unit) }
167
+
168
+ context "to the initial stock location" do
169
+
170
+ it "should mark all inventory units are returned" do
171
+ create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: inventory_unit.shipment.stock_location_id)
172
+ expect(inventory_unit.reload.state).to eq 'returned'
173
+ end
174
+
175
+ it "should update the stock item counts in the stock location" do
176
+ expect do
177
+ create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: inventory_unit.shipment.stock_location_id)
178
+ end.to change { inventory_unit.find_stock_item.count_on_hand }.by(1)
179
+ end
180
+
181
+ context 'with Config.track_inventory_levels == false' do
182
+ before do
183
+ Spree::Config.track_inventory_levels = false
184
+ expect(Spree::StockItem).not_to receive(:find_by)
185
+ expect(Spree::StockMovement).not_to receive(:create!)
186
+ end
187
+
188
+ it "should NOT update the stock item counts in the stock location" do
189
+ count_on_hand = inventory_unit.find_stock_item.count_on_hand
190
+ create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: inventory_unit.shipment.stock_location_id)
191
+ expect(inventory_unit.find_stock_item.count_on_hand).to eql count_on_hand
192
+ end
193
+ end
194
+ end
195
+
196
+ context "to a different stock location" do
197
+ let(:new_stock_location) { create(:stock_location, :name => "other") }
198
+
199
+ it "should update the stock item counts in new stock location" do
200
+ expect {
201
+ create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: new_stock_location.id)
202
+ }.to change {
203
+ Spree::StockItem.where(variant_id: inventory_unit.variant_id, stock_location_id: new_stock_location.id).first.count_on_hand
204
+ }.by(1)
205
+ end
206
+
207
+ it "should NOT raise an error when no stock item exists in the stock location" do
208
+ inventory_unit.find_stock_item.destroy
209
+ expect { create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: new_stock_location.id) }.not_to raise_error
210
+ end
211
+
212
+ it "should not update the stock item counts in the original stock location" do
213
+ count_on_hand = inventory_unit.find_stock_item.count_on_hand
214
+ create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: new_stock_location.id)
215
+ expect(inventory_unit.find_stock_item.count_on_hand).to eq(count_on_hand)
216
+ end
217
+ end
218
+ end
219
+
220
+ describe '#fully_reimbursed?' do
221
+ let(:customer_return) { create(:customer_return) }
222
+
223
+ let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
224
+
225
+ subject { customer_return.fully_reimbursed? }
226
+
227
+ context 'when some return items are undecided' do
228
+ it { is_expected.to be false }
229
+ end
230
+
231
+ context 'when all return items are decided' do
232
+
233
+ context 'when all return items are rejected' do
234
+ before { customer_return.return_items.each(&:reject!) }
235
+
236
+ it { is_expected.to be true }
237
+ end
238
+
239
+ context 'when all return items are accepted' do
240
+ before { customer_return.return_items.each(&:accept!) }
241
+
242
+ context 'when some return items have no reimbursement' do
243
+ it { is_expected.to be false }
244
+ end
245
+
246
+ context 'when all return items have a reimbursement' do
247
+ let!(:reimbursement) { create(:reimbursement, customer_return: customer_return) }
248
+
249
+ context 'when some reimbursements are not reimbursed' do
250
+ it { is_expected.to be false }
251
+ end
252
+
253
+ context 'when all reimbursements are reimbursed' do
254
+ before { reimbursement.perform! }
255
+
256
+ it { is_expected.to be true }
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
262
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Exchange, :type => :model do
5
+ let(:order) { Spree::Order.new }
6
+
7
+ let(:return_item_1) { build(:exchange_return_item) }
8
+ let(:return_item_2) { build(:exchange_return_item) }
9
+ let(:return_items) { [return_item_1, return_item_2] }
10
+ let(:exchange) { Exchange.new(order, return_items) }
11
+
12
+ describe "#description" do
13
+ before do
14
+ allow(return_item_1).to receive(:variant) { double(options_text: "foo") }
15
+ allow(return_item_1).to receive(:exchange_variant) { double(options_text: "bar") }
16
+ allow(return_item_2).to receive(:variant) { double(options_text: "baz") }
17
+ allow(return_item_2).to receive(:exchange_variant) { double(options_text: "qux") }
18
+ end
19
+
20
+ it "describes the return items' change in options" do
21
+ expect(exchange.description).to match /foo => bar/
22
+ expect(exchange.description).to match /baz => qux/
23
+ end
24
+ end
25
+
26
+ describe "#display_amount" do
27
+ it "is the total amount of all return items" do
28
+ expect(exchange.display_amount).to eq Spree::Money.new(0.0)
29
+ end
30
+ end
31
+
32
+ describe "#perform!" do
33
+ let(:return_item) { create(:exchange_return_item) }
34
+ let(:return_items) { [return_item] }
35
+ let(:order) { return_item.return_authorization.order }
36
+ subject { exchange.perform! }
37
+ before { return_item.exchange_variant.stock_items.first.adjust_count_on_hand(20) }
38
+
39
+ it "creates shipments for the order with the return items exchange inventory units" do
40
+ expect { subject }.to change { order.shipments.count }.by(1)
41
+ new_shipment = order.shipments.last
42
+ expect(new_shipment).to be_ready
43
+ new_inventory_units = new_shipment.inventory_units
44
+ expect(new_inventory_units.count).to eq 1
45
+ expect(new_inventory_units.first.original_return_item).to eq return_item
46
+ expect(new_inventory_units.first.line_item).to eq return_item.inventory_unit.line_item
47
+ end
48
+
49
+ context "when it cannot create shipments for all items" do
50
+ before do
51
+ StockItem.where(:variant_id => return_item.exchange_variant_id).destroy_all
52
+ end
53
+
54
+ it 'raises an UnableToCreateShipments error' do
55
+ expect {
56
+ subject
57
+ }.to raise_error(Spree::Exchange::UnableToCreateShipments)
58
+ end
59
+ end
60
+ end
61
+
62
+ describe "#to_key" do # for dom_id
63
+ it { expect(Exchange.new(nil, nil).to_key).to be_nil }
64
+ end
65
+
66
+ describe ".param_key" do # for dom_id
67
+ it { expect(Exchange.param_key).to eq "spree_exchange" }
68
+ end
69
+
70
+ describe ".model_name" do # for dom_id
71
+ it { expect(Exchange.model_name).to eq Spree::Exchange }
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::BogusSimple, :type => :model do
4
+
5
+ subject { Spree::Gateway::BogusSimple.new }
6
+
7
+ # regression test for #3824
8
+ describe "#capture" do
9
+ it "returns success with the right response code" do
10
+ response = subject.capture(123, '12345', {})
11
+ expect(response.message).to include("success")
12
+ end
13
+
14
+ it "returns failure with the wrong response code" do
15
+ response = subject.capture(123, 'wrong', {})
16
+ expect(response.message).to include("failure")
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Gateway::Bogus, :type => :model do
5
+ let(:bogus) { create(:credit_card_payment_method) }
6
+ let!(:cc) { create(:credit_card, payment_method: bogus, gateway_customer_profile_id: "BGS-RERTERT") }
7
+
8
+ it "disable recurring contract by destroying payment source" do
9
+ bogus.disable_customer_profile(cc)
10
+ expect(cc.gateway_customer_profile_id).to be_nil
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway, :type => :model do
4
+ class Provider
5
+ def initialize(options)
6
+ end
7
+
8
+ def imaginary_method
9
+
10
+ end
11
+ end
12
+
13
+ class TestGateway < Spree::Gateway
14
+ def provider_class
15
+ Provider
16
+ end
17
+ end
18
+
19
+ it "passes through all arguments on a method_missing call" do
20
+ gateway = TestGateway.new
21
+ expect(gateway.provider).to receive(:imaginary_method).with('foo')
22
+ gateway.imaginary_method('foo')
23
+ end
24
+
25
+ context "fetching payment sources" do
26
+ let(:order) { Spree::Order.create(user_id: 1) }
27
+
28
+ let(:has_card) { create(:credit_card_payment_method) }
29
+ let(:no_card) { create(:credit_card_payment_method) }
30
+
31
+ let(:cc) do
32
+ create(:credit_card, payment_method: has_card, gateway_customer_profile_id: "EFWE")
33
+ end
34
+
35
+ let(:payment) do
36
+ create(:payment, order: order, source: cc, payment_method: has_card)
37
+ end
38
+
39
+ it "finds credit cards associated on a order completed" do
40
+ allow(payment.order).to receive_messages completed?: true
41
+
42
+ expect(no_card.reusable_sources(payment.order)).to be_empty
43
+ expect(has_card.reusable_sources(payment.order)).not_to be_empty
44
+ end
45
+
46
+ it "finds credit cards associated with the order user" do
47
+ cc.update_column :user_id, 1
48
+ allow(payment.order).to receive_messages completed?: false
49
+
50
+ expect(no_card.reusable_sources(payment.order)).to be_empty
51
+ expect(has_card.reusable_sources(payment.order)).not_to be_empty
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Image, :type => :model do
4
+
5
+ end
@@ -0,0 +1,242 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::InventoryUnit, :type => :model do
4
+ let(:stock_location) { create(:stock_location_with_items) }
5
+ let(:stock_item) { stock_location.stock_items.order(:id).first }
6
+
7
+ context "#backordered_for_stock_item" do
8
+ let(:order) do
9
+ order = create(:order, state: 'complete', ship_address: create(:ship_address))
10
+ order.completed_at = Time.now
11
+ create(:shipment, order: order, stock_location: stock_location)
12
+ order.shipments.reload
13
+ create(:line_item, order: order, variant: stock_item.variant)
14
+ order.line_items.reload
15
+ order.tap(&:save!)
16
+ end
17
+
18
+ let(:shipment) do
19
+ order.shipments.first
20
+ end
21
+
22
+ let(:shipping_method) do
23
+ shipment.shipping_methods.first
24
+ end
25
+
26
+ let!(:unit) do
27
+ unit = shipment.inventory_units.first
28
+ unit.state = 'backordered'
29
+ unit.tap(&:save!)
30
+ end
31
+
32
+ before do
33
+ stock_item.set_count_on_hand(-2)
34
+ end
35
+
36
+ # Regression for #3066
37
+ it "returns modifiable objects" do
38
+ units = Spree::InventoryUnit.backordered_for_stock_item(stock_item)
39
+ expect { units.first.save! }.to_not raise_error
40
+ end
41
+
42
+ it "finds inventory units from its stock location when the unit's variant matches the stock item's variant" do
43
+ expect(Spree::InventoryUnit.backordered_for_stock_item(stock_item)).to match_array([unit])
44
+ end
45
+
46
+ it "does not find inventory units that aren't backordered" do
47
+ on_hand_unit = shipment.inventory_units.build
48
+ on_hand_unit.state = 'on_hand'
49
+ on_hand_unit.variant_id = 1
50
+ on_hand_unit.save!
51
+
52
+ expect(Spree::InventoryUnit.backordered_for_stock_item(stock_item)).not_to include(on_hand_unit)
53
+ end
54
+
55
+ it "does not find inventory units that don't match the stock item's variant" do
56
+ other_variant_unit = shipment.inventory_units.build
57
+ other_variant_unit.state = 'backordered'
58
+ other_variant_unit.variant = create(:variant)
59
+ other_variant_unit.save!
60
+
61
+ expect(Spree::InventoryUnit.backordered_for_stock_item(stock_item)).not_to include(other_variant_unit)
62
+ end
63
+
64
+ it "does not change shipping cost when fulfilling the order" do
65
+ current_shipment_cost = shipment.cost
66
+ shipping_method.calculator.set_preference(:amount, current_shipment_cost + 5.0)
67
+ stock_item.set_count_on_hand(0)
68
+ expect(shipment.reload.cost).to eq(current_shipment_cost)
69
+ end
70
+
71
+ context "other shipments" do
72
+ let(:other_order) do
73
+ order = create(:order)
74
+ order.state = 'payment'
75
+ order.completed_at = nil
76
+ order.tap(&:save!)
77
+ end
78
+
79
+ let(:other_shipment) do
80
+ shipment = Spree::Shipment.new
81
+ shipment.stock_location = stock_location
82
+ shipment.shipping_methods << create(:shipping_method)
83
+ shipment.order = other_order
84
+ # We don't care about this in this test
85
+ allow(shipment).to receive(:ensure_correct_adjustment)
86
+ shipment.tap(&:save!)
87
+ end
88
+
89
+ let!(:other_unit) do
90
+ unit = other_shipment.inventory_units.build
91
+ unit.state = 'backordered'
92
+ unit.variant_id = stock_item.variant.id
93
+ unit.order_id = other_order.id
94
+ unit.tap(&:save!)
95
+ end
96
+
97
+ it "does not find inventory units belonging to incomplete orders" do
98
+ expect(Spree::InventoryUnit.backordered_for_stock_item(stock_item)).not_to include(other_unit)
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+
105
+ context "variants deleted" do
106
+ let!(:unit) do
107
+ Spree::InventoryUnit.create(variant: stock_item.variant)
108
+ end
109
+
110
+ it "can still fetch variant" do
111
+ unit.variant.destroy
112
+ expect(unit.reload.variant).to be_a Spree::Variant
113
+ end
114
+
115
+ it "can still fetch variants by eager loading (remove default_scope)" do
116
+ skip "find a way to remove default scope when eager loading associations"
117
+ unit.variant.destroy
118
+ expect(Spree::InventoryUnit.joins(:variant).includes(:variant).first.variant).to be_a Spree::Variant
119
+ end
120
+ end
121
+
122
+ context "#finalize_units!" do
123
+ let!(:stock_location) { create(:stock_location) }
124
+ let(:variant) { create(:variant) }
125
+ let(:inventory_units) { [
126
+ create(:inventory_unit, variant: variant),
127
+ create(:inventory_unit, variant: variant)
128
+ ] }
129
+
130
+ it "should create a stock movement" do
131
+ Spree::InventoryUnit.finalize_units!(inventory_units)
132
+ expect(inventory_units.any?(&:pending)).to be false
133
+ end
134
+ end
135
+
136
+ describe "#current_or_new_return_item" do
137
+ before { allow(inventory_unit).to receive_messages(pre_tax_amount: 100.0) }
138
+
139
+ subject { inventory_unit.current_or_new_return_item }
140
+
141
+ context "associated with a return item" do
142
+ let(:return_item) { create(:return_item) }
143
+ let(:inventory_unit) { return_item.inventory_unit }
144
+
145
+ it "returns a persisted return item" do
146
+ expect(subject).to be_persisted
147
+ end
148
+
149
+ it "returns it's associated return_item" do
150
+ expect(subject).to eq return_item
151
+ end
152
+ end
153
+
154
+ context "no associated return item" do
155
+ let(:inventory_unit) { create(:inventory_unit) }
156
+
157
+ it "returns a new return item" do
158
+ expect(subject).to_not be_persisted
159
+ end
160
+
161
+ it "associates itself to the new return_item" do
162
+ expect(subject.inventory_unit).to eq inventory_unit
163
+ end
164
+ end
165
+ end
166
+
167
+ describe '#additional_tax_total' do
168
+ let(:quantity) { 2 }
169
+ let(:line_item_additional_tax_total) { 10.00 }
170
+ let(:line_item) do
171
+ build(:line_item, {
172
+ quantity: quantity,
173
+ additional_tax_total: line_item_additional_tax_total,
174
+ })
175
+ end
176
+
177
+ subject do
178
+ build(:inventory_unit, line_item: line_item)
179
+ end
180
+
181
+ it 'is the correct amount' do
182
+ expect(subject.additional_tax_total).to eq line_item_additional_tax_total / quantity
183
+ end
184
+ end
185
+
186
+ describe '#included_tax_total' do
187
+ let(:quantity) { 2 }
188
+ let(:line_item_included_tax_total) { 10.00 }
189
+ let(:line_item) do
190
+ build(:line_item, {
191
+ quantity: quantity,
192
+ included_tax_total: line_item_included_tax_total,
193
+ })
194
+ end
195
+
196
+ subject do
197
+ build(:inventory_unit, line_item: line_item)
198
+ end
199
+
200
+ it 'is the correct amount' do
201
+ expect(subject.included_tax_total).to eq line_item_included_tax_total / quantity
202
+ end
203
+ end
204
+
205
+ describe '#additional_tax_total' do
206
+ let(:quantity) { 2 }
207
+ let(:line_item_additional_tax_total) { 10.00 }
208
+ let(:line_item) do
209
+ build(:line_item, {
210
+ quantity: quantity,
211
+ additional_tax_total: line_item_additional_tax_total,
212
+ })
213
+ end
214
+
215
+ subject do
216
+ build(:inventory_unit, line_item: line_item)
217
+ end
218
+
219
+ it 'is the correct amount' do
220
+ expect(subject.additional_tax_total).to eq line_item_additional_tax_total / quantity
221
+ end
222
+ end
223
+
224
+ describe '#included_tax_total' do
225
+ let(:quantity) { 2 }
226
+ let(:line_item_included_tax_total) { 10.00 }
227
+ let(:line_item) do
228
+ build(:line_item, {
229
+ quantity: quantity,
230
+ included_tax_total: line_item_included_tax_total,
231
+ })
232
+ end
233
+
234
+ subject do
235
+ build(:inventory_unit, line_item: line_item)
236
+ end
237
+
238
+ it 'is the correct amount' do
239
+ expect(subject.included_tax_total).to eq line_item_included_tax_total / quantity
240
+ end
241
+ end
242
+ end