solidus_core 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +16 -0
  5. data/script/rails +9 -0
  6. data/solidus_core.gemspec +48 -0
  7. data/spec/fixtures/thinking-cat.jpg +0 -0
  8. data/spec/helpers/base_helper_spec.rb +173 -0
  9. data/spec/helpers/order_helper_spec.rb +12 -0
  10. data/spec/helpers/products_helper_spec.rb +220 -0
  11. data/spec/helpers/taxons_helper_spec.rb +17 -0
  12. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  13. data/spec/lib/i18n_spec.rb +123 -0
  14. data/spec/lib/search/base_spec.rb +86 -0
  15. data/spec/lib/search/variant_spec.rb +92 -0
  16. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +66 -0
  17. data/spec/lib/spree/core/controller_helpers/order_spec.rb +92 -0
  18. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  19. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  20. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  21. data/spec/lib/spree/core/current_store_spec.rb +36 -0
  22. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  23. data/spec/lib/spree/core/importer/order_spec.rb +431 -0
  24. data/spec/lib/spree/core/role_configuration_spec.rb +138 -0
  25. data/spec/lib/spree/core/validators/email_spec.rb +48 -0
  26. data/spec/lib/spree/localized_number_spec.rb +38 -0
  27. data/spec/lib/spree/migrations_spec.rb +36 -0
  28. data/spec/lib/spree/money_spec.rb +127 -0
  29. data/spec/lib/tasks/exchanges_spec.rb +231 -0
  30. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +115 -0
  31. data/spec/lib/tasks/order_capturing_spec.rb +56 -0
  32. data/spec/mailers/carton_mailer_spec.rb +43 -0
  33. data/spec/mailers/order_mailer_spec.rb +122 -0
  34. data/spec/mailers/reimbursement_mailer_spec.rb +40 -0
  35. data/spec/mailers/test_mailer_spec.rb +15 -0
  36. data/spec/models/spree/ability_spec.rb +276 -0
  37. data/spec/models/spree/address_spec.rb +250 -0
  38. data/spec/models/spree/adjustment_reason_spec.rb +13 -0
  39. data/spec/models/spree/adjustment_spec.rb +177 -0
  40. data/spec/models/spree/app_configuration_spec.rb +20 -0
  41. data/spec/models/spree/asset_spec.rb +24 -0
  42. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  43. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  44. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  45. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  46. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  47. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  48. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  49. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  50. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  51. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  52. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  53. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +30 -0
  54. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +36 -0
  55. data/spec/models/spree/calculator/tiered_percent_spec.rb +47 -0
  56. data/spec/models/spree/calculator_spec.rb +36 -0
  57. data/spec/models/spree/carton_spec.rb +133 -0
  58. data/spec/models/spree/classification_spec.rb +15 -0
  59. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  60. data/spec/models/spree/concerns/user_methods_spec.rb +41 -0
  61. data/spec/models/spree/credit_card_spec.rb +334 -0
  62. data/spec/models/spree/customer_return_spec.rb +276 -0
  63. data/spec/models/spree/exchange_spec.rb +79 -0
  64. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  65. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  66. data/spec/models/spree/gateway_spec.rb +82 -0
  67. data/spec/models/spree/inventory_unit_spec.rb +307 -0
  68. data/spec/models/spree/item_adjustments_spec.rb +256 -0
  69. data/spec/models/spree/line_item_spec.rb +191 -0
  70. data/spec/models/spree/option_type_spec.rb +14 -0
  71. data/spec/models/spree/option_value_spec.rb +22 -0
  72. data/spec/models/spree/order/address_spec.rb +50 -0
  73. data/spec/models/spree/order/adjustments_spec.rb +39 -0
  74. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  75. data/spec/models/spree/order/checkout_spec.rb +902 -0
  76. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  77. data/spec/models/spree/order/finalizing_spec.rb +111 -0
  78. data/spec/models/spree/order/payment_spec.rb +210 -0
  79. data/spec/models/spree/order/risk_assessment_spec.rb +68 -0
  80. data/spec/models/spree/order/state_machine_spec.rb +221 -0
  81. data/spec/models/spree/order/tax_spec.rb +84 -0
  82. data/spec/models/spree/order/totals_spec.rb +24 -0
  83. data/spec/models/spree/order/updating_spec.rb +18 -0
  84. data/spec/models/spree/order/validations_spec.rb +15 -0
  85. data/spec/models/spree/order_cancellations_spec.rb +120 -0
  86. data/spec/models/spree/order_capturing_spec.rb +116 -0
  87. data/spec/models/spree/order_contents_spec.rb +265 -0
  88. data/spec/models/spree/order_inventory_spec.rb +228 -0
  89. data/spec/models/spree/order_mutex_spec.rb +85 -0
  90. data/spec/models/spree/order_promotion_spec.rb +31 -0
  91. data/spec/models/spree/order_shipping_spec.rb +247 -0
  92. data/spec/models/spree/order_spec.rb +1412 -0
  93. data/spec/models/spree/order_stock_location_spec.rb +18 -0
  94. data/spec/models/spree/order_updater_spec.rb +299 -0
  95. data/spec/models/spree/payment_method/store_credit_spec.rb +294 -0
  96. data/spec/models/spree/payment_method_spec.rb +96 -0
  97. data/spec/models/spree/payment_spec.rb +1044 -0
  98. data/spec/models/spree/permission_sets/base_spec.rb +12 -0
  99. data/spec/models/spree/permission_sets/configuration_display.rb +82 -0
  100. data/spec/models/spree/permission_sets/configuration_management_spec.rb +50 -0
  101. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +22 -0
  102. data/spec/models/spree/permission_sets/order_display_spec.rb +49 -0
  103. data/spec/models/spree/permission_sets/order_management_spec.rb +36 -0
  104. data/spec/models/spree/permission_sets/product_display_spec.rb +60 -0
  105. data/spec/models/spree/permission_sets/product_management_spec.rb +40 -0
  106. data/spec/models/spree/permission_sets/promotion_display_spec.rb +34 -0
  107. data/spec/models/spree/permission_sets/promotion_management_spec.rb +26 -0
  108. data/spec/models/spree/permission_sets/report_display_spec.rb +24 -0
  109. data/spec/models/spree/permission_sets/restricted_transfer_management_spec.rb +132 -0
  110. data/spec/models/spree/permission_sets/stock_display_spec.rb +26 -0
  111. data/spec/models/spree/permission_sets/stock_management_spec.rb +24 -0
  112. data/spec/models/spree/permission_sets/user_display_spec.rb +36 -0
  113. data/spec/models/spree/permission_sets/user_management_spec.rb +28 -0
  114. data/spec/models/spree/preference_spec.rb +80 -0
  115. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  116. data/spec/models/spree/preferences/preferable_spec.rb +294 -0
  117. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  118. data/spec/models/spree/preferences/static_model_preferences_spec.rb +78 -0
  119. data/spec/models/spree/preferences/statically_configurable_spec.rb +60 -0
  120. data/spec/models/spree/preferences/store_spec.rb +39 -0
  121. data/spec/models/spree/price_spec.rb +42 -0
  122. data/spec/models/spree/product/scopes_spec.rb +148 -0
  123. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  124. data/spec/models/spree/product_filter_spec.rb +26 -0
  125. data/spec/models/spree/product_property_spec.rb +20 -0
  126. data/spec/models/spree/product_spec.rb +437 -0
  127. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +96 -0
  128. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +165 -0
  129. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +115 -0
  130. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +40 -0
  131. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  132. data/spec/models/spree/promotion/rules/item_total_spec.rb +67 -0
  133. data/spec/models/spree/promotion/rules/nth_order_spec.rb +70 -0
  134. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  135. data/spec/models/spree/promotion/rules/option_value_spec.rb +94 -0
  136. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  137. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  138. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  139. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  140. data/spec/models/spree/promotion_builder_spec.rb +118 -0
  141. data/spec/models/spree/promotion_category_spec.rb +17 -0
  142. data/spec/models/spree/promotion_code/code_builder_spec.rb +79 -0
  143. data/spec/models/spree/promotion_code_spec.rb +187 -0
  144. data/spec/models/spree/promotion_handler/cart_spec.rb +114 -0
  145. data/spec/models/spree/promotion_handler/coupon_spec.rb +335 -0
  146. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +47 -0
  147. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  148. data/spec/models/spree/promotion_rule_spec.rb +28 -0
  149. data/spec/models/spree/promotion_spec.rb +767 -0
  150. data/spec/models/spree/refund_spec.rb +204 -0
  151. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  152. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  153. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  154. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  155. data/spec/models/spree/reimbursement_spec.rb +231 -0
  156. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  157. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  158. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  159. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +107 -0
  160. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +97 -0
  161. data/spec/models/spree/return_authorization_spec.rb +290 -0
  162. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  163. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  164. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +85 -0
  165. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  166. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  167. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  168. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  169. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  170. data/spec/models/spree/return_item_spec.rb +775 -0
  171. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  172. data/spec/models/spree/shipment_spec.rb +709 -0
  173. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  174. data/spec/models/spree/shipping_method_spec.rb +88 -0
  175. data/spec/models/spree/shipping_rate_spec.rb +142 -0
  176. data/spec/models/spree/state_spec.rb +14 -0
  177. data/spec/models/spree/stock/availability_validator_spec.rb +83 -0
  178. data/spec/models/spree/stock/coordinator_spec.rb +116 -0
  179. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  180. data/spec/models/spree/stock/estimator_spec.rb +146 -0
  181. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  182. data/spec/models/spree/stock/package_spec.rb +163 -0
  183. data/spec/models/spree/stock/packer_spec.rb +91 -0
  184. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  185. data/spec/models/spree/stock/quantifier_spec.rb +115 -0
  186. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  187. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  188. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +50 -0
  189. data/spec/models/spree/stock/splitter/weight_spec.rb +29 -0
  190. data/spec/models/spree/stock_item_spec.rb +426 -0
  191. data/spec/models/spree/stock_location_spec.rb +279 -0
  192. data/spec/models/spree/stock_movement_spec.rb +56 -0
  193. data/spec/models/spree/stock_transfer_spec.rb +290 -0
  194. data/spec/models/spree/store_credit_category_spec.rb +17 -0
  195. data/spec/models/spree/store_credit_event_spec.rb +314 -0
  196. data/spec/models/spree/store_credit_spec.rb +876 -0
  197. data/spec/models/spree/store_spec.rb +55 -0
  198. data/spec/models/spree/tax_category_spec.rb +27 -0
  199. data/spec/models/spree/tax_rate_spec.rb +378 -0
  200. data/spec/models/spree/taxon_spec.rb +74 -0
  201. data/spec/models/spree/taxonomy_spec.rb +18 -0
  202. data/spec/models/spree/tracker_spec.rb +21 -0
  203. data/spec/models/spree/transfer_item_spec.rb +264 -0
  204. data/spec/models/spree/unit_cancel_spec.rb +148 -0
  205. data/spec/models/spree/user_spec.rb +223 -0
  206. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +23 -0
  207. data/spec/models/spree/variant/scopes_spec.rb +55 -0
  208. data/spec/models/spree/variant_spec.rb +546 -0
  209. data/spec/models/spree/zone_spec.rb +305 -0
  210. data/spec/spec_helper.rb +78 -0
  211. data/spec/support/big_decimal.rb +5 -0
  212. data/spec/support/concerns/default_price.rb +34 -0
  213. data/spec/support/dummy_ability.rb +4 -0
  214. data/spec/support/test_gateway.rb +2 -0
  215. metadata +229 -3
  216. data/lib/spree/testing_support/rspec-activemodel-mocks_patch.rb +0 -8
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe OrderStockLocation do
5
+ describe ".fulfill_for_order_with_stock_location" do
6
+ subject { OrderStockLocation.fulfill_for_order_with_stock_location(order, stock_location) }
7
+
8
+ let(:order) { create(:order) }
9
+ let(:stock_location) { create(:stock_location) }
10
+ let!(:order_stock_location) { Spree::OrderStockLocation.create!(order: order, stock_location: stock_location) }
11
+
12
+ it "fulfills the shipment for the order and stock location combination" do
13
+ subject
14
+ expect(order_stock_location.reload.shipment_fulfilled).to eq(true)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,299 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe OrderUpdater, type: :model do
5
+ let(:order) { Spree::Order.create }
6
+ let(:updater) { Spree::OrderUpdater.new(order) }
7
+
8
+ context "order totals" do
9
+ before do
10
+ 2.times do
11
+ create(:line_item, order: order, price: 10)
12
+ end
13
+ end
14
+
15
+ it "updates payment totals" do
16
+ create(:payment_with_refund, order: order)
17
+ Spree::OrderUpdater.new(order).update_payment_total
18
+ expect(order.payment_total).to eq(40.75)
19
+ end
20
+
21
+ it "update item total" do
22
+ updater.update_item_total
23
+ expect(order.item_total).to eq(20)
24
+ end
25
+
26
+ it "update shipment total" do
27
+ create(:shipment, order: order, cost: 10)
28
+ updater.update_shipment_total
29
+ expect(order.shipment_total).to eq(10)
30
+ end
31
+
32
+ context 'with order promotion followed by line item addition' do
33
+ let(:promotion) { Spree::Promotion.create!(name: "10% off") }
34
+ let(:calculator) { Calculator::FlatPercentItemTotal.new(preferred_flat_percent: 10) }
35
+
36
+ let(:promotion_action) do
37
+ Promotion::Actions::CreateAdjustment.create!({
38
+ calculator: calculator,
39
+ promotion: promotion,
40
+ })
41
+ end
42
+
43
+ before do
44
+ updater.update
45
+ create(:adjustment, source: promotion_action, adjustable: order, order: order)
46
+ create(:line_item, :order => order, price: 10) # in addition to the two already created
47
+ updater.update
48
+ end
49
+
50
+ it "updates promotion total" do
51
+ expect(order.promo_total).to eq(-3)
52
+ end
53
+ end
54
+
55
+ it "update order adjustments" do
56
+ # A line item will not have both additional and included tax,
57
+ # so please just humour me for now.
58
+ order.line_items.first.update_columns({
59
+ adjustment_total: 10.05,
60
+ additional_tax_total: 0.05,
61
+ included_tax_total: 0.05,
62
+ })
63
+ updater.update_adjustment_total
64
+ expect(order.adjustment_total).to eq(10.05)
65
+ expect(order.additional_tax_total).to eq(0.05)
66
+ expect(order.included_tax_total).to eq(0.05)
67
+ end
68
+ end
69
+
70
+ context "updating shipment state" do
71
+ before do
72
+ allow(order).to receive_messages backordered?: false
73
+ allow(order).to receive_message_chain(:shipments, :shipped, :count).and_return(0)
74
+ allow(order).to receive_message_chain(:shipments, :ready, :count).and_return(0)
75
+ allow(order).to receive_message_chain(:shipments, :pending, :count).and_return(0)
76
+ end
77
+
78
+ it "is backordered" do
79
+ allow(order).to receive_messages backordered?: true
80
+ updater.update_shipment_state
81
+
82
+ expect(order.shipment_state).to eq('backorder')
83
+ end
84
+
85
+ it "is nil" do
86
+ allow(order).to receive_message_chain(:shipments, :states).and_return([])
87
+ allow(order).to receive_message_chain(:shipments, :count).and_return(0)
88
+
89
+ updater.update_shipment_state
90
+ expect(order.shipment_state).to be_nil
91
+ end
92
+
93
+
94
+ ["shipped", "ready", "pending"].each do |state|
95
+ it "is #{state}" do
96
+ allow(order).to receive_message_chain(:shipments, :states).and_return([state])
97
+ updater.update_shipment_state
98
+ expect(order.shipment_state).to eq(state.to_s)
99
+ end
100
+ end
101
+
102
+ it "is partial" do
103
+ allow(order).to receive_message_chain(:shipments, :states).and_return(["pending", "ready"])
104
+ updater.update_shipment_state
105
+ expect(order.shipment_state).to eq('partial')
106
+ end
107
+ end
108
+
109
+ context "updating payment state" do
110
+ let(:order) { Order.new }
111
+ let(:updater) { order.updater }
112
+
113
+ context 'no valid payments with non-zero order total' do
114
+ it "is failed" do
115
+ allow(order).to receive_message_chain(:payments, :valid, :size).and_return(0)
116
+ order.total = 1
117
+ order.payment_total = 0
118
+
119
+ updater.update_payment_state
120
+ expect(order.payment_state).to eq('failed')
121
+ end
122
+ end
123
+
124
+ context 'invalid payments are present but order total is zero' do
125
+ it 'is paid' do
126
+ order.payments << Spree::Payment.new(state: 'invalid')
127
+ order.total = 0
128
+ order.payment_total = 0
129
+
130
+ expect {
131
+ updater.update_payment_state
132
+ }.to change { order.payment_state }.to 'paid'
133
+ end
134
+ end
135
+
136
+ context "payment total is greater than order total" do
137
+ it "is credit_owed" do
138
+ order.payment_total = 2
139
+ order.total = 1
140
+
141
+ expect {
142
+ updater.update_payment_state
143
+ }.to change { order.payment_state }.to 'credit_owed'
144
+ end
145
+ end
146
+
147
+ context "order total is greater than payment total" do
148
+ it "is balance_due" do
149
+ order.payment_total = 1
150
+ order.total = 2
151
+
152
+ expect {
153
+ updater.update_payment_state
154
+ }.to change { order.payment_state }.to 'balance_due'
155
+ end
156
+ end
157
+
158
+ context "order total equals payment total" do
159
+ it "is paid" do
160
+ order.payment_total = 30
161
+ order.total = 30
162
+
163
+ expect {
164
+ updater.update_payment_state
165
+ }.to change { order.payment_state }.to 'paid'
166
+ end
167
+ end
168
+
169
+ context "order is canceled" do
170
+
171
+ before do
172
+ order.state = 'canceled'
173
+ end
174
+
175
+ context "and is still unpaid" do
176
+ it "is void" do
177
+ order.payment_total = 0
178
+ order.total = 30
179
+ expect {
180
+ updater.update_payment_state
181
+ }.to change { order.payment_state }.to 'void'
182
+ end
183
+ end
184
+
185
+ context "and is paid" do
186
+
187
+ it "is credit_owed" do
188
+ order.payment_total = 30
189
+ order.total = 30
190
+ allow(order).to receive_message_chain(:payments, :valid, :size).and_return(1)
191
+ allow(order).to receive_message_chain(:payments, :completed, :size).and_return(1)
192
+ expect {
193
+ updater.update_payment_state
194
+ }.to change { order.payment_state }.to 'credit_owed'
195
+ end
196
+
197
+ end
198
+
199
+ context "and payment is refunded" do
200
+ it "is void" do
201
+ order.payment_total = 0
202
+ order.total = 30
203
+ expect {
204
+ updater.update_payment_state
205
+ }.to change { order.payment_state }.to 'void'
206
+ end
207
+ end
208
+ end
209
+
210
+ end
211
+
212
+ it "state change" do
213
+ order.shipment_state = 'shipped'
214
+ state_changes = double
215
+ allow(order).to receive_messages state_changes: state_changes
216
+ expect(state_changes).to receive(:create).with(
217
+ previous_state: nil,
218
+ next_state: 'shipped',
219
+ name: 'shipment',
220
+ user_id: nil
221
+ )
222
+
223
+ order.state_changed('shipment')
224
+ end
225
+
226
+ context "completed order" do
227
+ before { allow(order).to receive_messages completed?: true }
228
+
229
+ it "updates payment state" do
230
+ expect(updater).to receive(:update_payment_state)
231
+ updater.update
232
+ end
233
+
234
+ it "updates shipment state" do
235
+ expect(updater).to receive(:update_shipment_state)
236
+ updater.update
237
+ end
238
+
239
+ it "updates each shipment" do
240
+ shipment = stub_model(Spree::Shipment, order: order)
241
+ shipments = [shipment]
242
+ allow(order).to receive_messages shipments: shipments
243
+ allow(shipments).to receive_messages states: []
244
+ allow(shipments).to receive_messages ready: []
245
+ allow(shipments).to receive_messages pending: []
246
+ allow(shipments).to receive_messages shipped: []
247
+
248
+ expect(shipment).to receive(:update!).with(order)
249
+ updater.update_shipments
250
+ end
251
+
252
+ it "refreshes shipment rates" do
253
+ shipment = stub_model(Spree::Shipment, order: order)
254
+ shipments = [shipment]
255
+ allow(order).to receive_messages shipments: shipments
256
+
257
+ expect(shipment).to receive(:refresh_rates)
258
+ updater.update_shipments
259
+ end
260
+
261
+ it "updates the shipment amount" do
262
+ shipment = stub_model(Spree::Shipment, order: order)
263
+ shipments = [shipment]
264
+ allow(order).to receive_messages shipments: shipments
265
+
266
+ expect(shipment).to receive(:update_amounts)
267
+ updater.update_shipments
268
+ end
269
+ end
270
+
271
+ context "incompleted order" do
272
+ before { allow(order).to receive_messages completed?: false }
273
+
274
+ it "doesnt update payment state" do
275
+ expect(updater).not_to receive(:update_payment_state)
276
+ updater.update
277
+ end
278
+
279
+ it "doesnt update shipment state" do
280
+ expect(updater).not_to receive(:update_shipment_state)
281
+ updater.update
282
+ end
283
+
284
+ it "doesnt update each shipment" do
285
+ shipment = stub_model(Spree::Shipment)
286
+ shipments = [shipment]
287
+ allow(order).to receive_messages shipments: shipments
288
+ allow(shipments).to receive_messages states: []
289
+ allow(shipments).to receive_messages ready: []
290
+ allow(shipments).to receive_messages pending: []
291
+ allow(shipments).to receive_messages shipped: []
292
+
293
+ allow(updater).to receive(:update_totals) # Otherwise this gets called and causes a scene
294
+ expect(updater).not_to receive(:update_shipments).with(order)
295
+ updater.update
296
+ end
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,294 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::PaymentMethod::StoreCredit do
4
+ let(:order) { create(:order) }
5
+ let(:payment) { create(:payment, order: order) }
6
+ let(:gateway_options) { payment.gateway_options }
7
+
8
+ context "#authorize" do
9
+ subject do
10
+ Spree::PaymentMethod::StoreCredit.new.authorize(auth_amount, store_credit, gateway_options)
11
+ end
12
+
13
+ let(:auth_amount) { store_credit.amount_remaining * 100 }
14
+ let(:store_credit) { create(:store_credit) }
15
+ let(:gateway_options) { super().merge(originator: originator) }
16
+ let(:originator) { nil }
17
+
18
+ context 'without an invalid store credit' do
19
+ let(:store_credit) { nil }
20
+ let(:auth_amount) { 10 }
21
+
22
+ it "declines an unknown store credit" do
23
+ expect(subject.success?).to be false
24
+ expect(subject.message).to include Spree.t('store_credit.unable_to_find')
25
+ end
26
+ end
27
+
28
+ context 'with insuffient funds' do
29
+ let(:auth_amount) { (store_credit.amount_remaining * 100) + 1 }
30
+
31
+ it "declines a store credit" do
32
+ expect(subject.success?).to be false
33
+ expect(subject.message).to include Spree.t('store_credit.insufficient_funds')
34
+ end
35
+ end
36
+
37
+ context 'when the currency does not match the order currency' do
38
+ let(:store_credit) { create(:store_credit, currency: 'AUD') }
39
+
40
+ it "declines the credit" do
41
+ expect(subject.success?).to be false
42
+ expect(subject.message).to include Spree.t('store_credit.currency_mismatch')
43
+ end
44
+ end
45
+
46
+ context 'with a valid request' do
47
+ it "authorizes a valid store credit" do
48
+ expect(subject.success?).to be true
49
+ expect(subject.authorization).not_to be_nil
50
+ end
51
+
52
+ context 'with an originator' do
53
+ let(:originator) { double('originator') }
54
+
55
+ it 'passes the originator' do
56
+ expect_any_instance_of(Spree::StoreCredit).to receive(:authorize)
57
+ .with(anything, anything, action_originator: originator)
58
+ subject
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ context "#capture" do
65
+ subject do
66
+ Spree::PaymentMethod::StoreCredit.new.capture(capture_amount, auth_code, gateway_options)
67
+ end
68
+
69
+ let(:capture_amount) { 10_00 }
70
+ let(:auth_code) { auth_event.authorization_code }
71
+ let(:gateway_options) { super().merge(originator: originator) }
72
+
73
+ let(:authorized_amount) { capture_amount/100.0 }
74
+ let(:auth_event) { create(:store_credit_auth_event, store_credit: store_credit, amount: authorized_amount) }
75
+ let(:store_credit) { create(:store_credit, amount_authorized: authorized_amount) }
76
+ let(:originator) { nil }
77
+
78
+ context 'with an invalid auth code' do
79
+ let(:auth_code) { -1 }
80
+
81
+ it "declines an unknown store credit" do
82
+ expect(subject.success?).to be false
83
+ expect(subject.message).to include Spree.t('store_credit.unable_to_find')
84
+ end
85
+ end
86
+
87
+ context 'when unable to authorize the amount' do
88
+ let(:authorized_amount) { (capture_amount-1)/100 }
89
+
90
+ before do
91
+ allow_any_instance_of(Spree::StoreCredit).to receive_messages(authorize: true)
92
+ end
93
+
94
+ it "declines a store credit" do
95
+ expect(subject.success?).to be false
96
+ expect(subject.message).to include Spree.t('store_credit.insufficient_authorized_amount')
97
+ end
98
+ end
99
+
100
+ context 'when the currency does not match the order currency' do
101
+ let(:store_credit) { create(:store_credit, currency: 'AUD', amount_authorized: authorized_amount) }
102
+
103
+ it "declines the credit" do
104
+ expect(subject.success?).to be false
105
+ expect(subject.message).to include Spree.t('store_credit.currency_mismatch')
106
+ end
107
+ end
108
+
109
+ context 'with a valid request' do
110
+ it "captures the store credit" do
111
+ expect(subject.message).to include Spree.t('store_credit.successful_action', action: Spree::StoreCredit::CAPTURE_ACTION)
112
+ expect(subject.success?).to be true
113
+ end
114
+
115
+ context 'with an originator' do
116
+ let(:originator) { double('originator') }
117
+
118
+ it 'passes the originator' do
119
+ expect_any_instance_of(Spree::StoreCredit).to receive(:capture)
120
+ .with(anything, anything, anything, action_originator: originator)
121
+ subject
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ context "#void" do
128
+ subject do
129
+ Spree::PaymentMethod::StoreCredit.new.void(auth_code, gateway_options)
130
+ end
131
+
132
+ let(:auth_code) { auth_event.authorization_code }
133
+ let(:gateway_options) { super().merge(originator: originator) }
134
+ let(:auth_event) { create(:store_credit_auth_event) }
135
+ let(:originator) { nil }
136
+
137
+ context 'with an invalid auth code' do
138
+ let(:auth_code) { 1 }
139
+
140
+ it "declines an unknown store credit" do
141
+ expect(subject.success?).to be false
142
+ expect(subject.message).to include Spree.t('store_credit.unable_to_find')
143
+ end
144
+ end
145
+
146
+ context 'when the store credit is not voided successfully' do
147
+ before { allow_any_instance_of(Spree::StoreCredit).to receive_messages(void: false) }
148
+
149
+ it "returns an error response" do
150
+ expect(subject.success?).to be false
151
+ end
152
+ end
153
+
154
+ it "voids a valid store credit void request" do
155
+ expect(subject.success?).to be true
156
+ expect(subject.message).to include Spree.t('store_credit.successful_action', action: Spree::StoreCredit::VOID_ACTION)
157
+ end
158
+
159
+ context 'with an originator' do
160
+ let(:originator) { double('originator') }
161
+
162
+ it 'passes the originator' do
163
+ expect_any_instance_of(Spree::StoreCredit).to receive(:void)
164
+ .with(anything, action_originator: originator)
165
+ subject
166
+ end
167
+ end
168
+ end
169
+
170
+ context "#purchase" do
171
+ it "declines a purchase if it can't find a pending credit for the correct amount" do
172
+ amount = 100.0
173
+ store_credit = create(:store_credit)
174
+ auth_code = store_credit.generate_authorization_code
175
+ store_credit.store_credit_events.create!(action: Spree::StoreCredit::ELIGIBLE_ACTION,
176
+ amount: amount,
177
+ authorization_code: auth_code)
178
+ store_credit.store_credit_events.create!(action: Spree::StoreCredit::CAPTURE_ACTION,
179
+ amount: amount,
180
+ authorization_code: auth_code)
181
+
182
+ resp = subject.purchase(amount * 100.0, store_credit, gateway_options)
183
+ expect(resp.success?).to be false
184
+ expect(resp.message).to include Spree.t('store_credit.unable_to_find')
185
+ end
186
+
187
+ it "captures a purchase if it can find a pending credit for the correct amount" do
188
+ amount = 100.0
189
+ store_credit = create(:store_credit)
190
+ auth_code = store_credit.generate_authorization_code
191
+ store_credit.store_credit_events.create!(action: Spree::StoreCredit::ELIGIBLE_ACTION,
192
+ amount: amount,
193
+ authorization_code: auth_code)
194
+
195
+ resp = subject.purchase(amount * 100.0, store_credit, gateway_options)
196
+ expect(resp.success?).to be true
197
+ expect(resp.message).to include Spree.t('store_credit.successful_action', action: Spree::StoreCredit::CAPTURE_ACTION)
198
+ end
199
+ end
200
+
201
+ context "#credit" do
202
+ subject do
203
+ Spree::PaymentMethod::StoreCredit.new.credit(credit_amount, auth_code, gateway_options)
204
+ end
205
+
206
+ let(:credit_amount) { 100.0 }
207
+ let(:auth_code) { auth_event.authorization_code }
208
+ let(:gateway_options) { super().merge(originator: originator) }
209
+ let(:auth_event) { create(:store_credit_auth_event) }
210
+ let(:originator) { nil }
211
+
212
+ context 'with an invalid auth code' do
213
+ let(:auth_code) { 1 }
214
+
215
+ it "declines an unknown store credit" do
216
+ expect(subject.success?).to be false
217
+ expect(subject.message).to include Spree.t('store_credit.unable_to_find')
218
+ end
219
+ end
220
+
221
+ context "when the store credit isn't credited successfully" do
222
+ before { allow_any_instance_of(Spree::StoreCredit).to receive_messages(credit: false) }
223
+
224
+ it "returns an error response" do
225
+ expect(subject.success?).to be false
226
+ end
227
+ end
228
+
229
+ context 'with a valid credit request' do
230
+ before { allow_any_instance_of(Spree::StoreCredit).to receive_messages(credit: true) }
231
+
232
+ it "credits a valid store credit credit request" do
233
+ expect(subject.success?).to be true
234
+ expect(subject.message).to include Spree.t('store_credit.successful_action', action: Spree::StoreCredit::CREDIT_ACTION)
235
+ end
236
+ end
237
+
238
+ context 'with an originator' do
239
+ let(:originator) { double('originator') }
240
+
241
+ it 'passes the originator' do
242
+ expect_any_instance_of(Spree::StoreCredit).to receive(:credit)
243
+ .with(anything, anything, anything, action_originator: originator)
244
+ subject
245
+ end
246
+ end
247
+ end
248
+
249
+ context "#cancel" do
250
+ subject do
251
+ Spree::PaymentMethod::StoreCredit.new.cancel(auth_code)
252
+ end
253
+
254
+ let(:store_credit) { create(:store_credit, amount_used: captured_amount) }
255
+ let(:auth_code) { "1-SC-20141111111111" }
256
+ let(:captured_amount) { 10.0 }
257
+
258
+ context "capture event found" do
259
+ let!(:store_credit_event) { create(:store_credit_capture_event,
260
+ authorization_code: auth_code,
261
+ amount: captured_amount,
262
+ store_credit: store_credit) }
263
+
264
+ it "creates a store credit for the same amount that was captured" do
265
+ expect_any_instance_of(Spree::StoreCredit).to receive(:credit).with(captured_amount, auth_code, store_credit.currency)
266
+ subject
267
+ end
268
+ end
269
+
270
+ context "capture event not found" do
271
+ context "auth event found" do
272
+ let!(:store_credit_event) { create(:store_credit_auth_event,
273
+ authorization_code: auth_code,
274
+ amount: captured_amount,
275
+ store_credit: store_credit) }
276
+
277
+ it "creates a store credit for the same amount that was captured" do
278
+ expect_any_instance_of(Spree::StoreCredit).to receive(:void).with(auth_code)
279
+ subject
280
+ end
281
+ end
282
+
283
+ context "store credit event not found" do
284
+ subject do
285
+ Spree::PaymentMethod::StoreCredit.new.cancel('INVALID')
286
+ end
287
+
288
+ it "returns false" do
289
+ expect(subject).to be false
290
+ end
291
+ end
292
+ end
293
+ end
294
+ end