ruby-saferpay 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,6 +9,7 @@ require 'net/https'
9
9
  require 'uri'
10
10
  require 'net/https'
11
11
  require 'hpricot'
12
+ require 'ostruct'
12
13
 
13
14
  class Saferpay
14
15
 
@@ -53,13 +54,15 @@ class Saferpay
53
54
  {:code => 301, :short_message => 'Authentication Error', :long_message => 'An error happened during the authentication request. The merchant application could choose to:\n- continue the payment without authentication or\n- ask customer for other payment method or\n- stop the payment.'}
54
55
  ]
55
56
  attr_reader :error
56
- def initialize(saferpay_reply)
57
- if saferpay_reply.is_a? String
58
- result = Hpricot.parse(cmd_result).at('idp').attributes['result'].to_i rescue 152
59
- elsif saferpay_reply.is_a? Hash
60
- result = saferpay_reply['result'].to_i rescue 152
61
- elsif saferpay_reply.is_a? Fixnum
62
- result = saferpay_reply
57
+ def initialize(saferpay_response)
58
+ if saferpay_response.is_a? String
59
+ result = Hpricot.parse(saferpay_response).at('idp').attributes['result'].to_i rescue 152
60
+ elsif saferpay_response.is_a? Hash
61
+ result = saferpay_response['result'].to_i rescue 152
62
+ elsif saferpay_response.is_a? Fixnum
63
+ result = saferpay_response
64
+ elsif saferpay_response.is_a? OpenStruct
65
+ result = saferpay_response.response
63
66
  else
64
67
  result = 152 # Unknown error
65
68
  end
@@ -82,17 +85,17 @@ class Saferpay
82
85
  CURRENCIES = ['CHF','CZK','DKK','EUR','GBP','PLN','SEK','USD']
83
86
 
84
87
  attr_accessor :account_id
85
- attr_reader :current_transaction
88
+ attr_reader :current_request
86
89
 
87
- def initialize( account_id = "99867-94913159", pan = "9451123100000004", expiry_date = nil, cvc = nil, name = nil, tolerance = 0 )
90
+ def initialize( account_id = "99867-94913159", pan = "9451123100000004", expiry_date = '1107', cvc = '', name = '', tolerance = 0 )
88
91
  Saferpay.check_install
89
- @current_transaction = nil
92
+ @current_request = nil
90
93
 
91
- @account_id = account_id
92
- @pan = pan
93
- @expiry_date= expiry_date
94
- @cvc = cvc
95
- @name = name
94
+ @account_id = account_id.gsub(/[\s]/,'').chomp
95
+ @pan = pan.gsub(/[\s]/,'').chomp
96
+ @expiry_date= expiry_date.gsub(/[\s]/,'').chomp
97
+ @cvc = cvc.gsub(/[\s]/,'').chomp
98
+ @name = name.chomp
96
99
  @tolerance = tolerance # Amount tolerance in percent. The finally captured amount is AMOUNT + TOLERANCE
97
100
  end
98
101
 
@@ -107,61 +110,48 @@ class Saferpay
107
110
  end
108
111
 
109
112
  def details( transaction_id = nil )
110
- transaction_id = @current_transaction.transaction_id if transaction_id.nil?
111
- cmd = "#{BASEDIR}#{EXECUTABLE} -exec -p #{CONFIG} -m Inquiry -a ID #{transaction_id} -a TYPE Transaction -a TOKEN \"(not used)\""
112
- #logger.debug "#{self.class}#details COMMAND: #{cmd}"
113
- do_direct_cc cmd
113
+ transaction_id = @current_request.transaction_id if transaction_id.nil?
114
+ raise ArgumentError, "Cannot retrieve transaction details without a transaction id." if transaction_id.nil?
115
+ req = Request.new(:inquiry, :transaction_id => transaction_id)
116
+ do_direct_cc req.cmd
114
117
  end
115
118
 
116
119
  def reserve( amount, currency )
117
120
  check_params amount, currency
118
- @current_transaction = TransactionParams.new(
119
- :amount => amount,
120
- :currency => currency,
121
- :accountid => @account_id,
122
- :pan => @pan,
123
- :exp => @expiry_date
124
- )
125
- do_direct_cc
121
+ @current_request = Request.new(:reserve, :amount => amount, :currency => currency, :accountid => @account_id, :pan => @pan, :exp => @expiry_date)
122
+ do_direct_cc( @current_request.cmd )
126
123
  end
127
124
 
128
125
  def refund( amount, currency )
129
126
  check_params amount, currency
130
- @current_transaction = TransactionParams.new(
131
- :amount => amount,
132
- :currency => currency,
133
- :accountid => @account_id,
134
- :pan => @pan,
135
- :exp => @expiry_date,
136
- :action => "Credit"
137
- )
138
- do_direct_cc
127
+ @current_request = Request.new(:refund, :amount => amount, :currency => currency, :accountid => @account_id, :pan => @pan, :exp => @expiry_date)
128
+ do_direct_cc @current_request.cmd
139
129
  end
140
130
 
141
131
  def refund_last
142
- refund_transaction @current_transaction.transaction_id
132
+ raise ArgumentError, "No current request to refund." if @current_request.transaction_id.nil?
133
+ refund_transaction @current_request.transaction_id
143
134
  end
144
135
 
145
- def refund_transaction( transaction_id )
146
- cmd = "#{BASEDIR}#{EXECUTABLE} -capt -p #{CONFIG} -i #{transaction_id} -t \"(not used)\""
147
- do_direct_cc cmd
136
+ def refund_transaction( transaction_id = nil )
137
+ raise ArgumentError, "Cannot refund without transaction_id" if transaction_id.nil?
138
+ @current_request = Request.new(:refund_transaction, :transaction_id => transaction_id)
139
+ do_direct_cc @current_request.cmd
148
140
  end
149
141
 
150
142
  # Capture the amount of the transaction with id transaction_id
151
143
  # Defaults to capturing the current transaction's amount.
152
144
  def capture( transaction_id = nil, token = nil, params = nil )
153
- transaction_id = @current_transaction.transaction_id if transaction_id.nil?
154
- token = @current_transaction.token if token.nil?
155
- cmd = "#{BASEDIR}#{EXECUTABLE} -capt -p #{CONFIG} -i #{transaction_id} -t \"#{token}\" #{params}"
156
- do_direct_cc cmd
145
+ transaction_id = @current_request.transaction_id if transaction_id.nil?
146
+ @current_request = Request.new( :capture, :transaction_id => transaction_id )
147
+ do_direct_cc @current_request.cmd
157
148
  end
158
149
 
159
150
  def cancel( transaction_id = nil, token = nil )
160
- transaction_id = @current_transaction.transaction_id if transaction_id.nil?
161
- token = @current_transaction.token if token.nil?
162
- params = "-a ACTION Cancel"
163
-
164
- capture transaction_id, token, params
151
+ transaction_id = @current_request.transaction_id if transaction_id.nil?
152
+ token = @current_request.token if token.nil?
153
+ @current_request = Request.new( :cancel, :transaction_id => transaction_id )
154
+ do_direct_cc @current_request.cmd
165
155
  end
166
156
 
167
157
  # Direct debit on aquierer's bank account.
@@ -172,13 +162,10 @@ class Saferpay
172
162
  check_params amount, currency
173
163
  raise AttributeError, "Account number is a ten digit number" unless account_number.length == 10
174
164
  raise AttributeError, "BLZ is a eight digit number" unless blz.length == 8
175
- @current_transaction = TransactionParams.new(
176
- :amount => amount,
177
- :currency => currency,
178
- :accountid => @account_id,
179
- :track2 => "\";59#{blz}=#{account_number}\""
180
- )
181
- do_direct_cc
165
+
166
+ track2 = "\";59#{blz}=#{account_number}\"" # Weird, huh?
167
+ @current_request = Request.new(:debit_card_reserve, :amount => amount, :currency => currency, :accountid => @account_id, :track2 => track2 )
168
+ do_direct_cc @current_request.cmd
182
169
  end
183
170
  alias :lastschrift :debit_card_reserve
184
171
 
@@ -187,7 +174,7 @@ class Saferpay
187
174
  # couple of more methods to handle the paycomplete and other types of messages.
188
175
  # Take it for what it is: a stub)
189
176
  def payinit( amount, currency, description, backlink = 'http://localhost', faillink = 'http://localhost', successlink = 'http://localhost', notifyurl = 'http://localhost')
190
- @current_transaction = TransactionParams.new(
177
+ @current_request = TransactionParams.new(
191
178
  :amount => amount,
192
179
  :currency => currency,
193
180
  :description => description,
@@ -197,7 +184,7 @@ class Saferpay
197
184
  :successlink => successlink,
198
185
  :notifyurl => notifyurl
199
186
  )
200
- cmd = "#{BASEDIR}#{EXECUTABLE} -payinit -p #{CONFIG} -a #{@current_transaction.to_s}"
187
+ cmd = "#{BASEDIR}#{EXECUTABLE} -payinit -p #{CONFIG} -a #{@current_request.to_s}"
201
188
  logger.debug "#{self.class}#payinit Will execute command:\n#{cmd}"
202
189
  payinit = %x{#{cmd} 2>&1}
203
190
 
@@ -244,33 +231,45 @@ class Saferpay
244
231
 
245
232
  private
246
233
 
247
- # Execute the saferpay ommand. Defaults to the most common type of command.
248
- # TODO: should return a Transaction object
249
- def do_direct_cc( cmd = nil )
250
- cmd = "#{BASEDIR}#{EXECUTABLE} -exec -p #{CONFIG} -m Authorization -a #{@current_transaction.to_s}" if cmd.nil?
234
+ # Execute the saferpay command and return a response object (an OpenStruct with the attributes in the <IDP/> element as methods)
235
+ # TODO: clean this mess
236
+ # TODO: should raise or return response with success == false?
237
+ # TODO: get rid of OpenStruct and populate a Request object instead (all calls to this method initializes the @current_request ivar, _except_ details() that need to work out-of-context)
238
+ # TODO: move some stuff to class methods?
239
+ def do_direct_cc( cmd )
240
+ # cmd = "#{BASEDIR}#{EXECUTABLE} -exec -p #{CONFIG} -m Authorization -a #{@current_request.to_s}" if cmd.nil?
251
241
  cmd_result = %x{#{cmd} 2>&1}
242
+ #logger.debug "#{self.class}#do_direct_cc Got a result:\n\t#{cmd_result}\n\tCommand: #{cmd}\n-------------------\n"
252
243
 
253
244
  unless $?.success?
254
245
  logger.error "#{self.class}#do_direct_cc FAILED \nError status: #{$?.inspect}\nCommand:#{cmd}\nCommand result: #{cmd_result}"
255
246
  raise TransactionError.new(cmd_result)
256
247
  else
257
248
  unless cmd_result.empty?
258
- #logger.debug "#{self.class}#do_direct_cc Got a result:\n\t#{cmd_result}\n\tCommand: #{cmd}\n-------------------\n"
259
- result = Hpricot.parse(cmd_result).at('idp').attributes # A hash
260
- if result['result'] === "0"
261
- @current_transaction.transaction_id = result['id']
262
- @current_transaction.token = result['token']
263
- elsif result['msgtype'] == 'InquiryResponse'
264
- # TODO: check for valid InquiryResponse message
249
+ response_hsh = Hpricot.parse(cmd_result).at('idp').attributes # A hash
250
+ response = OpenStruct.new( response_hsh.merge('success' => false, :transaction_id => response_hsh['id']) )
251
+ #logger.debug "#{self.class}#do_direct_cc Have response object?\n\tresponse: #{response.inspect}\n\tOriginal hash: #{response_hsh.inspect}\n\tSTDOUT: #{cmd_result}"
252
+ if response.result === "0"
253
+ response.success = true
254
+ @current_request.transaction_id = response.transaction_id
255
+ @current_request.token = response.token
256
+ elsif response.msgtype == 'InquiryResponse'
257
+ if response.transaction_id
258
+ response.success = true
259
+ response.result = "0"
260
+ else
261
+ logger.error "#{self.class}#do_direct_cc FAILED INQUIRY \nError status: #{$?.inspect}\nCommand:#{cmd}\nCommand result: #{cmd_result}"
262
+ raise TransactionError.new(response)
263
+ end
265
264
  else
266
265
  logger.error "#{self.class}#do_direct_cc FAILED \nError status: #{$?.inspect}\nCommand:#{cmd}\nCommand result: #{cmd_result}"
267
- raise TransactionError.new(result)
266
+ raise TransactionError.new(response)
268
267
  end
269
268
  else
270
- result = true
269
+ response = OpenStruct.new(:response => '0', 'success?' => true)
271
270
  end
272
271
  end
273
- result
272
+ response
274
273
  end
275
274
 
276
275
  def check_params(amount, currency) #:nodoc:
@@ -340,18 +339,94 @@ private
340
339
  true
341
340
  end
342
341
 
343
- class TransactionParams
344
- DEFAULTS = {}
342
+ class Request
343
+ attr_reader :cmd, :type, :accountid, :account_id, :amount, :currency, :pan, :exp, :expiry_date, :cvc, :track2
344
+ attr_accessor :transaction_id, :token
345
+ def initialize(type = :authorization, args = {})
346
+ logger = Saferpay.logger
347
+ # logger.debug "#{self.class}#initialize ARGS: #{args.inspect}"
348
+ # logger.debug "#{self.class}#initialize #{type.to_s.capitalize}. Required attributes are:...."
349
+ opts = nil
350
+ attrs = nil
351
+ mess = nil
352
+ case type
353
+ when :authorization, :auth, :reserve
354
+ op = 'exec'
355
+ mess = 'Authorization'
356
+ attrs = {:amount => args[:amount], :currency => args[:currency], :accountid => args[:accountid], :pan => args[:pan], :exp => args[:exp]}
357
+ when :debit_card_reserve, :lastschrift
358
+ op = 'exec'
359
+ mess = 'Authorization'
360
+ attrs = {:amount => args[:amount], :currency => args[:currency], :accountid => args[:accountid], :track2 => args[:track2]}
361
+ when :capture
362
+ raise ArgumentError, "#{type.to_s.capitalize}: missing required parameter \"transaction_id\"" unless args[:transaction_id]
363
+ op = 'capt'
364
+ opts = "-i #{args[:transaction_id]} -t \"(not used)\""
365
+ when :refund
366
+ op = 'exec'
367
+ mess = 'Authorization'
368
+ attrs = {:action => 'Debit', :amount => args[:amount], :currency => args[:currency], :accountid => args[:accountid], :pan => args[:pan], :exp => args[:exp]}
369
+ when :refund_transaction
370
+ raise ArgumentError, "#{type.to_s.capitalize}: missing required parameter \"transaction_id\"" unless args[:transaction_id]
371
+ op = 'capt'
372
+ opts = "-i #{args[:transaction_id]} -t \"(not used)\""
373
+ when :cancel
374
+ raise ArgumentError, "#{type.to_s.capitalize}: missing required parameter \"transaction_id\"" unless args[:transaction_id]
375
+ op = 'capt'
376
+ opts = "-i #{args[:transaction_id]} -t \"(not used)\""
377
+ attrs = {:action => 'Cancel'}
378
+ when :inquiry, :details, :info
379
+ op = 'exec'
380
+ mess = 'Inquiry'
381
+ attrs = {:type => 'Transaction', :id => args[:transaction_id]}
382
+ end
383
+ message = mess.nil? ? '' : "-m #{mess}"
345
384
 
346
- attr_accessor :params, :transaction_id, :token
347
- def initialize( params )
348
- @params = DEFAULTS.merge( params )
349
- @transaction_id = nil
350
- @token = nil
385
+ # Check for missing values and complain; Compile attributes string
386
+ if attrs
387
+ attrs.each{|attr, value|
388
+ raise ArgumentError, "#{type.to_s.capitalize}: missing required parameter \"#{attr}\"" if(value.nil? || value.to_s.empty? || (value.is_a?(Fixnum) && value == 0))
389
+ }
390
+ attrs = '-a ' + attrs.map{|k,v| "#{k.to_s.upcase} #{v}" }.join(" -a ")
391
+ end
392
+
393
+ # TODO: fill all ivars and class_eval them to be attr_reader-able
394
+ @amount = args[:amount]
395
+ @pan = args[:pan]
396
+ @exp = args[:exp]; @expiry_date = @exp
397
+ @currency = args[:currency]
398
+ @cvc = args[:cvc]
399
+ @track2 = args[:track2]
400
+ @accountid = args[:accountid]; @account_id = @accountid
401
+ @transaction_id = args[:transaction_id]
402
+ @type = type
403
+ @cmd = "#{Saferpay::BASEDIR}#{Saferpay::EXECUTABLE} -#{op} -p #{Saferpay::CONFIG} #{message} #{opts} #{attrs}"
351
404
  end
352
405
 
353
- def to_s
354
- @params.map{|k,v| "#{k.to_s.upcase} #{v}"}.join " -a "
406
+ def to_hash
407
+ self.instance_variables.inject({}){|hsh,ivar| hsh.merge(ivar.gsub(/@/,'').to_sym => self.instance_variable_get(ivar))}
355
408
  end
409
+
356
410
  end
357
- end
411
+ end
412
+ # Example response messages
413
+ # Sucessful auth:
414
+ # <IDP MSGTYPE="AuthorizationResponse" AUTHMESSAGE="" ACCOUNTID="99867-94913159" PROVIDERID="90" PROVIDERNAME="Saferpay Test Card" CONTRACTNUMBER="123456789" CCCOUNTRY="XX" ID="3vQ3nvbp4bM8SAlEtd1lbAM0SSnA" TOKEN="(unused)" RESULT="0" AUTHCODE="074869"/>
415
+ # Failed auths
416
+ # <IDP MSGTYPE="AuthorizationResponse" MESSAGE="request was not processed" AUTHMESSAGE="Access Denied" ACCOUNTID="99867-9491" RESULT="5"/>
417
+ # <IDP MSGTYPE="AuthorizationResponse" MESSAGE="request was not processed" AUTHMESSAGE="currency &apos;EURR&apos; is unknown" ACCOUNTID="99867-94913159" RECEIPTDATA="" RESULT="83"/>
418
+ # <IDP MSGTYPE="AuthorizationResponse" MESSAGE="request was not processed" AUTHMESSAGE="no contract available" ACCOUNTID="99867-94913159" RECEIPTDATA="" RESULT="67"/>
419
+ # Sucessful inquiry
420
+ # <IDP MSGTYPE="InquiryResponse" ID="3vQ3nvbp4bM8SAlEtd1lbAM0SSnA" PAN="9451123100000004" TRACK2=";9451123100000004=0711?0" EXP="0711" CCCOUNTRY="XX"
421
+ # CVC="no" ACCOUNTID="99867-94913159" CONTRACTNUMBER="123456789" AMOUNT="300" CURRENCY="EUR" PROVIDERID="90" PROVIDERNAME="Saferpay Test Card"
422
+ # AUTHCODE="074869" AUTHMESSAGE="" AUTHDATE="20070815 17:37:12" APPLICATION="Saferpay Card Authorization Interface" ECI="0" SETTLED="no" ACTION="Debit"
423
+ # CANCELLED="no" CLOSED="no"/>
424
+ # Failed inquiry
425
+ # "" (empty if ID is bad)
426
+ # <IDP MSGTYPE="InquiryResponse" MESSAGE="request was not processed"/>
427
+ # Sucessful capture:
428
+ # ""
429
+ # Successful cancel
430
+ # ""
431
+ # Failed cancel
432
+ # ERROR: 0x80040213 (the request failed)
@@ -2,7 +2,7 @@ module RubySaferpay #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 2
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -57,6 +57,16 @@ class SaferpayTest < Test::Unit::TestCase
57
57
  assert_raise( NoMethodError ) { @sfp2.refund_last }
58
58
  end
59
59
 
60
+ def test_refund_transcation
61
+ assert_nothing_raised{
62
+ res = @sfp.reserve( 6666, 'EUR' )
63
+ @sfp.refund_transaction( res.transaction_id )
64
+ }
65
+
66
+ assert_raise( ArgumentError ) { @sfp.refund_transaction }
67
+ end
68
+
69
+
60
70
  def test_capture
61
71
  @sfp.reserve( 600, 'EUR' )
62
72
  assert @sfp.capture
@@ -69,48 +79,48 @@ class SaferpayTest < Test::Unit::TestCase
69
79
  @sfp.capture
70
80
  assert @sfp.cancel
71
81
  end
72
-
73
- def test_debit_card_reserve
74
- assert_raise( ArgumentError ) { @sfp.debit_card_reserve }
75
- assert_raise( Saferpay::TransactionError ) {
76
- @sfp.debit_card_reserve(100200, "EUR", "1234567890", "12345678")
77
- assert_is_authorization_response res
78
- }
79
- end
80
-
81
- def test_details
82
- assert_raise ( NoMethodError ) { @sfp.details }
83
- assert_nothing_raised{
84
- @sfp.reserve( 3000, "USD" )
85
- @sfp.capture
86
- @sfp.details
87
- }
88
-
89
- assert_nothing_raised{
90
- res = @sfp.reserve( 1000, "USD" )
91
- @sfp.capture
92
-
93
- res2 = @sfp.reserve( 1100, "USD" )
94
- @sfp.capture
95
-
96
- assert_not_equal @sfp.details( res['id'] ), @sfp.details( res2['id'] )
97
- assert_not_equal @sfp.details( res['id'] ), @sfp.details
98
- }
99
- end
100
-
101
- def test_pay
102
- res = @sfp.pay( 4000 )
103
- assert_is_inquiry_response res
104
- end
82
+ #
83
+ # def test_debit_card_reserve
84
+ # assert_raise( ArgumentError ) { @sfp.debit_card_reserve }
85
+ # assert_raise( Saferpay::TransactionError ) {
86
+ # @sfp.debit_card_reserve(100200, "EUR", "1234567890", "12345678")
87
+ # assert_is_authorization_response res
88
+ # }
89
+ # end
90
+ #
91
+ # def test_details
92
+ # assert_raise ( NoMethodError ) { @sfp.details }
93
+ # assert_nothing_raised{
94
+ # @sfp.reserve( 3000, "USD" )
95
+ # @sfp.capture
96
+ # @sfp.details
97
+ # }
98
+ #
99
+ # assert_nothing_raised{
100
+ # res = @sfp.reserve( 1000, "USD" )
101
+ # @sfp.capture
102
+ #
103
+ # res2 = @sfp.reserve( 1100, "USD" )
104
+ # @sfp.capture
105
+ #
106
+ # assert_not_equal @sfp.details( res.transaction_id ), @sfp.details( res2.transaction_id )
107
+ # assert_not_equal @sfp.details( res.transaction_id ), @sfp.details
108
+ # }
109
+ # end
110
+ #
111
+ # def test_pay
112
+ # res = @sfp.pay( 4000 )
113
+ # assert_is_inquiry_response res
114
+ # end
105
115
 
106
116
 
107
117
  private
108
118
  def assert_is_inquiry_response(res)
109
- assert_instance_of Hash, res
119
+ assert_instance_of OpenStruct, res
110
120
  assert_is_saferpay_response res
111
121
  require_these = [:pan, :track2, :exp, :cccountry, :cvc, :accountid, :contractnumber, :amount, :currency, :providerid, :providername, :authcode,:authmessage, :authdate, :application, :eci, :settled, :settledate, :action, :cancelled, :closed]
112
- assert require_these.all?{ |param| res.has_key? param.to_s }, "Required parameter is missing in response: #{res.inspect}"
113
- assert res['msgtype'] == "InquiryResponse", "Msgtype is not \"InquiryResponse\""
122
+ assert require_these.all?{ |param| res.respond_to? param.to_s }, "Required parameter is missing in response: #{res.inspect}"
123
+ assert res.msgtype == "InquiryResponse", "Msgtype is not \"InquiryResponse\""
114
124
  end
115
125
 
116
126
  #<IDP MSGTYPE="InquiryResponse"
@@ -138,25 +148,25 @@ private
138
148
  # CLOSED="no"
139
149
  #/>
140
150
  def assert_is_authorization_response(res)
141
- assert_instance_of Hash, res
151
+ assert_instance_of OpenStruct, res
142
152
  assert_is_saferpay_response res
143
- assert res['msgtype'] == "AuthorizationResponse", "Msgtype is not \"AuthorizationResponse\""
144
- assert res.has_key?( 'result' ), "No result code received in response"
145
- assert res['result'] == "0", "Result code is not Zero (\"0\")"
146
- assert res.has_key?( 'token' ), "No token in response"
147
- assert res['token'] == "(unused)", "Token is not \"(unused)\""
153
+ assert res.msgtype == "AuthorizationResponse", "Msgtype is not \"AuthorizationResponse\""
154
+ assert res.respond_to?( 'result' ), "No result code received in response"
155
+ assert res.result == "0", "Result code is not Zero (\"0\")"
156
+ assert res.respond_to?( 'token' ), "No token in response"
157
+ assert res.token == "(unused)", "Token is not \"(unused)\""
148
158
  end
149
159
 
150
160
  def assert_is_saferpay_response(res)
151
- assert res.has_key?( 'accountid' ), "No accountid received in response"
152
- assert res['accountid'] == @accountid, "Accountid is not the test accountid"
153
- assert res.has_key?( 'msgtype' ), "No msgtype in response"
154
- assert res.has_key?( 'authcode' ), "No authcode in response"
155
- assert res.has_key?( 'id' ), "No id in response"
156
- assert res.has_key?( 'providerid' ), "No providerid in response"
157
- assert res.has_key?( 'providername' ), "No providername in response"
158
- assert res.has_key?( 'cccountry' ), "No cccountry in response"
159
- assert res.has_key?( 'contractnumber' ), "No contractnumber in response"
161
+ assert res.respond_to?( 'accountid' ), "No accountid received in response"
162
+ assert res.accountid == @accountid, "Accountid is not the test accountid"
163
+ assert res.respond_to?( 'msgtype' ), "No msgtype in response"
164
+ assert res.respond_to?( 'authcode' ), "No authcode in response"
165
+ assert res.respond_to?( 'id' ), "No id in response"
166
+ assert res.respond_to?( 'providerid' ), "No providerid in response"
167
+ assert res.respond_to?( 'providername' ), "No providername in response"
168
+ assert res.respond_to?( 'cccountry' ), "No cccountry in response"
169
+ assert res.respond_to?( 'contractnumber' ), "No contractnumber in response"
160
170
  end
161
171
 
162
172
  end
metadata CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ruby-saferpay
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.2
6
+ version: 0.0.3
7
7
  date: 2007-08-15 00:00:00 +02:00
8
8
  summary: Ruby interface to the saferpay e-commerce payment provider
9
9
  require_paths: