paytrace 0.1.23 → 1.0.0

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/paytrace/address.rb +2 -0
  3. data/lib/paytrace/api/gateway.rb +19 -4
  4. data/lib/paytrace/api/request.rb +72 -28
  5. data/lib/paytrace/api/response.rb +19 -11
  6. data/lib/paytrace/batch_operations.rb +8 -30
  7. data/lib/paytrace/check_transaction.rb +119 -84
  8. data/lib/paytrace/configuration.rb +2 -0
  9. data/lib/paytrace/customer.rb +95 -97
  10. data/lib/paytrace/debug.rb +36 -0
  11. data/lib/paytrace/email_receipt_request.rb +4 -28
  12. data/lib/paytrace/recurring_transaction.rb +20 -67
  13. data/lib/paytrace/transaction.rb +680 -267
  14. data/lib/paytrace/version.rb +1 -1
  15. data/lib/paytrace.rb +0 -4
  16. data/paytrace.gemspec +1 -0
  17. data/run_all_integrations.sh +15 -0
  18. data/test/paytrace/api/gateway_spec.rb +8 -0
  19. data/test/paytrace/api/request_spec.rb +84 -28
  20. data/test/paytrace/api/response_spec.rb +2 -2
  21. data/test/paytrace/batch_operations_spec.rb +5 -5
  22. data/test/paytrace/{check_transactions_spec.rb → check_transaction_spec.rb} +40 -19
  23. data/test/paytrace/customer_spec.rb +86 -110
  24. data/test/paytrace/email_receipt_request_spec.rb +9 -8
  25. data/test/paytrace/level3_data_spec.rb +28 -2
  26. data/test/paytrace/recurring_transaction_spec.rb +8 -16
  27. data/test/paytrace/transaction_spec.rb +300 -330
  28. data/test/scripts/run_adjust_amount.rb +1 -1
  29. data/test/scripts/run_attach_signature.rb +2 -2
  30. data/test/scripts/run_calculate_shipping_costs.rb +2 -3
  31. data/test/scripts/run_change_password.rb +2 -0
  32. data/test/scripts/run_check_transactions.rb +2 -3
  33. data/test/scripts/run_create_customer.rb +16 -23
  34. data/test/scripts/run_email_request.rb +3 -5
  35. data/test/scripts/run_export_batches.rb +6 -3
  36. data/test/scripts/run_export_customers.rb +1 -1
  37. data/test/scripts/run_export_transactions.rb +2 -2
  38. data/test/scripts/run_level3_data.rb +1 -1
  39. data/test/scripts/run_recur_payments_integration.rb +24 -32
  40. data/test/scripts/run_settle_transaction.rb +2 -2
  41. data/test/test_helper.rb +12 -1
  42. metadata +19 -7
  43. data/lib/paytrace/credit_card.rb +0 -32
  44. data/test/paytrace/credit_card_spec.rb +0 -26
@@ -1,51 +1,83 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '../../test_helper.rb')
2
2
 
3
3
  describe PayTrace::Transaction do
4
- def base_url
5
- "UN~#{PayTrace.configuration.user_name}|PSWD~#{PayTrace.configuration.password}|TERMS~Y|"
6
- end
7
-
8
4
  before do
9
5
  PayTrace::API::Gateway.debug = true
10
6
  PayTrace::API::Gateway.reset_trace()
11
7
  PayTrace::API::Gateway.next_response = "RESPONSE~ok|"
12
8
  end
13
9
 
14
- it "exports transaction(s)" do
15
- PayTrace::API::Gateway.next_response = "TRANSACTIONRECORD~TRANXID=1143"
16
- records = PayTrace::Transaction.export({transaction_id: 1143})
17
- records.must_be_instance_of Array
18
- records.count.must_equal 1
19
- records[0].must_be_instance_of Hash
20
- records[0]["TRANXID"].must_equal "1143"
10
+ describe "export transactions" do
11
+ it "exports transaction(s)" do
12
+ PayTrace::API::Gateway.next_response = "TRANSACTIONRECORD~TRANXID=1143"
13
+ records = PayTrace::Transaction.export_by_id({transaction_id: 1143})
14
+ records.must_be_instance_of Array
15
+ records.count.must_equal 1
16
+ records[0].must_be_instance_of Hash
17
+ records[0]["TRANXID"].must_equal "1143"
18
+
19
+ assert_last_request_equals "METHOD~ExportTranx|TRANXID~1143|"
20
+ end
21
+
22
+ it "it can export transactions by date range" do
23
+ PayTrace::API::Gateway.next_response = "TRANSACTIONRECORD~TRANXID=1144|TRANSACTIONRECORD~TRANXID=1145|"
24
+
25
+ params = {
26
+ start_date: '01/02/2013',
27
+ end_date: '01/03/2014',
28
+ transaction_type: 'SETTLED',
29
+ customer_id: 1234,
30
+ transaction_user: 'DDuck',
31
+ return_bin: 'Y',
32
+ search_text: 'search text'
33
+ }
34
+
35
+ records = PayTrace::Transaction.export_by_date_range(params)
36
+ records.must_be_instance_of Array
37
+ records.count.must_equal 2
38
+ records[0].must_be_instance_of Hash
39
+ records[0]["TRANXID"].must_equal "1144"
40
+
41
+ assert_last_request_equals "METHOD~ExportTranx|SDATE~01/02/2013|EDATE~01/03/2014|TRANXTYPE~SETTLED|CUSTID~1234|USER~DDuck|RETURNBIN~Y|SEARCHTEXT~search text|"
42
+ end
21
43
  end
22
44
 
23
- it "successfully attaches base-64 encoded signatures to transactions" do
45
+ describe "settle transactions" do
46
+ it "can settle transactions" do
47
+ PayTrace::Transaction.settle_transactions()
48
+
49
+ assert_last_request_equals "METHOD~SettleTranx|"
50
+ end
51
+ end
52
+
53
+ it "successfully attaches image files to transactions as signatures" do
24
54
  PayTrace::API::Gateway.next_response = "RESPONSE~172. The signature image was successfully attached to Transaction ID 13192003.|"
25
- result = PayTrace::Transaction.attach_signature({transaction_id: 13192003, image_data: "foo", image_type: "png"})
55
+ result = PayTrace::Transaction.attach_signature_file({transaction_id: 13192003, image_file: __FILE__, image_type: "png"})
26
56
  result.has_errors?.must_equal false
27
57
  end
28
58
 
29
- it "successfully attaches image files to transactions" do
59
+ it "successfully attaches image data to transactions as signatures" do
30
60
  PayTrace::API::Gateway.next_response = "RESPONSE~172. The signature image was successfully attached to Transaction ID 13192003.|"
31
- result = PayTrace::Transaction.attach_signature({transaction_id: 13192003, image_file: __FILE__, image_type: "png"})
61
+ result = PayTrace::Transaction.attach_signature_data({transaction_id: 13192003, image_data: "fakebase64data", image_type: "png"})
32
62
  result.has_errors?.must_equal false
63
+
64
+ assert_last_request_equals "METHOD~AttachSignature|TRANXID~13192003|IMAGEDATA~fakebase64data|IMAGETYPE~png"
33
65
  end
34
66
 
35
67
  it "calculates shipping costs" do
36
68
  PayTrace::API::Gateway.next_response = "SHIPPINGRECORD~SHIPPINGCOMPANY=USPS+SHIPPINGMETHOD=STANDARD POST+SHIPPINGRATE=12.72|"
37
69
  params = {
38
- #UN, PSWD, TERMS, METHOD, SOURCEZIP, SOURCESTATE, SZIP, WEIGHT, SHIPPERS, SSTATE
39
70
  source_zip: 98133,
40
71
  source_state: "WA",
41
72
  shipping_postal_code: 94947,
42
73
  shipping_weight: 5.1,
43
74
  shippers: "UPS,USPS,FEDEX",
44
- shipping_state: "CA",
45
- shipping_country: "US"
75
+ shipping_state: "CA"
46
76
  }
47
77
  result = PayTrace::Transaction.calculate_shipping(params)
48
78
  result[0]['SHIPPINGCOMPANY'].must_equal "USPS"
79
+
80
+ assert_last_request_equals "METHOD~CalculateShipping|SOURCEZIP~98133|SOURCESTATE~WA|SZIP~94947|WEIGHT~5.1|SHIPPERS~UPS,USPS,FEDEX|SSTATE~CA|"
49
81
  end
50
82
 
51
83
  it "can adjust a transaction" do
@@ -55,370 +87,308 @@ describe PayTrace::Transaction do
55
87
  amount: 9.87
56
88
  }
57
89
  result = PayTrace::Transaction.adjust_amount(params)
58
- PayTrace::API::Gateway.last_request.must_equal base_url + "METHOD~AdjustAmount|TRANXID~1234|AMOUNT~9.87|"
90
+ assert_last_request_equals "METHOD~AdjustAmount|TRANXID~1234|AMOUNT~9.87|"
59
91
  end
60
92
 
61
93
  describe "create sales transactions" do
62
- it "can create a Payment Authorization" do
63
- t = PayTrace::Transaction.authorization(
64
- { amount:"1242.32",
65
- credit_card: {
66
- card_number:"1234123412341234",
67
- expiration_month:10,
68
- expiration_year:24
69
- }
70
- }
71
- )
94
+ it "can create a payment authorization for a keyed credit card" do
95
+ PayTrace::Transaction.keyed_authorization({
96
+ amount:"1242.32",
97
+ card_number:"1234123412341234",
98
+ expiration_month:10,
99
+ expiration_year:24
100
+ })
101
+
102
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Authorization|AMOUNT~1242.32|CC~1234123412341234|EXPMNTH~10|EXPYR~24|"
103
+ end
72
104
 
105
+ it "can create a payment authorization based upon a customer ID" do
106
+ PayTrace::Transaction.customer_id_authorization({
107
+ amount:"1242.32",
108
+ customer_id: 1234
109
+ })
73
110
 
74
- #Transaction is properly configured
75
- t.amount.must_equal "1242.32"
76
- t.type.must_equal PayTrace::TransactionTypes::Authorization
111
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Authorization|AMOUNT~1242.32|CUSTID~1234|"
112
+ end
113
+
114
+ it "can charge sales to a swiped credit card" do
115
+ PayTrace::Transaction.swiped_sale({
116
+ amount: "1242.32",
117
+ swipe: "this is fake swipe data"
118
+ })
77
119
 
78
- #Sets up a card
79
- t.credit_card.card_number.must_equal "1234123412341234"
80
- t.credit_card.expiration_month.must_equal 10
81
- t.credit_card.expiration_year.must_equal 24
120
+ assert_last_request_equals "METHOD~PROCESSTRANX|AMOUNT~1242.32|TRANXTYPE~SALE|SWIPE~this is fake swipe data|"
82
121
  end
83
122
 
84
- it "can charge sales to a credit card" do
85
- t = PayTrace::Transaction.sale(
86
- {amount: "1242.32",
87
- credit_card: {
88
- card_number: "1234123412341234",
89
- expiration_month: 10,
90
- expiration_year: 24
91
- }
92
- })
93
-
94
- #Transaction is properly configured
95
- t.amount.must_equal "1242.32"
96
- t.type.must_equal PayTrace::TransactionTypes::SALE
97
-
98
- #Sets up a card
99
- t.credit_card.card_number.must_equal "1234123412341234"
100
- t.credit_card.expiration_month.must_equal 10
101
- t.credit_card.expiration_year.must_equal 24
123
+ it "can charge sales to a keyed credit card" do
124
+ PayTrace::Transaction.keyed_sale({
125
+ amount: "1242.32",
126
+ card_number: "1234123412341234",
127
+ expiration_month: 10,
128
+ expiration_year: 24
129
+ })
130
+
131
+ assert_last_request_equals "METHOD~PROCESSTRANX|AMOUNT~1242.32|TRANXTYPE~SALE|CC~1234123412341234|EXPMNTH~10|EXPYR~24|"
102
132
  end
103
133
 
104
134
  it "can run a transaction for a customer" do
105
- t = PayTrace::Transaction.sale(
135
+ PayTrace::Transaction.customer_id_sale(
106
136
  {amount: "1.00",
107
- customer: 123456}
137
+ customer_id: 123456}
108
138
  )
109
139
 
110
- t.amount.must_equal "1.00"
111
- t.type.must_equal PayTrace::TransactionTypes::SALE
112
- t.customer.must_equal 123456
113
- t.credit_card.must_be_nil
140
+ assert_last_request_equals "METHOD~PROCESSTRANX|AMOUNT~1.00|TRANXTYPE~SALE|CUSTID~123456|"
114
141
  end
142
+ end
115
143
 
116
- it "can run a cash advance" do
117
-
144
+ describe "cash advance" do
145
+ it "can perform a cash advance for swiped credit card data" do
118
146
  args = {
119
147
  amount:"1.00",
120
148
  cc_last_4:"1234",
121
149
  id_number:"12345",
122
150
  id_expiration:"12/29/2020",
123
- billing_address: {
124
- street: "1234 happy lane",
125
- street2: "apt #1",
126
- city: "Seattle",
127
- state: "WA",
128
- postal_code:"98107",
129
- country:"US"
130
- },
131
- credit_card: {
132
- swipe:'%B5454545454545454^J/SCOTT^2612101001020001000000701000000?;5454545454545454=26121010010270100001?'
151
+ billing_name: "John Doe",
152
+ billing_address: "1234 happy lane",
153
+ billing_address2: "apt #1",
154
+ billing_city: "Seattle",
155
+ billing_state: "WA",
156
+ billing_postal_code:"98107",
157
+ billing_country:"US",
158
+ swipe:'%B5454545454545454^J/SCOTT^2612101001020001000000701000000?;5454545454545454=26121010010270100001?'
133
159
  }
134
- }
135
- t = PayTrace::Transaction.cash_advance(args)
136
-
137
- t.amount.must_equal "1.00"
138
- t.type.must_equal PayTrace::TransactionTypes::SALE
139
- t.credit_card.swipe.must_equal '%B5454545454545454^J/SCOTT^2612101001020001000000701000000?;5454545454545454=26121010010270100001?'
140
- t.optional_fields[:cc_last_4].must_equal "1234"
141
- t.optional_fields[:id_expiration].must_equal "12/29/2020"
142
- t.optional_fields[:id_number].must_equal "12345"
143
-
144
- t.billing_address.street.must_equal "1234 happy lane"
145
- t.response.must_equal @response
146
-
160
+
161
+ PayTrace::Transaction.swiped_cash_advance(args)
162
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~SALE|AMOUNT~1.00|LAST4~1234|PHOTOID~12345|IDEXP~12/29/2020|CASHADVANCE~Y|BNAME~John Doe|BADDRESS~1234 happy lane|BADDRESS2~apt #1|BCITY~Seattle|BSTATE~WA|BZIP~98107|BCOUNTRY~US|SWIPE~%B5454545454545454^J/SCOTT^2612101001020001000000701000000?;5454545454545454=26121010010270100001?"
147
163
  end
148
164
 
149
-
150
- end
151
- describe "adding address info" do
152
- it "can take a shipping address" do
153
- t = PayTrace::Transaction.new({
154
- optional:{
155
- shipping_address: {
156
- name: "Bob Smith",
157
- street: "1234 happy lane",
158
- street2: "suit 234",
159
- city:"Seattle",
160
- state:"WA",
161
- country:"USA",
162
- postal_code:"98107"
163
- }
164
- }
165
- })
166
- s = t.shipping_address
167
- s.name.must_equal "Bob Smith"
168
- s.street.must_equal "1234 happy lane"
169
- s.street2.must_equal "suit 234"
170
- s.city.must_equal "Seattle"
171
- s.state.must_equal "WA"
172
- s.country.must_equal "USA"
173
- s.postal_code.must_equal "98107"
174
-
175
- end
176
- it "can take a billing address" do
177
- t = PayTrace::Transaction.new({
178
- optional: {
179
- billing_address: {
180
- street: "1234 happy lane",
181
- street2: "suit 234",
182
- city:"Seattle",
183
- state:"WA",
184
- country:"USA",
185
- postal_code:"98107"
186
- }
187
- }
188
- })
189
- b = t.billing_address
190
- b.street.must_equal "1234 happy lane"
191
- b.street2.must_equal "suit 234"
192
- b.city.must_equal "Seattle"
193
- b.state.must_equal "WA"
194
- b.country.must_equal "USA"
195
- b.postal_code.must_equal "98107"
165
+ it "can perform a cash advance for keyed-in credit card data" do
166
+ args = {
167
+ amount:"1.00",
168
+ cc_last_4:"1234",
169
+ id_number:"12345",
170
+ id_expiration:"12/29/2020",
171
+ billing_name: "John Doe",
172
+ billing_address: "1234 happy lane",
173
+ billing_address2: "apt #1",
174
+ billing_city: "Seattle",
175
+ billing_state: "WA",
176
+ billing_postal_code:"98107",
177
+ billing_country:"US",
178
+ card_number: 1234123412341234,
179
+ expiration_month: 10,
180
+ expiration_year: 24
181
+ }
182
+
183
+ PayTrace::Transaction.keyed_cash_advance(args)
184
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~SALE|AMOUNT~1.00|LAST4~1234|PHOTOID~12345|IDEXP~12/29/2020|CASHADVANCE~Y|BNAME~John Doe|BADDRESS~1234 happy lane|BADDRESS2~apt #1|BCITY~Seattle|BSTATE~WA|BZIP~98107|BCOUNTRY~US|CC~1234123412341234|EXPMNTH~10|EXPYR~24|"
196
185
  end
197
186
  end
198
187
 
199
- it "can be set to void a transaction" do
200
- t = PayTrace::Transaction.new({optional:{transaction_id:"11"}})
201
- end
188
+ describe "store and forward transactions" do
189
+ it "can perform a store and forward transaction for swiped credit card data" do
190
+ params = {amount: 19.97, swipe: 'this is fake swipe data'}
191
+ PayTrace::Transaction.swiped_store_forward(params)
202
192
 
203
- it "can create and send a void transaction" do
204
- @response = mock()
205
- PayTrace::API::Gateway.any_instance.expects(:send_request).returns(@response)
206
-
207
- t = PayTrace::Transaction.void("111")
208
- t.optional_fields[:transaction_id].must_equal "111"
209
- t.type.must_equal PayTrace::TransactionTypes::Void
210
- end
193
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Str/FWD|AMOUNT~19.97|SWIPE~this is fake swipe data|"
194
+ end
211
195
 
212
- it "can create a forced sale" do
213
- t = PayTrace::Transaction.forced_sale("111",{})
214
-
215
- t.optional_fields[:approval_code].must_equal "111"
216
- t.type.must_equal PayTrace::TransactionTypes::ForcedSale
217
- end
196
+ it "can perform a store and forward transaction for keyed-in credit card data" do
197
+ params = {amount: 19.96, card_number: 1234123412341234, expiration_month: 10, expiration_year: 24}
198
+ PayTrace::Transaction.keyed_store_forward(params)
218
199
 
200
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Str/FWD|AMOUNT~19.96|CC~1234123412341234|EXPMNTH~10|EXPYR~24|"
201
+ end
219
202
 
220
- it "can add a transaction to its param list" do
221
- t = PayTrace::Transaction.new({amount: "23.12",
222
- credit_card: PayTrace::CreditCard.new({
223
- card_number: "1234123412341234",
224
- expiration_year: 24,
225
- expiration_month: 10 }),
226
- type: PayTrace::TransactionTypes::SALE})
227
- r = PayTrace::API::Request.new
228
- t.set_request(r)
229
-
230
- r.params[:card_number].must_equal ["1234123412341234"]
231
- r.params[:expiration_month].must_equal [10]
232
- r.params[:expiration_year].must_equal [24]
233
- r.params[:transaction_type].must_equal ["SALE"]
234
- r.params[:method].must_equal ["PROCESSTRANX"]
235
- r.params[:amount].must_equal ["23.12"]
236
-
237
- url = r.to_parms_string
238
- url.must_equal "UN~#{PayTrace.configuration.user_name}|PSWD~#{PayTrace.configuration.password}|TERMS~Y|CC~1234123412341234|EXPMNTH~10|EXPYR~24|TRANXTYPE~SALE|METHOD~PROCESSTRANX|AMOUNT~23.12|"
239
- end
203
+ it "can perform a store and forward transaction referencing a customer id" do
204
+ params = {amount: 19.96, customer_id: 1234}
205
+ PayTrace::Transaction.customer_id_store_forward(params)
240
206
 
241
- it "can use a customer id for processing the transaction" do
242
- t = PayTrace::Transaction.new({amount: "12.34",
243
- customer: 1234,
244
- type: PayTrace::TransactionTypes::SALE
245
- }
246
- )
247
- r = PayTrace::API::Request.new
248
- t.set_request(r)
249
-
250
- r.params[:customer_id].must_equal [1234]
251
- r.params[:amount].must_equal ["12.34"]
252
-
253
- url = r.to_parms_string
254
-
255
- #Make sure it puts in values we expect
256
- url.must_match /\|CUSTID~1234\|/
257
- url.must_match /\|AMOUNT~12.34\|/
258
- url.must_match /\|METHOD~PROCESSTRANX\|/
259
- url.must_match /\|TRANXTYPE~SALE\|/
260
- end
207
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Str/FWD|AMOUNT~19.96|CUSTID~1234|"
208
+ end
261
209
 
262
- it "can include a billing address" do
263
- t = PayTrace::Transaction.new({
264
- optional:{
265
- billing_address:{
266
- name:"John Doe",
267
- street:"1234 happy lane",
268
- street2:"apt#2",
269
- city:"Seattle",
270
- state:"WA",
271
- country: "US",
272
- postal_code:"98107"
273
- }
274
- }
275
- })
276
-
277
- t.shipping_address.must_be_nil
278
-
279
- r = PayTrace::API::Request.new
280
- t.set_request(r)
281
-
282
- url = r.to_parms_string
283
-
284
- #Make sure it puts in values we expect
285
- url.must_match /\|BNAME~John Doe\|/
286
- url.must_match /\|BADDRESS~1234 happy lane\|/
287
- url.must_match /\|BADDRESS2~apt#2\|/
288
- url.must_match /\|BCITY~Seattle\|/
289
- url.must_match /\|BSTATE~WA\|/
290
- url.must_match /\|BSTATE~WA\|/
291
- url.must_match /\|BCOUNTRY~US\|/
210
+ it "accepts extra parameters" do
211
+ params = {
212
+ amount: 19.96,
213
+ customer_id: 1234,
214
+ billing_name: "John Doe",
215
+ billing_address: "1234 Fake St.",
216
+ billing_address2: "Suite 123",
217
+ billing_city: "Seattle",
218
+ billing_state: "WA",
219
+ billing_postal_code: "98133",
220
+ billing_country: "US",
221
+ shipping_name: "Jim Doe",
222
+ shipping_address: "1235 Fake Ave.",
223
+ shipping_address2: "Suite 345",
224
+ shipping_city: "Shoreline",
225
+ shipping_state: "WA",
226
+ shipping_postal_code: "98134",
227
+ shipping_region: "King County",
228
+ shipping_country: "US",
229
+ email: "support@paytrace.com",
230
+ csc: 993,
231
+ invoice: "fake_invoice",
232
+ description: "fake_description",
233
+ tax_amount: 19.98,
234
+ customer_reference_id: "cust_ref_id",
235
+ discretionary_data: {hair_color: "red"},
236
+ return_clr: "Y",
237
+ custom_dba: "Arcadian Productions",
238
+ enable_partial_authentication: "Y"
239
+ }
240
+ PayTrace::Transaction.customer_id_store_forward(params)
292
241
 
242
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Str/FWD|AMOUNT~19.96|CUSTID~1234|BNAME~John Doe|BADDRESS~1234 Fake St.|BADDRESS2~Suite 123|BCITY~Seattle|BSTATE~WA|BZIP~98133|BCOUNTRY~US|SNAME~Jim Doe|SADDRESS~1235 Fake Ave.|SADDRESS2~Suite 345|SCITY~Shoreline|SSTATE~WA|SZIP~98134|SCOUNTY~King County|SCOUNTRY~US|EMAIL~support@paytrace.com|CSC~993|INVOICE~fake_invoice|DESCRIPTION~fake_description|TAX~19.98|CUSTREF~cust_ref_id|RETURNCLR~Y|CUSTOMDBA~Arcadian Productions|ENABLEPARTIALAUTH~Y|hair_color~red"
243
+ end
293
244
  end
294
245
 
295
- it "can include misc fields as well" do
296
- t = PayTrace::Transaction.new({
297
- optional: {
298
- email:"it@paytrace.com",
299
- description:"This is a test",
300
- tax_amount: "1.00",
301
- return_clr: "Y",
302
- enable_partial_authentication:"Y",
303
- custom_dba:"NewName"
304
- },
305
- discretionary_data: {hair_color: "red"}
306
- })
246
+ describe "refund transactions" do
247
+ it "can create a refund transaction for a swiped credit card" do
248
+ params = {
249
+ amount: 19.99,
250
+ swipe: 'this is fake swipe data'
251
+ }
307
252
 
308
- r = PayTrace::API::Request.new
309
- t.set_request(r)
253
+ PayTrace::Transaction.swiped_refund(params)
254
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Refund|AMOUNT~19.99|SWIPE~this is fake swipe data|"
255
+ end
310
256
 
311
- url = r.to_parms_string
257
+ it "can create a refund transaction for a keyed-in credit card" do
258
+ params = {
259
+ amount: 19.99,
260
+ card_number: 5444444444444444,
261
+ expiration_month: 10,
262
+ expiration_year: 24
263
+ }
312
264
 
313
- url.must_match /\|DESCRIPTION~This is a test\|/
314
- url.must_match /\|TAX~1.00\|/
315
- url.must_match /\|EMAIL~it@paytrace.com\|/
316
- url.must_match /\|RETURNCLR~Y\|/
317
- url.must_match /\|ENABLEPARTIALAUTH~Y\|/
318
- url.must_match /\|hair_color~red\|/
319
- url.must_match /\|CUSTOMDBA~NewName\|/
320
- end
265
+ PayTrace::Transaction.keyed_refund(params)
266
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Refund|AMOUNT~19.99|CC~5444444444444444|EXPMNTH~10|EXPYR~24|"
267
+ end
321
268
 
322
- it "can do a swipe transaction" do
323
- cc = PayTrace::CreditCard.new( {
324
- swipe: '%B4055010000000005^J/SCOTT^1212101001020001000000701000000?;4055010000000005=12121010010270100001?'
325
- })
326
- t = PayTrace::Transaction.new({
327
- amount: '1.00',
328
- credit_card:cc
329
- })
269
+ it "can create a refund transaction for a particular customer ID" do
270
+ params = {
271
+ amount: 19.99,
272
+ customer_id: 1234
273
+ }
330
274
 
331
- r = PayTrace::API::Request.new
332
- t.set_request(r)
275
+ PayTrace::Transaction.customer_id_refund(params)
276
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Refund|AMOUNT~19.99|CUSTID~1234|"
277
+ end
333
278
 
334
- url = r.to_parms_string
279
+ it "can create a refund transaction for a particular transaction ID" do
280
+ params = {
281
+ amount: 19.99,
282
+ transaction_id: 1234
283
+ }
335
284
 
336
- url.must_match /\|AMOUNT~1.00\|/
337
- url.must_match /\|SWIPE~%B4055010000000005/
285
+ PayTrace::Transaction.transaction_id_refund(params)
286
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Refund|AMOUNT~19.99|TRANXID~1234|"
287
+ end
338
288
 
289
+ it "accepts optional data" do
290
+ params = {
291
+ amount: 19.99,
292
+ transaction_id: 1234,
293
+ billing_name: "John Doe",
294
+ billing_address: "1234 Fake St.",
295
+ billing_address2: "Suite 123",
296
+ billing_city: "Seattle",
297
+ billing_state: "WA",
298
+ billing_postal_code: "98133",
299
+ billing_country: "US",
300
+ shipping_name: "Jim Doe",
301
+ shipping_address: "1235 Fake Ave.",
302
+ shipping_address2: "Suite 345",
303
+ shipping_city: "Shoreline",
304
+ shipping_state: "WA",
305
+ shipping_postal_code: "98134",
306
+ shipping_region: "King County",
307
+ shipping_country: "US",
308
+ email: "support@paytrace.com",
309
+ csc: 993,
310
+ invoice: "fake_invoice",
311
+ description: "fake_description",
312
+ tax_amount: 19.98,
313
+ customer_reference_id: "cust_ref_id",
314
+ discretionary_data: {hair_color: "red"}
315
+ }
339
316
 
317
+ PayTrace::Transaction.transaction_id_refund(params)
318
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Refund|AMOUNT~19.99|TRANXID~1234|BNAME~John Doe|BADDRESS~1234 Fake St.|BADDRESS2~Suite 123|BCITY~Seattle|BSTATE~WA|BZIP~98133|BCOUNTRY~US|SNAME~Jim Doe|SADDRESS~1235 Fake Ave.|SADDRESS2~Suite 345|SCITY~Shoreline|SSTATE~WA|SZIP~98134|SCOUNTY~King County|SCOUNTRY~US|EMAIL~support@paytrace.com|CSC~993|INVOICE~fake_invoice|DESCRIPTION~fake_description|TAX~19.98|CUSTREF~cust_ref_id|hair_color~red"
319
+ end
340
320
  end
341
321
 
342
- it "can do a reference sales request " do
343
-
344
- t = PayTrace::Transaction.new({
345
- amount: '1.00',
346
- optional:{transaction_id: '1234'}
347
- })
348
-
349
- r = PayTrace::API::Request.new
350
- t.set_request(r)
351
-
352
- url = r.to_parms_string
322
+ describe "adding address info" do
323
+ it "can take a shipping address" do
324
+ PayTrace::Transaction.customer_id_sale({
325
+ amount: 19.99,
326
+ customer_id: 'MMouse',
327
+ shipping_name: "Joe Blow",
328
+ shipping_address: "1234 happy lane",
329
+ shipping_address2: "suit 234",
330
+ shipping_city:"Seattle",
331
+ shipping_state:"WA",
332
+ shipping_country:"USA",
333
+ shipping_postal_code:"98107"
334
+ })
335
+
336
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~SALE|AMOUNT~19.99|CUSTID~MMouse|SNAME~Joe Blow|SADDRESS~1234 happy lane|SADDRESS2~suit 234|SCITY~Seattle|SSTATE~WA|SCOUNTRY~USA|SZIP~98107|"
337
+ end
353
338
 
354
- url.must_match /\|AMOUNT~1.00\|/
355
- url.must_match /\|TRANXID~1234|/
339
+ it "can take a billing address" do
340
+ PayTrace::Transaction.customer_id_sale({
341
+ amount: 19.99,
342
+ customer_id: 'MMouse',
343
+ billing_name: "Joe Blow",
344
+ billing_address: "1234 happy lane",
345
+ billing_address2: "suit 234",
346
+ billing_city:"Seattle",
347
+ billing_state:"WA",
348
+ billing_country:"USA",
349
+ billing_postal_code:"98107"
350
+ })
351
+
352
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~SALE|AMOUNT~19.99|CUSTID~MMouse|BNAME~Joe Blow|BADDRESS~1234 happy lane|BADDRESS2~suit 234|BCITY~Seattle|BSTATE~WA|BCOUNTRY~USA|BZIP~98107|"
353
+ end
356
354
  end
357
355
 
358
- it "can create an approval code call" do
359
- t = PayTrace::Transaction.new({amount: "23.12",
360
- credit_card: PayTrace::CreditCard.new({
361
- card_number: "1234123412341234",
362
- expiration_year: 24,
363
- expiration_month: 10 }),
364
- type: PayTrace::TransactionTypes::ForcedSale,
365
- optional:{approval_code:'1234'}
366
- })
367
-
368
- r = PayTrace::API::Request.new
369
- t.set_request(r)
370
-
371
- url = r.to_parms_string
372
-
373
- url.must_match /\|APPROVAL~1234\|/
374
- url.must_match /\|TRANXTYPE~Force\|/
375
-
356
+ it "can create and send a void transaction" do
357
+ PayTrace::Transaction.void({transaction_id: "111"})
358
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Void|TRANXID~111|"
376
359
  end
377
360
 
378
- it "can create a new cash_advance sale" do
379
- cc = PayTrace::CreditCard.new( {
380
- swipe: '%B4055010000000005^J/SCOTT^1212101001020001000000701000000?;4055010000000005=12121010010270100001?'
381
- })
382
-
383
- optional = {
384
- billing_address:{
385
- name:"John Doe",
386
- street:"1234 happy lane",
387
- street2:"apt#2",
388
- city:"Seattle",
389
- state:"WA",
390
- country: "US",
391
- postal_code:"98107"
392
- },
393
- id_number: "1234",
394
- id_expiration:"12/20/2020",
395
- cc_last_4: "1234",
396
- cash_advance: "Y"
397
-
398
-
399
- }
400
- t = PayTrace::Transaction.new({
401
- amount: '1.00',
402
- credit_card:cc,
403
- type: PayTrace::TransactionTypes::SALE,
404
- optional:optional
405
- })
406
-
407
- r = PayTrace::API::Request.new
408
- t.set_request(r)
409
-
410
- url = r.to_parms_string
411
-
412
- url.must_match /\|AMOUNT~1.00\|/
413
- url.must_match /\|SWIPE~%B4055010000000005/
414
- url.must_match /\|CASHADVANCE~Y\|/
415
- url.must_match /\|PHOTOID~1234\|/
416
- url.must_match /\|LAST4~1234\|/
417
- url.must_match /\|BADDRESS~1234 happy lane\|/
418
-
419
-
420
-
421
-
361
+ describe "forced sales" do
362
+ it "can create a forced sale for a swiped credit card" do
363
+ PayTrace::Transaction.swiped_forced_sale(amount: 19.99, swipe: "this is some fake swipe data", approval_code: 111)
364
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Force|AMOUNT~19.99|SWIPE~this is some fake swipe data|APPROVAL~111|"
365
+ end
366
+
367
+ it "can create a forced sale for a keyed-in credit card" do
368
+ params = {
369
+ amount: 19.98,
370
+ card_number: 1234123412341234,
371
+ expiration_month: 10,
372
+ expiration_year: 24,
373
+ approval_code: 123
374
+ }
375
+ PayTrace::Transaction.keyed_forced_sale(params)
376
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Force|AMOUNT~19.98|CC~1234123412341234|EXPMNTH~10|EXPYR~24|APPROVAL~123|"
377
+ end
378
+
379
+ it "can create a forced sale for a given customer ID" do
380
+ PayTrace::Transaction.customer_id_forced_sale(amount: 19.99, customer_id: "MMouse", approval_code: 111)
381
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Force|AMOUNT~19.99|CUSTID~MMouse|APPROVAL~111|"
382
+ end
383
+
384
+ it "can create a forced sale for a given transaction ID" do
385
+ PayTrace::Transaction.transaction_id_forced_sale(transaction_id: 1234, approval_code: 111)
386
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Force|TRANXID~1234|APPROVAL~111|"
387
+ end
422
388
  end
423
389
 
390
+ it "can perform a capture transaction" do
391
+ PayTrace::Transaction.capture(transaction_id: 1234)
392
+ assert_last_request_equals "METHOD~PROCESSTRANX|TRANXTYPE~Capture|TRANXID~1234|"
393
+ end
424
394
  end