spree_core 3.0.5 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile +3 -0
  4. data/Rakefile +30 -0
  5. data/app/assets/javascripts/spree.js.coffee.erb +1 -1
  6. data/app/models/spree/ability.rb +1 -1
  7. data/app/models/spree/base.rb +3 -1
  8. data/app/models/spree/order_updater.rb +2 -1
  9. data/app/models/spree/price.rb +7 -12
  10. data/app/models/spree/product.rb +3 -2
  11. data/app/models/spree/reimbursement.rb +1 -1
  12. data/app/models/spree/state.rb +2 -0
  13. data/app/models/spree/zone.rb +1 -1
  14. data/lib/spree/core/version.rb +1 -1
  15. data/lib/spree/testing_support/shoulda_matcher_configuration.rb +6 -0
  16. data/script/rails +9 -0
  17. data/spec/fixtures/thinking-cat.jpg +0 -0
  18. data/spec/helpers/base_helper_spec.rb +137 -0
  19. data/spec/helpers/products_helper_spec.rb +224 -0
  20. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  21. data/spec/lib/i18n_spec.rb +123 -0
  22. data/spec/lib/search/base_spec.rb +86 -0
  23. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +101 -0
  24. data/spec/lib/spree/core/controller_helpers/order_spec.rb +95 -0
  25. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  26. data/spec/lib/spree/core/controller_helpers/store_spec.rb +16 -0
  27. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  28. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  29. data/spec/lib/spree/core/importer/order_spec.rb +502 -0
  30. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  31. data/spec/lib/spree/localized_number_spec.rb +38 -0
  32. data/spec/lib/spree/migrations_spec.rb +34 -0
  33. data/spec/lib/spree/money_spec.rb +122 -0
  34. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  35. data/spec/mailers/order_mailer_spec.rb +124 -0
  36. data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
  37. data/spec/mailers/shipment_mailer_spec.rb +63 -0
  38. data/spec/mailers/test_mailer_spec.rb +24 -0
  39. data/spec/models/spree/ability_spec.rb +246 -0
  40. data/spec/models/spree/address_spec.rb +291 -0
  41. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +286 -0
  42. data/spec/models/spree/adjustment_spec.rb +163 -0
  43. data/spec/models/spree/app_configuration_spec.rb +23 -0
  44. data/spec/models/spree/asset_spec.rb +25 -0
  45. data/spec/models/spree/calculator/default_tax_spec.rb +127 -0
  46. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  47. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  48. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  49. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  50. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  51. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +51 -0
  52. data/spec/models/spree/calculator/shipping.rb +8 -0
  53. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  54. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  55. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  56. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  57. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  58. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  59. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  60. data/spec/models/spree/calculator_spec.rb +69 -0
  61. data/spec/models/spree/classification_spec.rb +93 -0
  62. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  63. data/spec/models/spree/country_spec.rb +18 -0
  64. data/spec/models/spree/credit_card_spec.rb +324 -0
  65. data/spec/models/spree/customer_return_spec.rb +262 -0
  66. data/spec/models/spree/exchange_spec.rb +75 -0
  67. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  68. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  69. data/spec/models/spree/gateway_spec.rb +54 -0
  70. data/spec/models/spree/image_spec.rb +5 -0
  71. data/spec/models/spree/inventory_unit_spec.rb +242 -0
  72. data/spec/models/spree/line_item_spec.rb +267 -0
  73. data/spec/models/spree/option_type_spec.rb +14 -0
  74. data/spec/models/spree/option_value_spec.rb +13 -0
  75. data/spec/models/spree/order/address_spec.rb +50 -0
  76. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  77. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  78. data/spec/models/spree/order/checkout_spec.rb +764 -0
  79. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  80. data/spec/models/spree/order/finalizing_spec.rb +117 -0
  81. data/spec/models/spree/order/helpers_spec.rb +5 -0
  82. data/spec/models/spree/order/payment_spec.rb +214 -0
  83. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  84. data/spec/models/spree/order/shipments_spec.rb +43 -0
  85. data/spec/models/spree/order/state_machine_spec.rb +216 -0
  86. data/spec/models/spree/order/tax_spec.rb +84 -0
  87. data/spec/models/spree/order/totals_spec.rb +24 -0
  88. data/spec/models/spree/order/updating_spec.rb +18 -0
  89. data/spec/models/spree/order/validations_spec.rb +15 -0
  90. data/spec/models/spree/order_contents_spec.rb +256 -0
  91. data/spec/models/spree/order_inventory_spec.rb +228 -0
  92. data/spec/models/spree/order_merger_spec.rb +133 -0
  93. data/spec/models/spree/order_spec.rb +954 -0
  94. data/spec/models/spree/order_updater_spec.rb +283 -0
  95. data/spec/models/spree/payment/gateway_options_spec.rb +119 -0
  96. data/spec/models/spree/payment_method_spec.rb +95 -0
  97. data/spec/models/spree/payment_spec.rb +926 -0
  98. data/spec/models/spree/preference_spec.rb +80 -0
  99. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  100. data/spec/models/spree/preferences/preferable_spec.rb +348 -0
  101. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  102. data/spec/models/spree/preferences/store_spec.rb +46 -0
  103. data/spec/models/spree/price_spec.rb +42 -0
  104. data/spec/models/spree/product/scopes_spec.rb +148 -0
  105. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  106. data/spec/models/spree/product_filter_spec.rb +26 -0
  107. data/spec/models/spree/product_option_type_spec.rb +5 -0
  108. data/spec/models/spree/product_property_spec.rb +11 -0
  109. data/spec/models/spree/product_spec.rb +474 -0
  110. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
  111. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  112. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  113. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  114. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  115. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  116. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  117. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  118. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  119. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  120. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  121. data/spec/models/spree/promotion/rules/user_spec.rb +37 -0
  122. data/spec/models/spree/promotion_action_spec.rb +10 -0
  123. data/spec/models/spree/promotion_category_spec.rb +17 -0
  124. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  125. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  126. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  127. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  128. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  129. data/spec/models/spree/promotion_spec.rb +603 -0
  130. data/spec/models/spree/property_spec.rb +5 -0
  131. data/spec/models/spree/prototype_spec.rb +5 -0
  132. data/spec/models/spree/refund_spec.rb +195 -0
  133. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  134. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  135. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  136. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  137. data/spec/models/spree/reimbursement_spec.rb +215 -0
  138. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +51 -0
  139. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  140. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  141. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  142. data/spec/models/spree/return_authorization_spec.rb +250 -0
  143. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  144. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  145. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  146. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  147. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  148. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  149. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  150. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  151. data/spec/models/spree/return_item_spec.rb +682 -0
  152. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  153. data/spec/models/spree/shipment_spec.rb +740 -0
  154. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  155. data/spec/models/spree/shipping_category_spec.rb +5 -0
  156. data/spec/models/spree/shipping_method_spec.rb +88 -0
  157. data/spec/models/spree/shipping_rate_spec.rb +141 -0
  158. data/spec/models/spree/state_spec.rb +18 -0
  159. data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
  160. data/spec/models/spree/stock/content_item_spec.rb +22 -0
  161. data/spec/models/spree/stock/coordinator_spec.rb +51 -0
  162. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  163. data/spec/models/spree/stock/estimator_spec.rb +154 -0
  164. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  165. data/spec/models/spree/stock/package_spec.rb +194 -0
  166. data/spec/models/spree/stock/packer_spec.rb +70 -0
  167. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  168. data/spec/models/spree/stock/quantifier_spec.rb +97 -0
  169. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  170. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  171. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  172. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  173. data/spec/models/spree/stock_item_spec.rb +410 -0
  174. data/spec/models/spree/stock_location_spec.rb +243 -0
  175. data/spec/models/spree/stock_movement_spec.rb +56 -0
  176. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  177. data/spec/models/spree/store_spec.rb +50 -0
  178. data/spec/models/spree/tax_category_spec.rb +27 -0
  179. data/spec/models/spree/tax_rate_spec.rb +382 -0
  180. data/spec/models/spree/taxon_spec.rb +74 -0
  181. data/spec/models/spree/taxonomy_spec.rb +18 -0
  182. data/spec/models/spree/tracker_spec.rb +21 -0
  183. data/spec/models/spree/user_spec.rb +130 -0
  184. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +24 -0
  185. data/spec/models/spree/variant_spec.rb +523 -0
  186. data/spec/models/spree/zone_spec.rb +444 -0
  187. data/spec/spec_helper.rb +74 -0
  188. data/spec/support/big_decimal.rb +5 -0
  189. data/spec/support/concerns/adjustment_source_spec.rb +23 -0
  190. data/spec/support/concerns/default_price_spec.rb +28 -0
  191. data/spec/support/rake.rb +13 -0
  192. data/spec/support/test_gateway.rb +2 -0
  193. data/spree_core.gemspec +48 -0
  194. metadata +185 -4
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order, :type => :model do
4
+ context 'CurrencyUpdater' do
5
+ context "when changing order currency" do
6
+ let!(:line_item) { create(:line_item) }
7
+ let!(:euro_price) { create(:price, variant: line_item.variant, amount: 8, currency: 'EUR') }
8
+
9
+ context "#homogenize_line_item_currencies" do
10
+ it "succeeds without error" do
11
+ expect { line_item.order.update_attributes!(currency: 'EUR') }.to_not raise_error
12
+ end
13
+
14
+ it "changes the line_item currencies" do
15
+ expect { line_item.order.update_attributes!(currency: 'EUR') }.to change{ line_item.reload.currency }.from('USD').to('EUR')
16
+ end
17
+
18
+ it "changes the line_item amounts" do
19
+ expect { line_item.order.update_attributes!(currency: 'EUR') }.to change{ line_item.reload.amount }.to(8)
20
+ end
21
+
22
+ it "fails to change the order currency when no prices are available in that currency" do
23
+ expect { line_item.order.update_attributes!(currency: 'GBP') }.to raise_error
24
+ end
25
+
26
+ it "calculates the item total in the order.currency" do
27
+ expect { line_item.order.update_attributes!(currency: 'EUR') }.to change{ line_item.order.item_total }.to(8)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order, :type => :model do
4
+ let(:order) { stub_model("Spree::Order") }
5
+
6
+ before { create(:store) }
7
+
8
+ context "#finalize!" do
9
+ let(:order) { Spree::Order.create(email: 'test@example.com') }
10
+
11
+ before do
12
+ order.update_column :state, 'complete'
13
+ end
14
+
15
+ it "should set completed_at" do
16
+ expect(order).to receive(:touch).with(:completed_at)
17
+ order.finalize!
18
+ end
19
+
20
+ it "should sell inventory units" do
21
+ order.shipments.each do |shipment|
22
+ expect(shipment).to receive(:update!)
23
+ expect(shipment).to receive(:finalize!)
24
+ end
25
+ order.finalize!
26
+ end
27
+
28
+ it "should decrease the stock for each variant in the shipment" do
29
+ order.shipments.each do |shipment|
30
+ expect(shipment.stock_location).to receive(:decrease_stock_for_variant)
31
+ end
32
+ order.finalize!
33
+ end
34
+
35
+ it "should change the shipment state to ready if order is paid" do
36
+ Spree::Shipment.create(order: order, stock_location: create(:stock_location))
37
+ order.shipments.reload
38
+
39
+ allow(order).to receive_messages(paid?: true, complete?: true)
40
+ order.finalize!
41
+ order.reload # reload so we're sure the changes are persisted
42
+ expect(order.shipment_state).to eq('ready')
43
+ end
44
+
45
+ after { Spree::Config.set track_inventory_levels: true }
46
+ it "should not sell inventory units if track_inventory_levels is false" do
47
+ Spree::Config.set track_inventory_levels: false
48
+ expect(Spree::InventoryUnit).not_to receive(:sell_units)
49
+ order.finalize!
50
+ end
51
+
52
+ it "should send an order confirmation email" do
53
+ mail_message = double "Mail::Message"
54
+ expect(Spree::OrderMailer).to receive(:confirm_email).with(order.id).and_return mail_message
55
+ expect(mail_message).to receive :deliver_later
56
+ order.finalize!
57
+ end
58
+
59
+ it "sets confirmation delivered when finalizing" do
60
+ expect(order.confirmation_delivered?).to be false
61
+ order.finalize!
62
+ expect(order.confirmation_delivered?).to be true
63
+ end
64
+
65
+ it "should not send duplicate confirmation emails" do
66
+ allow(order).to receive_messages(:confirmation_delivered? => true)
67
+ expect(Spree::OrderMailer).not_to receive(:confirm_email)
68
+ order.finalize!
69
+ end
70
+
71
+ it "should freeze all adjustments" do
72
+ # Stub this method as it's called due to a callback
73
+ # and it's irrelevant to this test
74
+ allow(order).to receive :has_available_shipment
75
+ allow(Spree::OrderMailer).to receive_message_chain :confirm_email, :deliver_later
76
+ adjustments = [double]
77
+ expect(order).to receive(:all_adjustments).and_return(adjustments)
78
+ adjustments.each do |adj|
79
+ expect(adj).to receive(:close)
80
+ end
81
+ order.finalize!
82
+ end
83
+
84
+ context "order is considered risky" do
85
+ before do
86
+ allow(order).to receive_messages :is_risky? => true
87
+ end
88
+
89
+ it "should change state to risky" do
90
+ expect(order).to receive(:considered_risky!)
91
+ order.finalize!
92
+ end
93
+
94
+ context "and order is approved" do
95
+ before do
96
+ allow(order).to receive_messages :approved? => true
97
+ end
98
+
99
+ it "should leave order in complete state" do
100
+ order.finalize!
101
+ expect(order.state).to eq 'complete'
102
+ end
103
+ end
104
+ end
105
+
106
+ context "order is not considered risky" do
107
+ before do
108
+ allow(order).to receive_messages :is_risky? => false
109
+ end
110
+
111
+ it "should set completed_at" do
112
+ order.finalize!
113
+ expect(order.completed_at).to be_present
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order, :type => :model do
4
+ let(:order) { stub_model(Spree::Order) }
5
+ end
@@ -0,0 +1,214 @@
1
+ require 'spec_helper'
2
+
3
+ module Spree
4
+ describe Spree::Order, :type => :model do
5
+ let(:order) { stub_model(Spree::Order) }
6
+ let(:updater) { Spree::OrderUpdater.new(order) }
7
+
8
+ context "processing payments" do
9
+ before do
10
+ # So that Payment#purchase! is called during processing
11
+ Spree::Config[:auto_capture] = true
12
+
13
+ allow(order).to receive_message_chain(:line_items, :empty?).and_return(false)
14
+ allow(order).to receive_messages :total => 100
15
+ end
16
+
17
+ it 'processes all checkout payments' do
18
+ payment_1 = create(:payment, :amount => 50)
19
+ payment_2 = create(:payment, :amount => 50)
20
+ allow(order).to receive(:unprocessed_payments).and_return([payment_1, payment_2])
21
+
22
+ order.process_payments!
23
+ updater.update_payment_state
24
+ expect(order.payment_state).to eq('paid')
25
+
26
+ expect(payment_1).to be_completed
27
+ expect(payment_2).to be_completed
28
+ end
29
+
30
+ it 'does not go over total for order' do
31
+ payment_1 = create(:payment, :amount => 50)
32
+ payment_2 = create(:payment, :amount => 50)
33
+ payment_3 = create(:payment, :amount => 50)
34
+ allow(order).to receive(:unprocessed_payments).and_return([payment_1, payment_2, payment_3])
35
+
36
+ order.process_payments!
37
+ updater.update_payment_state
38
+ expect(order.payment_state).to eq('paid')
39
+
40
+ expect(payment_1).to be_completed
41
+ expect(payment_2).to be_completed
42
+ expect(payment_3).to be_checkout
43
+ end
44
+
45
+ it "does not use failed payments" do
46
+ payment_1 = create(:payment, :amount => 50)
47
+ payment_2 = create(:payment, :amount => 50, :state => 'failed')
48
+ allow(order).to receive(:pending_payments).and_return([payment_1])
49
+
50
+ expect(payment_2).not_to receive(:process!)
51
+
52
+ order.process_payments!
53
+ end
54
+ end
55
+
56
+ context "ensure source attributes stick around" do
57
+ # For the reason of this test, please see spree/spree_gateway#132
58
+ it "does not have inverse_of defined" do
59
+ expect(Spree::Order.reflections['payments'].options[:inverse_of]).to be_nil
60
+ end
61
+
62
+ it "keeps source attributes after updating" do
63
+ persisted_order = Spree::Order.create
64
+ credit_card_payment_method = create(:credit_card_payment_method)
65
+ attributes = {
66
+ :payments_attributes => [
67
+ {
68
+ :payment_method_id => credit_card_payment_method.id,
69
+ :source_attributes => {
70
+ :name => "Ryan Bigg",
71
+ :number => "41111111111111111111",
72
+ :expiry => "01 / 15",
73
+ :verification_value => "123"
74
+ }
75
+ }
76
+ ]
77
+ }
78
+
79
+ persisted_order.update_attributes(attributes)
80
+ expect(persisted_order.unprocessed_payments.last.source.number).to be_present
81
+ end
82
+ end
83
+
84
+ context "checking if order is paid" do
85
+ context "payment_state is paid" do
86
+ before { allow(order).to receive_messages payment_state: 'paid' }
87
+ it { expect(order).to be_paid }
88
+ end
89
+
90
+ context "payment_state is credit_owned" do
91
+ before { allow(order).to receive_messages payment_state: 'credit_owed' }
92
+ it { expect(order).to be_paid }
93
+ end
94
+ end
95
+
96
+ context "#process_payments!" do
97
+ let(:payment) { stub_model(Spree::Payment) }
98
+ before { allow(order).to receive_messages unprocessed_payments: [payment], total: 10 }
99
+
100
+ it "should process the payments" do
101
+ expect(payment).to receive(:process!)
102
+ expect(order.process_payments!).to be_truthy
103
+ end
104
+
105
+ # Regression spec for https://github.com/spree/spree/issues/5436
106
+ it 'should raise an error if there are no payments to process' do
107
+ allow(order).to receive_messages unprocessed_payments: []
108
+ expect(payment).to_not receive(:process!)
109
+ expect(order.process_payments!).to be_falsey
110
+ end
111
+
112
+ context "when a payment raises a GatewayError" do
113
+ before { expect(payment).to receive(:process!).and_raise(Spree::Core::GatewayError) }
114
+
115
+ it "should return true when configured to allow checkout on gateway failures" do
116
+ Spree::Config.set :allow_checkout_on_gateway_error => true
117
+ expect(order.process_payments!).to be true
118
+ end
119
+
120
+ it "should return false when not configured to allow checkout on gateway failures" do
121
+ Spree::Config.set :allow_checkout_on_gateway_error => false
122
+ expect(order.process_payments!).to be false
123
+ end
124
+ end
125
+ end
126
+
127
+ context "#authorize_payments!" do
128
+ let(:payment) { stub_model(Spree::Payment) }
129
+ before { allow(order).to receive_messages :unprocessed_payments => [payment], :total => 10 }
130
+ subject { order.authorize_payments! }
131
+
132
+ it "processes payments with attempt_authorization!" do
133
+ expect(payment).to receive(:authorize!)
134
+ subject
135
+ end
136
+
137
+ it { is_expected.to be_truthy }
138
+ end
139
+
140
+ context "#capture_payments!" do
141
+ let(:payment) { stub_model(Spree::Payment) }
142
+ before { allow(order).to receive_messages :unprocessed_payments => [payment], :total => 10 }
143
+ subject { order.capture_payments! }
144
+
145
+ it "processes payments with attempt_authorization!" do
146
+ expect(payment).to receive(:purchase!)
147
+ subject
148
+ end
149
+
150
+ it { is_expected.to be_truthy }
151
+ end
152
+
153
+ context "#outstanding_balance" do
154
+ it "should return positive amount when payment_total is less than total" do
155
+ order.payment_total = 20.20
156
+ order.total = 30.30
157
+ expect(order.outstanding_balance).to eq(10.10)
158
+ end
159
+ it "should return negative amount when payment_total is greater than total" do
160
+ order.total = 8.20
161
+ order.payment_total = 10.20
162
+ expect(order.outstanding_balance).to be_within(0.001).of(-2.00)
163
+ end
164
+ it 'should incorporate refund reimbursements' do
165
+ # Creates an order w/total 10
166
+ reimbursement = create :reimbursement
167
+ # Set the payment amount to actually be the order total of 10
168
+ reimbursement.order.payments.first.update_column :amount, 10
169
+ # Creates a refund of 10
170
+ create :refund, amount: 10,
171
+ payment: reimbursement.order.payments.first,
172
+ reimbursement: reimbursement
173
+ order = reimbursement.order.reload
174
+ # Update the order totals so payment_total goes to 0 reflecting the refund..
175
+ order.update!
176
+ # Order Total - (Payment Total + Reimbursed)
177
+ # 10 - (0 + 10) = 0
178
+ expect(order.outstanding_balance).to eq 0
179
+ end
180
+ end
181
+
182
+ context "#outstanding_balance?" do
183
+ it "should be true when total greater than payment_total" do
184
+ order.total = 10.10
185
+ order.payment_total = 9.50
186
+ expect(order.outstanding_balance?).to be true
187
+ end
188
+
189
+ it "should be true when total less than payment_total" do
190
+ order.total = 8.25
191
+ order.payment_total = 10.44
192
+ expect(order.outstanding_balance?).to be true
193
+ end
194
+
195
+ it "should be false when total equals payment_total" do
196
+ order.total = 10.10
197
+ order.payment_total = 10.10
198
+ expect(order.outstanding_balance?).to be false
199
+ end
200
+ end
201
+
202
+ context "payment required?" do
203
+ context "total is zero" do
204
+ before { allow(order).to receive_messages(total: 0) }
205
+ it { expect(order.payment_required?).to be false }
206
+ end
207
+
208
+ context "total > zero" do
209
+ before { allow(order).to receive_messages(total: 1) }
210
+ it { expect(order.payment_required?).to be true }
211
+ end
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Order, :type => :model do
4
+ let(:order) { stub_model('Spree::Order') }
5
+
6
+ describe ".is_risky?" do
7
+ context "Not risky order" do
8
+ let(:order) { FactoryGirl.create(:order, payments: [payment]) }
9
+ context "with avs_response == D" do
10
+ let(:payment) { FactoryGirl.create(:payment, avs_response: "D") }
11
+ it "is not considered risky" do
12
+ expect(order.is_risky?).to eq(false)
13
+ end
14
+ end
15
+
16
+ context "with avs_response == M" do
17
+ let(:payment) { FactoryGirl.create(:payment, avs_response: "M") }
18
+ it "is not considered risky" do
19
+ expect(order.is_risky?).to eq(false)
20
+ end
21
+ end
22
+
23
+ context "with avs_response == ''" do
24
+ let(:payment) { FactoryGirl.create(:payment, avs_response: "") }
25
+ it "is not considered risky" do
26
+ expect(order.is_risky?).to eq(false)
27
+ end
28
+ end
29
+
30
+ context "with cvv_response_code == M" do
31
+ let(:payment) { FactoryGirl.create(:payment, cvv_response_code: "M") }
32
+ it "is not considered risky" do
33
+ expect(order.is_risky?).to eq(false)
34
+ end
35
+ end
36
+
37
+ context "with cvv_response_message == ''" do
38
+ let(:payment) { FactoryGirl.create(:payment, cvv_response_message: "") }
39
+ it "is not considered risky" do
40
+ expect(order.is_risky?).to eq(false)
41
+ end
42
+ end
43
+ end
44
+
45
+ context "Risky order" do
46
+ context "AVS response message" do
47
+ let(:order) { FactoryGirl.create(:order, payments: [FactoryGirl.create(:payment, avs_response: "A")]) }
48
+ it "returns true if the order has an avs_response" do
49
+ expect(order.is_risky?).to eq(true)
50
+ end
51
+ end
52
+
53
+ context "CVV response code" do
54
+ let(:order) { FactoryGirl.create(:order, payments: [FactoryGirl.create(:payment, cvv_response_code: "N")]) }
55
+ it "returns true if the order has an cvv_response_code" do
56
+ expect(order.is_risky?).to eq(true)
57
+ end
58
+ end
59
+
60
+ context "state == 'failed'" do
61
+ let(:order) { FactoryGirl.create(:order, payments: [FactoryGirl.create(:payment, state: 'failed')]) }
62
+ it "returns true if the order has state == 'failed'" do
63
+ expect(order.is_risky?).to eq(true)
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ context "is considered risky" do
70
+ let(:order) do
71
+ order = FactoryGirl.create(:completed_order_with_pending_payment)
72
+ order.considered_risky!
73
+ order
74
+ end
75
+
76
+ it "can be approved by a user" do
77
+ expect(order).to receive(:approve!)
78
+ order.approved_by(stub_model(Spree::LegacyUser, id: 1))
79
+ expect(order.approver_id).to eq(1)
80
+ expect(order.approved_at).to be_present
81
+ expect(order.approved?).to be true
82
+ end
83
+ end
84
+ end