spree_gateway 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +22 -0
  5. data/Gemfile +21 -0
  6. data/LICENSE +26 -0
  7. data/README.md +68 -0
  8. data/Rakefile +14 -0
  9. data/Versionfile +12 -0
  10. data/app/assets/javascripts/store/gateway/stripe.js.coffee +58 -0
  11. data/app/assets/javascripts/store/spree_gateway.js +2 -0
  12. data/app/assets/stylesheets/store/spree_gateway.css +8 -0
  13. data/app/controllers/spree/checkout_controller_decorator.rb +51 -0
  14. data/app/controllers/spree/skrill_status_controller.rb +39 -0
  15. data/app/models/spree/billing_integration/skrill/quick_checkout.rb +48 -0
  16. data/app/models/spree/gateway/authorize_net.rb +16 -0
  17. data/app/models/spree/gateway/authorize_net_cim.rb +132 -0
  18. data/app/models/spree/gateway/balanced_gateway.rb +65 -0
  19. data/app/models/spree/gateway/banwire.rb +15 -0
  20. data/app/models/spree/gateway/beanstream.rb +193 -0
  21. data/app/models/spree/gateway/braintree_gateway.rb +147 -0
  22. data/app/models/spree/gateway/card_save.rb +10 -0
  23. data/app/models/spree/gateway/data_cash.rb +10 -0
  24. data/app/models/spree/gateway/eway.rb +20 -0
  25. data/app/models/spree/gateway/fatzebra.rb +15 -0
  26. data/app/models/spree/gateway/linkpoint.rb +28 -0
  27. data/app/models/spree/gateway/maxipago.rb +14 -0
  28. data/app/models/spree/gateway/moneris.rb +11 -0
  29. data/app/models/spree/gateway/pay_junction.rb +16 -0
  30. data/app/models/spree/gateway/pay_pal_gateway.rb +12 -0
  31. data/app/models/spree/gateway/payflow_pro.rb +17 -0
  32. data/app/models/spree/gateway/paymill.rb +12 -0
  33. data/app/models/spree/gateway/pin_gateway.rb +15 -0
  34. data/app/models/spree/gateway/sage_pay.rb +11 -0
  35. data/app/models/spree/gateway/samurai.rb +63 -0
  36. data/app/models/spree/gateway/secure_pay_au.rb +10 -0
  37. data/app/models/spree/gateway/stripe_gateway.rb +103 -0
  38. data/app/models/spree/gateway/usa_epay.rb +9 -0
  39. data/app/models/spree/gateway/worldpay.rb +91 -0
  40. data/app/models/spree/skrill_transaction.rb +19 -0
  41. data/app/views/spree/admin/log_entries/_braintree.html.erb +31 -0
  42. data/app/views/spree/admin/log_entries/_stripe.html.erb +28 -0
  43. data/app/views/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
  44. data/app/views/spree/admin/payments/source_forms/_stripe.html.erb +1 -0
  45. data/app/views/spree/admin/payments/source_views/_quickcheckout.html.erb +39 -0
  46. data/app/views/spree/admin/payments/source_views/_stripe.html.erb +1 -0
  47. data/app/views/spree/checkout/payment/_quickcheckout.html.erb +26 -0
  48. data/app/views/spree/checkout/payment/_stripe.html.erb +21 -0
  49. data/config/initializers/savon.rb +3 -0
  50. data/config/locales/bg.yml +11 -0
  51. data/config/locales/de.yml +11 -0
  52. data/config/locales/en.yml +30 -0
  53. data/config/locales/sv.yml +11 -0
  54. data/config/routes.rb +20 -0
  55. data/db/migrate/20111118164631_create_skrill_transactions.rb +14 -0
  56. data/db/migrate/20121017004102_update_braintree_payment_method_type.rb +9 -0
  57. data/db/migrate/20130213222555_update_stripe_payment_method_type.rb +9 -0
  58. data/db/migrate/20130415222802_update_balanced_payment_method_type.rb +9 -0
  59. data/db/migrate/20131008221012_update_paypal_payment_method_type.rb +9 -0
  60. data/db/migrate/20131112133401_migrate_stripe_preferences.rb +8 -0
  61. data/lib/active_merchant/billing/skrill.rb +18 -0
  62. data/lib/generators/spree_gateway/install/install_generator.rb +28 -0
  63. data/lib/spree_gateway.rb +3 -0
  64. data/lib/spree_gateway/engine.rb +42 -0
  65. data/script/rails +5 -0
  66. data/spec/factories/payment_method_factory.rb +4 -0
  67. data/spec/features/stripe_checkout_spec.rb +82 -0
  68. data/spec/models/gateway/authorize_net_cim_spec.rb +17 -0
  69. data/spec/models/gateway/authorize_net_spec.rb +17 -0
  70. data/spec/models/gateway/balanced_gateway_spec.rb +9 -0
  71. data/spec/models/gateway/banwire_spec.rb +9 -0
  72. data/spec/models/gateway/braintree_gateway_spec.rb +289 -0
  73. data/spec/models/gateway/eway_spec.rb +17 -0
  74. data/spec/models/gateway/fatzebra_spec.rb +47 -0
  75. data/spec/models/gateway/linkpoint_spec.rb +60 -0
  76. data/spec/models/gateway/pay_junction_spec.rb +17 -0
  77. data/spec/models/gateway/payflow_pro_spec.rb +17 -0
  78. data/spec/models/gateway/pin_gateway_spec.rb +57 -0
  79. data/spec/models/gateway/stripe_gateway_spec.rb +122 -0
  80. data/spec/models/gateway/usa_epay_spec.rb +38 -0
  81. data/spec/models/savon_spec.rb +9 -0
  82. data/spec/spec_helper.rb +56 -0
  83. data/spree_gateway.gemspec +28 -0
  84. metadata +104 -5
data/script/rails ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ ENGINE_PATH = File.expand_path('../..', __FILE__)
5
+ load File.expand_path('../../spec/dummy/script/rails', __FILE__)
@@ -0,0 +1,4 @@
1
+ Factory.define(:skrill_quick_checkout, :class => BillingIntegration::Skrill::QuickCheckout) do |record|
2
+ record.name 'Skrill - Quick Checkout'
3
+ record.environment 'test'
4
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Stripe checkout" do
4
+ let!(:country) { create(:country, :states_required => true) }
5
+ let!(:state) { create(:state, :country => country) }
6
+ let!(:shipping_method) { create(:shipping_method) }
7
+ let!(:stock_location) { create(:stock_location) }
8
+ let!(:mug) { create(:product, :name => "RoR Mug") }
9
+ let!(:stripe_payment_method) do
10
+ Spree::Gateway::StripeGateway.create!(
11
+ :name => "Stripe",
12
+ :preferred_secret_key => "sk_test_VCZnDv3GLU15TRvn8i2EsaAN",
13
+ :preferred_publishable_key => "pk_test_Cuf0PNtiAkkMpTVC2gwYDMIg",
14
+ :environment => "test"
15
+ )
16
+ end
17
+
18
+ let!(:zone) { create(:zone) }
19
+
20
+ before do
21
+ user = create(:user)
22
+
23
+ order = OrderWalkthrough.up_to(:delivery)
24
+ order.stub :confirmation_required? => true
25
+
26
+ order.reload
27
+ order.user = user
28
+ order.update!
29
+
30
+ Spree::CheckoutController.any_instance.stub(:current_order => order)
31
+ Spree::CheckoutController.any_instance.stub(:try_spree_current_user => user)
32
+ Spree::CheckoutController.any_instance.stub(:skip_state_validation? => true)
33
+
34
+ visit spree.checkout_state_path(:payment)
35
+ end
36
+
37
+ # This will pass the CC data to the server and the StripeGateway class handles it
38
+ it "can process a valid payment (without JS)" do
39
+ fill_in "Card Number", :with => "4242 4242 4242 4242"
40
+ fill_in "Card Code", :with => "123"
41
+ fill_in "Expiration", :with => "01 / #{Time.now.year + 1}"
42
+ click_button "Save and Continue"
43
+ page.current_url.should include("/checkout/confirm")
44
+ click_button "Place Order"
45
+ page.should have_content("Your order has been processed successfully")
46
+ end
47
+
48
+ # This will fetch a token from Stripe.com and then pass that to the webserver.
49
+ # The server then processes the payment using that token.
50
+ it "can process a valid payment (with JS)", :js => true do
51
+ fill_in "Card Number", :with => "4242 4242 4242 4242"
52
+ # Otherwise ccType field does not get updated correctly
53
+ page.execute_script("$('.cardNumber').trigger('change')")
54
+ fill_in "Card Code", :with => "123"
55
+ fill_in "Expiration", :with => "01 / #{Time.now.year + 1}"
56
+ click_button "Save and Continue"
57
+ sleep(5) # Wait for Stripe API to return + form to submit
58
+ page.current_url.should include("/checkout/confirm")
59
+ click_button "Place Order"
60
+ page.should have_content("Your order has been processed successfully")
61
+ end
62
+
63
+ it "shows an error with an invalid credit card number", :js => true do
64
+ click_button "Save and Continue"
65
+ page.should have_content("This card number looks invalid")
66
+ end
67
+
68
+ it "shows an error with invalid security fields", :js => true do
69
+ fill_in "Card Number", :with => "4242 4242 4242 4242"
70
+ fill_in "Expiration", :with => "01 / #{Time.now.year + 1}"
71
+ click_button "Save and Continue"
72
+ page.should have_content("Your card's security code is invalid.")
73
+ end
74
+
75
+ it "shows an error with invalid expiry fields", :js => true do
76
+ fill_in "Card Number", :with => "4242 4242 4242 4242"
77
+ fill_in "Expiration", :with => "00 / #{Time.now.year + 1}"
78
+ fill_in "Card Code", :with => "123"
79
+ click_button "Save and Continue"
80
+ page.should have_content("Your card's expiration month is invalid.")
81
+ end
82
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::AuthorizeNetCim do
4
+ let (:gateway) { Spree::Gateway::AuthorizeNetCim.new }
5
+
6
+ describe "options" do
7
+ it "should include :test => true when :test_mode is true" do
8
+ gateway.preferred_test_mode = true
9
+ gateway.options[:test].should == true
10
+ end
11
+
12
+ it "should not include :test when :test_mode is false" do
13
+ gateway.preferred_test_mode = false
14
+ gateway.options[:test].should be_nil
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::AuthorizeNet do
4
+ let (:gateway) { Spree::Gateway::AuthorizeNet.create!(:name => "Authorize.net") }
5
+
6
+ describe "options" do
7
+ it "should include :test => true when :test_mode is true" do
8
+ gateway.preferred_test_mode = true
9
+ gateway.options[:test].should == true
10
+ end
11
+
12
+ it "should not include :test when test_mode is false" do
13
+ gateway.preferred_test_mode = false
14
+ gateway.options[:test].should == false
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::BalancedGateway do
4
+ let(:gateway) { Spree::Gateway::BalancedGateway.create!(:name => "Balanced") }
5
+
6
+ it "should be Balanced gateway" do
7
+ gateway.provider_class.should == ::ActiveMerchant::Billing::BalancedGateway
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Banwire do
4
+ let(:gateway) { Spree::Gateway::Banwire.create!(:name => "Banwire") }
5
+
6
+ it "should be Banwire gateway" do
7
+ gateway.provider_class.should == ::ActiveMerchant::Billing::BanwireGateway
8
+ end
9
+ end
@@ -0,0 +1,289 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::BraintreeGateway do
4
+
5
+ before(:each) do
6
+ Spree::Gateway.update_all :active => false
7
+ @gateway = Spree::Gateway::BraintreeGateway.create!(:name => "Braintree Gateway", :environment => "sandbox", :active => true)
8
+
9
+ @gateway.set_preference(:environment, "sandbox" )
10
+ @gateway.set_preference(:merchant_id, "zbn5yzq9t7wmwx42" )
11
+ @gateway.set_preference(:public_key, "ym9djwqpkxbv3xzt")
12
+ @gateway.set_preference(:private_key, "4ghghkyp2yy6yqc8")
13
+ @gateway.save!
14
+
15
+ with_payment_profiles_off do
16
+ @country = FactoryGirl.create(:country, :name => "United States", :iso_name => "UNITED STATES", :iso3 => "USA", :iso => "US", :numcode => 840)
17
+ @state = FactoryGirl.create(:state, :name => "Maryland", :abbr => "MD", :country => @country)
18
+ @address = FactoryGirl.create(:address,
19
+ :firstname => 'John',
20
+ :lastname => 'Doe',
21
+ :address1 => '1234 My Street',
22
+ :address2 => 'Apt 1',
23
+ :city => 'Washington DC',
24
+ :zipcode => '20123',
25
+ :phone => '(555)555-5555',
26
+ :state => @state,
27
+ :country => @country
28
+ )
29
+ @order = FactoryGirl.create(:order_with_totals, :bill_address => @address, :ship_address => @address)
30
+ @order.update!
31
+ @credit_card = FactoryGirl.create(:credit_card, :verification_value => '123', :number => '5105105105105100', :month => 9, :year => Time.now.year + 1, :first_name => 'John', :last_name => 'Doe', :cc_type => 'mastercard')
32
+ @payment = FactoryGirl.create(:payment, :source => @credit_card, :order => @order, :payment_method => @gateway, :amount => 10.00)
33
+ @payment.payment_method.environment = "test"
34
+ end
35
+
36
+ end
37
+
38
+ describe 'merchant_account_id' do
39
+ before do
40
+ @gateway.set_preference(:merchant_account_id, merchant_account_id)
41
+ end
42
+
43
+ context "with merchant_account_id empty" do
44
+ let(:merchant_account_id) { "" }
45
+
46
+ it 'should not be present in options' do
47
+ @gateway.options.keys.include?(:merchant_account_id).should be_false
48
+ end
49
+ end
50
+
51
+ context 'with merchant_account_id set on gateway' do
52
+ let(:merchant_account_id) { 'test' }
53
+
54
+ it 'should have a perferred_merchant_account_id' do
55
+ @gateway.preferred_merchant_account_id.should == merchant_account_id
56
+ end
57
+
58
+ it 'should have a preferences[:merchant_account_id]' do
59
+ @gateway.preferences.keys.include?(:merchant_account_id).should be_true
60
+ end
61
+
62
+ it 'should be present in options' do
63
+ @gateway.options.keys.include?(:merchant_account_id).should be_true
64
+ end
65
+ end
66
+ end
67
+
68
+ it "should be braintree gateway" do
69
+ @gateway.provider_class.should == ::ActiveMerchant::Billing::BraintreeBlueGateway
70
+ end
71
+
72
+ describe "preferences" do
73
+ it "should not include server + test_mode" do
74
+ lambda { @gateway.preferences.fetch(:server) }.should raise_error(StandardError)
75
+ end
76
+ end
77
+
78
+ describe "authorize" do
79
+ it "should return a success response with an authorization code" do
80
+ result = @gateway.authorize(500, @credit_card)
81
+
82
+ result.success?.should be_true
83
+ result.authorization.should match(/\A\w{6}\z/)
84
+
85
+
86
+ Braintree::Transaction::Status::Authorized.should == Braintree::Transaction.find(result.authorization).status
87
+ end
88
+
89
+ shared_examples "a valid credit card" do
90
+ it 'should work through the spree payment interface' do
91
+ Spree::Config.set :auto_capture => false
92
+ @payment.log_entries.size.should == 0
93
+ @payment.process!
94
+ @payment.log_entries.size.should == 1
95
+ @payment.response_code.should match /\A\w{6}\z/
96
+ @payment.state.should == 'pending'
97
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
98
+ transaction.status.should == Braintree::Transaction::Status::Authorized
99
+ card_number = @credit_card.number[0..5] + "******" + @credit_card.number[-4..-1]
100
+ transaction.credit_card_details.masked_number.should == card_number
101
+ transaction.credit_card_details.expiration_date.should == "09/#{Time.now.year + 1}"
102
+ transaction.customer_details.first_name.should == 'John'
103
+ transaction.customer_details.last_name.should == 'Doe'
104
+ end
105
+ end
106
+
107
+ context "when the card is a mastercard" do
108
+ before do
109
+ @credit_card.number = '5105105105105100'
110
+ @credit_card.cc_type = 'mastercard'
111
+ @credit_card.save
112
+ end
113
+
114
+ it_behaves_like "a valid credit card"
115
+ end
116
+
117
+ context "when the card is a visa" do
118
+ before do
119
+ @credit_card.number = '4111111111111111'
120
+ @credit_card.cc_type = 'visa'
121
+ @credit_card.save
122
+ end
123
+
124
+ it_behaves_like "a valid credit card"
125
+ end
126
+
127
+ context "when the card is an amex" do
128
+ before do
129
+ @credit_card.number = '378282246310005'
130
+ @credit_card.verification_value = '1234'
131
+ @credit_card.cc_type = 'amex'
132
+ @credit_card.save
133
+ end
134
+
135
+ it_behaves_like "a valid credit card"
136
+ end
137
+
138
+ context "when the card is a JCB" do
139
+ before do
140
+ @credit_card.number = '3530111333300000'
141
+ @credit_card.cc_type = 'jcb'
142
+ @credit_card.save
143
+ end
144
+
145
+ it_behaves_like "a valid credit card"
146
+ end
147
+
148
+ context "when the card is a diners club" do
149
+ before do
150
+ @credit_card.number = '36050000000003'
151
+ @credit_card.cc_type = 'dinersclub'
152
+ @credit_card.save
153
+ end
154
+
155
+ it_behaves_like "a valid credit card"
156
+ end
157
+ end
158
+
159
+ describe "capture" do
160
+
161
+ it " should capture a previous authorization" do
162
+ @payment.process!
163
+ assert_equal 1, @payment.log_entries.size
164
+ assert_match /\A\w{6}\z/, @payment.response_code
165
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
166
+ transaction.status.should == Braintree::Transaction::Status::Authorized
167
+ capture_result = @gateway.capture(@payment,:ignored_arg_credit_card, :ignored_arg_options)
168
+ capture_result.success?.should be_true
169
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
170
+ transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
171
+ end
172
+
173
+ pending "raise an error if capture fails using spree interface" do
174
+ Spree::Config.set :auto_capture => false
175
+ @payment.log_entries.size.should == 0
176
+ @payment.process!
177
+ @payment.log_entries.size.should == 1
178
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
179
+ transaction.status.should == Braintree::Transaction::Status::Authorized
180
+ @payment.payment_source.capture(@payment) # as done in PaymentsController#fire
181
+ # transaction = ::Braintree::Transaction.find(@payment.response_code)
182
+ # transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
183
+ # lambda do
184
+ # @payment.payment_source.capture(@payment)
185
+ # end.should raise_error(Spree::Core::GatewayError, "Cannot submit for settlement unless status is authorized. (91507)")
186
+ end
187
+ end
188
+
189
+ describe 'purchase' do
190
+ it 'should return a success response with an authorization code' do
191
+ result = @gateway.purchase(500, @credit_card)
192
+ result.success?.should be_true
193
+ result.authorization.should match(/\A\w{6}\z/)
194
+ Braintree::Transaction::Status::SubmittedForSettlement.should == Braintree::Transaction.find(result.authorization).status
195
+ end
196
+
197
+ it 'should work through the spree payment interface with payment profiles' do
198
+ purchase_using_spree_interface
199
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
200
+ transaction.credit_card_details.token.should_not be_nil
201
+ end
202
+
203
+ it 'should work through the spree payment interface without payment profiles' do
204
+ with_payment_profiles_off do
205
+ purchase_using_spree_interface(false)
206
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
207
+ transaction.credit_card_details.token.should be_nil
208
+ end
209
+ end
210
+ end
211
+
212
+ describe "credit" do
213
+ pending "should work through the spree interface" do
214
+ @payment.amount += 100.00
215
+ purchase_using_spree_interface
216
+ credit_using_spree_interface
217
+ end
218
+ end
219
+
220
+ describe "void" do
221
+ pending "should work through the spree credit_card / payment interface" do
222
+ assert_equal 0, @payment.log_entries.size
223
+ @payment.process!
224
+ assert_equal 1, @payment.log_entries.size
225
+ @payment.response_code.should match(/\A\w{6}\z/)
226
+ transaction = Braintree::Transaction.find(@payment.response_code)
227
+ transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
228
+ @credit_card.void(@payment)
229
+ transaction = Braintree::Transaction.find(transaction.id)
230
+ transaction.status.should == Braintree::Transaction::Status::Voided
231
+ end
232
+ end
233
+
234
+ describe "update_card_number" do
235
+ it "passes through gateway_payment_profile_id" do
236
+ credit_card = { 'token' => 'testing', 'last_4' => '1234', 'masked_number' => '5555**5555' }
237
+ @gateway.update_card_number(@payment.source, credit_card)
238
+ @payment.source.gateway_payment_profile_id.should == "testing"
239
+ end
240
+ end
241
+
242
+ def credit_using_spree_interface
243
+ @payment.log_entries.size.should == 1
244
+ @payment.source.credit(@payment) # as done in PaymentsController#fire
245
+ @payment.log_entries.size.should == 2
246
+ #Let's get the payment record associated with the credit
247
+ @payment = @order.payments.last
248
+ @payment.response_code.should match(/\A\w{6}\z/)
249
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
250
+ transaction.type.should == Braintree::Transaction::Type::Credit
251
+ transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
252
+ transaction.credit_card_details.masked_number.should == "510510******5100"
253
+ transaction.credit_card_details.expiration_date.should == "09/#{Time.now.year + 1}"
254
+ transaction.customer_details.first_name.should == "John"
255
+ transaction.customer_details.last_name.should == "Doe"
256
+ end
257
+
258
+ def purchase_using_spree_interface(profile=true)
259
+ Spree::Config.set :auto_capture => true
260
+ @payment.send(:create_payment_profile) if profile
261
+ @payment.log_entries.size == 0
262
+ @payment.process! # as done in PaymentsController#create
263
+ @payment.log_entries.size == 1
264
+ @payment.response_code.should match /\A\w{6}\z/
265
+ @payment.state.should == 'completed'
266
+ transaction = ::Braintree::Transaction.find(@payment.response_code)
267
+ Braintree::Transaction::Status::SubmittedForSettlement.should == transaction.status
268
+ transaction.credit_card_details.masked_number.should == "510510******5100"
269
+ transaction.credit_card_details.expiration_date.should == "09/#{Time.now.year + 1}"
270
+ transaction.customer_details.first_name.should == 'John'
271
+ transaction.customer_details.last_name.should == 'Doe'
272
+ end
273
+
274
+ def with_payment_profiles_off(&block)
275
+ Spree::Gateway::BraintreeGateway.class_eval do
276
+ def payment_profiles_supported?
277
+ false
278
+ end
279
+ end
280
+ yield
281
+ ensure
282
+ Spree::Gateway::BraintreeGateway.class_eval do
283
+ def payment_profiles_supported?
284
+ true
285
+ end
286
+ end
287
+ end
288
+
289
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Eway do
4
+ let (:gateway) { Spree::Gateway::Eway.create!(:name => "Eway") }
5
+
6
+ describe "options" do
7
+ it "should include :test => true in when :test_mode is true" do
8
+ gateway.preferred_test_mode = true
9
+ gateway.options[:test].should == true
10
+ end
11
+
12
+ it "should not include :test when test_mode is false" do
13
+ gateway.preferred_test_mode = false
14
+ gateway.options[:test].should == false
15
+ end
16
+ end
17
+ end