authorize-net 1.5.2

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 (79) hide show
  1. data/License.pdf +0 -0
  2. data/README.rdoc +124 -0
  3. data/Rakefile +74 -0
  4. data/generators/authorize_net_direct_post/USAGE +20 -0
  5. data/generators/authorize_net_direct_post/authorize_net_direct_post_generator.rb +21 -0
  6. data/generators/authorize_net_direct_post/templates/README-AuthorizeNet +49 -0
  7. data/generators/authorize_net_direct_post/templates/config.yml.erb +8 -0
  8. data/generators/authorize_net_direct_post/templates/config.yml.rails3.erb +8 -0
  9. data/generators/authorize_net_direct_post/templates/controller.rb.erb +31 -0
  10. data/generators/authorize_net_direct_post/templates/initializer.rb +4 -0
  11. data/generators/authorize_net_direct_post/templates/layout.erb +18 -0
  12. data/generators/authorize_net_direct_post/templates/payment.erb +10 -0
  13. data/generators/authorize_net_direct_post/templates/payment.rails3.erb +10 -0
  14. data/generators/authorize_net_direct_post/templates/receipt.erb +1 -0
  15. data/generators/authorize_net_direct_post/templates/relay_response.erb +1 -0
  16. data/generators/authorize_net_sim/USAGE +20 -0
  17. data/generators/authorize_net_sim/authorize_net_sim_generator.rb +19 -0
  18. data/generators/authorize_net_sim/templates/README-AuthorizeNet +52 -0
  19. data/generators/authorize_net_sim/templates/config.yml.erb +8 -0
  20. data/generators/authorize_net_sim/templates/config.yml.rails3.erb +8 -0
  21. data/generators/authorize_net_sim/templates/controller.rb.erb +21 -0
  22. data/generators/authorize_net_sim/templates/initializer.rb +4 -0
  23. data/generators/authorize_net_sim/templates/layout.erb +18 -0
  24. data/generators/authorize_net_sim/templates/payment.erb +6 -0
  25. data/generators/authorize_net_sim/templates/payment.rails3.erb +6 -0
  26. data/generators/authorize_net_sim/templates/thank_you.erb +1 -0
  27. data/generators/generator_extensions.rb +75 -0
  28. data/init.rb +2 -0
  29. data/install.rb +1 -0
  30. data/lib/app/helpers/authorize_net_helper.rb +24 -0
  31. data/lib/authorize-net.rb +4 -0
  32. data/lib/authorize_net.rb +92 -0
  33. data/lib/authorize_net/addresses/address.rb +29 -0
  34. data/lib/authorize_net/addresses/shipping_address.rb +26 -0
  35. data/lib/authorize_net/aim/response.rb +131 -0
  36. data/lib/authorize_net/aim/transaction.rb +184 -0
  37. data/lib/authorize_net/arb/response.rb +34 -0
  38. data/lib/authorize_net/arb/subscription.rb +72 -0
  39. data/lib/authorize_net/arb/transaction.rb +146 -0
  40. data/lib/authorize_net/authorize_net.rb +154 -0
  41. data/lib/authorize_net/cim/customer_profile.rb +19 -0
  42. data/lib/authorize_net/cim/payment_profile.rb +37 -0
  43. data/lib/authorize_net/cim/response.rb +110 -0
  44. data/lib/authorize_net/cim/transaction.rb +678 -0
  45. data/lib/authorize_net/customer.rb +27 -0
  46. data/lib/authorize_net/email_receipt.rb +24 -0
  47. data/lib/authorize_net/fields.rb +736 -0
  48. data/lib/authorize_net/key_value_response.rb +117 -0
  49. data/lib/authorize_net/key_value_transaction.rb +291 -0
  50. data/lib/authorize_net/line_item.rb +25 -0
  51. data/lib/authorize_net/order.rb +42 -0
  52. data/lib/authorize_net/payment_methods/credit_card.rb +74 -0
  53. data/lib/authorize_net/payment_methods/echeck.rb +72 -0
  54. data/lib/authorize_net/reporting/batch.rb +19 -0
  55. data/lib/authorize_net/reporting/batch_statistics.rb +19 -0
  56. data/lib/authorize_net/reporting/fds_filter.rb +11 -0
  57. data/lib/authorize_net/reporting/response.rb +127 -0
  58. data/lib/authorize_net/reporting/transaction.rb +116 -0
  59. data/lib/authorize_net/reporting/transaction_details.rb +25 -0
  60. data/lib/authorize_net/response.rb +27 -0
  61. data/lib/authorize_net/sim/hosted_payment_form.rb +38 -0
  62. data/lib/authorize_net/sim/hosted_receipt_page.rb +37 -0
  63. data/lib/authorize_net/sim/response.rb +142 -0
  64. data/lib/authorize_net/sim/transaction.rb +138 -0
  65. data/lib/authorize_net/transaction.rb +66 -0
  66. data/lib/authorize_net/xml_response.rb +172 -0
  67. data/lib/authorize_net/xml_transaction.rb +275 -0
  68. data/lib/generators/authorize_net/direct_post_generator.rb +51 -0
  69. data/lib/generators/authorize_net/sim_generator.rb +47 -0
  70. data/spec/aim_spec.rb +310 -0
  71. data/spec/arb_spec.rb +191 -0
  72. data/spec/authorize_net_spec.rb +200 -0
  73. data/spec/cim_spec.rb +450 -0
  74. data/spec/reporting_spec.rb +431 -0
  75. data/spec/sim_spec.rb +97 -0
  76. data/spec/spec.opts +5 -0
  77. data/spec/spec_helper.rb +2 -0
  78. data/uninstall.rb +1 -0
  79. metadata +223 -0
@@ -0,0 +1,47 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/named_base'
3
+
4
+ module AuthorizeNet
5
+ module Generators
6
+ class SimGenerator < Rails::Generators::NamedBase
7
+ source_root File.expand_path("../../../../generators/authorize_net_sim/templates", __FILE__)
8
+ argument :api_login_id, :type => :string, :desc => 'Your Authorize.Net API login ID.', :optional => true
9
+ argument :api_transaction_key, :type => :string, :desc => 'Your Authorize.Net API transaction key.', :optional => true
10
+ argument :merchant_hash_value, :type => :string, :desc => 'Your Authorize.Net merchant hash value.', :optional => true
11
+ desc <<-DESC
12
+ Description
13
+ Generates a simple implementation of Authorize.Net's SIM integration method.
14
+
15
+ Example:
16
+ rails generate authorize_net:sim payments API_LOGIN_ID API_TRANSACTION_KEY MERCHANT_HASH_VALUE
17
+
18
+ This will create:
19
+ create README-AuthorizeNet
20
+ create app/views/payments
21
+ create app/views/payments/payment.erb
22
+ create app/views/payments/thank_you.erb
23
+ create app/views/layouts/authorize_net.erb
24
+ create config/authorize_net.yml
25
+ create config/initializers/authorize_net.rb
26
+ create app/controllers/payments_controller.rb
27
+ route match '/payments/thank_you', :to => 'payments#thank_you', :as => 'payments_thank_you', :via => [:get]
28
+ route match '/payments/payment', :to => 'payments#payment', :as => 'paymentspayment', :via => [:get]
29
+
30
+ DESC
31
+
32
+ def manifest
33
+ copy_file "README-AuthorizeNet", "README-AuthorizeNet"
34
+ empty_directory "app/views/#{file_name}"
35
+ copy_file "payment.rails3.erb", "app/views/#{file_name}/payment.erb"
36
+ copy_file "thank_you.erb", "app/views/#{file_name}/thank_you.erb"
37
+ copy_file "layout.erb", "app/views/layouts/authorize_net.erb"
38
+ template "config.yml.rails3.erb", "config/authorize_net.yml"
39
+ copy_file "initializer.rb", "config/initializers/authorize_net.rb"
40
+ template "controller.rb.erb", "app/controllers/#{file_name}_controller.rb"
41
+ route "match '/#{plural_name}/thank_you', :to => '#{file_name}#thank_you', :as => '#{singular_name}_thank_you', :via => [:get]"
42
+ route "match '/#{plural_name}/payment', :to => '#{file_name}#payment', :as => '#{singular_name}payment', :via => [:get]"
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,310 @@
1
+ require "spec_helper"
2
+
3
+ describe AuthorizeNet::AIM::Transaction do
4
+
5
+ before :all do
6
+ begin
7
+ creds = YAML.load_file(File.dirname(__FILE__) + "/credentials.yml")
8
+ @api_key = creds['api_transaction_key']
9
+ @api_login = creds['api_login_id']
10
+ @cp_api_key = creds['cp_api_transaction_key']
11
+ @cp_api_login = creds['cp_api_login_id']
12
+ @md5_value = creds['md5_value']
13
+ @cp_md5_value = creds['cp_md5_value']
14
+ rescue Errno::ENOENT => e
15
+ @api_key = "TEST"
16
+ @api_login = "TEST"
17
+ @cp_api_key = "TEST"
18
+ @cp_api_login = "TEST"
19
+ @md5_value = "TEST"
20
+ @cp_md5_value = "TEST"
21
+ warn "WARNING: Running w/o valid AuthorizeNet sandbox credentials. Create spec/credentials.yml."
22
+ end
23
+ end
24
+
25
+ before do
26
+ @type = AuthorizeNet::AIM::Transaction::Type::AUTHORIZE_AND_CAPTURE
27
+ @test_mode = false
28
+ @gateway = :sandbox
29
+ @amount = (rand(10000) + 100) / 100.0
30
+ @credit_card = AuthorizeNet::CreditCard.new('4111111111111111', '01' + (Time.now + (3600 * 24 * 365)).strftime('%y'))
31
+ @response = '1,1,1,(TESTMODE) This transaction has been approved.,000000,P,0,,,10.00,CC,auth_capture,,,,,,,,,,,,,,,,,,,,,,,,,,7A3C09A367FED29C9902038440CD8A52,,,,,,,,,,,,,XXXX0027,Visa,,,,,,,,,,,,,,,,'
32
+ @echeck = AuthorizeNet::ECheck.new('322271627', '123456789', 'JPMorgan Chase Bank', 'John Doe')
33
+ end
34
+
35
+ it "should support instantiation" do
36
+ AuthorizeNet::AIM::Transaction.new(@api_login, @api_key).should be_instance_of(AuthorizeNet::AIM::Transaction)
37
+ end
38
+
39
+ it "should know if its in test mode" do
40
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => AuthorizeNet::AIM::Transaction::Gateway::TEST, :test => true)
41
+ transaction.test?.should be_true
42
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => AuthorizeNet::AIM::Transaction::Gateway::TEST, :test => false)
43
+ transaction.test?.should be_true
44
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => AuthorizeNet::AIM::Transaction::Gateway::LIVE, :test => true)
45
+ transaction.test?.should be_true
46
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => AuthorizeNet::AIM::Transaction::Gateway::LIVE, :test => false)
47
+ transaction.test?.should be_false
48
+ end
49
+
50
+ it "should not have a response if the transaciton hasn't been run" do
51
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
52
+ transaction.has_response?.should be_false
53
+ end
54
+
55
+ it "should support the addition of fields to the transaction body" do
56
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
57
+ transaction.should respond_to(:set_fields)
58
+ transaction.set_fields({:test => 123}).should == {:test => 123}
59
+ end
60
+
61
+ it "should support the addition of mulitple line_item fields" do
62
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
63
+ transaction.set_fields({:line_item => [123, 123]}).should == {:line_item => [123, 123]}
64
+ transaction.set_fields({:line_item => "abc"}).should == {:line_item => "abc"}
65
+ end
66
+
67
+ it "should not support the addition of mulitple fields for non-line-item fields" do
68
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
69
+ transaction.set_fields({:test => 123}).should == {:test => 123}
70
+ transaction.set_fields({:test => 123}).should == {:test => 123}
71
+ end
72
+
73
+ it "should support custom fields" do
74
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
75
+ transaction.should respond_to(:set_custom_fields)
76
+ transaction.set_custom_fields(:test => 123).should == {:test => 123}
77
+ transaction.fields.should == {}
78
+ transaction.custom_fields.should == {:test => 123}
79
+ end
80
+
81
+ it "should support the returning its response object" do
82
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
83
+ transaction.should respond_to(:response)
84
+ end
85
+
86
+ it "should parse the response properly" do
87
+ Net::HTTP.stub!(:start).and_return(@response)
88
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
89
+ response = transaction.purchase(@amount, @credit_card)
90
+ response.should be_kind_of(AuthorizeNet::AIM::Response)
91
+ response.transaction_id.length.should >= 3
92
+ response.success?.should be_true
93
+ response.avs_response.should == AuthorizeNet::AIM::Response::AVSResponseCode::ADDRESS_AND_ZIP5_MATCH
94
+ response.card_type.should == AuthorizeNet::AIM::Response::CardType::VISA
95
+ response.card_type.should_not == AuthorizeNet::AIM::Response::CardType::MASTER_CARD
96
+ end
97
+
98
+ it "should support different transaction types" do
99
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
100
+ transaction.should respond_to(:type)
101
+ transaction.type.should == AuthorizeNet::AIM::Transaction::Type::AUTHORIZE_AND_CAPTURE
102
+ transaction.type = AuthorizeNet::AIM::Transaction::Type::VOID
103
+ transaction.type.should == AuthorizeNet::AIM::Transaction::Type::VOID
104
+ transaction.type = AuthorizeNet::AIM::Transaction::Type::AUTHORIZE_ONLY
105
+ transaction.type.should == AuthorizeNet::AIM::Transaction::Type::AUTHORIZE_ONLY
106
+ transaction.type = AuthorizeNet::AIM::Transaction::Type::CAPTURE_ONLY
107
+ transaction.type.should == AuthorizeNet::AIM::Transaction::Type::CAPTURE_ONLY
108
+ transaction.type = AuthorizeNet::AIM::Transaction::Type::CREDIT
109
+ transaction.type.should == AuthorizeNet::AIM::Transaction::Type::CREDIT
110
+ transaction.type = AuthorizeNet::AIM::Transaction::Type::PRIOR_AUTHORIZATION_AND_CAPTURE
111
+ transaction.type.should == AuthorizeNet::AIM::Transaction::Type::PRIOR_AUTHORIZATION_AND_CAPTURE
112
+ end
113
+
114
+ it "should be able to run a transaction" do
115
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
116
+ transaction.run.should be_kind_of(AuthorizeNet::AIM::Response)
117
+ end
118
+
119
+ it "should not be able to run a transaction a second time" do
120
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
121
+ transaction.run.should be_kind_of(AuthorizeNet::AIM::Response)
122
+ transaction.run.should be_nil
123
+ end
124
+
125
+ it "should be able to make a purchase" do
126
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
127
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
128
+ transaction.response.fields[:amount].should == @amount
129
+ transaction.response.success?.should be_true
130
+ end
131
+
132
+ it "should support custom fields in the response" do
133
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
134
+ transaction.set_custom_fields(:funkey => '123')
135
+ transaction.set_custom_fields(:winker => 'ABC')
136
+ transaction.set_custom_fields(:bean => '!!!')
137
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
138
+ fields = transaction.response.custom_fields
139
+ fields.should have_key(:funkey)
140
+ fields[:funkey].should == '123'
141
+ fields.should have_key(:winker)
142
+ fields[:winker].should == 'ABC'
143
+ fields.should have_key(:bean)
144
+ fields[:bean].should == '!!!'
145
+ end
146
+
147
+ it "should support an encapsulation character in the response" do
148
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode, :encapsulation_character => '"')
149
+ transaction.set_custom_fields(:funkey => '12,3')
150
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
151
+ fields = transaction.response.custom_fields
152
+ fields.should have_key(:funkey)
153
+ fields[:funkey].should == '12,3'
154
+ end
155
+
156
+ it "should accept an ECheck for a purchase" do
157
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
158
+ transaction.purchase(@amount, @echeck).should be_kind_of(AuthorizeNet::AIM::Response)
159
+ transaction.response.success?.should be_true
160
+ end
161
+
162
+ it "should support adding line items" do
163
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
164
+ transaction.add_line_item("item1", "Foo", "Bar", "5", "5.00", "TRUE")
165
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
166
+ transaction.response.success?.should be_true
167
+ transaction.fields[:line_item].should == ["item1<|>Foo<|>Bar<|>5<|>5.00<|>TRUE"]
168
+ end
169
+
170
+ it "should support setting a customer" do
171
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
172
+ customer = AuthorizeNet::Customer.new(:ip => '127.0.0.1')
173
+ transaction.set_customer(customer)
174
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
175
+ transaction.response.success?.should be_true
176
+ end
177
+
178
+ it "should support setting an address" do
179
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
180
+ address = AuthorizeNet::Address.new(:city => 'San Francisco', :state => 'NY')
181
+ transaction.set_address(address)
182
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
183
+ transaction.response.success?.should be_true
184
+ end
185
+
186
+ it "should support setting a shipping address" do
187
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
188
+ address = AuthorizeNet::ShippingAddress.new(:city => 'San Francisco', :state => 'NY', :tax => 10.00)
189
+ transaction.set_shipping_address(address)
190
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
191
+ transaction.response.success?.should be_true
192
+ end
193
+
194
+ it "should support adding an email receipt" do
195
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
196
+ email = AuthorizeNet::EmailReceipt.new(:header => 'TEST!')
197
+ transaction.set_email_receipt(email)
198
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
199
+ transaction.response.success?.should be_true
200
+ end
201
+
202
+ it "should be able to void a purchase" do
203
+ purchase = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => false)
204
+ purchase.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
205
+ purchase.response.fields[:amount].should == @amount
206
+ purchase.response.success?.should be_true
207
+ void = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :gateway => @gateway, :test => false)
208
+ void.void(purchase.response.transaction_id)
209
+ void.response.success?.should be_true
210
+ end
211
+
212
+ it "should be able to capture a prior authorization" do
213
+ auth = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => false)
214
+ auth.authorize(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
215
+ auth.response.fields[:amount].should == @amount
216
+ auth.response.success?.should be_true
217
+ capture = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :gateway => @gateway, :test => false)
218
+ capture.prior_auth_capture(auth.response.transaction_id)
219
+ capture.response.success?.should be_true
220
+ end
221
+
222
+ it "should be able to run a card present purchase with track 1 data" do
223
+ @credit_card = AuthorizeNet::CreditCard.new(nil, nil, :track_1 => '%B4111111111111111^DOE/JOHN^1803101000000000020000831000000?')
224
+ purchase = AuthorizeNet::AIM::Transaction.new(@cp_api_login, @cp_api_key, :gateway => :card_present_test, :test => false)
225
+ response = purchase.purchase(@amount, @credit_card)
226
+ response.success?.should be_true
227
+ end
228
+
229
+ it "should be able to run a card present purchase with LRC codes in the track 1 data" do
230
+ @credit_card = AuthorizeNet::CreditCard.new(nil, nil, :track_1 => "%B4111111111111111^DOE/JOHN^1803101000000000020000831000000?\xAA")
231
+ purchase = AuthorizeNet::AIM::Transaction.new(@cp_api_login, @cp_api_key, :gateway => :card_present_test, :test => false)
232
+ response = purchase.purchase(@amount, @credit_card)
233
+ response.success?.should be_true
234
+ end
235
+
236
+ it "should be able to run a card present purchase with no LRC or Start/End Sentinels in track 1 data" do
237
+ @credit_card = AuthorizeNet::CreditCard.new(nil, nil, :track_1 => "B4111111111111111^DOE/JOHN^1803101000000000020000831000000")
238
+ purchase = AuthorizeNet::AIM::Transaction.new(@cp_api_login, @cp_api_key, :gateway => :card_present_test, :test => false)
239
+ response = purchase.purchase(@amount, @credit_card)
240
+ response.success?.should be_true
241
+ end
242
+
243
+ it "should be able to run a card present purchase with track 2 data" do
244
+ @credit_card = AuthorizeNet::CreditCard.new(nil, nil, :track_2 => ';4111111111111111=1803101000020000831?')
245
+ purchase = AuthorizeNet::AIM::Transaction.new(@cp_api_login, @cp_api_key, :gateway => :card_present_test, :test => false)
246
+ response = purchase.purchase(@amount, @credit_card)
247
+ response.success?.should be_true
248
+ end
249
+
250
+ it "should be able to run a card present purchase with LRC codes in the track 2 data" do
251
+ @credit_card = AuthorizeNet::CreditCard.new(nil, nil, :track_2 => ";4111111111111111=1803101000020000831?\x33")
252
+ purchase = AuthorizeNet::AIM::Transaction.new(@cp_api_login, @cp_api_key, :gateway => :card_present_test, :test => false)
253
+ response = purchase.purchase(@amount, @credit_card)
254
+ response.success?.should be_true
255
+ end
256
+
257
+ it "should be able to run a card present purchase with no LRC or Start/End Sentinels in track 2 data" do
258
+ @credit_card = AuthorizeNet::CreditCard.new(nil, nil, :track_2 => "4111111111111111=1803101000020000831")
259
+ purchase = AuthorizeNet::AIM::Transaction.new(@cp_api_login, @cp_api_key, :gateway => :card_present_test, :test => false)
260
+ response = purchase.purchase(@amount, @credit_card)
261
+ response.success?.should be_true
262
+ end
263
+
264
+ it "should be able to validate the passed MD5 hash" do
265
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :transaction_type => @type, :gateway => @gateway, :test => @test_mode)
266
+ transaction.purchase(@amount, @credit_card).should be_kind_of(AuthorizeNet::AIM::Response)
267
+ transaction.response.success?.should be_true
268
+ transaction.response.valid_md5?(@api_login, @md5_value).should be_true
269
+ end
270
+
271
+ it "should be able to validate the passed MD5 hash for card present transactions" do
272
+ @credit_card = AuthorizeNet::CreditCard.new(nil, nil, :track_1 => '%B4111111111111111^DOE/JOHN^1803101000000000020000831000000?')
273
+ purchase = AuthorizeNet::AIM::Transaction.new(@cp_api_login, @cp_api_key, :gateway => :card_present_test, :test => false)
274
+ response = purchase.purchase(@amount, @credit_card)
275
+ response.success?.should be_true
276
+ response.valid_md5?(@cp_api_login, @cp_md5_value).should be_true
277
+ end
278
+ end
279
+
280
+
281
+ describe AuthorizeNet::AIM::Response do
282
+
283
+ before :all do
284
+ begin
285
+ creds = YAML.load_file(File.dirname(__FILE__) + "/credentials.yml")
286
+ @api_key = creds['api_transaction_key']
287
+ @api_login = creds['api_login_id']
288
+ rescue Errno::ENOENT => e
289
+ @api_key = "TEST"
290
+ @api_login = "TEST"
291
+ warn "WARNING: Running w/o valid AuthorizeNet sandbox credentials. Create spec/credentials.yml."
292
+ end
293
+ end
294
+
295
+ before do
296
+ @cim_response = '1,1,1,This transaction has been approved.,000000,Y,2000000000,none,Test transaction for ValidateCustomerPaymentProfile.,0.01,CC,auth_only,custId123,John,Doe,,123 Main St.,Bellevue,WA,98004,USA,000-000-0000,,mark@example.com,,,,,,,,,0.00,0.00,0.00,,none,D18EB6B211FE0BBF556B271FDA6F92EE,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,'
297
+ end
298
+
299
+ it "should support a Nokogiri based raw_response" do
300
+ builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |x|
301
+ x.directResponse(@cim_response)
302
+ end
303
+ @element = builder.doc.children[0]
304
+ @element.should be_kind_of(Nokogiri::XML::Element)
305
+ transaction = AuthorizeNet::AIM::Transaction.new(@api_login, @api_key, :test => false)
306
+ response = AuthorizeNet::AIM::Response.new(@element, transaction)
307
+ response.success?.should be_true
308
+ response.response_reason_text.should == 'This transaction has been approved.'
309
+ end
310
+ end
@@ -0,0 +1,191 @@
1
+ require "spec_helper"
2
+
3
+ describe AuthorizeNet::ARB::Transaction do
4
+
5
+ before :all do
6
+ begin
7
+ creds = YAML.load_file(File.dirname(__FILE__) + "/credentials.yml")
8
+ @api_key = creds['api_transaction_key']
9
+ @api_login = creds['api_login_id']
10
+ rescue Errno::ENOENT => e
11
+ @api_key = "TEST"
12
+ @api_login = "TEST"
13
+ warn "WARNING: Running w/o valid AuthorizeNet sandbox credentials. Create spec/credentials.yml."
14
+ end
15
+ end
16
+
17
+ before do
18
+ @gateway = :sandbox
19
+ @subscription = AuthorizeNet::ARB::Subscription.new(
20
+ :name => "monthly foo",
21
+ :length => 1,
22
+ :unit => AuthorizeNet::ARB::Subscription::IntervalUnits::MONTH,
23
+ :start_date => Date.today,
24
+ :total_occurrences => 1,
25
+ :trial_occurrences => nil,
26
+ :amount => 10.00,
27
+ :trial_amount => nil,
28
+ :invoice_number => rand(),
29
+ :description => "a test subscription",
30
+ :subscription_id => nil,
31
+ :credit_card => AuthorizeNet::CreditCard.new('4111111111111111', '01' + (Time.now + (3600 * 24 * 365)).strftime('%y')),
32
+ :billing_address => AuthorizeNet::Address.new(:first_name => 'John', :last_name => 'Doe')
33
+ )
34
+ end
35
+
36
+ it "should support instantiation" do
37
+ AuthorizeNet::ARB::Transaction.new(@api_login, @api_key).should be_instance_of(AuthorizeNet::ARB::Transaction)
38
+ end
39
+
40
+ it "should not have a response if the transaction hasn't been run" do
41
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => @gateway)
42
+ transaction.has_response?.should be_false
43
+ end
44
+
45
+ it "should support the returning its response object" do
46
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => @gateway)
47
+ transaction.should respond_to(:response)
48
+ end
49
+
50
+ it "should know if its running against the sandbox or not" do
51
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
52
+ transaction.test?.should be_true
53
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :live)
54
+ transaction.test?.should be_false
55
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => 'moose')
56
+ transaction.test?.should be_true
57
+ end
58
+
59
+ it "should have a response after running a transaction" do
60
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
61
+ response = transaction.create({})
62
+ response.should be_instance_of(AuthorizeNet::ARB::Response)
63
+ end
64
+
65
+ it "should support creating a subscription" do
66
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
67
+ response = transaction.create(@subscription)
68
+ response.success?.should be_true
69
+ end
70
+
71
+ it "should support canceling a subscription" do
72
+ transaction = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
73
+ response = transaction.create(@subscription)
74
+ response.success?.should be_true
75
+ cancel = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
76
+ response = cancel.cancel(response.subscription_id)
77
+ response.success?.should be_true
78
+ end
79
+
80
+ it "should support getting the status of a subscription" do
81
+ create = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
82
+ response = create.create(@subscription)
83
+ response.success?.should be_true
84
+ status = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
85
+ response = status.get_status(response.subscription_id)
86
+ response.success?.should be_true
87
+ response.subscription_status.should == AuthorizeNet::ARB::Subscription::Status::ACTIVE
88
+ end
89
+
90
+ it "should support updating a subscription" do
91
+ create = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
92
+ response = create.create(@subscription)
93
+ response.success?.should be_true
94
+ update = AuthorizeNet::ARB::Transaction.new(@api_login, @api_key, :gateway => :sandbox)
95
+ subscription = AuthorizeNet::ARB::Subscription.new(:subscription_id => response.subscription_id, :billing_address => AuthorizeNet::Address.new(:first_name => 'Jane', :last_name => 'Doe'))
96
+ response = update.update(subscription)
97
+ response.success?.should be_true
98
+ end
99
+ end
100
+
101
+ describe AuthorizeNet::ARB::Response do
102
+
103
+ before :all do
104
+ begin
105
+ creds = YAML.load_file(File.dirname(__FILE__) + "/credentials.yml")
106
+ @api_key = creds['api_transaction_key']
107
+ @api_login = creds['api_login_id']
108
+ rescue Errno::ENOENT => e
109
+ @api_key = "TEST"
110
+ @api_login = "TEST"
111
+ warn "WARNING: Running w/o valid AuthorizeNet sandbox credentials. Create spec/credentials.yml."
112
+ end
113
+ end
114
+
115
+ before do
116
+
117
+ end
118
+
119
+ it "should support instantiation" do
120
+ AuthorizeNet::ARB::Response.new('', nil).should be_instance_of(AuthorizeNet::ARB::Response)
121
+ end
122
+ end
123
+
124
+ describe AuthorizeNet::ARB::Subscription do
125
+
126
+ before do
127
+ @attributes = [:name, :length, :unit, :start_date, :total_occurrences, :trial_occurrences, :amount, :trial_amount, :invoice_number, :description, :subscription_id]
128
+ @attribute_values = {
129
+ :name => "daily foo",
130
+ :length => 1,
131
+ :unit => AuthorizeNet::ARB::Subscription::IntervalUnits::DAY,
132
+ :start_date => Date.today,
133
+ :total_occurrences => 1,
134
+ :trial_occurrences => nil,
135
+ :amount => 10.00,
136
+ :trial_amount => nil,
137
+ :invoice_number => '123456',
138
+ :description => "a test subscription",
139
+ :subscription_id => nil,
140
+ :credit_card => AuthorizeNet::CreditCard.new('4111111111111111', '01' + (Time.now + (3600 * 24 * 365)).strftime('%y')),
141
+ :billing_address => AuthorizeNet::Address.new(:first_name => 'John', :last_name => 'Doe')
142
+ }
143
+ end
144
+
145
+ it "should support instantiation" do
146
+ AuthorizeNet::ARB::Subscription.new().should be_instance_of(AuthorizeNet::ARB::Subscription)
147
+ end
148
+
149
+ it "should support access to its attributes" do
150
+ subscription = AuthorizeNet::ARB::Subscription.new(@attribute_values)
151
+ @attribute_values.each do |k, v|
152
+ subscription.send(k).should == v
153
+ end
154
+ end
155
+
156
+ it "should support connivence values for unlimited subscription length" do
157
+ subscription = AuthorizeNet::ARB::Subscription.new(:length => :unlimited)
158
+ subscription.length.should == AuthorizeNet::ARB::Subscription::UNLIMITED_OCCURRENCES
159
+ subscription = AuthorizeNet::ARB::Subscription.new()
160
+ subscription.length = :unlimited
161
+ subscription.length.should == AuthorizeNet::ARB::Subscription::UNLIMITED_OCCURRENCES
162
+ end
163
+
164
+ it "should support connivence values for day interval units" do
165
+ subscription = AuthorizeNet::ARB::Subscription.new(:unit => :day)
166
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::DAY
167
+ subscription = AuthorizeNet::ARB::Subscription.new(:unit => :days)
168
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::DAY
169
+ subscription = AuthorizeNet::ARB::Subscription.new()
170
+ subscription.unit = :day
171
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::DAY
172
+ subscription = AuthorizeNet::ARB::Subscription.new()
173
+ subscription.unit = :days
174
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::DAY
175
+ end
176
+
177
+ it "should support connivence values for month interval units" do
178
+ subscription = AuthorizeNet::ARB::Subscription.new(:unit => :month)
179
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::MONTH
180
+ subscription = AuthorizeNet::ARB::Subscription.new(:unit => :months)
181
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::MONTH
182
+ subscription = AuthorizeNet::ARB::Subscription.new()
183
+ subscription.unit = :month
184
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::MONTH
185
+ subscription = AuthorizeNet::ARB::Subscription.new()
186
+ subscription.unit = :months
187
+ subscription.unit.should == AuthorizeNet::ARB::Subscription::IntervalUnits::MONTH
188
+ end
189
+ end
190
+
191
+