exact4r 0.9.1 → 0.9.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 (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