solidus_core 1.1.0 → 1.1.1

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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Rakefile +16 -0
  4. data/script/rails +9 -0
  5. data/solidus_core.gemspec +48 -0
  6. data/spec/fixtures/thinking-cat.jpg +0 -0
  7. data/spec/helpers/base_helper_spec.rb +173 -0
  8. data/spec/helpers/order_helper_spec.rb +12 -0
  9. data/spec/helpers/products_helper_spec.rb +208 -0
  10. data/spec/helpers/taxons_helper_spec.rb +17 -0
  11. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  12. data/spec/lib/i18n_spec.rb +106 -0
  13. data/spec/lib/search/base_spec.rb +86 -0
  14. data/spec/lib/search/variant_spec.rb +112 -0
  15. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  16. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -0
  17. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +80 -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 +24 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +156 -0
  25. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +130 -0
  26. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  27. data/spec/lib/spree/localized_number_spec.rb +38 -0
  28. data/spec/lib/spree/migrations_spec.rb +36 -0
  29. data/spec/lib/spree/money_spec.rb +127 -0
  30. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  31. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  32. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  33. data/spec/mailers/carton_mailer_spec.rb +55 -0
  34. data/spec/mailers/order_mailer_spec.rb +135 -0
  35. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  36. data/spec/mailers/test_mailer_spec.rb +15 -0
  37. data/spec/models/spree/ability_spec.rb +276 -0
  38. data/spec/models/spree/address_spec.rb +376 -0
  39. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  40. data/spec/models/spree/adjustment_spec.rb +169 -0
  41. data/spec/models/spree/app_configuration_spec.rb +24 -0
  42. data/spec/models/spree/asset_spec.rb +24 -0
  43. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  44. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  45. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  46. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  47. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  48. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  49. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +60 -0
  50. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  51. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  52. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  53. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  54. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  55. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  56. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  57. data/spec/models/spree/calculator_spec.rb +36 -0
  58. data/spec/models/spree/carton_spec.rb +133 -0
  59. data/spec/models/spree/classification_spec.rb +93 -0
  60. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  61. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +25 -0
  62. data/spec/models/spree/concerns/user_address_book_spec.rb +332 -0
  63. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  64. data/spec/models/spree/credit_card_spec.rb +341 -0
  65. data/spec/models/spree/customer_return_spec.rb +276 -0
  66. data/spec/models/spree/exchange_spec.rb +79 -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 +104 -0
  70. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  71. data/spec/models/spree/item_adjustments_spec.rb +275 -0
  72. data/spec/models/spree/line_item_spec.rb +199 -0
  73. data/spec/models/spree/option_type_spec.rb +14 -0
  74. data/spec/models/spree/option_value_spec.rb +45 -0
  75. data/spec/models/spree/order/address_spec.rb +50 -0
  76. data/spec/models/spree/order/adjustments_spec.rb +27 -0
  77. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  78. data/spec/models/spree/order/checkout_spec.rb +884 -0
  79. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  80. data/spec/models/spree/order/finalizing_spec.rb +110 -0
  81. data/spec/models/spree/order/payment_spec.rb +243 -0
  82. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  83. data/spec/models/spree/order/state_machine_spec.rb +209 -0
  84. data/spec/models/spree/order/tax_spec.rb +84 -0
  85. data/spec/models/spree/order/totals_spec.rb +24 -0
  86. data/spec/models/spree/order/updating_spec.rb +18 -0
  87. data/spec/models/spree/order/validations_spec.rb +15 -0
  88. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  89. data/spec/models/spree/order_capturing_spec.rb +150 -0
  90. data/spec/models/spree/order_contents_spec.rb +307 -0
  91. data/spec/models/spree/order_inventory_spec.rb +228 -0
  92. data/spec/models/spree/order_mutex_spec.rb +85 -0
  93. data/spec/models/spree/order_promotion_spec.rb +31 -0
  94. data/spec/models/spree/order_shipping_spec.rb +241 -0
  95. data/spec/models/spree/order_spec.rb +1482 -0
  96. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  97. data/spec/models/spree/order_updater_spec.rb +283 -0
  98. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  99. data/spec/models/spree/payment_method_spec.rb +147 -0
  100. data/spec/models/spree/payment_spec.rb +1087 -0
  101. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  102. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  103. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  104. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  105. data/spec/models/spree/permission_sets/order_display_spec.rb +55 -0
  106. data/spec/models/spree/permission_sets/order_management_spec.rb +42 -0
  107. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  108. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  109. data/spec/models/spree/permission_sets/promotion_display_spec.rb +40 -0
  110. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +41 -0
  113. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +41 -0
  114. data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +50 -0
  115. data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +160 -0
  116. data/spec/models/spree/permission_sets/stock_display_spec.rb +24 -0
  117. data/spec/models/spree/permission_sets/stock_management_spec.rb +22 -0
  118. data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +24 -0
  119. data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +25 -0
  120. data/spec/models/spree/permission_sets/user_display_spec.rb +38 -0
  121. data/spec/models/spree/permission_sets/user_management_spec.rb +48 -0
  122. data/spec/models/spree/preference_spec.rb +80 -0
  123. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  124. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  125. data/spec/models/spree/preferences/scoped_store_spec.rb +60 -0
  126. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  127. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  128. data/spec/models/spree/preferences/store_spec.rb +39 -0
  129. data/spec/models/spree/price_spec.rb +42 -0
  130. data/spec/models/spree/product/scopes_spec.rb +116 -0
  131. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  132. data/spec/models/spree/product_filter_spec.rb +26 -0
  133. data/spec/models/spree/product_property_spec.rb +18 -0
  134. data/spec/models/spree/product_spec.rb +504 -0
  135. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  136. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  137. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  138. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  139. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  140. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +69 -0
  141. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  142. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  143. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  144. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  145. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  146. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  147. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  148. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  149. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  150. data/spec/models/spree/promotion_category_spec.rb +17 -0
  151. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  152. data/spec/models/spree/promotion_code_spec.rb +187 -0
  153. data/spec/models/spree/promotion_handler/cart_spec.rb +130 -0
  154. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  155. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  156. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  157. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  158. data/spec/models/spree/promotion_spec.rb +776 -0
  159. data/spec/models/spree/refund_spec.rb +192 -0
  160. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  161. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  162. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  163. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  164. data/spec/models/spree/reimbursement_spec.rb +231 -0
  165. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  166. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  167. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  168. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  169. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  170. data/spec/models/spree/return_authorization_spec.rb +290 -0
  171. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  172. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  173. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  174. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  175. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  176. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  177. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  178. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  179. data/spec/models/spree/return_item_spec.rb +776 -0
  180. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  181. data/spec/models/spree/shipment_spec.rb +753 -0
  182. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  183. data/spec/models/spree/shipping_manifest_spec.rb +94 -0
  184. data/spec/models/spree/shipping_method_spec.rb +88 -0
  185. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  186. data/spec/models/spree/state_spec.rb +14 -0
  187. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  188. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  189. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  190. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  191. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  192. data/spec/models/spree/stock/package_spec.rb +163 -0
  193. data/spec/models/spree/stock/packer_spec.rb +91 -0
  194. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  195. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  196. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  197. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  198. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  199. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  200. data/spec/models/spree/stock_item_spec.rb +444 -0
  201. data/spec/models/spree/stock_location_spec.rb +279 -0
  202. data/spec/models/spree/stock_movement_spec.rb +56 -0
  203. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  204. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  205. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  206. data/spec/models/spree/store_credit_spec.rb +876 -0
  207. data/spec/models/spree/store_spec.rb +55 -0
  208. data/spec/models/spree/tax_category_spec.rb +27 -0
  209. data/spec/models/spree/tax_rate_spec.rb +378 -0
  210. data/spec/models/spree/taxon_spec.rb +74 -0
  211. data/spec/models/spree/taxonomy_spec.rb +18 -0
  212. data/spec/models/spree/tracker_spec.rb +21 -0
  213. data/spec/models/spree/transfer_item_spec.rb +264 -0
  214. data/spec/models/spree/unit_cancel_spec.rb +149 -0
  215. data/spec/models/spree/user_spec.rb +246 -0
  216. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  217. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  218. data/spec/models/spree/variant_property_rule_condition_spec.rb +15 -0
  219. data/spec/models/spree/variant_property_rule_spec.rb +83 -0
  220. data/spec/models/spree/variant_property_rule_value_spec.rb +18 -0
  221. data/spec/models/spree/variant_spec.rb +601 -0
  222. data/spec/models/spree/zone_spec.rb +305 -0
  223. data/spec/spec_helper.rb +80 -0
  224. data/spec/support/big_decimal.rb +5 -0
  225. data/spec/support/concerns/default_price.rb +34 -0
  226. data/spec/support/dummy_ability.rb +4 -0
  227. data/spec/support/test_gateway.rb +2 -0
  228. metadata +242 -2
@@ -0,0 +1,231 @@
1
+ require 'spec_helper'
2
+
3
+ describe "exchanges:charge_unreturned_items" do
4
+ let(:task) do
5
+ Rake::Task['exchanges:charge_unreturned_items']
6
+ end
7
+
8
+ before do
9
+ Rails.application.load_tasks
10
+ task.reenable
11
+ end
12
+
13
+ subject { task }
14
+
15
+ describe '#prerequisites' do
16
+ it { expect(subject.prerequisites).to include("environment") }
17
+ end
18
+
19
+ before do
20
+ @original_expedited_exchanges_pref = Spree::Config[:expedited_exchanges]
21
+ Spree::Config[:expedited_exchanges] = true
22
+ Spree::StockItem.update_all(count_on_hand: 10)
23
+ end
24
+
25
+ after { Spree::Config[:expedited_exchanges] = @original_expedited_exchanges_pref }
26
+
27
+ context "there are no unreturned items" do
28
+ it { expect { subject.invoke }.not_to change { Spree::Order.count } }
29
+ end
30
+
31
+ context "there are return items in an intermediate return status" do
32
+ let!(:order) { create(:shipped_order, line_items_count: 2) }
33
+ let(:return_item_1) { build(:exchange_return_item, inventory_unit: order.inventory_units.first) }
34
+ let(:return_item_2) { build(:exchange_return_item, inventory_unit: order.inventory_units.last) }
35
+ let!(:rma) { create(:return_authorization, order: order, return_items: [return_item_1, return_item_2]) }
36
+ let!(:tax_rate) { create(:tax_rate, zone: order.tax_zone, tax_category: return_item_2.exchange_variant.tax_category) }
37
+ before do
38
+ rma.save!
39
+ Spree::Shipment.last.ship!
40
+ return_item_1.lost!
41
+ return_item_2.give!
42
+ Timecop.travel (Spree::Config[:expedited_exchanges_days_window] + 1).days
43
+ end
44
+ after { Timecop.return }
45
+ it { expect { subject.invoke }.not_to change { Spree::Order.count } }
46
+ end
47
+
48
+ context "there are unreturned items" do
49
+ let!(:order) { create(:shipped_order, line_items_count: 2) }
50
+ let(:return_item_1) { build(:exchange_return_item, inventory_unit: order.inventory_units.first) }
51
+ let(:return_item_2) { build(:exchange_return_item, inventory_unit: order.inventory_units.last) }
52
+ let!(:rma) { create(:return_authorization, order: order, return_items: [return_item_1, return_item_2]) }
53
+ let!(:tax_rate) { create(:tax_rate, zone: order.tax_zone, tax_category: return_item_2.exchange_variant.tax_category) }
54
+
55
+ before do
56
+ rma.save!
57
+ Spree::Shipment.last.ship!
58
+ return_item_1.receive!
59
+ Timecop.travel travel_time
60
+ end
61
+
62
+ after { Timecop.return }
63
+
64
+ context "fewer than the config allowed days have passed" do
65
+ let(:travel_time) { (Spree::Config[:expedited_exchanges_days_window] - 1).days }
66
+
67
+ it "does not create a new order" do
68
+ expect { subject.invoke }.not_to change { Spree::Order.count }
69
+ end
70
+ end
71
+
72
+ context "more than the config allowed days have passed" do
73
+
74
+ let(:travel_time) { (Spree::Config[:expedited_exchanges_days_window] + 1).days }
75
+
76
+ it "creates a new completed order" do
77
+ expect { subject.invoke }.to change { Spree::Order.count }
78
+ expect(Spree::Order.last).to be_completed
79
+ end
80
+
81
+ it "sets frontend_viewable to false" do
82
+ subject.invoke
83
+ expect(Spree::Order.last).not_to be_frontend_viewable
84
+ end
85
+
86
+ it "moves the shipment for the unreturned items to the new order" do
87
+ subject.invoke
88
+ new_order = Spree::Order.last
89
+ expect(new_order.shipments.count).to eq 1
90
+ expect(return_item_2.reload.exchange_shipment.order).to eq Spree::Order.last
91
+ end
92
+
93
+ it "creates line items on the order for the unreturned items" do
94
+ subject.invoke
95
+ expect(Spree::Order.last.line_items.map(&:variant)).to eq [return_item_2.exchange_variant]
96
+ end
97
+
98
+ it "associates the exchanges inventory units with the new line items" do
99
+ subject.invoke
100
+ expect(return_item_2.reload.exchange_inventory_unit.try(:line_item).try(:order)).to eq Spree::Order.last
101
+ end
102
+
103
+ it "uses the credit card from the previous order" do
104
+ subject.invoke
105
+ new_order = Spree::Order.last
106
+ expect(new_order.credit_cards).to be_present
107
+ expect(new_order.credit_cards.first).to eq order.valid_credit_cards.first
108
+ end
109
+
110
+ context "payments" do
111
+ it "authorizes the order for the full amount of the unreturned items including taxes" do
112
+ expect { subject.invoke }.to change { Spree::Payment.count }.by(1)
113
+ new_order = Spree::Order.last
114
+ expected_amount = return_item_2.reload.exchange_variant.price + new_order.additional_tax_total + new_order.included_tax_total + new_order.shipment_total
115
+ expect(new_order.total).to eq expected_amount
116
+ payment = new_order.payments.first
117
+ expect(payment.amount).to eq expected_amount
118
+ expect(new_order.item_total).to eq return_item_2.reload.exchange_variant.price
119
+ end
120
+
121
+ context "auto_capture_exchanges is true" do
122
+ before do
123
+ @original_auto_capture_exchanges = Spree::Config[:auto_capture_exchanges]
124
+ Spree::Config[:auto_capture_exchanges] = true
125
+ end
126
+
127
+ after { Spree::Config[:auto_capture_exchanges] = @original_auto_capture_exchanges }
128
+
129
+ it 'creates a pending payment' do
130
+ expect { subject.invoke }.to change { Spree::Payment.count }.by(1)
131
+ payment = Spree::Payment.last
132
+ expect(payment).to be_completed
133
+ end
134
+ end
135
+
136
+ context "auto_capture_exchanges is false" do
137
+ before do
138
+ @original_auto_capture_exchanges = Spree::Config[:auto_capture_exchanges]
139
+ Spree::Config[:auto_capture_exchanges] = false
140
+ end
141
+
142
+ after { Spree::Config[:auto_capture_exchanges] = @original_auto_capture_exchanges }
143
+
144
+ it 'captures payment' do
145
+ expect { subject.invoke }.to change { Spree::Payment.count }.by(1)
146
+ payment = Spree::Payment.last
147
+ expect(payment).to be_pending
148
+ end
149
+ end
150
+ end
151
+
152
+ it "does not attempt to create a new order for the item more than once" do
153
+ subject.invoke
154
+ subject.reenable
155
+ expect { subject.invoke }.not_to change { Spree::Order.count }
156
+ end
157
+
158
+ it "associates the store of the original order with the exchange order" do
159
+ store = order.store
160
+ expect(Spree::Order).to receive(:create!).once.with(hash_including({store_id: store.id})).and_call_original
161
+ subject.invoke
162
+ end
163
+
164
+ it 'approves the order' do
165
+ subject.invoke
166
+ new_order = Spree::Order.last
167
+ expect(new_order).to be_approved
168
+ expect(new_order.is_risky?).to eq false
169
+ expect(new_order.approver_name).to eq "Spree::UnreturnedItemCharger"
170
+ expect(new_order.approver).to be nil
171
+ end
172
+
173
+ context "there is no card from the previous order" do
174
+ let!(:credit_card) { create(:credit_card, user: order.user, default: true, gateway_customer_profile_id: "BGS-123") }
175
+ before { allow_any_instance_of(Spree::Order).to receive(:valid_credit_cards) { [] } }
176
+
177
+ it "attempts to use the user's default card" do
178
+ expect { subject.invoke }.to change { Spree::Payment.count }.by(1)
179
+ new_order = Spree::Order.last
180
+ expect(new_order.credit_cards).to be_present
181
+ expect(new_order.credit_cards.first).to eq credit_card
182
+ end
183
+ end
184
+
185
+ context "it is unable to authorize the credit card" do
186
+ before { allow_any_instance_of(Spree::Payment).to receive(:authorize!).and_raise(RuntimeError) }
187
+
188
+ it "raises an error with the order" do
189
+ expect { subject.invoke }.to raise_error(Spree::ChargeUnreturnedItemsFailures)
190
+ end
191
+ end
192
+
193
+ context "the exchange inventory unit is not shipped" do
194
+ before { return_item_2.reload.exchange_inventory_unit.update_columns(state: "on hand") }
195
+ it "does not create a new order" do
196
+ expect { subject.invoke }.not_to change { Spree::Order.count }
197
+ end
198
+ end
199
+
200
+ context "the exchange inventory unit has been returned" do
201
+ before { return_item_2.reload.exchange_inventory_unit.update_columns(state: "returned") }
202
+ it "does not create a new order" do
203
+ expect { subject.invoke }.not_to change { Spree::Order.count }
204
+ end
205
+ end
206
+
207
+ context 'rma for unreturned exchanges' do
208
+ context 'config to not create' do
209
+ before { Spree::Config[:create_rma_for_unreturned_exchange] = false }
210
+
211
+ it 'does not create rma' do
212
+ expect { subject.invoke }.not_to change { Spree::ReturnAuthorization.count }
213
+ end
214
+ end
215
+
216
+ context 'config to create' do
217
+ before do
218
+ Spree::Config[:create_rma_for_unreturned_exchange] = true
219
+ end
220
+
221
+ it 'creates with return items' do
222
+ expect { subject.invoke }.to change { Spree::ReturnAuthorization.count }
223
+ rma = Spree::ReturnAuthorization.last
224
+
225
+ expect(rma.return_items.all?(&:awaiting?)).to be true
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,115 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'spree:migrations:copy_shipped_shipments_to_cartons' do
4
+ before do
5
+ Rails.application.load_tasks
6
+ task.reenable
7
+ end
8
+
9
+ describe 'up' do
10
+ let(:task) do
11
+ Rake::Task['spree:migrations:copy_shipped_shipments_to_cartons:up']
12
+ end
13
+
14
+ # should generate a carton
15
+ let!(:shipped_shipment) { shipped_order.shipments.first }
16
+ # should not generate a carton because it's not shipped
17
+ let!(:unshipped_shipment) { create(:shipment) }
18
+ # should not generate a carton because it has no inventory units
19
+ let!(:shipped_shipment_without_units) do
20
+ shipped_order_without_units.shipments.first
21
+ end
22
+ # should not generate a carton because it already has a carton
23
+ let!(:shipped_and_cartonized_shipment) do
24
+ shipped_and_cartonized_order.shipments.first
25
+ end
26
+
27
+ let(:shipped_order) { create(:shipped_order, line_items_count: 1, with_cartons: false) }
28
+
29
+ let(:shipped_order_without_units) do
30
+ create(:shipped_order, line_items_count: 1) do |order|
31
+ order.inventory_units.delete_all
32
+ end
33
+ end
34
+
35
+ let(:shipped_and_cartonized_order) do
36
+ create(:order_ready_to_ship, line_items_count: 1).tap do |order|
37
+ order.shipping.ship_shipment(order.shipments.first)
38
+ end
39
+ end
40
+
41
+ it 'creates the expected carton' do
42
+ expect {
43
+ task.invoke
44
+ }.to change { Spree::Carton.count }.by(1)
45
+
46
+ carton = Spree::Carton.last
47
+
48
+ expect(carton).to be_valid
49
+
50
+ expect(carton.imported_from_shipment_id).to eq shipped_shipment.id
51
+ expect(carton.orders).to eq [shipped_order]
52
+
53
+ expect(carton.number).to eq "C#{shipped_shipment.number}"
54
+ expect(carton.stock_location).to eq shipped_shipment.stock_location
55
+ expect(carton.address).to eq shipped_shipment.address
56
+ expect(carton.shipping_method).to eq shipped_shipment.shipping_method
57
+ expect(carton.tracking).to eq shipped_shipment.tracking
58
+ expect(carton.shipped_at).to eq shipped_shipment.shipped_at
59
+ expect(carton.created_at).to be_present
60
+ expect(carton.updated_at).to be_present
61
+
62
+ expect(carton.inventory_units).to match_array shipped_shipment.inventory_units
63
+ end
64
+
65
+ describe 'when run a second time' do
66
+ before do
67
+ task.invoke
68
+ task.reenable
69
+ end
70
+
71
+ let!(:second_shipped_shipment) { second_shipped_order.shipments.first }
72
+
73
+ let(:second_shipped_order) { create(:shipped_order, line_items_count: 1, with_cartons: false) }
74
+
75
+ it 'creates only a carton for the second shipment' do
76
+ expect {
77
+ task.invoke
78
+ }.to change { Spree::Carton.count }.by(1)
79
+
80
+ carton = Spree::Carton.last
81
+
82
+ expect(carton.imported_from_shipment_id).to eq second_shipped_shipment.id
83
+ expect(carton.orders).to eq [second_shipped_order]
84
+ end
85
+ end
86
+ end
87
+
88
+ describe 'down' do
89
+ let(:task) do
90
+ Rake::Task['spree:migrations:copy_shipped_shipments_to_cartons:down']
91
+ end
92
+
93
+ let!(:migrated_carton) { create(:carton) }
94
+ let!(:preexisting_carton) { create(:carton) }
95
+
96
+ let!(:migrated_carton_inventory_units) { migrated_carton.inventory_units.to_a }
97
+ let!(:preexisting_carton_inventory_units) { preexisting_carton.inventory_units.to_a }
98
+
99
+ before do
100
+ migrated_carton.update!(imported_from_shipment_id: migrated_carton.inventory_units.first.shipment_id)
101
+ end
102
+
103
+ it 'clears out the correct carton' do
104
+ expect {
105
+ task.invoke
106
+ }.to change { Spree::Carton.count }.by(-1)
107
+
108
+ expect(Spree::Carton.find_by(id: migrated_carton.id)).to be_nil
109
+
110
+ expect(migrated_carton_inventory_units.map(&:reload).map(&:carton_id)).to all(be_nil)
111
+ expect(preexisting_carton_inventory_units.map(&:reload).map(&:carton_id)).to all(eq preexisting_carton.id)
112
+ end
113
+ end
114
+
115
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe "order_capturing:capture_payments" do
4
+ let(:task) do
5
+ Rake::Task['order_capturing:capture_payments']
6
+ end
7
+
8
+ before do
9
+ Rails.application.load_tasks
10
+ task.reenable
11
+ end
12
+
13
+ subject { task }
14
+
15
+ describe '#prerequisites' do
16
+ subject { super().prerequisites }
17
+ it { is_expected.to include("environment") }
18
+ end
19
+ let(:order) { create(:completed_order_with_pending_payment, line_items_count: 2) }
20
+ let(:payment) { order.payments.first }
21
+
22
+ context "with a mix of canceled and shipped inventory" do
23
+ before do
24
+ Spree::OrderCancellations.new(order).short_ship([order.inventory_units.first])
25
+ order.shipping.ship_shipment(order.shipments.first)
26
+ order.update_attributes!(payment_state: 'balance_due')
27
+ end
28
+
29
+ it "charges the order" do
30
+ expect(order.inventory_units.any?(&:on_hand?)).to eq false
31
+ expect(order.inventory_units.all? {|iu| iu.canceled? || iu.shipped? }).to eq true
32
+ expect {
33
+ expect { subject.invoke }.to change { payment.reload.state }.to('completed')
34
+ }.to change { order.reload.payment_state }.to('paid')
35
+ end
36
+
37
+ context "when there is an error capturing payment" do
38
+ before do
39
+ allow_any_instance_of(Spree::OrderCapturing).to receive(:capture_payments).and_raise(StateMachines::InvalidTransition)
40
+ end
41
+
42
+ it "raises a OrderCapturingFailures" do
43
+ expect { subject.invoke }.to raise_error(Spree::OrderCapturingFailures)
44
+ end
45
+ end
46
+ end
47
+
48
+ context "with any inventory not shipped or canceled" do
49
+ it "does not charge for the order" do
50
+ expect(order.inventory_units.any?(&:on_hand?)).to eq true
51
+ expect {
52
+ expect { subject.invoke }.not_to change { payment.reload }
53
+ }.not_to change { order.reload.payment_state }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+ require 'email_spec'
3
+
4
+ describe Spree::CartonMailer do
5
+ include EmailSpec::Helpers
6
+ include EmailSpec::Matchers
7
+
8
+ let(:carton) { create(:carton) }
9
+ let(:order) { carton.orders.first }
10
+
11
+ # Regression test for #2196
12
+ it "doesn't include out of stock in the email body" do
13
+ shipment_email = Spree::CartonMailer.shipped_email(order: order, carton: carton)
14
+ expect(shipment_email.body).not_to include(%Q{Out of Stock})
15
+ expect(shipment_email.body).to include(%Q{Your order has been shipped})
16
+ expect(shipment_email.subject).to eq "#{order.store.name} Shipment Notification ##{order.number}"
17
+ end
18
+
19
+ context "deprecated signature" do
20
+ it do
21
+ ActiveSupport::Deprecation.silence do
22
+ mail = Spree::CartonMailer.shipped_email(carton.id)
23
+ expect(mail.subject).to include "Shipment Notification"
24
+ end
25
+ end
26
+ end
27
+
28
+ context "with resend option" do
29
+ subject do
30
+ Spree::CartonMailer.shipped_email(order: order, carton: carton, resend: true).subject
31
+ end
32
+ it { is_expected.to match /^\[RESEND\] / }
33
+ end
34
+
35
+ context "emails must be translatable" do
36
+ context "shipped_email" do
37
+ context "pt-BR locale" do
38
+ before do
39
+ pt_br_shipped_email = { :spree => { :shipment_mailer => { :shipped_email => { :dear_customer => 'Caro Cliente,' } } } }
40
+ I18n.backend.store_translations :'pt-BR', pt_br_shipped_email
41
+ I18n.locale = :'pt-BR'
42
+ end
43
+
44
+ after do
45
+ I18n.locale = I18n.default_locale
46
+ end
47
+
48
+ specify do
49
+ shipped_email = Spree::CartonMailer.shipped_email(order: order, carton: carton)
50
+ expect(shipped_email.body).to include("Caro Cliente,")
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end