activemerchant 1.3.1 → 1.3.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 (30) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG +15 -0
  3. data/Rakefile +1 -1
  4. data/lib/active_merchant/billing/credit_card.rb +1 -1
  5. data/lib/active_merchant/billing/credit_card_methods.rb +3 -3
  6. data/lib/active_merchant/billing/gateway.rb +12 -3
  7. data/lib/active_merchant/billing/gateways/braintree.rb +2 -2
  8. data/lib/active_merchant/billing/gateways/card_stream.rb +2 -2
  9. data/lib/active_merchant/billing/gateways/cyber_source.rb +1 -1
  10. data/lib/active_merchant/billing/gateways/data_cash.rb +1 -1
  11. data/lib/active_merchant/billing/gateways/linkpoint.rb +1 -1
  12. data/lib/active_merchant/billing/gateways/payflow.rb +4 -3
  13. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +2 -2
  14. data/lib/active_merchant/billing/gateways/paypal.rb +2 -2
  15. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +3 -15
  16. data/lib/active_merchant/billing/gateways/protx.rb +3 -3
  17. data/lib/active_merchant/billing/gateways/realex.rb +1 -1
  18. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +155 -0
  19. data/lib/active_merchant/lib/country.rb +2 -1
  20. data/test/fixtures.yml +4 -0
  21. data/test/remote/gateways/remote_authorize_net_test.rb +1 -1
  22. data/test/remote/gateways/remote_paypal_test.rb +7 -7
  23. data/test/remote/gateways/remote_secure_pay_au_test.rb +40 -0
  24. data/test/unit/credit_card_test.rb +20 -3
  25. data/test/unit/gateways/gateway_test.rb +11 -1
  26. data/test/unit/gateways/payflow_test.rb +1 -1
  27. data/test/unit/gateways/paypal_test.rb +0 -20
  28. data/test/unit/gateways/secure_pay_au_test.rb +150 -0
  29. metadata +5 -2
  30. metadata.gz.sig +0 -0
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG CHANGED
@@ -1,5 +1,20 @@
1
1
  = ActiveMerchant CHANGELOG
2
2
 
3
+ == Version 1.3.2 (February 24, 2008)
4
+
5
+ * Actually fix the bug by adding extdata element to Payflow Requests [cody]
6
+ * Fix bug with adding name to Payflow requests [cody]
7
+ * Gateways will now look for CreditCard#brand before looking for CreditCard#type [cody]
8
+ * Make before_validate in CreditCard more clear [keith_du...@mac.com, cody]
9
+ * Don't send full Australian state names to PayPal [cody]
10
+ * Return last_digits that are less than 4 characters long [cody]
11
+ * Fix Bug with Authorize.Net ARB Remote Test [patrick.t.joyce]
12
+ * Add support for forcing test mode on Secure Pay AU gateway [cody]
13
+ * Update Secure Pay Au to meet specs for MessageInfo elements [cody]
14
+ * Add support for the Australian Secure Pay payment gateway [cody]
15
+ * Allow LinkPoint cancellations for recurring billing. [yanagimoto.shin]
16
+ * Add support for Åland Islands to the country list [cody]
17
+
3
18
  == Version 1.3.1 (January 28, 2008)
4
19
 
5
20
  * Rename BrainTreeGateway to BraintreeGateway, but keep alias to old naming for backwards compatibility [cody]
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ require File.dirname(__FILE__) + '/lib/tasks/cia'
8
8
  require File.dirname(__FILE__) + '/lib/support/gateway_support'
9
9
 
10
10
 
11
- PKG_VERSION = "1.3.1"
11
+ PKG_VERSION = "1.3.2"
12
12
  PKG_NAME = "activemerchant"
13
13
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
14
14
 
@@ -112,7 +112,7 @@ module ActiveMerchant #:nodoc:
112
112
  def before_validate #:nodoc:
113
113
  self.month = month.to_i
114
114
  self.year = year.to_i
115
- self.number.to_s.gsub!(/[^\d]/, "")
115
+ self.number = number.to_s.gsub(/[^\d]/, "")
116
116
  self.type.downcase! if type.respond_to?(:downcase)
117
117
  self.type = self.class.type?(number) if type.blank?
118
118
  end
@@ -84,12 +84,12 @@ module ActiveMerchant #:nodoc:
84
84
  return nil
85
85
  end
86
86
 
87
- def last_digits(number)
88
- number.to_s.slice(-4..-1) if number.to_s.length >= 4
87
+ def last_digits(number)
88
+ number.to_s.length <= 4 ? number : number.to_s.slice(-4..-1)
89
89
  end
90
90
 
91
91
  def mask(number)
92
- "XXXX-XXXX-XXXX-#{last_digits(number)}" if number.to_s.length >= 4
92
+ "XXXX-XXXX-XXXX-#{last_digits(number)}"
93
93
  end
94
94
 
95
95
  # Checks to see if the calculated type matches the specified type
@@ -101,7 +101,16 @@ module ActiveMerchant #:nodoc:
101
101
  # Use this method to check if your gateway of interest supports a credit card of some type
102
102
  def self.supports?(card_type)
103
103
  supported_cardtypes.include?(card_type.to_sym)
104
- end
104
+ end
105
+
106
+ def self.card_brand(source)
107
+ result = source.respond_to?(:brand) ? source.brand : source.type
108
+ result.to_s.downcase
109
+ end
110
+
111
+ def card_brand(source)
112
+ self.class.card_brand(source)
113
+ end
105
114
 
106
115
  # Initialize a new gateway.
107
116
  #
@@ -145,8 +154,8 @@ module ActiveMerchant #:nodoc:
145
154
  end
146
155
 
147
156
  def requires_start_date_or_issue_number?(credit_card)
148
- return false if credit_card.type.blank?
149
- DEBIT_CARDS.include?(credit_card.type.to_sym)
157
+ return false if card_brand(credit_card).blank?
158
+ DEBIT_CARDS.include?(card_brand(credit_card).to_sym)
150
159
  end
151
160
  end
152
161
  end
@@ -192,8 +192,8 @@ module ActiveMerchant #:nodoc:
192
192
  def determine_funding_source(source)
193
193
  case
194
194
  when source.is_a?(String) then :vault
195
- when CreditCard.card_companies.keys.include?(source.type) then :credit_card
196
- when source.type == 'check' then :check
195
+ when CreditCard.card_companies.keys.include?(card_brand(source)) then :credit_card
196
+ when card_brand(source) == 'check' then :check
197
197
  else raise ArgumentError, "Unsupported funding source provided"
198
198
  end
199
199
  end
@@ -134,7 +134,7 @@ module ActiveMerchant #:nodoc:
134
134
  add_pair(post, :TransactionUnique, options[:order_id], :required => true)
135
135
  add_pair(post, :OrderDesc, options[:description] || options[:order_id], :required => true)
136
136
 
137
- if [ 'american_express', 'diners_club' ].include?(credit_card.type.to_s)
137
+ if [ 'american_express', 'diners_club' ].include?(card_brand(credit_card).to_s)
138
138
  add_pair(post, :AEIT1Quantity, 1)
139
139
  add_pair(post, :AEIT1Description, (options[:description] || options[:order_id]).slice(0, 15))
140
140
  add_pair(post, :AEIT1GrossValue, amount(money))
@@ -159,7 +159,7 @@ module ActiveMerchant #:nodoc:
159
159
  end
160
160
 
161
161
  def format_issue_number(credit_card)
162
- credit_card.type.to_s == 'solo' ? format(credit_card.issue_number, :two_digits) : credit_card.issue_number
162
+ card_brand(credit_card).to_s == 'solo' ? format(credit_card.issue_number, :two_digits) : credit_card.issue_number
163
163
  end
164
164
 
165
165
  def commit(action, parameters)
@@ -270,7 +270,7 @@ module ActiveMerchant #:nodoc:
270
270
  xml.tag! 'expirationMonth', format(creditcard.month, :two_digits)
271
271
  xml.tag! 'expirationYear', format(creditcard.year, :four_digits)
272
272
  xml.tag!('cvNumber', creditcard.verification_value) unless (@options[:ignore_cvv] || creditcard.verification_value.blank? )
273
- xml.tag! 'cardType', @@credit_card_codes[creditcard.type.to_sym]
273
+ xml.tag! 'cardType', @@credit_card_codes[card_brand(creditcard).to_sym]
274
274
  end
275
275
  end
276
276
 
@@ -275,7 +275,7 @@ module ActiveMerchant
275
275
  xml.tag! :expirydate, format_date(credit_card.month, credit_card.year)
276
276
 
277
277
  # optional values - for Solo etc
278
- if [ 'switch', 'solo' ].include?(credit_card.type.to_s)
278
+ if [ 'switch', 'solo' ].include?(card_brand(credit_card).to_s)
279
279
 
280
280
  xml.tag! :issuenumber, credit_card.issue_number unless credit_card.issue_number.blank?
281
281
 
@@ -144,7 +144,7 @@ module ActiveMerchant #:nodoc:
144
144
 
145
145
  options.update(
146
146
  :ordertype => "SALE",
147
- :action => "SUBMIT",
147
+ :action => options[:action] || "SUBMIT",
148
148
  :installments => options[:installments] || 12,
149
149
  :startdate => options[:startdate] || "immediate",
150
150
  :periodicity => options[:periodicity].to_s || "monthly",
@@ -126,20 +126,21 @@ module ActiveMerchant #:nodoc:
126
126
  xml.tag! 'CardType', credit_card_type(credit_card)
127
127
  xml.tag! 'CardNum', credit_card.number
128
128
  xml.tag! 'ExpDate', expdate(credit_card)
129
- xml.tag! 'NameOnCard', credit_card.name
129
+ xml.tag! 'NameOnCard', credit_card.first_name
130
130
  xml.tag! 'CVNum', credit_card.verification_value if credit_card.verification_value?
131
131
 
132
132
  if requires_start_date_or_issue_number?(credit_card)
133
133
  xml.tag!('ExtData', 'Name' => 'CardStart', 'Value' => startdate(credit_card)) unless credit_card.start_month.blank? || credit_card.start_year.blank?
134
134
  xml.tag!('ExtData', 'Name' => 'CardIssue', 'Value' => format(credit_card.issue_number, :two_digits)) unless credit_card.issue_number.blank?
135
135
  end
136
+ xml.tag! 'ExtData', 'Name' => 'LASTNAME', 'Value' => credit_card.last_name
136
137
  end
137
138
  end
138
139
 
139
140
  def credit_card_type(credit_card)
140
- return '' if credit_card.type.blank?
141
+ return '' if card_brand(credit_card).blank?
141
142
 
142
- CARD_MAPPING[credit_card.type.to_sym]
143
+ CARD_MAPPING[card_brand(credit_card).to_sym]
143
144
  end
144
145
 
145
146
  def expdate(creditcard)
@@ -128,7 +128,7 @@ module ActiveMerchant #:nodoc:
128
128
  def add_address(xml, tag, address, options)
129
129
  return if address.nil?
130
130
  xml.tag! tag do
131
- xml.tag! 'Name', address[:name] unless options[:name].blank?
131
+ xml.tag! 'Name', address[:name] unless address[:name].blank?
132
132
  xml.tag! 'EMail', options[:email] unless options[:email].blank?
133
133
  xml.tag! 'Phone', address[:phone] unless address[:phone].blank?
134
134
  xml.tag! 'CustCode', options[:customer] if !options[:customer].blank? && tag == 'BillTo'
@@ -200,7 +200,7 @@ module ActiveMerchant #:nodoc:
200
200
  headers = build_headers(request.size)
201
201
 
202
202
  response = parse(ssl_post(test? ? TEST_URL : LIVE_URL, request, headers))
203
-
203
+
204
204
  build_response(response[:result] == "0", response[:message], response,
205
205
  :test => test?,
206
206
  :authorization => response[:pn_ref] || response[:rp_ref],
@@ -65,13 +65,13 @@ module ActiveMerchant #:nodoc:
65
65
 
66
66
  def add_credit_card(xml, credit_card, address, options)
67
67
  xml.tag! 'n2:CreditCard' do
68
- xml.tag! 'n2:CreditCardType', credit_card_type(credit_card.type)
68
+ xml.tag! 'n2:CreditCardType', credit_card_type(card_brand(credit_card))
69
69
  xml.tag! 'n2:CreditCardNumber', credit_card.number
70
70
  xml.tag! 'n2:ExpMonth', format(credit_card.month, :two_digits)
71
71
  xml.tag! 'n2:ExpYear', format(credit_card.year, :four_digits)
72
72
  xml.tag! 'n2:CVV2', credit_card.verification_value
73
73
 
74
- if [ 'switch', 'solo' ].include?(credit_card.type.to_s)
74
+ if [ 'switch', 'solo' ].include?(card_brand(credit_card).to_s)
75
75
  xml.tag! 'n2:StartMonth', format(credit_card.start_month, :two_digits) unless credit_card.start_month.blank?
76
76
  xml.tag! 'n2:StartYear', format(credit_card.start_year, :four_digits) unless credit_card.start_year.blank?
77
77
  xml.tag! 'n2:IssueNumber', format(credit_card.issue_number, :two_digits) unless credit_card.issue_number.blank?
@@ -122,7 +122,7 @@ module ActiveMerchant #:nodoc:
122
122
  xml.target!
123
123
  end
124
124
 
125
- def build_capture_request(money, authorization, options)
125
+ def build_capture_request(money, authorization, options)
126
126
  xml = Builder::XmlMarkup.new :indent => 2
127
127
 
128
128
  xml.tag! 'DoCaptureReq', 'xmlns' => PAYPAL_NAMESPACE do
@@ -168,7 +168,7 @@ module ActiveMerchant #:nodoc:
168
168
  xml.target!
169
169
  end
170
170
 
171
- def build_mass_pay_request(*args)
171
+ def build_mass_pay_request(*args)
172
172
  default_options = args.last.is_a?(Hash) ? args.pop : {}
173
173
  recipients = args.first.is_a?(Array) ? args : [args]
174
174
 
@@ -269,25 +269,13 @@ module ActiveMerchant #:nodoc:
269
269
  xml.tag! 'n2:Street1', address[:address1]
270
270
  xml.tag! 'n2:Street2', address[:address2]
271
271
  xml.tag! 'n2:CityName', address[:city]
272
- xml.tag! 'n2:StateOrProvince', lookup_state(address)
272
+ xml.tag! 'n2:StateOrProvince', address[:state].blank? ? 'N/A' : address[:state]
273
273
  xml.tag! 'n2:Country', address[:country]
274
274
  xml.tag! 'n2:PostalCode', address[:zip]
275
275
  xml.tag! 'n2:Phone', address[:phone]
276
276
  end
277
277
  end
278
278
 
279
- def lookup_state(address)
280
- country = Country.find(address[:country]) rescue nil
281
- return '' if country.nil?
282
-
283
- case country.code(:alpha2).to_s
284
- when 'AU'
285
- AUSTRALIAN_STATES[address[:state]] || address[:state]
286
- else
287
- address[:state].blank? ? 'N/A' : address[:state]
288
- end
289
- end
290
-
291
279
  def endpoint_url
292
280
  URLS[test? ? :test : :live][@options[:signature].blank? ? :certificate : :signature]
293
281
  end
@@ -188,9 +188,9 @@ module ActiveMerchant #:nodoc:
188
188
  end
189
189
 
190
190
  def map_card_type(credit_card)
191
- raise ArgumentError, "The credit card type must be provided" if credit_card.type.blank?
191
+ raise ArgumentError, "The credit card type must be provided" if card_brand(credit_card).blank?
192
192
 
193
- card_type = credit_card.type.to_sym
193
+ card_type = card_brand(credit_card).to_sym
194
194
 
195
195
  # Check if it is an electron card
196
196
  if card_type == :visa && credit_card.number =~ ELECTRON
@@ -209,7 +209,7 @@ module ActiveMerchant #:nodoc:
209
209
  end
210
210
 
211
211
  def format_issue_number(credit_card)
212
- credit_card.type.to_s == 'solo' ? format(credit_card.issue_number, :two_digits) : credit_card.issue_number
212
+ card_brand(credit_card).to_s == 'solo' ? format(credit_card.issue_number, :two_digits) : credit_card.issue_number
213
213
  end
214
214
 
215
215
  def commit(action, parameters)
@@ -107,7 +107,7 @@ module ActiveMerchant
107
107
  xml.tag! 'card' do
108
108
  xml.tag! 'number', credit_card.number
109
109
  xml.tag! 'expdate', expiry_date(credit_card)
110
- xml.tag! 'type', CARD_MAPPING[credit_card.type.to_s]
110
+ xml.tag! 'type', CARD_MAPPING[card_brand(credit_card).to_s]
111
111
  xml.tag! 'chname', credit_card.name
112
112
  xml.tag! 'issueno', credit_card.issue_number
113
113
 
@@ -0,0 +1,155 @@
1
+ require 'rexml/document'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class SecurePayAuGateway < Gateway
6
+ API_VERSION = 'xml-4.2'
7
+
8
+ TEST_URL = 'https://www.securepay.com.au/test/payment'
9
+ LIVE_URL = 'https://www.securepay.com.au/xmlapi/payment'
10
+
11
+ self.supported_countries = ['AU']
12
+ self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb]
13
+
14
+ # The homepage URL of the gateway
15
+ self.homepage_url = 'http://securepay.com.au'
16
+
17
+ # The name of the gateway
18
+ self.display_name = 'SecurePay'
19
+
20
+ class_inheritable_accessor :request_timeout
21
+ self.request_timeout = 60
22
+
23
+ self.money_format = :cents
24
+ self.default_currency = 'AUD'
25
+
26
+ # 0 Standard Payment
27
+ # 4 Refund
28
+ # 6 Client Reversal (Void)
29
+ # 10 Preauthorise
30
+ # 11 Preauth Complete (Advice)
31
+ TRANSACTIONS = {
32
+ :purchase => 0,
33
+ :authorization => 10,
34
+ :capture => 11,
35
+ :void => 6,
36
+ :credit => 4
37
+ }
38
+
39
+ def initialize(options = {})
40
+ requires!(options, :login, :password)
41
+ @options = options
42
+ super
43
+ end
44
+
45
+ def test?
46
+ @options[:test] || super
47
+ end
48
+
49
+ def purchase(money, credit_card, options = {})
50
+ commit :purchase, build_purchase_request(money, credit_card, options)
51
+ end
52
+
53
+ private
54
+
55
+ def build_purchase_request(money, credit_card, options)
56
+ xml = Builder::XmlMarkup.new
57
+
58
+ xml.tag! 'amount', amount(money)
59
+ xml.tag! 'currency', options[:currency] || currency(money)
60
+ xml.tag! 'purchaseOrderNo', options[:order_id].to_s.gsub(/[ ']/, '')
61
+
62
+ xml.tag! 'CreditCardInfo' do
63
+ xml.tag! 'cardNumber', credit_card.number
64
+ xml.tag! 'expiryDate', expdate(credit_card)
65
+ xml.tag! 'cvv', credit_card.verification_value if credit_card.verification_value?
66
+ end
67
+
68
+ xml.target!
69
+ end
70
+
71
+ def build_request(action, body)
72
+ xml = Builder::XmlMarkup.new
73
+ xml.instruct!
74
+ xml.tag! 'SecurePayMessage' do
75
+ xml.tag! 'MessageInfo' do
76
+ xml.tag! 'messageID', Utils.generate_unique_id.slice(0, 30)
77
+ xml.tag! 'messageTimestamp', generate_timestamp
78
+ xml.tag! 'timeoutValue', request_timeout
79
+ xml.tag! 'apiVersion', API_VERSION
80
+ end
81
+
82
+ xml.tag! 'MerchantInfo' do
83
+ xml.tag! 'merchantID', @options[:login]
84
+ xml.tag! 'password', @options[:password]
85
+ end
86
+
87
+ xml.tag! 'RequestType', 'Payment'
88
+ xml.tag! 'Payment' do
89
+ xml.tag! 'TxnList', "count" => 1 do
90
+ xml.tag! 'Txn', "ID" => 1 do
91
+ xml.tag! 'txnType', TRANSACTIONS[action]
92
+ xml.tag! 'txnSource', 23
93
+ xml << body
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ xml.target!
100
+ end
101
+
102
+ def commit(action, request)
103
+ response = parse(ssl_post(test? ? TEST_URL : LIVE_URL, build_request(action, request)))
104
+
105
+ Response.new(success?(response), message_from(response), response,
106
+ :test => test?,
107
+ :authorization => authorization_from(response)
108
+ )
109
+ end
110
+
111
+ def success?(response)
112
+ response[:response_code] == "00"
113
+ end
114
+
115
+ def authorization_from(response)
116
+ response[:txn_id]
117
+ end
118
+
119
+ def message_from(response)
120
+ response[:response_text] || response[:status_description]
121
+ end
122
+
123
+ def expdate(credit_card)
124
+ "#{format(credit_card.month, :two_digits)}/#{format(credit_card.year, :two_digits)}"
125
+ end
126
+
127
+ def parse(body)
128
+ xml = REXML::Document.new(body)
129
+
130
+ response = {}
131
+
132
+ xml.root.elements.to_a.each do |node|
133
+ parse_element(response, node)
134
+ end
135
+
136
+ response
137
+ end
138
+
139
+ def parse_element(response, node)
140
+ if node.has_elements?
141
+ node.elements.each{|element| parse_element(response, element) }
142
+ else
143
+ response[node.name.underscore.to_sym] = node.text
144
+ end
145
+ end
146
+
147
+ # YYYYDDMMHHNNSSKKK000sOOO
148
+ def generate_timestamp
149
+ time = Time.now.utc
150
+ time.strftime("%Y%d%m%H%M%S#{time.usec}+000")
151
+ end
152
+ end
153
+ end
154
+ end
155
+
@@ -63,7 +63,8 @@ module ActiveMerchant #:nodoc:
63
63
  { :alpha2 => 'AM', :name => 'Armenia', :alpha3 => 'ARM', :numeric => '051' },
64
64
  { :alpha2 => 'AW', :name => 'Aruba', :alpha3 => 'ABW', :numeric => '533' },
65
65
  { :alpha2 => 'AU', :name => 'Australia', :alpha3 => 'AUS', :numeric => '036' },
66
- { :alpha2 => 'AT', :name => 'Austria', :alpha3 => 'AUT', :numeric => '040' },
66
+ { :alpha2 => 'AT', :name => 'Austria', :alpha3 => 'AUT', :numeric => '040' },
67
+ { :alpha2 => 'AX', :name => 'Åland Islands', :alpha3 => 'ALA', :numeric => '248' },
67
68
  { :alpha2 => 'AZ', :name => 'Azerbaijan', :alpha3 => 'AZE', :numeric => '031' },
68
69
  { :alpha2 => 'BS', :name => 'Bahamas', :alpha3 => 'BHS', :numeric => '044' },
69
70
  { :alpha2 => 'BH', :name => 'Bahrain', :alpha3 => 'BHR', :numeric => '048' },
@@ -244,6 +244,10 @@ secure_pay_tech:
244
244
  login: TESTDIGISPL1
245
245
  password: d557591484cb2cd12bba445aba420d2c69cd6a88
246
246
 
247
+ secure_pay_au:
248
+ login:
249
+ password:
250
+
247
251
  # Replace with your serial numbers for the skipjack test environment
248
252
  skipjack:
249
253
  login: X
@@ -129,7 +129,7 @@ class AuthorizeNetTest < Test::Unit::TestCase
129
129
  subscription_id = response.authorization
130
130
 
131
131
  assert response = @gateway.update_recurring(:subscription_id => subscription_id, :amount => @amount * 2)
132
- assert_success response.success?
132
+ assert_success response
133
133
 
134
134
  assert response = @gateway.cancel_recurring(subscription_id)
135
135
  assert_success response
@@ -7,11 +7,11 @@ class PaypalTest < Test::Unit::TestCase
7
7
  @gateway = PaypalGateway.new(fixtures(:paypal_certificate))
8
8
 
9
9
  @creditcard = CreditCard.new(
10
- :type => "Visa",
10
+ :type => "visa",
11
11
  :number => "4381258770269608", # Use a generated CC from the paypal Sandbox
12
12
  :verification_value => "000",
13
13
  :month => 1,
14
- :year => 2008,
14
+ :year => Time.now.year + 1,
15
15
  :first_name => 'Fred',
16
16
  :last_name => 'Brooks'
17
17
  )
@@ -63,7 +63,7 @@ class PaypalTest < Test::Unit::TestCase
63
63
  response = @gateway.authorize(@amount, @creditcard, @params)
64
64
  assert_success response
65
65
  assert response.params['transaction_id']
66
- assert_equal '3.00', response.params['amount']
66
+ assert_equal '1.00', response.params['amount']
67
67
  assert_equal 'USD', response.params['amount_currency_id']
68
68
  end
69
69
 
@@ -100,7 +100,7 @@ class PaypalTest < Test::Unit::TestCase
100
100
  response = @gateway.capture(@amount, auth.authorization)
101
101
  assert_success response
102
102
  assert response.params['transaction_id']
103
- assert_equal '3.00', response.params['gross_amount']
103
+ assert_equal '1.00', response.params['gross_amount']
104
104
  assert_equal 'USD', response.params['gross_amount_currency_id']
105
105
  end
106
106
 
@@ -119,11 +119,11 @@ class PaypalTest < Test::Unit::TestCase
119
119
  assert_success credit
120
120
  assert credit.test?
121
121
  assert_equal 'USD', credit.params['net_refund_amount_currency_id']
122
- assert_equal '2.61', credit.params['net_refund_amount']
122
+ assert_equal '0.67', credit.params['net_refund_amount']
123
123
  assert_equal 'USD', credit.params['gross_refund_amount_currency_id']
124
- assert_equal '3.00', credit.params['gross_refund_amount']
124
+ assert_equal '1.00', credit.params['gross_refund_amount']
125
125
  assert_equal 'USD', credit.params['fee_refund_amount_currency_id']
126
- assert_equal '0.39', credit.params['fee_refund_amount']
126
+ assert_equal '0.33', credit.params['fee_refund_amount']
127
127
  end
128
128
 
129
129
  def test_failed_voiding
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ class RemoteSecurePayAuTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @gateway = SecurePayAuGateway.new(fixtures(:secure_pay_au))
7
+
8
+ @amount = 100
9
+ @credit_card = credit_card('4444333322221111')
10
+
11
+ @options = {
12
+ :order_id => '1',
13
+ :billing_address => address,
14
+ :description => 'Store Purchase'
15
+ }
16
+ end
17
+
18
+ def test_successful_purchase
19
+ assert response = @gateway.purchase(@amount, @credit_card, @options)
20
+ assert_success response
21
+ assert_equal 'Approved', response.message
22
+ end
23
+
24
+ def test_unsuccessful_purchase
25
+ @credit_card.year = '2005'
26
+ assert response = @gateway.purchase(@amount, @credit_card, @options)
27
+ assert_failure response
28
+ assert_equal 'CARD EXPIRED', response.message
29
+ end
30
+
31
+ def test_invalid_login
32
+ gateway = SecurePayAuGateway.new(
33
+ :login => '',
34
+ :password => ''
35
+ )
36
+ assert response = gateway.purchase(@amount, @credit_card, @options)
37
+ assert_failure response
38
+ assert_equal "Invalid merchant ID", response.message
39
+ end
40
+ end
@@ -162,9 +162,9 @@ class CreditCardTest < Test::Unit::TestCase
162
162
  assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '111222233331234').display_number
163
163
  assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '1112223331234').display_number
164
164
 
165
- assert_nil CreditCard.new(:number => nil).display_number
166
- assert_nil CreditCard.new(:number => '').display_number
167
- assert_nil CreditCard.new(:number => '123').display_number
165
+ assert_equal 'XXXX-XXXX-XXXX-', CreditCard.new(:number => nil).display_number
166
+ assert_equal 'XXXX-XXXX-XXXX-', CreditCard.new(:number => '').display_number
167
+ assert_equal 'XXXX-XXXX-XXXX-123', CreditCard.new(:number => '123').display_number
168
168
  assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '1234').display_number
169
169
  assert_equal 'XXXX-XXXX-XXXX-1234', CreditCard.new(:number => '01234').display_number
170
170
  end
@@ -222,6 +222,11 @@ class CreditCardTest < Test::Unit::TestCase
222
222
  assert_equal "8580", ccn.last_digits
223
223
  end
224
224
 
225
+ def test_bogus_last_digits
226
+ ccn = CreditCard.new(:number => "1")
227
+ assert_equal "1", ccn.last_digits
228
+ end
229
+
225
230
  def test_should_be_true_when_credit_card_has_a_first_name
226
231
  c = CreditCard.new
227
232
  assert_false c.first_name?
@@ -291,4 +296,16 @@ class CreditCardTest < Test::Unit::TestCase
291
296
  def test_mask_number
292
297
  assert_equal 'XXXX-XXXX-XXXX-5100', CreditCard.mask('5105105105105100')
293
298
  end
299
+
300
+ def test_strip_non_digit_characters
301
+ card = credit_card('4242-4242 %%%%%%4242......4242')
302
+ assert card.valid?
303
+ assert_equal "4242424242424242", card.number
304
+ end
305
+
306
+ def test_before_validate_handles_blank_number
307
+ card = credit_card(nil)
308
+ assert !card.valid?
309
+ assert_equal "", card.number
310
+ end
294
311
  end
@@ -1,7 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/../../test_helper'
2
2
 
3
3
  class Gateway < Test::Unit::TestCase
4
- def test_should_detect_if_a_card_is_supported
4
+ def test_should_detect_if_a_card_is_supported
5
5
  Gateway.supported_cardtypes = [:visa, :bogus]
6
6
  assert [:visa, :bogus].all? { |supported_cardtype| Gateway.supports?(supported_cardtype) }
7
7
 
@@ -28,4 +28,14 @@ class Gateway < Test::Unit::TestCase
28
28
  Gateway.new.send(:amount, '10.34')
29
29
  end
30
30
  end
31
+
32
+ def test_invalid_type
33
+ credit_card = stub(:type => "visa")
34
+ assert_equal "visa", Gateway.card_brand(credit_card)
35
+ end
36
+
37
+ def test_invalid_type
38
+ credit_card = stub(:type => "String", :brand => "visa")
39
+ assert_equal "visa", Gateway.card_brand(credit_card)
40
+ end
31
41
  end
@@ -191,7 +191,7 @@ class PayflowTest < Test::Unit::TestCase
191
191
  def test_ensure_gateway_uses_safe_retry
192
192
  assert @gateway.retry_safe
193
193
  end
194
-
194
+
195
195
  private
196
196
  def successful_recurring_response
197
197
  <<-XML
@@ -94,26 +94,6 @@ class PaypalTest < Test::Unit::TestCase
94
94
  assert_equal '123456', express.options[:pem]
95
95
  end
96
96
 
97
- def test_successful_state_lookup
98
- assert_equal 'AB', @gateway.send(:lookup_state, { :country => 'CA', :state => 'AB'})
99
- end
100
-
101
- def test_lookup_unknown_state
102
- assert_equal '', @gateway.send(:lookup_state, { :country => 'XX', :state => 'NA'})
103
- end
104
-
105
- def test_lookup_uk_with_state
106
- assert_equal 'Avon', @gateway.send(:lookup_state, { :country => 'United Kingdom', :state => 'Avon'})
107
- end
108
-
109
- def test_lookup_uk_with_no_state
110
- assert_equal 'N/A', @gateway.send(:lookup_state, { :country => 'GB', :state => '' })
111
- end
112
-
113
- def test_lookup_australian_state
114
- assert_equal 'Australian Capital Territory', @gateway.send(:lookup_state, { :country => 'AU', :state => 'ACT'} )
115
- end
116
-
117
97
  def test_supported_countries
118
98
  assert_equal ['US'], PaypalGateway.supported_countries
119
99
  end
@@ -0,0 +1,150 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ class SecurePayAuTest < Test::Unit::TestCase
4
+ def setup
5
+ @gateway = SecurePayAuGateway.new(
6
+ :login => 'login',
7
+ :password => 'password'
8
+ )
9
+
10
+ @credit_card = credit_card
11
+ @amount = 100
12
+
13
+ @options = {
14
+ :order_id => '1',
15
+ :billing_address => address,
16
+ :description => 'Store Purchase'
17
+ }
18
+ end
19
+
20
+ def test_successful_purchase
21
+ @gateway.expects(:ssl_post).returns(successful_purchase_response)
22
+
23
+ assert response = @gateway.purchase(@amount, @credit_card, @options)
24
+ assert_instance_of Response, response
25
+ assert_success response
26
+
27
+ assert_equal '024259', response.authorization
28
+ assert response.test?
29
+ end
30
+
31
+ def test_unsuccessful_purchase
32
+ @gateway.expects(:ssl_post).returns(failed_purchase_response)
33
+
34
+ assert response = @gateway.purchase(@amount, @credit_card, @options)
35
+ assert_instance_of Response, response
36
+ assert_failure response
37
+ assert response.test?
38
+ assert_equal "CARD EXPIRED", response.message
39
+ end
40
+
41
+ def test_failed_login
42
+ @gateway.expects(:ssl_post).returns(failed_login_response)
43
+
44
+ assert response = @gateway.purchase(@amount, @credit_card, @options)
45
+ assert_instance_of Response, response
46
+ assert_failure response
47
+ assert_equal "Invalid merchant ID", response.message
48
+ end
49
+
50
+ private
51
+
52
+ def failed_login_response
53
+ '<SecurePayMessage><Status><statusCode>504</statusCode><statusDescription>Invalid merchant ID</statusDescription></Status></SecurePayMessage>'
54
+ end
55
+
56
+ def successful_purchase_response
57
+ <<-XML
58
+ <?xml version="1.0" encoding="UTF-8"?>
59
+ <SecurePayMessage>
60
+ <MessageInfo>
61
+ <messageID>8af793f9af34bea0cf40f5fb5c630c</messageID>
62
+ <messageTimestamp>20080802041625665000+660</messageTimestamp>
63
+ <apiVersion>xml-4.2</apiVersion>
64
+ </MessageInfo>
65
+ <RequestType>Payment</RequestType>
66
+ <MerchantInfo>
67
+ <merchantID>XYZ0001</merchantID>
68
+ </MerchantInfo>
69
+ <Status>
70
+ <statusCode>000</statusCode>
71
+ <statusDescription>Normal</statusDescription>
72
+ </Status>
73
+ <Payment>
74
+ <TxnList count="1">
75
+ <Txn ID="1">
76
+ <txnType>0</txnType>
77
+ <txnSource>0</txnSource>
78
+ <amount>1000</amount>
79
+ <currency>AUD</currency>
80
+ <purchaseOrderNo>test</purchaseOrderNo>
81
+ <approved>Yes</approved>
82
+ <responseCode>00</responseCode>
83
+ <responseText>Approved</responseText>
84
+ <thinlinkResponseCode>100</thinlinkResponseCode>
85
+ <thinlinkResponseText>000</thinlinkResponseText>
86
+ <thinlinkEventStatusCode>000</thinlinkEventStatusCode>
87
+ <thinlinkEventStatusText>Normal</thinlinkEventStatusText>
88
+ <settlementDate>20080208</settlementDate>
89
+ <txnID>024259</txnID>
90
+ <CreditCardInfo>
91
+ <pan>424242...242</pan>
92
+ <expiryDate>07/11</expiryDate>
93
+ <cardType>6</cardType>
94
+ <cardDescription>Visa</cardDescription>
95
+ </CreditCardInfo>
96
+ </Txn>
97
+ </TxnList>
98
+ </Payment>
99
+ </SecurePayMessage>
100
+
101
+ XML
102
+ end
103
+
104
+ def failed_purchase_response
105
+ <<-XML
106
+ <?xml version="1.0" encoding="UTF-8"?>
107
+ <SecurePayMessage>
108
+ <MessageInfo>
109
+ <messageID>8af793f9af34bea0cf40f5fb5c630c</messageID>
110
+ <messageTimestamp>20080802040346380000+660</messageTimestamp>
111
+ <apiVersion>xml-4.2</apiVersion>
112
+ </MessageInfo>
113
+ <RequestType>Payment</RequestType>
114
+ <MerchantInfo>
115
+ <merchantID>XYZ0001</merchantID>
116
+ </MerchantInfo>
117
+ <Status>
118
+ <statusCode>000</statusCode>
119
+ <statusDescription>Normal</statusDescription>
120
+ </Status>
121
+ <Payment>
122
+ <TxnList count="1">
123
+ <Txn ID="1">
124
+ <txnType>0</txnType>
125
+ <txnSource>0</txnSource>
126
+ <amount>1000</amount>
127
+ <currency>AUD</currency>
128
+ <purchaseOrderNo>test</purchaseOrderNo>
129
+ <approved>No</approved>
130
+ <responseCode>907</responseCode>
131
+ <responseText>CARD EXPIRED</responseText>
132
+ <thinlinkResponseCode>300</thinlinkResponseCode>
133
+ <thinlinkResponseText>000</thinlinkResponseText>
134
+ <thinlinkEventStatusCode>981</thinlinkEventStatusCode>
135
+ <thinlinkEventStatusText>Error - Expired Card</thinlinkEventStatusText>
136
+ <settlementDate> </settlementDate>
137
+ <txnID>000000</txnID>
138
+ <CreditCardInfo>
139
+ <pan>424242...242</pan>
140
+ <expiryDate>07/06</expiryDate>
141
+ <cardType>6</cardType>
142
+ <cardDescription>Visa</cardDescription>
143
+ </CreditCardInfo>
144
+ </Txn>
145
+ </TxnList>
146
+ </Payment>
147
+ </SecurePayMessage>
148
+ XML
149
+ end
150
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemerchant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
@@ -30,7 +30,7 @@ cert_chain:
30
30
  hPaSTyVU0yCSnw==
31
31
  -----END CERTIFICATE-----
32
32
 
33
- date: 2008-01-28 00:00:00 -05:00
33
+ date: 2008-02-24 00:00:00 -05:00
34
34
  default_executable:
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
@@ -108,6 +108,7 @@ files:
108
108
  - lib/active_merchant/billing/gateways/quickpay.rb
109
109
  - lib/active_merchant/billing/gateways/realex.rb
110
110
  - lib/active_merchant/billing/gateways/secure_pay.rb
111
+ - lib/active_merchant/billing/gateways/secure_pay_au.rb
111
112
  - lib/active_merchant/billing/gateways/secure_pay_tech.rb
112
113
  - lib/active_merchant/billing/gateways/skip_jack.rb
113
114
  - lib/active_merchant/billing/gateways/trans_first.rb
@@ -206,6 +207,7 @@ files:
206
207
  - test/remote/gateways/remote_psl_card_test.rb
207
208
  - test/remote/gateways/remote_quickpay_test.rb
208
209
  - test/remote/gateways/remote_realex_test.rb
210
+ - test/remote/gateways/remote_secure_pay_au_test.rb
209
211
  - test/remote/gateways/remote_secure_pay_tech_test.rb
210
212
  - test/remote/gateways/remote_secure_pay_test.rb
211
213
  - test/remote/gateways/remote_skipjack_test.rb
@@ -259,6 +261,7 @@ files:
259
261
  - test/unit/gateways/psl_card_test.rb
260
262
  - test/unit/gateways/quickpay_test.rb
261
263
  - test/unit/gateways/realex_test.rb
264
+ - test/unit/gateways/secure_pay_au_test.rb
262
265
  - test/unit/gateways/secure_pay_tech_test.rb
263
266
  - test/unit/gateways/secure_pay_test.rb
264
267
  - test/unit/gateways/skip_jack_test.rb
metadata.gz.sig CHANGED
Binary file