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
@@ -0,0 +1,174 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class RestEncodingTest < Test::Unit::TestCase
4
+
5
+ def test_basic_request_encoding
6
+ r = EWS::Transaction::Request.new(basic_params)
7
+
8
+ rest = EWS::Transaction::Mapping.request_to_rest(r)
9
+
10
+ xml = REXML::Document.new(rest)
11
+ txn = REXML::XPath.first(xml, "//Transaction")
12
+ assert_equal "4111111111111111", REXML::XPath.first(txn, "Card_Number").text
13
+ assert_equal "Simon Brown", REXML::XPath.first(txn, "CardHoldersName").text
14
+ assert_equal "00", REXML::XPath.first(txn, "Transaction_Type").text
15
+ assert_equal "1012", REXML::XPath.first(txn, "Expiry_Date").text
16
+ assert_equal "10.13", REXML::XPath.first(txn, "DollarAmount").text
17
+ end
18
+
19
+ def test_request_encoding_everything
20
+ request = EWS::Transaction::Request.new(sample_everything_params)
21
+
22
+ rest = EWS::Transaction::Mapping.request_to_rest(request)
23
+
24
+ xml = REXML::Document.new(rest)
25
+ txn = REXML::XPath.first(xml, "//Transaction")
26
+
27
+ assert_equal request.amount.to_s, REXML::XPath.first(txn, "DollarAmount").text
28
+ assert_equal request.authorization_num.to_s, REXML::XPath.first(txn, "Authorization_Num").text
29
+ assert_equal request.cardholder_name.to_s, REXML::XPath.first(txn, "CardHoldersName").text
30
+ assert_equal request.cavv.to_s, REXML::XPath.first(txn, "CAVV").text
31
+ assert_equal request.cavv_algorithm.to_s, REXML::XPath.first(txn, "CAVV_Algorithm").text
32
+ assert_equal request.cc_expiry.to_s, REXML::XPath.first(txn, "Expiry_Date").text
33
+ assert_equal request.cc_number.to_s, REXML::XPath.first(txn, "Card_Number").text
34
+ assert_equal request.cc_verification_str1.to_s, REXML::XPath.first(txn, "VerificationStr1").text
35
+ assert_equal request.cc_verification_str2.to_s, REXML::XPath.first(txn, "VerificationStr2").text
36
+ assert_equal request.client_email.to_s, REXML::XPath.first(txn, "Client_Email").text
37
+ assert_equal request.client_ip.to_s, REXML::XPath.first(txn, "Client_IP").text
38
+ assert_equal request.customer_ref.to_s, REXML::XPath.first(txn, "Customer_Ref").text
39
+ assert_equal request.cvd_presence_ind.to_s, REXML::XPath.first(txn, "CVD_Presence_Ind").text
40
+ assert_equal request.ecommerce_flag.to_s, REXML::XPath.first(txn, "Ecommerce_Flag").text
41
+ assert_equal request.gateway_id.to_s, REXML::XPath.first(txn, "ExactID").text
42
+ assert_equal request.language.to_s, REXML::XPath.first(txn, "Language").text
43
+ assert_equal request.password.to_s, REXML::XPath.first(txn, "Password").text
44
+ assert_equal request.pan.to_s, REXML::XPath.first(txn, "PAN").text
45
+ assert_equal request.reference_3.to_s, REXML::XPath.first(txn, "Reference_3").text
46
+ assert_equal request.reference_no.to_s, REXML::XPath.first(txn, "Reference_No").text
47
+ assert_equal request.secure_auth_required.to_s, REXML::XPath.first(txn, "Secure_AuthRequired").text
48
+ assert_equal request.secure_auth_result.to_s, REXML::XPath.first(txn, "Secure_AuthResult").text
49
+ assert_equal request.surcharge_amount.to_s, REXML::XPath.first(txn, "SurchargeAmount").text
50
+ assert_equal request.tax1_amount.to_s, REXML::XPath.first(txn, "Tax1Amount").text
51
+ assert_equal request.tax1_number.to_s, REXML::XPath.first(txn, "Tax1Number").text
52
+ assert_equal request.tax2_amount.to_s, REXML::XPath.first(txn, "Tax2Amount").text
53
+ assert_equal request.tax2_number.to_s, REXML::XPath.first(txn, "Tax2Number").text
54
+ assert_equal request.track1.to_s, REXML::XPath.first(txn, "Track1").text
55
+ assert_equal request.track2.to_s, REXML::XPath.first(txn, "Track2").text
56
+ assert_equal request.transaction_tag.to_s, REXML::XPath.first(txn, "Transaction_Tag").text
57
+ assert_equal request.user_name.to_s, REXML::XPath.first(txn, "User_Name").text
58
+ assert_equal request.xid.to_s, REXML::XPath.first(txn, "XID").text
59
+ assert_equal request.zip_code.to_s, REXML::XPath.first(txn, "ZipCode").text
60
+ end
61
+
62
+ def test_basic_response_decoding
63
+ filename = File.dirname(__FILE__) + "/../samples/rest.response.xml"
64
+ payload = IO.read(filename)
65
+
66
+ r = nil
67
+ assert_nothing_raised do
68
+ r = EWS::Transaction::Mapping.rest_to_response(payload)
69
+ end
70
+ assert_not_nil r
71
+
72
+ assert_equal "Transaction Normal", r.exact_message
73
+ assert_nil r.error_description
74
+ assert_equal "APPROVED", r.bank_message
75
+ assert_equal 2516, r.transaction_tag
76
+ assert_equal "00", r.transaction_type
77
+ end
78
+
79
+ def test_dodgy_response_decoding
80
+ filename = File.dirname(__FILE__) + "/../samples/rest.dodgy.response.xml"
81
+ payload = IO.read(filename)
82
+
83
+ r = nil
84
+ assert_nothing_raised do
85
+ r = EWS::Transaction::Mapping.rest_to_response(payload)
86
+ end
87
+ assert_not_nil r
88
+
89
+ assert_equal "Transaction Normal", r.exact_message
90
+ assert_nil r.error_description
91
+ assert_equal "APPROVED", r.bank_message
92
+ assert_equal 2516, r.transaction_tag
93
+ assert_equal "00", r.transaction_type
94
+
95
+ # the following are all invalid examples of the relevant fields, so ensure we
96
+ # decode them without complaint.
97
+ assert_equal "Simon Brown Is Not A Really Long Name But This Is", r.cardholder_name
98
+ assert_equal "nonsense", r.cc_number
99
+ assert_equal "This Is A Really LONG Customer Reference", r.customer_ref
100
+ end
101
+
102
+ def test_response_decoding_everything
103
+ filename = File.dirname(__FILE__) + "/../samples/rest.everything.response.xml"
104
+ payload = IO.read(filename)
105
+
106
+ r = nil
107
+ assert_nothing_raised do
108
+ r = EWS::Transaction::Mapping.rest_to_response(payload)
109
+ end
110
+ assert_not_nil r
111
+
112
+ assert !r.transaction_error?
113
+ assert r.approved?
114
+
115
+ assert_equal 'Z', r.avs
116
+ assert_equal "APPROVED", r.bank_message
117
+ assert_equal "000", r.bank_resp_code
118
+ assert_equal "12", r.bank_resp_code_2
119
+ assert_equal "0", r.cavv_response
120
+ assert_equal "This is\na CTR", r.ctr
121
+ assert_equal "U", r.cvv2
122
+ assert_equal "Something", r.error_description
123
+ assert_equal "650", r.error_number
124
+ assert_equal "Transaction Normal", r.exact_message
125
+ assert_equal "00", r.exact_resp_code
126
+ assert_equal "Processed by E-Xact", r.logon_message
127
+ assert_equal "07203434", r.retrieval_ref_no
128
+ assert_equal "258", r.sequence_no
129
+
130
+ assert_equal "Paymentech Goods Buy and Sell(Calgary) 5300003", r.merchant_name
131
+ assert_equal "4567 8th ave SE.", r.merchant_address
132
+ assert_equal "Calgary", r.merchant_city
133
+ assert_equal "United States", r.merchant_country
134
+ assert_equal "V6B 2K4", r.merchant_postal
135
+ assert_equal "Alabama", r.merchant_province
136
+ assert_equal "http://somewhere.com/somehow/", r.merchant_url
137
+
138
+ assert_equal "ET3434", r.authorization_num
139
+ assert_equal "Simon Brown", r.cardholder_name
140
+ assert_equal "4111111111111111", r.cc_number
141
+ assert_equal "123", r.cavv
142
+ assert_equal "8", r.cavv_algorithm
143
+ assert_equal "simon@example.com", r.client_email
144
+ assert_equal "127.0.0.1", r.client_ip
145
+ assert_equal "REF-123", r.customer_ref
146
+ assert_equal "0", r.cvd_presence_ind
147
+ assert_equal "4", r.ecommerce_flag
148
+ assert_equal "1210", r.cc_expiry
149
+ assert_equal "4", r.language
150
+ assert_equal "12345678900987654321", r.pan
151
+ assert_equal "AD0009-01", r.gateway_id
152
+ assert_equal "passw0rd", r.password
153
+ assert_equal "REF-456", r.reference_3
154
+ assert_equal "987987", r.reference_no
155
+ assert_equal "1", r.secure_auth_required
156
+ assert_equal "9", r.secure_auth_result
157
+ assert_equal "11.12", r.surcharge_amount
158
+ assert_equal "23.23", r.tax1_amount
159
+ assert_equal "987654", r.tax1_number
160
+ assert_equal "34.34", r.tax2_amount
161
+ assert_equal "123456", r.tax2_number
162
+ assert_equal "%B4111111111111111^Jones/Simon ^1309101063510010000000306000000?", r.track1
163
+ assert_equal ";4111111111111111=1309101420320192611?", r.track2
164
+ assert_equal 2516, r.transaction_tag
165
+ assert_equal "00", r.transaction_type
166
+ assert_equal "Superman", r.user_name
167
+ assert_equal "verified", r.cc_verification_str1
168
+ assert_equal "6785", r.cc_verification_str2
169
+ assert_equal "x678", r.xid
170
+ assert_equal "10100", r.zip_code
171
+
172
+ end
173
+
174
+ end
@@ -0,0 +1,211 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class SoapEncodingTest < Test::Unit::TestCase
4
+
5
+ def test_basic_request_encoding
6
+ r = EWS::Transaction::Request.new(basic_params)
7
+
8
+ soap = EWS::Transaction::Mapping.request_to_soap(r)
9
+
10
+ xml = REXML::Document.new(soap)
11
+ txn = REXML::XPath.first(xml, "//SendAndCommitSource")
12
+ assert_equal "4111111111111111", REXML::XPath.first(txn, "Card_Number").text
13
+ assert_equal "Simon Brown", REXML::XPath.first(txn, "CardHoldersName").text
14
+ assert_equal "00", REXML::XPath.first(txn, "Transaction_Type").text
15
+ assert_equal "1012", REXML::XPath.first(txn, "Expiry_Date").text
16
+ assert_equal "10.13", REXML::XPath.first(txn, "DollarAmount").text
17
+ end
18
+
19
+ def test_request_encoding_everything
20
+ request = EWS::Transaction::Request.new(sample_everything_params)
21
+
22
+ soap = EWS::Transaction::Mapping.request_to_soap(request)
23
+
24
+ xml = REXML::Document.new(soap)
25
+ txn = REXML::XPath.first(xml, "//SendAndCommitSource")
26
+
27
+ assert_equal request.amount.to_s, REXML::XPath.first(txn, "DollarAmount").text
28
+ assert_equal request.authorization_num.to_s, REXML::XPath.first(txn, "Authorization_Num").text
29
+ assert_equal request.cardholder_name.to_s, REXML::XPath.first(txn, "CardHoldersName").text
30
+ assert_equal request.cavv.to_s, REXML::XPath.first(txn, "CAVV").text
31
+ assert_equal request.cavv_algorithm.to_s, REXML::XPath.first(txn, "CAVV_Algorithm").text
32
+ assert_equal request.cc_expiry.to_s, REXML::XPath.first(txn, "Expiry_Date").text
33
+ assert_equal request.cc_number.to_s, REXML::XPath.first(txn, "Card_Number").text
34
+ assert_equal request.cc_verification_str1.to_s, REXML::XPath.first(txn, "VerificationStr1").text
35
+ assert_equal request.cc_verification_str2.to_s, REXML::XPath.first(txn, "VerificationStr2").text
36
+ assert_equal request.client_email.to_s, REXML::XPath.first(txn, "Client_Email").text
37
+ assert_equal request.client_ip.to_s, REXML::XPath.first(txn, "Client_IP").text
38
+ assert_equal request.customer_ref.to_s, REXML::XPath.first(txn, "Customer_Ref").text
39
+ assert_equal request.cvd_presence_ind.to_s, REXML::XPath.first(txn, "CVD_Presence_Ind").text
40
+ assert_equal request.ecommerce_flag.to_s, REXML::XPath.first(txn, "Ecommerce_Flag").text
41
+ assert_equal request.gateway_id.to_s, REXML::XPath.first(txn, "ExactID").text
42
+ assert_equal request.language.to_s, REXML::XPath.first(txn, "Language").text
43
+ assert_equal request.password.to_s, REXML::XPath.first(txn, "Password").text
44
+ assert_equal request.pan.to_s, REXML::XPath.first(txn, "PAN").text
45
+ assert_equal request.reference_3.to_s, REXML::XPath.first(txn, "Reference_3").text
46
+ assert_equal request.reference_no.to_s, REXML::XPath.first(txn, "Reference_No").text
47
+ assert_equal request.secure_auth_required.to_s, REXML::XPath.first(txn, "Secure_AuthRequired").text
48
+ assert_equal request.secure_auth_result.to_s, REXML::XPath.first(txn, "Secure_AuthResult").text
49
+ assert_equal request.surcharge_amount.to_s, REXML::XPath.first(txn, "SurchargeAmount").text
50
+ assert_equal request.tax1_amount.to_s, REXML::XPath.first(txn, "Tax1Amount").text
51
+ assert_equal request.tax1_number.to_s, REXML::XPath.first(txn, "Tax1Number").text
52
+ assert_equal request.tax2_amount.to_s, REXML::XPath.first(txn, "Tax2Amount").text
53
+ assert_equal request.tax2_number.to_s, REXML::XPath.first(txn, "Tax2Number").text
54
+ assert_equal request.track1.to_s, REXML::XPath.first(txn, "Track1").text
55
+ assert_equal request.track2.to_s, REXML::XPath.first(txn, "Track2").text
56
+ assert_equal request.transaction_tag.to_s, REXML::XPath.first(txn, "Transaction_Tag").text
57
+ assert_equal request.user_name.to_s, REXML::XPath.first(txn, "User_Name").text
58
+ assert_equal request.xid.to_s, REXML::XPath.first(txn, "XID").text
59
+ assert_equal request.zip_code.to_s, REXML::XPath.first(txn, "ZipCode").text
60
+ end
61
+
62
+ def test_basic_response_decoding
63
+ filename = File.dirname(__FILE__) + "/../samples/soap.response.xml"
64
+ payload = IO.read(filename)
65
+
66
+ r = nil
67
+ assert_nothing_raised do
68
+ r = EWS::Transaction::Mapping.soap_to_response(payload)
69
+ end
70
+ assert_not_nil r
71
+
72
+ assert_equal "Transaction Normal", r.exact_message
73
+ assert_nil r.error_description
74
+ assert_equal "APPROVED", r.bank_message
75
+ assert_equal 2517, r.transaction_tag
76
+ assert_equal "00", r.transaction_type
77
+ end
78
+
79
+ def test_dodgy_response_decoding
80
+ filename = File.dirname(__FILE__) + "/../samples/soap.dodgy.response.xml"
81
+ payload = IO.read(filename)
82
+
83
+ r = nil
84
+ assert_nothing_raised do
85
+ r = EWS::Transaction::Mapping.soap_to_response(payload)
86
+ end
87
+ assert_not_nil r
88
+
89
+ assert_equal "Transaction Normal", r.exact_message
90
+ assert_nil r.error_description
91
+ assert_equal "APPROVED", r.bank_message
92
+ assert_equal 2517, r.transaction_tag
93
+ assert_equal "00", r.transaction_type
94
+
95
+ # the following are all invalid examples of the relevant fields, so ensure we
96
+ # decode them without complaint.
97
+ assert_equal "Simon Brown Is Not A Really Long Name But This Is", r.cardholder_name
98
+ assert_equal "4111111111111111666666", r.cc_number
99
+ end
100
+
101
+ def test_response_decoding_everything
102
+ filename = File.dirname(__FILE__) + "/../samples/soap.everything.response.xml"
103
+ payload = IO.read(filename)
104
+
105
+ r = nil
106
+ assert_nothing_raised do
107
+ r = EWS::Transaction::Mapping.soap_to_response(payload)
108
+ end
109
+ assert_not_nil r
110
+
111
+ assert !r.transaction_error?
112
+ assert r.approved?
113
+
114
+ assert_equal 'Z', r.avs
115
+ assert_equal "APPROVED", r.bank_message
116
+ assert_equal "000", r.bank_resp_code
117
+ assert_equal "12", r.bank_resp_code_2
118
+ assert_equal "0", r.cavv_response
119
+ assert_equal "This is\na CTR", r.ctr
120
+ assert_equal "U", r.cvv2
121
+ assert_equal "Something", r.error_description
122
+ assert_equal "650", r.error_number
123
+ assert_equal "Transaction Normal", r.exact_message
124
+ assert_equal "00", r.exact_resp_code
125
+ assert_equal "Processed by E-Xact", r.logon_message
126
+ assert_equal "07203434", r.retrieval_ref_no
127
+ assert_equal "258", r.sequence_no
128
+
129
+ assert_equal "Paymentech Goods Buy and Sell(Calgary) 5300003", r.merchant_name
130
+ assert_equal "4567 8th ave SE.", r.merchant_address
131
+ assert_equal "Calgary", r.merchant_city
132
+ assert_equal "United States", r.merchant_country
133
+ assert_equal "V6B 2K4", r.merchant_postal
134
+ assert_equal "Alabama", r.merchant_province
135
+ assert_equal "http://somewhere.com/somehow/", r.merchant_url
136
+
137
+ assert_equal "ET3434", r.authorization_num
138
+ assert_equal "Simon Brown", r.cardholder_name
139
+ assert_equal "4111111111111111", r.cc_number
140
+ assert_equal "123", r.cavv
141
+ assert_equal "8", r.cavv_algorithm
142
+ assert_equal "simon@example.com", r.client_email
143
+ assert_equal "127.0.0.1", r.client_ip
144
+ assert_equal "REF-123", r.customer_ref
145
+ assert_equal "0", r.cvd_presence_ind
146
+ assert_equal "4", r.ecommerce_flag
147
+ assert_equal "1210", r.cc_expiry
148
+ assert_equal "4", r.language
149
+ assert_equal "12345678900987654321", r.pan
150
+ assert_equal "AD0009-01", r.gateway_id
151
+ assert_equal "passw0rd", r.password
152
+ assert_equal "REF-456", r.reference_3
153
+ assert_equal "987987", r.reference_no
154
+ assert_equal "1", r.secure_auth_required
155
+ assert_equal "9", r.secure_auth_result
156
+ assert_equal "11.12", r.surcharge_amount
157
+ assert_equal "23.23", r.tax1_amount
158
+ assert_equal "987654", r.tax1_number
159
+ assert_equal "34.34", r.tax2_amount
160
+ assert_equal "123456", r.tax2_number
161
+ assert_equal "%B4111111111111111^Jones/Simon ^1309101063510010000000306000000?", r.track1
162
+ assert_equal ";4111111111111111=1309101420320192611?", r.track2
163
+ assert_equal 2516, r.transaction_tag
164
+ assert_equal "00", r.transaction_type
165
+ assert_equal "Superman", r.user_name
166
+ assert_equal "verified", r.cc_verification_str1
167
+ assert_equal "6785", r.cc_verification_str2
168
+ assert_equal "x678", r.xid
169
+ assert_equal "10100", r.zip_code
170
+
171
+ end
172
+
173
+ def test_fault_decoding_with_details
174
+ filename = File.dirname(__FILE__) + "/../samples/soap.generalfailure.fault.xml"
175
+ payload = IO.read(filename)
176
+
177
+ r = nil
178
+ assert_nothing_raised do
179
+ r = EWS::Transaction::Mapping.soap_to_response(payload)
180
+ end
181
+ assert_not_nil r
182
+
183
+ assert_equal 500, r.error_number
184
+ assert_equal "Internal Server Error. An unknown error occurred.", r.error_description
185
+ assert !r.approved?
186
+ end
187
+
188
+ def test_fault_decoding_with_no_details
189
+ filename = File.dirname(__FILE__) + "/../samples/soap.deserialization.fault.xml"
190
+ payload = IO.read(filename)
191
+
192
+ assert_raises(RuntimeError) {
193
+ EWS::Transaction::Mapping.soap_to_response(payload)
194
+ }
195
+ end
196
+
197
+ def test_null_transaction_fault_decoding
198
+ filename = File.dirname(__FILE__) + "/../samples/soap.nulltransaction.fault.xml"
199
+ payload = IO.read(filename)
200
+
201
+ r = nil
202
+ assert_nothing_raised do
203
+ r = EWS::Transaction::Mapping.soap_to_response(payload)
204
+ end
205
+ assert_not_nil r
206
+
207
+ assert_equal 400, r.error_number
208
+ assert_equal "Bad Request. Object reference not set to an instance of a Transaction object.", r.error_description
209
+ assert !r.approved?
210
+ end
211
+ end
@@ -0,0 +1,54 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class TransporterTest < Test::Unit::TestCase
4
+
5
+ def test_invalid_transport_type
6
+ txn = ::EWS::Transaction::Request.new({
7
+ :transaction_type => :purchase,
8
+ :amount => "10.13",
9
+ :cardholder_name => "Simon Brown",
10
+ :cc_number => "4111111111111111",
11
+ :cc_expiry => "1012",
12
+ :reference_no => "987987",
13
+ }.merge(EMERGIS_BASIC_AUTH))
14
+
15
+ tr = ::EWS::Transporter.new(LOCATION)
16
+
17
+ # should raise an exception when transport_type is not one of :json, :rest or :soap
18
+ assert_raises(ArgumentError) {
19
+ tr.submit(txn, :banana)
20
+ }
21
+ end
22
+
23
+ def test_no_errors_thrown
24
+ txn = ::EWS::Transaction::Request.new({
25
+ :transaction_type => :purchase,
26
+ :amount => "10.13",
27
+ :cardholder_name => "Simon Brown",
28
+ :cc_number => "4111111111111111",
29
+ :cc_expiry => "1012",
30
+ :reference_no => "987987",
31
+ }.merge(EMERGIS_BASIC_AUTH))
32
+
33
+ assert_nothing_raised {
34
+ tr = ::EWS::Transporter.new(LOCATION)
35
+ tr.submit(txn)
36
+ }
37
+ end
38
+
39
+ def test_returns_response_object_on_server_failure
40
+ req = ::EWS::Transaction::Request.new({
41
+ :transaction_type => :transaction_details
42
+ }.merge(EMERGIS_BASIC_AUTH))
43
+
44
+ req.transaction_tag = 9000 # non-existent txn
45
+
46
+ tr = ::EWS::Transporter.new(LOCATION)
47
+ resp = tr.submit(req, :json)
48
+
49
+ assert_not_nil resp
50
+ assert_equal 404, resp.error_number
51
+ assert_equal "Not Found", resp.error_description
52
+ end
53
+
54
+ end
@@ -0,0 +1,150 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ class ValidatorTest < Test::Unit::TestCase
4
+
5
+ def test_strings_invalid_when_too_long
6
+ assert EWS::Transaction::Request.new(basic_params).valid?
7
+
8
+ assert EWS::Transaction::Request.new(basic_params(:authorization_num => 'a'*8)).valid?
9
+ assert !EWS::Transaction::Request.new(basic_params(:authorization_num => 'a'*9)).valid?
10
+
11
+ assert EWS::Transaction::Request.new(basic_params(:cardholder_name => 'a'*30)).valid?
12
+ assert !EWS::Transaction::Request.new(basic_params(:cardholder_name => 'a'*31)).valid?
13
+
14
+ assert EWS::Transaction::Request.new(basic_params(:cc_number => 'a'*19)).valid?
15
+ assert !EWS::Transaction::Request.new(basic_params(:cc_number => 'a'*20)).valid?
16
+
17
+ assert EWS::Transaction::Request.new(basic_params(:cc_expiry => "0909")).valid?
18
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "09091")).valid?
19
+
20
+ assert EWS::Transaction::Request.new(basic_params(:cavv => 'a'*40)).valid?
21
+ assert !EWS::Transaction::Request.new(basic_params(:cavv => 'a'*41)).valid?
22
+
23
+ assert EWS::Transaction::Request.new(basic_params(:client_email => 'a'*30)).valid?
24
+ assert !EWS::Transaction::Request.new(basic_params(:client_email => 'a'*31)).valid?
25
+
26
+ assert EWS::Transaction::Request.new(basic_params(:customer_ref => 'a'*20)).valid?
27
+ assert !EWS::Transaction::Request.new(basic_params(:customer_ref => 'a'*21)).valid?
28
+
29
+ assert EWS::Transaction::Request.new(basic_params(:gateway_id => 'a'*10)).valid?
30
+ assert !EWS::Transaction::Request.new(basic_params(:gateway_id => 'a'*11)).valid?
31
+
32
+ assert EWS::Transaction::Request.new(basic_params(:pan => 'a'*39)).valid?
33
+ assert !EWS::Transaction::Request.new(basic_params(:pan => 'a'*40)).valid?
34
+
35
+ assert EWS::Transaction::Request.new(basic_params(:password => 'a'*30)).valid?
36
+ assert !EWS::Transaction::Request.new(basic_params(:password => 'a'*31)).valid?
37
+
38
+ assert EWS::Transaction::Request.new(basic_params(:reference_3 => 'a'*30)).valid?
39
+ assert !EWS::Transaction::Request.new(basic_params(:reference_3 => 'a'*31)).valid?
40
+
41
+ assert EWS::Transaction::Request.new(basic_params(:reference_no => 'a'*20)).valid?
42
+ assert !EWS::Transaction::Request.new(basic_params(:reference_no => 'a'*21)).valid?
43
+
44
+ assert EWS::Transaction::Request.new(basic_params(:tax1_number => 'a'*20)).valid?
45
+ assert !EWS::Transaction::Request.new(basic_params(:tax1_number => 'a'*21)).valid?
46
+
47
+ assert EWS::Transaction::Request.new(basic_params(:tax2_number => 'a'*20)).valid?
48
+ assert !EWS::Transaction::Request.new(basic_params(:tax2_number => 'a'*21)).valid?
49
+
50
+ assert EWS::Transaction::Request.new(basic_params(:track1 => 'a'*79)).valid?
51
+ assert !EWS::Transaction::Request.new(basic_params(:track1 => 'a'*80)).valid?
52
+
53
+ assert EWS::Transaction::Request.new(basic_params(:track2 => 'a'*40)).valid?
54
+ assert !EWS::Transaction::Request.new(basic_params(:track2 => 'a'*41)).valid?
55
+
56
+ assert EWS::Transaction::Request.new(basic_params(:cc_verification_str1 => 'a'*40)).valid?
57
+ assert !EWS::Transaction::Request.new(basic_params(:cc_verification_str1 => 'a'*41)).valid?
58
+
59
+ assert EWS::Transaction::Request.new(basic_params(:cc_verification_str2 => 'a'*4)).valid?
60
+ assert !EWS::Transaction::Request.new(basic_params(:cc_verification_str2 => 'a'*5)).valid?
61
+
62
+ assert EWS::Transaction::Request.new(basic_params(:xid => 'a'*40)).valid?
63
+ assert !EWS::Transaction::Request.new(basic_params(:xid => 'a'*41)).valid?
64
+
65
+ assert EWS::Transaction::Request.new(basic_params(:zip_code => 'a'*10)).valid?
66
+ assert !EWS::Transaction::Request.new(basic_params(:zip_code => 'a'*11)).valid?
67
+ end
68
+
69
+ def test_requires_gateway_and_password
70
+ assert EWS::Transaction::Request.new(basic_params).valid?
71
+
72
+ assert !EWS::Transaction::Request.new(basic_params(:gateway_id => nil)).valid?
73
+ assert !EWS::Transaction::Request.new(basic_params(:gateway_id => "")).valid?
74
+
75
+ assert !EWS::Transaction::Request.new(basic_params(:password => nil)).valid?
76
+ assert !EWS::Transaction::Request.new(basic_params(:password => "")).valid?
77
+ end
78
+
79
+ def test_amount_validation
80
+ # validation: amounts
81
+ [:amount, :surcharge_amount, :tax1_amount, :tax2_amount].each do |amount_attr|
82
+ assert EWS::Transaction::Request.new(basic_params(amount_attr => "10.13")).valid?
83
+ assert EWS::Transaction::Request.new(basic_params(amount_attr => "10.")).valid?
84
+ assert EWS::Transaction::Request.new(basic_params(amount_attr => "0.13")).valid?
85
+ assert EWS::Transaction::Request.new(basic_params(amount_attr => 10.13)).valid?
86
+ assert EWS::Transaction::Request.new(basic_params(amount_attr => 0.13)).valid?
87
+ assert EWS::Transaction::Request.new(basic_params(amount_attr => 10)).valid?
88
+
89
+ r = EWS::Transaction::Request.new(basic_params(amount_attr => "10.1s3"))
90
+ assert !r.valid?
91
+ assert !r.errors[amount_attr].blank?
92
+
93
+ r = EWS::Transaction::Request.new(basic_params(amount_attr => "1s0.13"))
94
+ assert !r.valid?
95
+ assert !r.errors[amount_attr].blank?
96
+
97
+ r = EWS::Transaction::Request.new(basic_params(amount_attr => "dopey"))
98
+ assert !r.valid?
99
+ assert !r.errors[amount_attr].blank?
100
+
101
+ r = EWS::Transaction::Request.new(basic_params(amount_attr => 100000))
102
+ assert !r.valid?
103
+ assert !r.errors[amount_attr].blank?
104
+
105
+ r = EWS::Transaction::Request.new(basic_params(amount_attr => 99999.99))
106
+ assert r.valid?
107
+ assert_nil r.errors[amount_attr]
108
+
109
+ r = EWS::Transaction::Request.new(basic_params(amount_attr => -0.01))
110
+ assert !r.valid?
111
+ assert !r.errors[amount_attr].blank?
112
+
113
+ r = EWS::Transaction::Request.new(basic_params(amount_attr => 0.0))
114
+ assert r.valid?
115
+ assert r.errors[amount_attr].blank?
116
+ end
117
+ end
118
+
119
+ def test_card_validation
120
+ # validation: card number
121
+ assert EWS::Transaction::Request.new(basic_params(:cc_number => "4111111111111111")).valid?
122
+ assert !EWS::Transaction::Request.new(basic_params(:cc_number => "4111111111111112")).valid?
123
+
124
+ # validation: card expiry (should be in MMYY format)
125
+ assert EWS::Transaction::Request.new(basic_params(:cc_expiry => "1009")).valid?
126
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => nil)).valid?
127
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "")).valid?
128
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "708")).valid?
129
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "07089")).valid?
130
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "07f")).valid?
131
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "1308")).valid? # invalid month
132
+
133
+ # ensure we don't accept dates in the past
134
+ t = Time.new
135
+ month = t.month
136
+ year = t.year - 2000
137
+ # in the past
138
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => sprintf("%02d%02d", month, year-1))).valid?
139
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => sprintf("%02d%02d", month-1, year))).valid?
140
+ # in the present or future
141
+ assert EWS::Transaction::Request.new(basic_params(:cc_expiry => sprintf("%02d%02d", month, year))).valid?
142
+ assert EWS::Transaction::Request.new(basic_params(:cc_expiry => sprintf("%02d%02d", month+1, year))).valid?
143
+ assert EWS::Transaction::Request.new(basic_params(:cc_expiry => sprintf("%02d%02d", month, year+1))).valid?
144
+
145
+ # we've chosen 1980 as our cutoff in the past, so check around this date
146
+ assert EWS::Transaction::Request.new(basic_params(:cc_expiry => "1279")).valid? # Dec 2079
147
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "0180")).valid? # Jan 1980
148
+ assert !EWS::Transaction::Request.new(basic_params(:cc_expiry => "0199")).valid? # Jan 1999
149
+ end
150
+ end
@@ -0,0 +1,60 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <TransactionResult>
3
+ <Authorization_Num>ET3434</Authorization_Num>
4
+ <AVS></AVS>
5
+ <Bank_Message>APPROVED</Bank_Message>
6
+ <Bank_Resp_Code>000</Bank_Resp_Code>
7
+ <Bank_Resp_Code_2></Bank_Resp_Code_2>
8
+ <CardHoldersName>Simon Brown Is Not A Really Long Name But This Is</CardHoldersName>
9
+ <Card_Number>nonsense</Card_Number>
10
+ <CAVV></CAVV>
11
+ <CAVV_Algorithm></CAVV_Algorithm>
12
+ <CAVV_Response>0</CAVV_Response>
13
+ <Client_Email></Client_Email>
14
+ <Client_IP></Client_IP>
15
+ <CTR></CTR>
16
+ <Customer_Ref>This Is A Really LONG Customer Reference</Customer_Ref>
17
+ <CVD_Presence_Ind>0</CVD_Presence_Ind>
18
+ <CVV2></CVV2>
19
+ <DollarAmount>10.13</DollarAmount>
20
+ <Ecommerce_Flag>0</Ecommerce_Flag>
21
+ <Error_Description></Error_Description>
22
+ <Error_Number></Error_Number>
23
+ <ExactID>AD0008-01</ExactID>
24
+ <EXact_Message>Transaction Normal</EXact_Message>
25
+ <EXact_Resp_Code>00</EXact_Resp_Code>
26
+ <Expiry_Date>0000</Expiry_Date>
27
+ <Language></Language>
28
+ <LogonMessage></LogonMessage>
29
+ <MerchantAddress>4567 8th ave SE.</MerchantAddress>
30
+ <MerchantCity>Calgary</MerchantCity>
31
+ <MerchantCountry>United States</MerchantCountry>
32
+ <MerchantName>Paymentech Goods Buy and Sell(Calgary) 5300003</MerchantName>
33
+ <MerchantPostal>V6B 2K4</MerchantPostal>
34
+ <MerchantProvince>Alabama</MerchantProvince>
35
+ <MerchantURL></MerchantURL>
36
+ <PAN></PAN>
37
+ <Password></Password>
38
+ <Reference_3></Reference_3>
39
+ <Reference_No>987987</Reference_No>
40
+ <Retrieval_Ref_No>07203434</Retrieval_Ref_No>
41
+ <Secure_AuthRequired></Secure_AuthRequired>
42
+ <Secure_AuthResult></Secure_AuthResult>
43
+ <SequenceNo>258</SequenceNo>
44
+ <SurchargeAmount></SurchargeAmount>
45
+ <Tax1Amount></Tax1Amount>
46
+ <Tax1Number></Tax1Number>
47
+ <Tax2Amount></Tax2Amount>
48
+ <Tax2Number></Tax2Number>
49
+ <Track1></Track1>
50
+ <Track2></Track2>
51
+ <Transaction_Approved>true</Transaction_Approved>
52
+ <Transaction_Error></Transaction_Error>
53
+ <Transaction_Tag>2516</Transaction_Tag>
54
+ <Transaction_Type>00</Transaction_Type>
55
+ <User_Name></User_Name>
56
+ <VerificationStr1></VerificationStr1>
57
+ <VerificationStr2></VerificationStr2>
58
+ <XID></XID>
59
+ <ZipCode></ZipCode>
60
+ </TransactionResult>