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,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,283 @@
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
+ end
74
+
75
+ it "is backordered" do
76
+ allow(order).to receive_messages backordered?: true
77
+ updater.update_shipment_state
78
+
79
+ expect(order.shipment_state).to eq('backorder')
80
+ end
81
+
82
+ it "is nil" do
83
+ updater.update_shipment_state
84
+ expect(order.shipment_state).to be_nil
85
+ end
86
+
87
+
88
+ ["shipped", "ready", "pending"].each do |state|
89
+ it "is #{state}" do
90
+ create(:shipment, order: order, state: state)
91
+ updater.update_shipment_state
92
+ expect(order.shipment_state).to eq(state)
93
+ end
94
+ end
95
+
96
+ it "is partial" do
97
+ create(:shipment, order: order, state: 'pending')
98
+ create(:shipment, order: order, state: 'ready')
99
+ updater.update_shipment_state
100
+ expect(order.shipment_state).to eq('partial')
101
+ end
102
+ end
103
+
104
+ context "updating payment state" do
105
+ let(:order) { Order.new }
106
+ let(:updater) { order.updater }
107
+ before { allow(order).to receive(:refund_total).and_return(0) }
108
+
109
+ context 'no valid payments with non-zero order total' do
110
+ it "is failed" do
111
+ create(:payment, order: order, state: 'invalid')
112
+ order.total = 1
113
+ order.payment_total = 0
114
+
115
+ updater.update_payment_state
116
+ expect(order.payment_state).to eq('failed')
117
+ end
118
+ end
119
+
120
+ context 'invalid payments are present but order total is zero' do
121
+ it 'is paid' do
122
+ order.payments << Spree::Payment.new(state: 'invalid')
123
+ order.total = 0
124
+ order.payment_total = 0
125
+
126
+ expect {
127
+ updater.update_payment_state
128
+ }.to change { order.payment_state }.to 'paid'
129
+ end
130
+ end
131
+
132
+ context "payment total is greater than order total" do
133
+ it "is credit_owed" do
134
+ order.payment_total = 2
135
+ order.total = 1
136
+
137
+ expect {
138
+ updater.update_payment_state
139
+ }.to change { order.payment_state }.to 'credit_owed'
140
+ end
141
+ end
142
+
143
+ context "order total is greater than payment total" do
144
+ it "is balance_due" do
145
+ order.payment_total = 1
146
+ order.total = 2
147
+
148
+ expect {
149
+ updater.update_payment_state
150
+ }.to change { order.payment_state }.to 'balance_due'
151
+ end
152
+ end
153
+
154
+ context "order total equals payment total" do
155
+ it "is paid" do
156
+ order.payment_total = 30
157
+ order.total = 30
158
+
159
+ expect {
160
+ updater.update_payment_state
161
+ }.to change { order.payment_state }.to 'paid'
162
+ end
163
+ end
164
+
165
+ context "order is canceled" do
166
+
167
+ before do
168
+ order.state = 'canceled'
169
+ end
170
+
171
+ context "and is still unpaid" do
172
+ it "is void" do
173
+ order.payment_total = 0
174
+ order.total = 30
175
+ expect {
176
+ updater.update_payment_state
177
+ }.to change { order.payment_state }.to 'void'
178
+ end
179
+ end
180
+
181
+ context "and is paid" do
182
+
183
+ it "is credit_owed" do
184
+ order.payment_total = 30
185
+ order.total = 30
186
+ create(:payment, order: order, state: 'completed', amount: 30)
187
+ expect {
188
+ updater.update_payment_state
189
+ }.to change { order.payment_state }.to 'credit_owed'
190
+ end
191
+
192
+ end
193
+
194
+ context "and payment is refunded" do
195
+ it "is void" do
196
+ order.payment_total = 0
197
+ order.total = 30
198
+ expect {
199
+ updater.update_payment_state
200
+ }.to change { order.payment_state }.to 'void'
201
+ end
202
+ end
203
+ end
204
+
205
+ end
206
+
207
+ it "state change" do
208
+ order.shipment_state = 'shipped'
209
+ state_changes = double
210
+ allow(order).to receive_messages state_changes: state_changes
211
+ expect(state_changes).to receive(:create).with(
212
+ previous_state: nil,
213
+ next_state: 'shipped',
214
+ name: 'shipment',
215
+ user_id: nil
216
+ )
217
+
218
+ order.state_changed('shipment')
219
+ end
220
+
221
+ context "completed order" do
222
+ before { allow(order).to receive_messages completed?: true }
223
+
224
+ it "updates payment state" do
225
+ expect(updater).to receive(:update_payment_state)
226
+ updater.update
227
+ end
228
+
229
+ it "updates shipment state" do
230
+ expect(updater).to receive(:update_shipment_state)
231
+ updater.update
232
+ end
233
+
234
+ context 'with a shipment' do
235
+ before { create(:shipment, order: order) }
236
+ let(:shipment){ order.shipments[0] }
237
+
238
+ it "updates each shipment" do
239
+ expect(shipment).to receive(:update!)
240
+ updater.update_shipments
241
+ end
242
+
243
+ it "refreshes shipment rates" do
244
+ expect(shipment).to receive(:refresh_rates)
245
+ updater.update_shipments
246
+ end
247
+
248
+ it "updates the shipment amount" do
249
+ expect(shipment).to receive(:update_amounts)
250
+ updater.update_shipments
251
+ end
252
+ end
253
+ end
254
+
255
+ context "incompleted order" do
256
+ before { allow(order).to receive_messages completed?: false }
257
+
258
+ it "doesnt update payment state" do
259
+ expect(updater).not_to receive(:update_payment_state)
260
+ updater.update
261
+ end
262
+
263
+ it "doesnt update shipment state" do
264
+ expect(updater).not_to receive(:update_shipment_state)
265
+ updater.update
266
+ end
267
+
268
+ it "doesnt update each shipment" do
269
+ shipment = stub_model(Spree::Shipment)
270
+ shipments = [shipment]
271
+ allow(order).to receive_messages shipments: shipments
272
+ allow(shipments).to receive_messages states: []
273
+ allow(shipments).to receive_messages ready: []
274
+ allow(shipments).to receive_messages pending: []
275
+ allow(shipments).to receive_messages shipped: []
276
+
277
+ allow(updater).to receive(:update_totals) # Otherwise this gets called and causes a scene
278
+ expect(updater).not_to receive(:update_shipments).with(order)
279
+ updater.update
280
+ end
281
+ end
282
+ end
283
+ 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