exact4r 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/CHANGELOG +6 -1
  2. data/README +71 -3
  3. data/Rakefile +8 -7
  4. data/VERSION +1 -1
  5. data/doc/classes/EWS/Transaction/FakeResponse.html +451 -0
  6. data/doc/classes/EWS/Transaction/Request.html +61 -80
  7. data/doc/classes/EWS/Transaction/Response.html +206 -14
  8. data/doc/classes/EWS/Transaction/Validator.html +182 -0
  9. data/doc/classes/EWS/Transporter.html +269 -0
  10. data/doc/classes/REXML/Document.html +176 -0
  11. data/doc/classes/REXML/Entity.html +150 -0
  12. data/doc/classes/REXML.html +112 -0
  13. data/doc/created.rid +1 -1
  14. data/doc/files/CHANGELOG.html +156 -0
  15. data/doc/files/LICENCE.html +109 -0
  16. data/doc/files/README.html +164 -23
  17. data/doc/files/VERSION.html +107 -0
  18. data/doc/files/lib/ews/transaction/fake_response_rb.html +101 -0
  19. data/doc/files/lib/ews/transaction/mapping_rb.html +1 -1
  20. data/doc/files/lib/ews/transaction/request_rb.html +8 -1
  21. data/doc/files/lib/ews/transaction/response_rb.html +1 -1
  22. data/doc/files/lib/ews/transaction/validator_rb.html +101 -0
  23. data/doc/files/lib/ews/{transaction/transporter_rb.html → transporter_rb.html} +3 -3
  24. data/doc/files/lib/exact4r_rb.html +6 -2
  25. data/doc/fr_class_index.html +6 -1
  26. data/doc/fr_file_index.html +6 -1
  27. data/doc/fr_method_index.html +22 -7
  28. data/lib/ews/transaction/mapping.rb +41 -40
  29. data/lib/ews/transaction/request.rb +3 -4
  30. data/lib/ews/transaction/response.rb +5 -0
  31. data/lib/ews/transaction/validator.rb +44 -34
  32. data/lib/ews/transporter.rb +3 -3
  33. data/lib/exact4r.rb +1 -1
  34. data/test/exhaustive/forced_post_test.rb +75 -0
  35. data/test/exhaustive/online_debit_purchase_test.rb +66 -0
  36. data/test/exhaustive/online_debit_refund_test.rb +66 -0
  37. data/test/exhaustive/pre_auth_completion_test.rb +99 -0
  38. data/test/exhaustive/pre_auth_only_test.rb +68 -0
  39. data/test/exhaustive/pre_auth_test.rb +68 -0
  40. data/test/exhaustive/purchase_correction_test.rb +79 -0
  41. data/test/exhaustive/purchase_test.rb +68 -0
  42. data/test/exhaustive/recurring_seed_pre_auth_test.rb +68 -0
  43. data/test/exhaustive/recurring_seed_purchase_test.rb +68 -0
  44. data/test/exhaustive/refund_correction_test.rb +79 -0
  45. data/test/exhaustive/refund_test.rb +68 -0
  46. data/test/exhaustive/secure_storage_test.rb +75 -0
  47. data/test/exhaustive/tagged_online_debit_refund_test.rb +168 -0
  48. data/test/exhaustive/tagged_pre_auth_completion_test.rb +119 -0
  49. data/test/exhaustive/tagged_pre_auth_test.rb +116 -0
  50. data/test/exhaustive/tagged_purchase_test.rb +116 -0
  51. data/test/exhaustive/tagged_refund_test.rb +144 -0
  52. data/test/exhaustive/transaction_details_test.rb +86 -0
  53. data/test/exhaustive/void_test.rb +75 -0
  54. data/{spec/avs_spec.rb → test/general/avs_test.rb} +33 -44
  55. data/test/general/json_encoding_test.rb +62 -0
  56. data/test/general/request_test.rb +185 -0
  57. data/test/general/rest_encoding_test.rb +174 -0
  58. data/test/general/soap_encoding_test.rb +211 -0
  59. data/test/general/transporter_test.rb +54 -0
  60. data/test/general/validator_test.rb +150 -0
  61. data/test/samples/rest.dodgy.response.xml +60 -0
  62. data/test/samples/rest.everything.response.xml +67 -0
  63. data/test/samples/rest.response.xml +60 -0
  64. data/test/samples/soap.deserialization.fault.xml +10 -0
  65. data/test/samples/soap.dodgy.response.xml +95 -0
  66. data/test/samples/soap.everything.response.xml +75 -0
  67. data/test/samples/soap.generalfailure.fault.xml +13 -0
  68. data/test/samples/soap.nulltransaction.fault.xml +14 -0
  69. data/test/samples/soap.response.xml +95 -0
  70. data/test/test_helper.rb +115 -0
  71. metadata +52 -12
  72. data/doc/classes/EWS/Transaction/Transporter.html +0 -251
  73. data/pkg/exact4r-0.5.gem +0 -0
  74. data/spec/mapping_spec.rb +0 -126
  75. data/spec/request_spec.rb +0 -154
  76. data/spec/spec_helper.rb +0 -55
  77. data/spec/transporter_spec.rb +0 -43
  78. data/spec/validator_spec.rb +0 -150
@@ -20,9 +20,14 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Classes</h1>
22
22
  <div id="index-entries">
23
+ <a href="classes/EWS/Transaction/FakeResponse.html">EWS::Transaction::FakeResponse</a><br />
23
24
  <a href="classes/EWS/Transaction/Request.html">EWS::Transaction::Request</a><br />
24
25
  <a href="classes/EWS/Transaction/Response.html">EWS::Transaction::Response</a><br />
25
- <a href="classes/EWS/Transaction/Transporter.html">EWS::Transaction::Transporter</a><br />
26
+ <a href="classes/EWS/Transaction/Validator.html">EWS::Transaction::Validator</a><br />
27
+ <a href="classes/EWS/Transporter.html">EWS::Transporter</a><br />
28
+ <a href="classes/REXML.html">REXML</a><br />
29
+ <a href="classes/REXML/Document.html">REXML::Document</a><br />
30
+ <a href="classes/REXML/Entity.html">REXML::Entity</a><br />
26
31
  </div>
27
32
  </div>
28
33
  </body>
@@ -20,11 +20,16 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Files</h1>
22
22
  <div id="index-entries">
23
+ <a href="files/CHANGELOG.html">CHANGELOG</a><br />
24
+ <a href="files/LICENCE.html">LICENCE</a><br />
23
25
  <a href="files/README.html">README</a><br />
26
+ <a href="files/VERSION.html">VERSION</a><br />
27
+ <a href="files/lib/ews/transaction/fake_response_rb.html">lib/ews/transaction/fake_response.rb</a><br />
24
28
  <a href="files/lib/ews/transaction/mapping_rb.html">lib/ews/transaction/mapping.rb</a><br />
25
29
  <a href="files/lib/ews/transaction/request_rb.html">lib/ews/transaction/request.rb</a><br />
26
30
  <a href="files/lib/ews/transaction/response_rb.html">lib/ews/transaction/response.rb</a><br />
27
- <a href="files/lib/ews/transaction/transporter_rb.html">lib/ews/transaction/transporter.rb</a><br />
31
+ <a href="files/lib/ews/transaction/validator_rb.html">lib/ews/transaction/validator.rb</a><br />
32
+ <a href="files/lib/ews/transporter_rb.html">lib/ews/transporter.rb</a><br />
28
33
  <a href="files/lib/exact4r_rb.html">lib/exact4r.rb</a><br />
29
34
  </div>
30
35
  </div>
@@ -20,13 +20,28 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/EWS/Transaction/Response.html#M000003">approved? (EWS::Transaction::Response)</a><br />
24
- <a href="classes/EWS/Transaction/Request.html#M000006">is_find_transaction? (EWS::Transaction::Request)</a><br />
25
- <a href="classes/EWS/Transaction/Transporter.html#M000001">new (EWS::Transaction::Transporter)</a><br />
26
- <a href="classes/EWS/Transaction/Request.html#M000004">new (EWS::Transaction::Request)</a><br />
27
- <a href="classes/EWS/Transaction/Transporter.html#M000002">send (EWS::Transaction::Transporter)</a><br />
28
- <a href="classes/EWS/Transaction/Request.html#M000005">transaction_type= (EWS::Transaction::Request)</a><br />
29
- <a href="classes/EWS/Transaction/Request.html#M000007">valid? (EWS::Transaction::Request)</a><br />
23
+ <a href="classes/EWS/Transaction/Response.html#M000013">approved? (EWS::Transaction::Response)</a><br />
24
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000003">declined (EWS::Transaction::FakeResponse)</a><br />
25
+ <a href="classes/REXML/Document.html#M000021">entity_expansion_limit= (REXML::Document)</a><br />
26
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000006">invalid_amount (EWS::Transaction::FakeResponse)</a><br />
27
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000008">invalid_auth_num (EWS::Transaction::FakeResponse)</a><br />
28
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000012">invalid_avs (EWS::Transaction::FakeResponse)</a><br />
29
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000007">invalid_cardholder_name (EWS::Transaction::FakeResponse)</a><br />
30
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000005">invalid_cc_expiry (EWS::Transaction::FakeResponse)</a><br />
31
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000004">invalid_cc_number (EWS::Transaction::FakeResponse)</a><br />
32
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000009">invalid_cc_verification_str (EWS::Transaction::FakeResponse)</a><br />
33
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000011">invalid_reference_no (EWS::Transaction::FakeResponse)</a><br />
34
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000010">invalid_transaction_code (EWS::Transaction::FakeResponse)</a><br />
35
+ <a href="classes/EWS/Transaction/Request.html#M000017">is_find_transaction? (EWS::Transaction::Request)</a><br />
36
+ <a href="classes/EWS/Transporter.html#M000018">new (EWS::Transporter)</a><br />
37
+ <a href="classes/EWS/Transaction/Request.html#M000015">new (EWS::Transaction::Request)</a><br />
38
+ <a href="classes/REXML/Document.html#M000022">record_entity_expansion! (REXML::Document)</a><br />
39
+ <a href="classes/EWS/Transporter.html#M000019">submit (EWS::Transporter)</a><br />
40
+ <a href="classes/EWS/Transaction/Response.html#M000014">transaction_error? (EWS::Transaction::Response)</a><br />
41
+ <a href="classes/EWS/Transaction/Request.html#M000016">transaction_type= (EWS::Transaction::Request)</a><br />
42
+ <a href="classes/REXML/Entity.html#M000020">unnormalized (REXML::Entity)</a><br />
43
+ <a href="classes/EWS/Transaction/FakeResponse.html#M000002">valid (EWS::Transaction::FakeResponse)</a><br />
44
+ <a href="classes/EWS/Transaction/Validator.html#M000001">valid? (EWS::Transaction::Validator)</a><br />
30
45
  </div>
31
46
  </div>
32
47
  </body>
@@ -13,65 +13,66 @@ module EWS # :nodoc:
13
13
  class Mapping # :nodoc:
14
14
 
15
15
  XML_REQUEST_TAGS_TO_ATTRS = {
16
- :ExactID => :gateway_id,
17
- :Password => :password,
18
- :Transaction_Type => :transaction_type,
19
- :DollarAmount => :amount,
20
- :SurchargeAmount => :surcharge_amount,
21
- :Card_Number => :cc_number,
22
- :Transaction_Tag => :transaction_tag,
23
- :Track1 => :track1,
24
- :Track2 => :track2,
25
- :PAN => :pan,
26
16
  :Authorization_Num => :authorization_num,
27
- :Expiry_Date => :cc_expiry,
28
17
  :CardHoldersName => :cardholder_name,
29
- :VerificationStr1 => :cc_verification_str1,
30
- :VerificationStr2 => :cc_verification_str2,
18
+ :Card_Number => :cc_number,
19
+ :CAVV => :cavv,
20
+ :CAVV_Algorithm => :cavv_algorithm,
21
+ :Client_Email => :client_email,
22
+ :Client_IP => :client_ip,
23
+ :Customer_Ref => :customer_ref,
31
24
  :CVD_Presence_Ind => :cvd_presence_ind,
32
- :ZipCode => :zip_code,
25
+ :DollarAmount => :amount,
26
+ :Ecommerce_Flag => :ecommerce_flag,
27
+ :ExactID => :gateway_id,
28
+ :Expiry_Date => :cc_expiry,
29
+ :Language => :language,
30
+ :PAN => :pan,
31
+ :Password => :password,
32
+ :Reference_3 => :reference_3,
33
+ :Reference_No => :reference_no,
34
+ :Secure_AuthRequired => :secure_auth_required,
35
+ :Secure_AuthResult => :secure_auth_result,
36
+ :SurchargeAmount => :surcharge_amount,
33
37
  :Tax1Amount => :tax1_amount,
34
38
  :Tax1Number => :tax1_number,
35
39
  :Tax2Amount => :tax2_amount,
36
40
  :Tax2Number => :tax2_number,
37
- :Secure_AuthRequired => :secure_auth_required,
38
- :Secure_AuthResult => :secure_auth_result,
39
- :Ecommerce_Flag => :ecommerce_flag,
41
+ :Track1 => :track1,
42
+ :Track2 => :track2,
43
+ :Transaction_Tag => :transaction_tag,
44
+ :Transaction_Type => :transaction_type,
45
+ :VerificationStr1 => :cc_verification_str1,
46
+ :VerificationStr2 => :cc_verification_str2,
47
+ :User_Name => :user_name,
40
48
  :XID => :xid,
41
- :CAVV => :cavv,
42
- :CAVV_Algorithm => :cavv_algorithm,
43
- :Reference_No => :reference_no,
44
- :Customer_Ref => :customer_ref,
45
- :Reference_3 => :reference_3,
46
- :Language => :language,
47
- :Client_IP => :client_ip,
48
- :Client_Email => :client_email
49
+ :ZipCode => :zip_code
49
50
  } unless defined?(XML_REQUEST_TAGS_TO_ATTRS)
50
51
 
51
52
  XML_RESPONSE_TAGS_TO_ATTRS = {
52
- :LogonMessage => :logon_message,
53
- :Error_Number => :error_number,
54
- :Error_Description => :error_description,
55
- :Transaction_Error => :transaction_error,
56
- :Transaction_Approved => :transaction_approved,
57
- :EXact_Resp_Code => :exact_resp_code,
58
- :EXact_Message => :exact_message,
59
- :Bank_Resp_Code => :bank_resp_code,
53
+ :AVS => :avs,
60
54
  :Bank_Message => :bank_message,
55
+ :Bank_Resp_Code => :bank_resp_code,
61
56
  :Bank_Resp_Code_2 => :bank_resp_code_2,
62
- :SequenceNo => :sequence_no,
63
- :AVS => :avs,
64
- :CVV2 => :cvv2,
65
- :Retrieval_Ref_No => :retrieval_ref_no,
66
57
  :CAVV_Response => :cavv_response,
67
- :MerchantName => :merchant_name,
58
+ :CTR => :ctr,
59
+ :CVV2 => :cvv2,
60
+ :Error_Description => :error_description,
61
+ :Error_Number => :error_number,
62
+ :EXact_Message => :exact_message,
63
+ :EXact_Resp_Code => :exact_resp_code,
64
+ :LogonMessage => :logon_message,
68
65
  :MerchantAddress => :merchant_address,
69
66
  :MerchantCity => :merchant_city,
70
- :MerchantProvince => :merchant_province,
71
67
  :MerchantCountry => :merchant_country,
68
+ :MerchantName => :merchant_name,
72
69
  :MerchantPostal => :merchant_postal,
70
+ :MerchantProvince => :merchant_province,
73
71
  :MerchantURL => :merchant_url,
74
- :CTR => :ctr
72
+ :Retrieval_Ref_No => :retrieval_ref_no,
73
+ :SequenceNo => :sequence_no,
74
+ :Transaction_Approved => :transaction_approved,
75
+ :Transaction_Error => :transaction_error
75
76
  }.merge(XML_REQUEST_TAGS_TO_ATTRS) unless defined?(XML_RESPONSE_TAGS_TO_ATTRS)
76
77
 
77
78
  def self.request_to_json(request)
@@ -50,7 +50,7 @@ module EWS # :nodoc:
50
50
  # yeah, it's ugly, but otherwise RDoc won't pick them up
51
51
  attr_accessor :errors
52
52
  attr_accessor :gateway_id, :password, :transaction_type, :amount, :surcharge_amount, :cc_number, :transaction_tag, :track1, :track2, :pan, :authorization_num, :cc_expiry, :cardholder_name
53
- attr_accessor :cc_verification_str2, :cvd_presence_ind, :tax1_amount, :tax1_number, :tax2_amount, :tax2_number, :secure_auth_required, :secure_auth_result
53
+ attr_accessor :cc_verification_str2, :cvd_presence_ind, :tax1_amount, :tax1_number, :tax2_amount, :tax2_number, :secure_auth_required, :secure_auth_result, :user_name
54
54
 
55
55
  # AVS - Address Verification,
56
56
  attr_accessor :cc_verification_str1
@@ -63,7 +63,7 @@ module EWS # :nodoc:
63
63
  @#{m.to_s} = v
64
64
  calculate_verification_str1
65
65
  end
66
- METHOD_EOS
66
+ METHOD_EOS
67
67
  }
68
68
 
69
69
  attr_accessor :ecommerce_flag, :xid, :cavv, :cavv_algorithm, :reference_no, :customer_ref, :reference_3, :language, :client_ip, :client_email, :zip_code
@@ -81,7 +81,7 @@ module EWS # :nodoc:
81
81
  value = @@transaction_codes[type_sym]
82
82
  # if nothing found, then maybe we were given an actual code?
83
83
  if(value.nil?)
84
- raise "invalid transaction_type supplied #{type_sym}" unless @@transaction_codes.values.include?(type_sym)
84
+ raise ArgumentError, "invalid transaction_type supplied #{type_sym}" unless @@transaction_codes.values.include?(type_sym)
85
85
  value = type_sym
86
86
  end
87
87
 
@@ -108,7 +108,6 @@ module EWS # :nodoc:
108
108
  :tagged_purchase => '30',
109
109
  :tagged_pre_auth => '31',
110
110
  :tagged_pre_auth_completion => '32',
111
- :tagged_void => '33',
112
111
  :tagged_refund => '34',
113
112
  :tagged_online_debit_refund => '35',
114
113
  :recurring_seed_pre_auth => '40',
@@ -17,6 +17,11 @@ module EWS # :nodoc:
17
17
  def approved?
18
18
  self.transaction_approved == 1
19
19
  end
20
+
21
+ def transaction_error?
22
+ self.transaction_error == 1
23
+ end
24
+
20
25
  end
21
26
  end
22
27
  end
@@ -30,16 +30,30 @@ module EWS # :nodoc:
30
30
  def valid?
31
31
  @errors = {}
32
32
 
33
- validate_lengths
34
-
35
- validate_mandatory_fields
36
-
37
33
  append_error(:transaction_type, "transaction_type must be supplied") if self.transaction_type.blank?
38
34
 
39
35
  # need to authenticate
40
36
  append_error(:gateway_id, "gateway_id must be supplied") if self.gateway_id.blank?
41
37
  append_error(:password, "password must be supplied") if self.password.blank?
42
38
 
39
+ validate_lengths
40
+
41
+ if self.transaction_type == "CR"
42
+ append_error(:transaction_tag, "transaction_tag must be supplied") if self.transaction_tag.to_i < 1
43
+ elsif %w(50 54).include?(self.transaction_type)
44
+ validate_for_pan
45
+ elsif !self.transaction_tag.blank?
46
+ validate_for_transaction_tag
47
+ elsif !self.cc_number.blank?
48
+ validate_for_cc_number
49
+ elsif !self.track1.blank?
50
+ validate_for_track1
51
+ elsif !self.track2.blank?
52
+ validate_for_track2
53
+ else
54
+ append_error(:base, "One of the following must be supplied: cc_number, track1, track2 or transaction_tag.")
55
+ end
56
+
43
57
  # ensure we've been given valid amounts
44
58
  append_error(:amount, "invalid amount supplied") unless valid_amount?(self.amount)
45
59
  append_error(:surcharge_amount, "invalid surcharge_amount supplied") unless valid_amount?(self.surcharge_amount)
@@ -67,21 +81,6 @@ module EWS # :nodoc:
67
81
  end
68
82
  end
69
83
 
70
- # which fields are mandatory and which optional depends on the transaction_type and
71
- # also how the credit card information is supplied.
72
- #
73
- # it can be supplied either
74
- # a) via the cc_number field
75
- # b) via a tagged transaction
76
- # c) encoded in a track1 value, or
77
- # d) encoded in a track2 value
78
- def validate_mandatory_fields
79
- validate_for_card unless self.cc_number.blank?
80
- validate_for_transaction_tag unless self.transaction_tag.blank?
81
- validate_for_track1 unless self.track1.blank?
82
- validate_for_track2 unless self.track2.blank?
83
- end
84
-
85
84
  def valid_amount?(amount)
86
85
  return true if amount.blank?
87
86
 
@@ -143,19 +142,15 @@ module EWS # :nodoc:
143
142
  end
144
143
 
145
144
  # validate presence of mandatory fields when cc_number present
146
- def validate_for_card
145
+ def validate_for_cc_number
147
146
  tt = self.transaction_type.to_i
148
147
 
149
148
  # mandatory: transaction_type must != (30, 31, 32, 34, 35)
150
149
  append_error(:cc_number, "cc_number must not be set for tagged transactions") if [30,31,32,34,35].include?(tt)
150
+ append_error(:cc_number, "cc_number must not be set for debit transactions") if [50,54].include?(tt)
151
151
 
152
152
  # amount, cardholder_name always mandaory
153
- mandatory = [:amount, :cardholder_name]
154
-
155
- # card_number & expiry_date mandatory for all except 50, 54
156
- # pan mandatory for only 50, 54
157
- mandatory << ([50,54].include?(tt) ? :pan : [:cc_number, :cc_expiry])
158
- mandatory.flatten!
153
+ mandatory = [:amount, :cardholder_name, :cc_number, :cc_expiry]
159
154
 
160
155
  # reference_no mandatory for 60
161
156
  mandatory << :reference_no if tt == 60
@@ -176,6 +171,11 @@ module EWS # :nodoc:
176
171
  mandatory = [:transaction_tag]
177
172
  mandatory << [:authorization_num, :amount] unless tt == 'CR'
178
173
 
174
+ # ensure no cc details sent
175
+ append_error(:cc_number, "do not set cc_number for tagged transactions") unless self.cc_number.blank?
176
+ append_error(:cc_expiry, "do not set cc_expiry for tagged transactions") unless self.cc_expiry.blank?
177
+ append_error(:cardholder_name, "do not set cardholder_name for tagged transactions") unless self.cardholder_name.blank?
178
+
179
179
  check_mandatory(mandatory.flatten)
180
180
  end
181
181
 
@@ -184,13 +184,10 @@ module EWS # :nodoc:
184
184
 
185
185
  # mandatory: transaction_type must != (30, 31, 32, 34, 35)
186
186
  append_error(:track1, "track1 must not be set for tagged transactions") if [30,31,32,34,35].include?(tt)
187
+ append_error(:track1, "track1 must not be set for debit transactions") if [50,54].include?(tt)
187
188
 
188
189
  # amount mandatory for all
189
- mandatory = [:amount]
190
-
191
- # track1 mandatory, except 50,54
192
- # pan mandatory 50,54 only
193
- mandatory << ([50,54].include?(tt) ? :pan : :track1)
190
+ mandatory = [:track1, :amount]
194
191
 
195
192
  # reference_no mandatory for 60
196
193
  mandatory << :reference_no if tt == 60
@@ -204,10 +201,11 @@ module EWS # :nodoc:
204
201
  tt = self.transaction_type.to_i
205
202
 
206
203
  # mandatory: transaction_type must != (30, 31, 32, 34, 35, 50, 54)
207
- append_error(:track2, "track2 must not be set for tagged transactions") if [30,31,32,34,35,50,54].include?(tt)
204
+ append_error(:track2, "track2 must not be set for tagged transactions") if [30,31,32,34,35].include?(tt)
205
+ append_error(:track2, "track2 must not be set for debit transactions") if [50,54].include?(tt)
208
206
 
209
207
  # track2, expiry_date, cardholder_name, amount mandatory
210
- mandatory = [:track2, :cc_expiry, :cardholder_name, :amount]
208
+ mandatory = [:track2, :cardholder_name, :amount]
211
209
 
212
210
  # auth_number mandatory for (02, 03, 11, 12, 13)
213
211
  mandatory << :authorization_num if [02, 03, 11, 12, 13].include?(tt)
@@ -215,9 +213,21 @@ module EWS # :nodoc:
215
213
  check_mandatory(mandatory)
216
214
  end
217
215
 
216
+ def validate_for_pan
217
+ tt = self.transaction_type.to_i
218
+
219
+ # mandatory: transaction_type must == (50, 54)
220
+ append_error(:pan, "pan must not be set for non-debit transactions") unless [50,54].include?(tt)
221
+
222
+ # track2, expiry_date, cardholder_name, amount mandatory
223
+ mandatory = [:pan, :cardholder_name, :amount]
224
+
225
+ check_mandatory(mandatory)
226
+ end
227
+
218
228
  def check_mandatory(mandatory)
219
229
  mandatory.each do |key|
220
- append_error(key, "#{key} is required") if self.send(key).blank?
230
+ append_error(key, "#{key} must be supplied") if self.send(key).blank?
221
231
  end
222
232
  end
223
233
  end
@@ -40,19 +40,19 @@ module EWS # :nodoc:
40
40
  # <tt>transaction</tt>:: the Request object to encode for transmission to the server
41
41
  # <tt>transport_type</tt>:: (optional) the transport type to use for this transaction only. If it is not specified, the Transporter's transport type will be used
42
42
  def submit(transaction, transport_type = nil)
43
- raise "Request not supplied" if transaction.nil?
43
+ raise ArgumentError, "Request not supplied" if transaction.nil?
44
44
  return false unless transaction.valid?
45
45
 
46
46
  transport_type ||= @transport_type
47
47
 
48
- raise "Transport type #{transport_type} is not supported" unless @@transport_types.include? transport_type
48
+ raise ArgumentError, "Transport type #{transport_type} is not supported" unless @@transport_types.include? transport_type
49
49
 
50
50
  transport_details = @@transport_types[transport_type]
51
51
 
52
52
  request = build_http_request(transaction, transport_type, transport_details[:suffix])
53
53
  request.basic_auth(transaction.gateway_id, transaction.password)
54
54
  request.add_field "Accept", transport_details[:content_type]
55
- request.add_field "User-Agent", "exact4r v0.9"
55
+ request.add_field "User-Agent", "exact4r v0.9.1"
56
56
  request.add_field "Content-type", "#{transport_details[:content_type]}; charset=UTF-8"
57
57
 
58
58
  response = get_connection.request(request)
data/lib/exact4r.rb CHANGED
@@ -7,4 +7,4 @@ require 'ews/transaction/response'
7
7
  require 'ews/transaction/validator'
8
8
  require 'ews/transporter'
9
9
 
10
- require 'ews/transaction/fake_response'
10
+ require 'ews/transaction/fake_response'
@@ -0,0 +1,75 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class ForcedPostTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @transporter = EWS::Transporter.new(LOCATION)
7
+ end
8
+
9
+ def test_mandatory
10
+ request = EWS::Transaction::Request.new(:transaction_type => :forced_post)
11
+ assert !request.valid?
12
+ assert_equal "gateway_id must be supplied", request.errors[:gateway_id]
13
+
14
+ request.gateway_id = EMERGIS_BASIC_AUTH[:gateway_id]
15
+ assert !request.valid?
16
+ assert_equal "password must be supplied", request.errors[:password]
17
+
18
+ request.password = EMERGIS_BASIC_AUTH[:password]
19
+ assert !request.valid?
20
+ assert_equal "One of the following must be supplied: cc_number, track1, track2 or transaction_tag.", request.errors[:base]
21
+
22
+ request.cc_number = "4111111111111111"
23
+ assert !request.valid?
24
+ assert_equal "cc_expiry must be supplied", request.errors[:cc_expiry]
25
+
26
+ request.cc_expiry = "0913"
27
+ assert !request.valid?
28
+ assert_equal "cardholder_name must be supplied", request.errors[:cardholder_name]
29
+
30
+ request.cardholder_name = "Simon Jones"
31
+ assert !request.valid?
32
+ assert_equal "amount must be supplied", request.errors[:amount]
33
+
34
+ request.amount = 10
35
+ assert !request.valid?
36
+ assert_equal "authorization_num must be supplied", request.errors[:authorization_num]
37
+
38
+ request.authorization_num = "TH6754"
39
+ assert request.valid?
40
+ end
41
+
42
+ def test_by_credit_card
43
+ request = EWS::Transaction::Request.new(cc_number_params.merge(:transaction_type => :forced_post))
44
+ request.amount = 11.25
45
+ request.authorization_num = "1234"
46
+ assert request.valid?, request.errors.inspect
47
+
48
+ assert_details_correct request, @transporter.submit(request, :json)
49
+ assert_details_correct request, @transporter.submit(request, :rest)
50
+ assert_details_correct request, @transporter.submit(request, :soap)
51
+ end
52
+
53
+ def test_by_track1
54
+ request = EWS::Transaction::Request.new(track1_params.merge(:transaction_type => :forced_post))
55
+ request.amount = 11.25
56
+ request.authorization_num = "1234"
57
+ assert request.valid?, request.errors.inspect
58
+
59
+ assert_details_correct request, @transporter.submit(request, :json)
60
+ assert_details_correct request, @transporter.submit(request, :rest)
61
+ assert_details_correct request, @transporter.submit(request, :soap)
62
+ end
63
+
64
+ def test_by_track2
65
+ request = EWS::Transaction::Request.new(track2_params.merge(:transaction_type => :forced_post))
66
+ request.amount = 11.25
67
+ request.authorization_num = "1234"
68
+ assert request.valid?, request.errors.inspect
69
+
70
+ assert_details_correct request, @transporter.submit(request, :json)
71
+ assert_details_correct request, @transporter.submit(request, :rest)
72
+ assert_details_correct request, @transporter.submit(request, :soap)
73
+ end
74
+
75
+ end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class OnlineDebitPurchaseTest < Test::Unit::TestCase
4
+
5
+ # NOTE: INTERAC Online Debit transactions are ONLY supported by Chase merchants
6
+
7
+ def setup
8
+ @transporter = EWS::Transporter.new(LOCATION)
9
+ end
10
+
11
+ def test_mandatory
12
+ request = EWS::Transaction::Request.new(:transaction_type => :idebit_purchase)
13
+ assert !request.valid?
14
+ assert_equal "gateway_id must be supplied", request.errors[:gateway_id]
15
+
16
+ request.gateway_id = CHASE_BASIC_AUTH[:gateway_id]
17
+ assert !request.valid?
18
+ assert_equal "password must be supplied", request.errors[:password]
19
+
20
+ request.password = CHASE_BASIC_AUTH[:password]
21
+ assert !request.valid?
22
+ assert_equal "pan must be supplied", request.errors[:pan]
23
+
24
+ request.pan = "4111111111111111"
25
+ assert !request.valid?
26
+ assert_equal "cardholder_name must be supplied", request.errors[:cardholder_name]
27
+
28
+ request.cardholder_name = "Simon Jones"
29
+ assert !request.valid?
30
+ assert_equal "amount must be supplied", request.errors[:amount]
31
+
32
+ request.amount = 10
33
+ assert request.valid?
34
+ end
35
+
36
+ # PAN may be specificed as a simple account number...
37
+ def test_by_pan_as_cc_number
38
+ request = EWS::Transaction::Request.new({
39
+ :transaction_type => :idebit_purchase,
40
+ :amount => 11.25,
41
+ :pan => TEST_CARD_NUMBER,
42
+ :cardholder_name => TEST_CARD_HOLDER
43
+ }.merge(CHASE_BASIC_AUTH))
44
+ assert request.valid?, request.errors.inspect
45
+
46
+ assert_details_correct request, @transporter.submit(request, :json)
47
+ assert_details_correct request, @transporter.submit(request, :rest)
48
+ assert_details_correct request, @transporter.submit(request, :soap)
49
+ end
50
+
51
+ # ...or in track2 format
52
+ def test_by_pan_as_cc_number
53
+ request = EWS::Transaction::Request.new({
54
+ :transaction_type => :idebit_purchase,
55
+ :amount => 11.25,
56
+ :pan => TEST_TRACK2,
57
+ :cardholder_name => TEST_CARD_HOLDER
58
+ }.merge(CHASE_BASIC_AUTH))
59
+ assert request.valid?, request.errors.inspect
60
+
61
+ assert_details_correct request, @transporter.submit(request, :json)
62
+ assert_details_correct request, @transporter.submit(request, :rest)
63
+ assert_details_correct request, @transporter.submit(request, :soap)
64
+ end
65
+
66
+ end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class OnlineDebitRefundTest < Test::Unit::TestCase
4
+
5
+ # NOTE: INTERAC Online Debit transactions are ONLY supported by Chase merchants
6
+
7
+ def setup
8
+ @transporter = EWS::Transporter.new(LOCATION)
9
+ end
10
+
11
+ def test_mandatory
12
+ request = EWS::Transaction::Request.new(:transaction_type => :idebit_refund)
13
+ assert !request.valid?
14
+ assert_equal "gateway_id must be supplied", request.errors[:gateway_id]
15
+
16
+ request.gateway_id = CHASE_BASIC_AUTH[:gateway_id]
17
+ assert !request.valid?
18
+ assert_equal "password must be supplied", request.errors[:password]
19
+
20
+ request.password = CHASE_BASIC_AUTH[:password]
21
+ assert !request.valid?
22
+ assert_equal "pan must be supplied", request.errors[:pan]
23
+
24
+ request.pan = "4111111111111111"
25
+ assert !request.valid?
26
+ assert_equal "cardholder_name must be supplied", request.errors[:cardholder_name]
27
+
28
+ request.cardholder_name = "Simon Jones"
29
+ assert !request.valid?
30
+ assert_equal "amount must be supplied", request.errors[:amount]
31
+
32
+ request.amount = 10
33
+ assert request.valid?
34
+ end
35
+
36
+ # PAN may be specificed as a simple account number...
37
+ def test_by_pan_as_cc_number
38
+ request = EWS::Transaction::Request.new({
39
+ :transaction_type => :idebit_refund,
40
+ :amount => 11.25,
41
+ :pan => TEST_CARD_NUMBER,
42
+ :cardholder_name => TEST_CARD_HOLDER
43
+ }.merge(CHASE_BASIC_AUTH))
44
+ assert request.valid?, request.errors.inspect
45
+
46
+ assert_details_correct request, @transporter.submit(request, :json)
47
+ assert_details_correct request, @transporter.submit(request, :rest)
48
+ assert_details_correct request, @transporter.submit(request, :soap)
49
+ end
50
+
51
+ # ...or in track2 format
52
+ def test_by_pan_as_cc_number
53
+ request = EWS::Transaction::Request.new({
54
+ :transaction_type => :idebit_refund,
55
+ :amount => 11.25,
56
+ :pan => TEST_TRACK2,
57
+ :cardholder_name => TEST_CARD_HOLDER
58
+ }.merge(CHASE_BASIC_AUTH))
59
+ assert request.valid?, request.errors.inspect
60
+
61
+ assert_details_correct request, @transporter.submit(request, :json)
62
+ assert_details_correct request, @transporter.submit(request, :rest)
63
+ assert_details_correct request, @transporter.submit(request, :soap)
64
+ end
65
+
66
+ end