activemerchant-realex3ds 1.0.0

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.
@@ -0,0 +1,265 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path('../../lib', __FILE__)
4
+ $:.unshift File.expand_path('..', __FILE__)
5
+
6
+ begin
7
+ require 'rubygems'
8
+ require 'bundler'
9
+ Bundler.setup
10
+ rescue LoadError => e
11
+ puts "Error loading bundler (#{e.message}): \"gem install bundler\" for bundler support."
12
+ end
13
+
14
+ require 'test/unit'
15
+ require 'money'
16
+ require 'mocha/version'
17
+ if(Mocha::VERSION.split(".")[1].to_i < 12)
18
+ require 'mocha'
19
+ else
20
+ require 'mocha/setup'
21
+ end
22
+ require 'yaml'
23
+ require 'json'
24
+ require 'active_merchant'
25
+ require 'comm_stub'
26
+ require 'assert_equal_xml'
27
+
28
+ require 'active_support/core_ext/integer/time'
29
+ require 'active_support/core_ext/numeric/time'
30
+ require 'active_support/core_ext/hash/slice'
31
+
32
+ begin
33
+ require 'active_support/core_ext/time/acts_like'
34
+ rescue LoadError
35
+ end
36
+
37
+ begin
38
+ gem 'actionpack'
39
+ rescue LoadError
40
+ raise StandardError, "The view tests need ActionPack installed as gem to run"
41
+ end
42
+
43
+ require 'action_controller'
44
+ require "action_view/template"
45
+ begin
46
+ require 'active_support/core_ext/module/deprecation'
47
+ require 'action_dispatch/testing/test_process'
48
+ rescue LoadError
49
+ require 'action_controller/test_process'
50
+ end
51
+ require 'active_merchant/billing/integrations/action_view_helper'
52
+
53
+ ActiveMerchant::Billing::Base.mode = :test
54
+
55
+ if ENV['DEBUG_ACTIVE_MERCHANT'] == 'true'
56
+ require 'logger'
57
+ ActiveMerchant::Billing::Gateway.logger = Logger.new(STDOUT)
58
+ ActiveMerchant::Billing::Gateway.wiredump_device = STDOUT
59
+ end
60
+
61
+ # Test gateways
62
+ class SimpleTestGateway < ActiveMerchant::Billing::Gateway
63
+ end
64
+
65
+ class SubclassGateway < SimpleTestGateway
66
+ end
67
+
68
+
69
+ module ActiveMerchant
70
+ module Assertions
71
+ AssertionClass = RUBY_VERSION > '1.9' ? MiniTest::Assertion : Test::Unit::AssertionFailedError
72
+
73
+ def assert_field(field, value)
74
+ clean_backtrace do
75
+ assert_equal value, @helper.fields[field]
76
+ end
77
+ end
78
+
79
+ # Allows the testing of you to check for negative assertions:
80
+ #
81
+ # # Instead of
82
+ # assert !something_that_is_false
83
+ #
84
+ # # Do this
85
+ # assert_false something_that_should_be_false
86
+ #
87
+ # An optional +msg+ parameter is available to help you debug.
88
+ def assert_false(boolean, message = nil)
89
+ message = build_message message, '<?> is not false or nil.', boolean
90
+
91
+ clean_backtrace do
92
+ assert_block message do
93
+ not boolean
94
+ end
95
+ end
96
+ end
97
+
98
+ # A handy little assertion to check for a successful response:
99
+ #
100
+ # # Instead of
101
+ # assert_success response
102
+ #
103
+ # # DRY that up with
104
+ # assert_success response
105
+ #
106
+ # A message will automatically show the inspection of the response
107
+ # object if things go afoul.
108
+ def assert_success(response)
109
+ clean_backtrace do
110
+ assert response.success?, "Response failed: #{response.inspect}"
111
+ end
112
+ end
113
+
114
+ # The negative of +assert_success+
115
+ def assert_failure(response)
116
+ clean_backtrace do
117
+ assert_false response.success?, "Response expected to fail: #{response.inspect}"
118
+ end
119
+ end
120
+
121
+ def assert_valid(validateable)
122
+ clean_backtrace do
123
+ assert validateable.valid?, "Expected to be valid"
124
+ end
125
+ end
126
+
127
+ def assert_not_valid(validateable)
128
+ clean_backtrace do
129
+ assert_false validateable.valid?, "Expected to not be valid"
130
+ end
131
+ end
132
+
133
+ def assert_deprecation_warning(message, target)
134
+ target.expects(:deprecated).with(message)
135
+ yield
136
+ end
137
+
138
+ def assert_no_deprecation_warning(target)
139
+ target.expects(:deprecated).never
140
+ yield
141
+ end
142
+
143
+ private
144
+ def clean_backtrace(&block)
145
+ yield
146
+ rescue AssertionClass => e
147
+ path = File.expand_path(__FILE__)
148
+ raise AssertionClass, e.message, e.backtrace.reject { |line| File.expand_path(line) =~ /#{path}/ }
149
+ end
150
+ end
151
+
152
+ module Fixtures
153
+ HOME_DIR = RUBY_PLATFORM =~ /mswin32/ ? ENV['HOMEPATH'] : ENV['HOME'] unless defined?(HOME_DIR)
154
+ LOCAL_CREDENTIALS = File.join(HOME_DIR.to_s, '.active_merchant/fixtures.yml') unless defined?(LOCAL_CREDENTIALS)
155
+ DEFAULT_CREDENTIALS = File.join(File.dirname(__FILE__), 'fixtures.yml') unless defined?(DEFAULT_CREDENTIALS)
156
+
157
+ private
158
+ def credit_card(number = '4242424242424242', options = {})
159
+ defaults = {
160
+ :number => number,
161
+ :month => 9,
162
+ :year => Time.now.year + 1,
163
+ :first_name => 'Longbob',
164
+ :last_name => 'Longsen',
165
+ :verification_value => '123',
166
+ :brand => 'visa'
167
+ }.update(options)
168
+
169
+ Billing::CreditCard.new(defaults)
170
+ end
171
+
172
+ def check(options = {})
173
+ defaults = {
174
+ :name => 'Jim Smith',
175
+ :bank_name => 'Bank of Elbonia',
176
+ :routing_number => '244183602',
177
+ :account_number => '15378535',
178
+ :account_holder_type => 'personal',
179
+ :account_type => 'checking',
180
+ :number => '1'
181
+ }.update(options)
182
+
183
+ Billing::Check.new(defaults)
184
+ end
185
+
186
+ def address(options = {})
187
+ {
188
+ :name => 'Jim Smith',
189
+ :address1 => '1234 My Street',
190
+ :address2 => 'Apt 1',
191
+ :company => 'Widgets Inc',
192
+ :city => 'Ottawa',
193
+ :state => 'ON',
194
+ :zip => 'K1C2N6',
195
+ :country => 'CA',
196
+ :phone => '(555)555-5555',
197
+ :fax => '(555)555-6666'
198
+ }.update(options)
199
+ end
200
+
201
+ def all_fixtures
202
+ @@fixtures ||= load_fixtures
203
+ end
204
+
205
+ def fixtures(key)
206
+ data = all_fixtures[key] || raise(StandardError, "No fixture data was found for '#{key}'")
207
+
208
+ data.dup
209
+ end
210
+
211
+ def load_fixtures
212
+ [DEFAULT_CREDENTIALS, LOCAL_CREDENTIALS].inject({}) do |credentials, file_name|
213
+ if File.exists?(file_name)
214
+ yaml_data = YAML.load(File.read(file_name))
215
+ credentials.merge!(symbolize_keys(yaml_data))
216
+ end
217
+ credentials
218
+ end
219
+ end
220
+
221
+ def symbolize_keys(hash)
222
+ return unless hash.is_a?(Hash)
223
+
224
+ hash.symbolize_keys!
225
+ hash.each{|k,v| symbolize_keys(v)}
226
+ end
227
+ end
228
+ end
229
+
230
+ Test::Unit::TestCase.class_eval do
231
+ include ActiveMerchant::Billing
232
+ include ActiveMerchant::Assertions
233
+ include ActiveMerchant::Utils
234
+ include ActiveMerchant::Fixtures
235
+ end
236
+
237
+ module ActionViewHelperTestHelper
238
+
239
+ def self.included(base)
240
+ base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)
241
+ base.send(:include, ActionView::Helpers::FormHelper)
242
+ base.send(:include, ActionView::Helpers::FormTagHelper)
243
+ base.send(:include, ActionView::Helpers::UrlHelper)
244
+ base.send(:include, ActionView::Helpers::TagHelper)
245
+ base.send(:include, ActionView::Helpers::CaptureHelper)
246
+ base.send(:include, ActionView::Helpers::TextHelper)
247
+ base.send(:attr_accessor, :output_buffer)
248
+ end
249
+
250
+ def setup
251
+ @controller = Class.new do
252
+ attr_reader :url_for_options
253
+ def url_for(options, *parameters_for_method_reference)
254
+ @url_for_options = options
255
+ end
256
+ end
257
+ @controller = @controller.new
258
+ @output_buffer = ''
259
+ end
260
+
261
+ protected
262
+ def protect_against_forgery?
263
+ false
264
+ end
265
+ end
@@ -0,0 +1,975 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ require 'digest/sha1'
4
+ require 'active_merchant/billing/gateways/realex3ds'
5
+
6
+ class RealexTest < Test::Unit::TestCase
7
+
8
+ class ActiveMerchant::Billing::Realex3dsGateway
9
+ # For the purposes of testing, lets redefine some protected methods as public.
10
+ public :build_purchase_or_authorization_request, :build_credit_request, :build_void_request,
11
+ :build_capture_request, :stringify_values, :avs_input_code, :build_cancel_card_request,
12
+ :build_new_card_request, :build_new_payee_request, :build_receipt_in_request,
13
+ :build_3d_secure_verify_signature_or_enrolled_request
14
+ end
15
+
16
+ def setup
17
+ @login = 'your_merchant_id'
18
+ @password = 'your_secret'
19
+ @account = 'your_account'
20
+ @rebate_secret = 'your_rebate_secret'
21
+
22
+ @gateway = Realex3dsGateway.new(
23
+ :login => @login,
24
+ :password => @password,
25
+ :account => @account
26
+ )
27
+
28
+ @gateway_with_account = Realex3dsGateway.new(
29
+ :login => @merchant_id,
30
+ :password => @secret,
31
+ :account => 'bill_web_cengal'
32
+ )
33
+
34
+ @credit_card = CreditCard.new(
35
+ :number => '4263971921001307',
36
+ :month => 8,
37
+ :year => 2008,
38
+ :first_name => 'Longbob',
39
+ :last_name => 'Longsen',
40
+ :type => 'visa'
41
+ )
42
+
43
+ @options = {
44
+ :order_id => '1'
45
+ }
46
+
47
+ @address = {
48
+ :name => 'Longbob Longsen',
49
+ :address1 => '123 Fake Street',
50
+ :city => 'Belfast',
51
+ :state => 'Antrim',
52
+ :country => 'Northern Ireland',
53
+ :zip => 'BT2 8XX'
54
+ }
55
+
56
+ @amount = 100
57
+ end
58
+
59
+ def test_in_test
60
+ assert_equal :test, ActiveMerchant::Billing::Base.gateway_mode
61
+ end
62
+
63
+ def test_successful_purchase
64
+ @gateway.expects(:ssl_post).returns(successful_purchase_response)
65
+
66
+ response = @gateway.purchase(@amount, @credit_card, @options)
67
+ assert_instance_of Response, response
68
+ assert_success response
69
+ assert response.test?
70
+ end
71
+
72
+ def test_unsuccessful_purchase
73
+ @gateway.expects(:ssl_post).returns(unsuccessful_purchase_response)
74
+
75
+ response = @gateway.purchase(@amount, @credit_card, @options)
76
+ assert_instance_of Response, response
77
+ assert_failure response
78
+ assert response.test?
79
+ end
80
+
81
+ def test_successful_credit
82
+ @gateway = Realex3dsGateway.new(:login => @login, :password => @password, :rebate_secret => 'xyz')
83
+ @gateway.expects(:ssl_post).returns(successful_credit_response)
84
+
85
+ response = @gateway.credit(@amount, '1234', {:order_id => '1234', :pasref => '1234', :authcode => '1234' })
86
+ assert_instance_of Response, response
87
+ assert_success response
88
+ assert response.test?
89
+ end
90
+
91
+ def test_unsuccessful_credit
92
+ @gateway = Realex3dsGateway.new(:login => @login, :password => @password, :rebate_secret => 'xyz')
93
+ @gateway.expects(:ssl_post).returns(unsuccessful_credit_response)
94
+
95
+ response = @gateway.credit(@amount, '1234', {:order_id => '1234', :pasref => '1234', :authcode => '1234' })
96
+ assert_instance_of Response, response
97
+ assert_failure response
98
+ assert response.test?
99
+ end
100
+
101
+ def test_supported_countries
102
+ assert_equal ['IE', 'GB'], Realex3dsGateway.supported_countries
103
+ end
104
+
105
+ def test_supported_card_types
106
+ assert_equal [ :visa, :master, :american_express, :diners_club, :switch, :solo, :laser ], Realex3dsGateway.supported_cardtypes
107
+ end
108
+
109
+ def test_avs_result_not_supported
110
+ @gateway.expects(:ssl_post).returns(successful_purchase_response)
111
+
112
+ response = @gateway.purchase(@amount, @credit_card, @options)
113
+ assert_nil response.avs_result['code']
114
+ end
115
+
116
+ def test_cvv_result
117
+ @gateway.expects(:ssl_post).returns(successful_purchase_response)
118
+
119
+ response = @gateway.purchase(@amount, @credit_card, @options)
120
+ assert_equal 'M', response.cvv_result['code']
121
+ end
122
+
123
+ def test_capture_xml
124
+ options = {
125
+ :pasref => '1234',
126
+ :order_id => '1'
127
+ }
128
+
129
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
130
+
131
+ valid_capture_xml = <<-SRC
132
+ <request timestamp="20090824160201" type="settle">
133
+ <merchantid>your_merchant_id</merchantid>
134
+ <account>your_account</account>
135
+ <orderid>1</orderid>
136
+ <pasref>1234</pasref>
137
+ <authcode>1234</authcode>
138
+ <sha1hash>4132600f1dc70333b943fc292bd0ca7d8e722f6e</sha1hash>
139
+ </request>
140
+ SRC
141
+
142
+ assert_equal_xml valid_capture_xml, @gateway.build_capture_request('1234', options)
143
+ end
144
+
145
+ def test_purchase_xml
146
+ options = {
147
+ :order_id => '1'
148
+ }
149
+
150
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
151
+
152
+ valid_purchase_request_xml = <<-SRC
153
+ <request timestamp="20090824160201" type="auth">
154
+ <merchantid>your_merchant_id</merchantid>
155
+ <account>your_account</account>
156
+ <orderid>1</orderid>
157
+ <amount currency="EUR">100</amount>
158
+ <card>
159
+ <number>4263971921001307</number>
160
+ <expdate>0808</expdate>
161
+ <chname>Longbob Longsen</chname>
162
+ <type>VISA</type>
163
+ <issueno/>
164
+ <cvn>
165
+ <number/>
166
+ <presind/>
167
+ </cvn>
168
+ </card>
169
+ <autosettle flag="1"/>
170
+ <sha1hash>3499d7bc8dbacdcfba2286bd74916d026bae630f</sha1hash>
171
+ </request>
172
+ SRC
173
+
174
+ assert_equal_xml valid_purchase_request_xml, @gateway.build_purchase_or_authorization_request(:purchase, @amount, @credit_card, options)
175
+ end
176
+
177
+ def test_void_xml
178
+ options = {
179
+ :pasref => '1234',
180
+ :order_id => '1'
181
+ }
182
+
183
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
184
+
185
+ valid_void_request_xml = <<-SRC
186
+ <request timestamp="20090824160201" type="void">
187
+ <merchantid>your_merchant_id</merchantid>
188
+ <account>your_account</account>
189
+ <orderid>1</orderid>
190
+ <pasref>1234</pasref>
191
+ <authcode>1234</authcode>
192
+ <sha1hash>4132600f1dc70333b943fc292bd0ca7d8e722f6e</sha1hash>
193
+ </request>
194
+ SRC
195
+
196
+ assert_equal_xml valid_void_request_xml, @gateway.build_void_request('1234', options)
197
+ end
198
+
199
+ def test_auth_xml
200
+ options = {
201
+ :order_id => '1'
202
+ }
203
+
204
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
205
+
206
+ valid_auth_request_xml = <<-SRC
207
+ <request timestamp="20090824160201" type="auth">
208
+ <merchantid>your_merchant_id</merchantid>
209
+ <account>your_account</account>
210
+ <orderid>1</orderid>
211
+ <amount currency=\"EUR\">100</amount>
212
+ <card>
213
+ <number>4263971921001307</number>
214
+ <expdate>0808</expdate>
215
+ <chname>Longbob Longsen</chname>
216
+ <type>VISA</type>
217
+ <issueno/>
218
+ <cvn>
219
+ <number/>
220
+ <presind/>
221
+ </cvn>
222
+ </card>
223
+ <autosettle flag="0"/>
224
+ <sha1hash>3499d7bc8dbacdcfba2286bd74916d026bae630f</sha1hash>
225
+ </request>
226
+ SRC
227
+
228
+ assert_equal_xml valid_auth_request_xml, @gateway.build_purchase_or_authorization_request(:authorization, @amount, @credit_card, options)
229
+ end
230
+
231
+ def test_credit_xml
232
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account)
233
+
234
+
235
+ options = {
236
+ :pasref => '1234',
237
+ :order_id => '1'
238
+ }
239
+
240
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
241
+
242
+ valid_credit_request_xml = <<-SRC
243
+ <request timestamp="20090824160201" type="rebate">
244
+ <merchantid>your_merchant_id</merchantid>
245
+ <account>your_account</account>
246
+ <orderid>1</orderid>
247
+ <pasref>1234</pasref>
248
+ <authcode>1234</authcode>
249
+ <amount currency="EUR">100</amount>
250
+ <autosettle flag="1"/>
251
+ <sha1hash>ef0a6c485452f3f94aff336fa90c6c62993056ca</sha1hash>
252
+ </request>
253
+ SRC
254
+
255
+ assert_equal_xml valid_credit_request_xml, @gateway.build_credit_request(@amount, '1234', options)
256
+
257
+ end
258
+
259
+ def test_credit_with_rebate_secret_xml
260
+
261
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account, :rebate_secret => @rebate_secret)
262
+
263
+ options = {
264
+ :pasref => '1234',
265
+ :order_id => '1'
266
+ }
267
+
268
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
269
+
270
+ valid_credit_request_xml = <<-SRC
271
+ <request timestamp="20090824160201" type="rebate">
272
+ <merchantid>your_merchant_id</merchantid>
273
+ <account>your_account</account>
274
+ <orderid>1</orderid>
275
+ <pasref>1234</pasref>
276
+ <authcode>1234</authcode>
277
+ <amount currency="EUR">100</amount>
278
+ <refundhash>f94ff2a7c125a8ad87e5683114ba1e384889240e</refundhash>
279
+ <autosettle flag="1"/>
280
+ <sha1hash>ef0a6c485452f3f94aff336fa90c6c62993056ca</sha1hash>
281
+ </request>
282
+ SRC
283
+
284
+ assert_equal_xml valid_credit_request_xml, gateway.build_credit_request(@amount, '1234', options)
285
+
286
+ end
287
+
288
+ def test_stringify_values
289
+ assert_equal "timestamp.merchantid.orderid.ammount.currency.creditcard",
290
+ @gateway.stringify_values(["timestamp","merchantid", "orderid", "ammount", "currency", "creditcard"])
291
+
292
+ assert_equal "timestamp.merchantid.orderid.ammount.currency",
293
+ @gateway.stringify_values(["timestamp","merchantid", "orderid", "ammount", "currency"])
294
+
295
+ assert_equal "timestamp.merchantid.orderid",
296
+ @gateway.stringify_values(["timestamp","merchantid", "orderid"])
297
+ end
298
+
299
+ def test_should_extract_avs_input
300
+ address = {:address1 => "123 Fake Street", :zip => 'BT1 0HX'}
301
+ assert_equal "10|123", @gateway.avs_input_code(address)
302
+ end
303
+
304
+ def test_auth_with_address
305
+ @gateway.expects(:ssl_post).returns(successful_purchase_response)
306
+
307
+ options = {
308
+ :order_id => '1',
309
+ :billing_address => @address,
310
+ :shipping_address => @address
311
+ }
312
+
313
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
314
+
315
+ response = @gateway.authorize(@amount, @credit_card, options)
316
+ assert_instance_of Response, response
317
+ assert_success response
318
+ assert response.test?
319
+
320
+ end
321
+
322
+ def test_address_with_avs_code
323
+ options = {
324
+ :billing_address => @address
325
+ }
326
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
327
+ request = @gateway.build_purchase_or_authorization_request(:purchase, @amount, @credit_card, options)
328
+
329
+ avs_request = <<-SRC
330
+ <request timestamp="20090824160201" type="auth">
331
+ <merchantid>your_merchant_id</merchantid>
332
+ <account>your_account</account>
333
+ <orderid></orderid>
334
+ <amount currency="EUR">100</amount>
335
+ <card>
336
+ <number>4263971921001307</number>
337
+ <expdate>0808</expdate>
338
+ <chname>Longbob Longsen</chname>
339
+ <type>VISA</type>
340
+ <issueno/>
341
+ <cvn>
342
+ <number/>
343
+ <presind/>
344
+ </cvn>
345
+ </card>
346
+ <autosettle flag="1"/>
347
+ <sha1hash>2cf9b05d95c7a2eefc3936989b2696a189b518c9</sha1hash>
348
+ <tssinfo>
349
+ <address type="billing">
350
+ <code>28|123</code>
351
+ <country>Northern Ireland</country>
352
+ </address>
353
+ </tssinfo>
354
+ </request>
355
+ SRC
356
+
357
+ assert_equal_xml avs_request, request
358
+ end
359
+
360
+ def test_skip_avs_check
361
+ options = {
362
+ :billing_address => @address,
363
+ :skip_avs_check => true
364
+ }
365
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
366
+ request = @gateway.build_purchase_or_authorization_request(:purchase, @amount, @credit_card, options)
367
+
368
+ avs_request = <<-SRC
369
+ <request timestamp="20090824160201" type="auth">
370
+ <merchantid>your_merchant_id</merchantid>
371
+ <account>your_account</account>
372
+ <orderid></orderid>
373
+ <amount currency="EUR">100</amount>
374
+ <card>
375
+ <number>4263971921001307</number>
376
+ <expdate>0808</expdate>
377
+ <chname>Longbob Longsen</chname>
378
+ <type>VISA</type>
379
+ <issueno/>
380
+ <cvn>
381
+ <number/>
382
+ <presind/>
383
+ </cvn>
384
+ </card>
385
+ <autosettle flag="1"/>
386
+ <sha1hash>2cf9b05d95c7a2eefc3936989b2696a189b518c9</sha1hash>
387
+ <tssinfo>
388
+ <address type="billing">
389
+ <code>BT2 8XX</code>
390
+ <country>Northern Ireland</country>
391
+ </address>
392
+ </tssinfo>
393
+ </request>
394
+ SRC
395
+
396
+ assert_equal_xml avs_request, request
397
+ end
398
+
399
+ def test_verify_signature_xml
400
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account)
401
+
402
+
403
+ options = {
404
+ :order_id => '1',
405
+ :three_d_secure_auth => {
406
+ :pa_res => 'xxxx'
407
+ }
408
+ }
409
+
410
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
411
+
412
+ valid_verify_signature_request_xml = <<-SRC
413
+ <request timestamp="20090824160201" type="3ds-verifysig">
414
+ <merchantid>your_merchant_id</merchantid>
415
+ <account>your_account</account>
416
+ <orderid>1</orderid>
417
+ <amount currency="EUR">100</amount>
418
+ <card>
419
+ <number>4263971921001307</number>
420
+ <expdate>0808</expdate>
421
+ <chname>Longbob Longsen</chname>
422
+ <type>VISA</type>
423
+ <issueno/>
424
+ <cvn>
425
+ <number/>
426
+ <presind/>
427
+ </cvn>
428
+ </card>
429
+ <pares>xxxx</pares>
430
+ <sha1hash>3499d7bc8dbacdcfba2286bd74916d026bae630f</sha1hash>
431
+ </request>
432
+ SRC
433
+
434
+ assert_equal_xml valid_verify_signature_request_xml, @gateway.build_3d_secure_verify_signature_or_enrolled_request('3ds-verifysig', @amount, @credit_card, options)
435
+
436
+ end
437
+
438
+ def test_verify_enrolled_xml
439
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account)
440
+
441
+
442
+ options = {
443
+ :order_id => '1',
444
+ :three_d_secure_auth => {
445
+ }
446
+ }
447
+
448
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
449
+
450
+ valid_verify_signature_request_xml = <<-SRC
451
+ <request timestamp="20090824160201" type="3ds-verifyenrolled">
452
+ <merchantid>your_merchant_id</merchantid>
453
+ <account>your_account</account>
454
+ <orderid>1</orderid>
455
+ <amount currency="EUR">100</amount>
456
+ <card>
457
+ <number>4263971921001307</number>
458
+ <expdate>0808</expdate>
459
+ <chname>Longbob Longsen</chname>
460
+ <type>VISA</type>
461
+ <issueno/>
462
+ <cvn>
463
+ <number/>
464
+ <presind/>
465
+ </cvn>
466
+ </card>
467
+ <sha1hash>3499d7bc8dbacdcfba2286bd74916d026bae630f</sha1hash>
468
+ </request>
469
+ SRC
470
+
471
+ assert_equal_xml valid_verify_signature_request_xml, @gateway.build_3d_secure_verify_signature_or_enrolled_request('3ds-verifyenrolled', @amount, @credit_card, options)
472
+
473
+ end
474
+
475
+
476
+
477
+ def test_payee_new_xml
478
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account)
479
+ options = {
480
+ :order_id => '1',
481
+ :user => {
482
+ :id => 1,
483
+ :first_name => 'John',
484
+ :last_name => 'Smith'
485
+ }
486
+ }
487
+
488
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
489
+
490
+ valid_new_payee_request_xml = <<-SRC
491
+ <request timestamp="20090824160201" type="payer-new">
492
+ <merchantid>your_merchant_id</merchantid>
493
+ <account>your_account</account>
494
+ <orderid>1</orderid>
495
+ <payer type="Business" ref="1">
496
+ <firstname>John</firstname>
497
+ <surname>Smith</surname>
498
+ </payer>
499
+ <sha1hash>388dd92c8b251ee8970fb4770dc0fed31aa6f1ba</sha1hash>
500
+ </request>
501
+ SRC
502
+
503
+ assert_equal_xml valid_new_payee_request_xml, @gateway.build_new_payee_request(options)
504
+
505
+ end
506
+
507
+ def test_new_card_xml
508
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account)
509
+ options = {
510
+ :order_id => '1',
511
+ :payment_method => 'visa01',
512
+ :user => {
513
+ :id => 1,
514
+ :first_name => 'John',
515
+ :last_name => 'Smith'
516
+ }
517
+ }
518
+
519
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
520
+
521
+ valid_new_card_request_xml = <<-SRC
522
+ <request timestamp="20090824160201" type="card-new">
523
+ <merchantid>your_merchant_id</merchantid>
524
+ <account>your_account</account>
525
+ <orderid>1</orderid>
526
+ <card>
527
+ <ref>visa01</ref>
528
+ <payerref>1</payerref>
529
+ <number>4263971921001307</number>
530
+ <expdate>0808</expdate>
531
+ <chname>Longbob Longsen</chname>
532
+ <type>VISA</type>
533
+ <issueno/>
534
+ <cvn>
535
+ <number/>
536
+ <presind/>
537
+ </cvn>
538
+ </card>
539
+ <sha1hash>2b95dd150f1d7192fe1e4c2d701f826883e5956b</sha1hash>
540
+ </request>
541
+ SRC
542
+
543
+ assert_equal_xml valid_new_card_request_xml, @gateway.build_new_card_request(@credit_card, options)
544
+
545
+ end
546
+
547
+ def test_receipt_in_xml
548
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account)
549
+ options = {
550
+ :order_id => '1',
551
+ :payment_method => 'visa01',
552
+ :user => {
553
+ :id => 1,
554
+ :first_name => 'John',
555
+ :last_name => 'Smith'
556
+ }
557
+ }
558
+
559
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
560
+
561
+ valid_receipt_in_request_xml = <<-SRC
562
+ <request timestamp="20090824160201" type="receipt-in">
563
+ <merchantid>your_merchant_id</merchantid>
564
+ <account>your_account</account>
565
+ <orderid>1</orderid>
566
+ <amount currency=\"EUR\">100</amount>
567
+ <payerref>1</payerref>
568
+ <paymentmethod>visa01</paymentmethod>
569
+ <autosettle flag="1"/>
570
+ <sha1hash>f8365c0ba649e82bed6eebc1043e6a211919676e</sha1hash>
571
+ </request>
572
+ SRC
573
+
574
+ assert_equal_xml valid_receipt_in_request_xml, @gateway.build_receipt_in_request(@amount, @credit_card, options)
575
+
576
+ end
577
+
578
+ def test_card_unstore_xml
579
+ gateway = Realex3dsGateway.new(:login => @login, :password => @password, :account => @account)
580
+ options = {
581
+ :order_id => '1',
582
+ :payment_method => 'visa01',
583
+ :user => {
584
+ :id => 1,
585
+ :first_name => 'John',
586
+ :last_name => 'Smith'
587
+ }
588
+ }
589
+
590
+ ActiveMerchant::Billing::Realex3dsGateway.expects(:timestamp).returns('20090824160201')
591
+
592
+ valid_cancel_card_request_xml = <<-SRC
593
+ <request timestamp="20090824160201" type="card-cancel-card">
594
+ <merchantid>your_merchant_id</merchantid>
595
+ <account>your_account</account>
596
+ <card>
597
+ <ref>visa01</ref>
598
+ <payerref>1</payerref>
599
+ <expdate>0808</expdate>
600
+ </card>
601
+ <sha1hash>ff0d7ff2ff82fef20de477b4d91478533bd4ab85</sha1hash>
602
+ </request>
603
+ SRC
604
+
605
+ assert_equal_xml valid_cancel_card_request_xml, @gateway.build_cancel_card_request(@credit_card, options)
606
+
607
+ end
608
+
609
+
610
+ private
611
+
612
+ def successful_purchase_response
613
+ <<-RESPONSE
614
+ <response timestamp='20010427043422'>
615
+ <merchantid>your merchant id</merchantid>
616
+ <account>account to use</account>
617
+ <orderid>order id from request</orderid>
618
+ <authcode>authcode received</authcode>
619
+ <result>00</result>
620
+ <message>[ test system ] message returned from system</message>
621
+ <pasref> realex payments reference</pasref>
622
+ <cvnresult>M</cvnresult>
623
+ <batchid>batch id for this transaction (if any)</batchid>
624
+ <cardissuer>
625
+ <bank>Issuing Bank Name</bank>
626
+ <country>Issuing Bank Country</country>
627
+ <countrycode>Issuing Bank Country Code</countrycode>
628
+ <region>Issuing Bank Region</region>
629
+ </cardissuer>
630
+ <tss>
631
+ <result>89</result>
632
+ <check id="1000">9</check>
633
+ <check id="1001">9</check>
634
+ </tss>
635
+ <sha1hash>7384ae67....ac7d7d</sha1hash>
636
+ <md5hash>34e7....a77d</md5hash>
637
+ </response>"
638
+ RESPONSE
639
+ end
640
+
641
+ def unsuccessful_purchase_response
642
+ <<-RESPONSE
643
+ <response timestamp='20010427043422'>
644
+ <merchantid>your merchant id</merchantid>
645
+ <account>account to use</account>
646
+ <orderid>order id from request</orderid>
647
+ <authcode>authcode received</authcode>
648
+ <result>01</result>
649
+ <message>[ test system ] message returned from system</message>
650
+ <pasref> realex payments reference</pasref>
651
+ <cvnresult>M</cvnresult>
652
+ <batchid>batch id for this transaction (if any)</batchid>
653
+ <cardissuer>
654
+ <bank>Issuing Bank Name</bank>
655
+ <country>Issuing Bank Country</country>
656
+ <countrycode>Issuing Bank Country Code</countrycode>
657
+ <region>Issuing Bank Region</region>
658
+ </cardissuer>
659
+ <tss>
660
+ <result>89</result>
661
+ <check id="1000">9</check>
662
+ <check id="1001">9</check>
663
+ </tss>
664
+ <sha1hash>7384ae67....ac7d7d</sha1hash>
665
+ <md5hash>34e7....a77d</md5hash>
666
+ </response>"
667
+ RESPONSE
668
+ end
669
+
670
+ def successful_credit_response
671
+ <<-RESPONSE
672
+ <response timestamp='20010427043422'>
673
+ <merchantid>your merchant id</merchantid>
674
+ <account>account to use</account>
675
+ <orderid>order id from request</orderid>
676
+ <authcode>authcode received</authcode>
677
+ <result>00</result>
678
+ <message>[ test system ] message returned from system</message>
679
+ <pasref> realex payments reference</pasref>
680
+ <cvnresult>M</cvnresult>
681
+ <batchid>batch id for this transaction (if any)</batchid>
682
+ <sha1hash>7384ae67....ac7d7d</sha1hash>
683
+ <md5hash>34e7....a77d</md5hash>
684
+ </response>"
685
+ RESPONSE
686
+ end
687
+
688
+ def unsuccessful_credit_response
689
+ <<-RESPONSE
690
+ <response timestamp='20010427043422'>
691
+ <merchantid>your merchant id</merchantid>
692
+ <account>account to use</account>
693
+ <orderid>order id from request</orderid>
694
+ <authcode>authcode received</authcode>
695
+ <result>508</result>
696
+ <message>[ test system ] You may only rebate up to 115% of the original amount.</message>
697
+ <pasref> realex payments reference</pasref>
698
+ <cvnresult>M</cvnresult>
699
+ <batchid>batch id for this transaction (if any)</batchid>
700
+ <sha1hash>7384ae67....ac7d7d</sha1hash>
701
+ <md5hash>34e7....a77d</md5hash>
702
+ </response>"
703
+ RESPONSE
704
+ end
705
+
706
+ def successful_verify_request
707
+ <<-REQUEST
708
+ <request timestamp="20030625172305" type="3ds-verifyenrolled">
709
+ <merchantid>merchantid</merchantid>
710
+ <account />
711
+ <orderid>orderid</orderid>
712
+ <amount currency="EUR">2499</amount>
713
+ <card>
714
+ <number>4012001037141112</number>
715
+ <expdate>0404</expdate>
716
+ <type>visa</type>
717
+ <chname>Joe Pescquali</chname>
718
+ </card>
719
+ <sha1hash>c914a520f88743e40d0620e1b5328c4eebb33725</sha1hash>
720
+ <comments>
721
+ <comment id="1" />
722
+ <comment id="2" />
723
+ </comments>
724
+ </request>
725
+ REQUEST
726
+ end
727
+
728
+ def successful_verify_enrollment_response
729
+ <<-RESPONSE
730
+ <response timestamp="20030625171810">
731
+ <merchantid>merchantid</merchantid>
732
+ <account>internet</account>
733
+ <orderid>orderid</orderid>
734
+ <authcode></authcode>
735
+ <result>00</result>
736
+ <message>Enrolled</message>
737
+ <pasref></pasref>
738
+ <timetaken>3</timetaken>
739
+ <authtimetaken>0</authtimetaken>
740
+ <pareq>eJxVUttygkAM/ZUdnitZFlBw4na02tE6bR0vD+0bLlHpFFDASv++u6i1
741
+ zVNycju54H2dfrIvKsokz3qWY3OLUabyOMm2PWu1fGwF1r3E5a4gGi5IH
742
+ QuS+ExlGW2JJXHPCjcuVyLYbIRQnrf2o3VMEY+57q05oIsibP+nA4SL02k
743
+ 7mELhKupqxVqF2WVxEgdBpMX6dwE4YJhSsVkKB3RH9ypGFyvNXpkrLW
744
+ 982HcancQzn7MopSkO2RnqmxJZYXQgKjyY1YV39Lt6O5XA4/Fp9xV1b4L
745
+ cDqdbDcum8xKJ9oqTxFMAMKN5OxotFIXrJNY1otpMH0qYQwP43w08Pn0
746
+ /W1Ql6+nj+cegonAOKpICs5d3hY+czpdJ+g6HKHBUoNEyk8OwzZaDXXE
747
+ 58R3JtG/as7DBH+IqhZFvpS3zLsBHqeq4VU7/OMTA7Cr45wo/0wNptWlV
748
+ 4Xb8Thftv3A30xs+7GYaokej3c415TxhgIJhUu54TLF2jt33f8ADVyvnA=</pareq>
749
+ <url>http://www.acs.com</url>
750
+ <enrolled>Y</enrolled>
751
+ <xid>7ba3b1e6e6b542489b73243aac050777</xid>
752
+ <sha1hash>9eda1f99191d4e994627ddf38550b9f47981f614</sha1hash>
753
+ </response>
754
+ RESPONSE
755
+ end
756
+
757
+ def unsuccessful_verify_enrollment_response
758
+ <<-RESPONSE
759
+ <response timestamp="20030625171810">
760
+ <merchantid>merchantid</merchantid>
761
+ <account>internet</account>
762
+ <orderid>orderid</orderid>
763
+ <authcode></authcode>
764
+ <result>110</result>
765
+ <message>Not Enrolled</message>
766
+ <pasref></pasref>
767
+ <timetaken>3</timetaken>
768
+ <authtimetaken>0</authtimetaken>
769
+ <pareq>eJxVUttygkAM/ZUdnitZFlBw4na02tE6bR0vD+0bLlHpFFDASv++u6i1
770
+ zVNycju54H2dfrIvKsokz3qWY3OLUabyOMm2PWu1fGwF1r3E5a4gGi5IH
771
+ QuS+ExlGW2JJXHPCjcuVyLYbIRQnrf2o3VMEY+57q05oIsibP+nA4SL02k
772
+ 7mELhKupqxVqF2WVxEgdBpMX6dwE4YJhSsVkKB3RH9ypGFyvNXpkrLW
773
+ 982HcancQzn7MopSkO2RnqmxJZYXQgKjyY1YV39Lt6O5XA4/Fp9xV1b4L
774
+ cDqdbDcum8xKJ9oqTxFMAMKN5OxotFIXrJNY1otpMH0qYQwP43w08Pn0
775
+ /W1Ql6+nj+cegonAOKpICs5d3hY+czpdJ+g6HKHBUoNEyk8OwzZaDXXE
776
+ 58R3JtG/as7DBH+IqhZFvpS3zLsBHqeq4VU7/OMTA7Cr45wo/0wNptWlV
777
+ 4Xb8Thftv3A30xs+7GYaokej3c415TxhgIJhUu54TLF2jt33f8ADVyvnA=</pareq>
778
+ <url></url>
779
+ <enrolled>N</enrolled>
780
+ <xid>e9dafe706f7142469c45d4877aaf5984</xid>
781
+ <sha1hash>9eda1f99191d4e994627ddf38550b9f47981f614</sha1hash>
782
+ </response>
783
+ RESPONSE
784
+ end
785
+
786
+ def successful_verify_signature_request
787
+ <<-REQUEST
788
+ <request timestamp="20030625172325" type="3ds-verifysig">
789
+ <merchantid>merchantid</merchantid>
790
+ <account />
791
+ <orderid>orderid</orderid>
792
+ <amount currency="EUR">2499</amount>
793
+ <card>
794
+ <number>4012001037141112</number>
795
+ <expdate>0404</expdate>
796
+ <type>visa</type>
797
+ <chname>Joe Pescqualli</chname>
798
+ </card>
799
+ <pares>eJztWFmT4jgS/..... a/A2OMEv4=</pares>
800
+ <sha1hash>e0817f5ffeca1241c23a52b0eafa5c578ef68356</sha1hash>
801
+ <comments>
802
+ <comment id="1" />
803
+ <comment id="2" />
804
+ </comments>
805
+ </request>
806
+ REQUEST
807
+ end
808
+
809
+ def successful_verify_signature_response
810
+ <<-RESPONSE
811
+ <response timestamp="20030625171823">
812
+ <merchantid>merchantid</merchantid>
813
+ <account />
814
+ <orderid>orderid</orderid>
815
+ <result>00</result>
816
+ <message>Authentication Successful</message>
817
+ <threedsecure>
818
+ <status>N</status>
819
+ <eci />
820
+ <xid />
821
+ <cavv />
822
+ <algorithm />
823
+ </threedsecure>
824
+ <sha1hash>e5a7745da5dc32d234c3f52860132c482107e9ac</sha1hash>
825
+ </response>
826
+ RESPONSE
827
+ end
828
+
829
+
830
+ # TODO
831
+ # Ensure this response error is caught and payments made unobtrusively...
832
+ #
833
+ # <response timestamp="20060322231944">
834
+ # <result> 508</ result>
835
+ # < message> Transaction MPI data does not match the data in the MPI database</ message>
836
+ # </response>
837
+
838
+ def successful_authorisation_request_with_3dsecure
839
+ <<-REQUEST
840
+ <request timestamp="20030625172325" type="auth">
841
+ <merchantid>merchantid</merchantid>
842
+ <account />
843
+ <orderid>orderid</orderid>
844
+ <amount currency="EUR">2499</amount>
845
+ <card>
846
+ <number>4012001037141112</number>
847
+ <expdate>0404</expdate>
848
+ <type>visa</type>
849
+ <chname>Joe Pescqualli</chname>
850
+ </card>
851
+ <autosettle flag="1" />
852
+ <mpi>
853
+ <cavv>AAACAWQWaRKIFwQlVBZpAAAAAAA=</cavv>
854
+ <xid>l2ncCuvKNtCtRY3OoC/ztHS8ZvI=</xid>
855
+ <eci>5</eci>
856
+ </mpi>
857
+ <sha1hash>e0817f5ffeca1241c23a52b0eafa5c578ef68356</sha1hash>
858
+ <comments>
859
+ <comment id="1" />
860
+ <comment id="2" />
861
+ </comments>
862
+ <autosettle flag="1" />
863
+ </request>
864
+ REQUEST
865
+ end
866
+
867
+ def successful_payer_new_response
868
+ <<-RESPONSE
869
+ <response timestamp="20080611122312">
870
+ <merchantid>yourmerchantid</merchantid>
871
+ <account>internet</account>
872
+ <orderid>transaction01</orderid>
873
+ <result>00</result>
874
+ <message>Successful</message>
875
+ <pasref>5e6b67d303404710a98a4f18abdcd402</pasref>
876
+ <authcode></authcode>
877
+ <batchid></batchid>
878
+ <timetaken>0</timetaken>
879
+ <processingtimetaken></processingtimetaken>
880
+ <md5hash>ff3be479aca946522a9d72d792855018</md5hash>
881
+ <sha1hash>2858c85a5e380e9dc9398329bbd1f086527fc2a7</sha1hash>
882
+ </response>
883
+ RESPONSE
884
+ end
885
+
886
+ def successful_payer_edit_response
887
+ <<-RESPONSE
888
+ <response timestamp="20080619114736">
889
+ <merchantid>yourmerchantid</merchantid>
890
+ <account>internet</account>
891
+ <orderid>transaction01</orderid>
892
+ <result>00</result>
893
+ <message>Successful</message>
894
+ <pasref>889510cbf2e74b27b745b2b9b908fabf</pasref>
895
+ <authcode></authcode>
896
+ <batchid></batchid>
897
+ <timetaken>0</timetaken>
898
+ <processingtimetaken></processingtimetaken>
899
+ <md5hash>0bcbd8187c2e2ff48668bca26c706a39</md5hash>
900
+ <sha1hash>7cd0d46c65d6985b7871a7e682451be5ac1b5a2d</sha1hash>
901
+ </response>
902
+ RESPONSE
903
+ end
904
+
905
+ def successful_card_store_response
906
+ <<-RESPONSE
907
+ <response timestamp="20080619120024">
908
+ <merchantid>yourmerchantid</merchantid>
909
+ <account>internet</account>
910
+ <orderid>transaction01</orderid>
911
+ <result>00</result>
912
+ <message>Successful</message>
913
+ <pasref>6326ce64fbe340d699433dfc01785c69</pasref>
914
+ <authcode></authcode>
915
+ <batchid></batchid>
916
+ <timetaken>0</timetaken>
917
+ <processingtimetaken></processingtimetaken>
918
+ <md5hash>e41b9e80d0421930131572d66c830407</md5hash>
919
+ <sha1hash>281e5be5a58c7e26b2a6aa31018177960a9c49ab</sha1hash>
920
+ </response>
921
+ RESPONSE
922
+ end
923
+
924
+ def unsuccessful_card_store_response
925
+ <<-RESPONSE
926
+ <response timestamp="20080619120121">
927
+ <merchantid></merchantid>
928
+ <account></account>
929
+ <orderid></orderid>
930
+ <result>501</result>
931
+ <message>This Card Ref [cardref01] has already been used [Perhaps you've already set up this
932
+ card for this Payer?]</message>
933
+ <pasref></pasref>
934
+ <authcode></authcode>
935
+ <batchid></batchid>
936
+ <timetaken>1</timetaken>
937
+ <processingtimetaken></processingtimetaken>
938
+ <md5hash>ce30d3ea0e4c9b3d152b61bc5dc93fba</md5hash>
939
+ <sha1hash>8f00805dc22a8832ad43ba2d31ba1ee868ed51f9</sha1hash>
940
+ </response>
941
+ RESPONSE
942
+ end
943
+
944
+ def successful_reccurring_response
945
+ <<-RESPONSE
946
+ <response timestamp="20080611121850">
947
+ <merchantid>yourmerchantid</merchantid>
948
+ <account>internet</account>
949
+ <orderid>transaction01</orderid>
950
+ <result>00</result>
951
+ <message>Successful</message>
952
+ <pasref>6210a82bba414793ba391254dffbbf77</pasref>
953
+ <authcode></authcode>
954
+ <batchid>161</batchid>
955
+ <timetaken>1</timetaken>
956
+ <processingtimetaken></processingtimetaken>
957
+ <md5hash>22049e6b2c68a5a3942a615c46a1bd72</md5hash>
958
+ <sha1hash>ddd37a93aa377e8c85b42ff4c3a1f88db33ea977</sha1hash>
959
+ </response>
960
+ RESPONSE
961
+ end
962
+
963
+ def unsucessful_recurring_response
964
+ <<-RESPONSE
965
+ <response timestamp="20080611122328">
966
+ <merchantid>yourmerchantid</merchantid>
967
+ <account>internet</account>
968
+ <result>520</result>
969
+ <message>There is no such Payment Method [cardref] configured for that Payer
970
+ [payerref]</message>
971
+ </response>
972
+ RESPONSE
973
+ end
974
+
975
+ end