LitleOnline 8.13.2 → 8.16.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.
@@ -23,6 +23,8 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
23
  OTHER DEALINGS IN THE SOFTWARE.
24
24
  =end
25
25
 
26
+ require 'logger'
27
+
26
28
  #
27
29
  # Handles round trip of transactions
28
30
  # Maps the request to Litle XML -> Sends XML payload to Litle via HTTP(S) -> formats XML response into a Ruby hash and returns it
@@ -30,20 +32,33 @@ OTHER DEALINGS IN THE SOFTWARE.
30
32
  module LitleOnline
31
33
  class LitleXmlMapper
32
34
  def LitleXmlMapper.request(request_xml, config_hash)
33
-
34
- # create a Litle XML request from the nested hashes
35
- if(config_hash['printxml'])
36
- puts request_xml
37
- end
35
+ logger = initialize_logger(config_hash)
36
+
37
+ logger.debug request_xml
38
38
  # get the Litle Online Response from the API server over HTTP
39
39
  response_xml = Communications.http_post(request_xml,config_hash)
40
- if(config_hash['printxml'])
41
- puts response_xml
42
- end
40
+ logger.debug response_xml
41
+
43
42
  # create response object from xml returned form the Litle API
44
43
  response_object = XMLObject.new(response_xml)
45
44
 
46
45
  return response_object
47
46
  end
47
+
48
+ private
49
+
50
+ def self.initialize_logger(config_hash)
51
+ # Sadly, this needs to be static (the alternative would be to change the LitleXmlMapper.request API
52
+ # to accept a Configuration instance instead of the config_hash)
53
+ Configuration.logger ||= default_logger config_hash['printxml'] ? Logger::DEBUG : Logger::INFO
54
+ end
55
+
56
+ def self.default_logger(level) # :nodoc:
57
+ logger = Logger.new(STDOUT)
58
+ logger.level = level
59
+ # Backward compatible logging format for pre 8.16
60
+ logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
61
+ logger
62
+ end
48
63
  end
49
64
  end
@@ -1102,6 +1102,7 @@ module LitleOnline
1102
1102
  object_node :shipToAddress, "shipToAddress", :class=>Contact, :default_value=>nil
1103
1103
  optional_choice_node :if, 'echeck', :then, (object_node :echeck, "echeck", :class=>Echeck),
1104
1104
  :elsif, 'echeckToken', :then, (object_node :echeckToken, "echeckToken", :class=>EcheckToken)
1105
+ object_node :merchantData, "merchantData", :class=>MerchantData, :default_value=>nil
1105
1106
  end
1106
1107
 
1107
1108
  class EcheckCredit
@@ -1130,6 +1131,7 @@ module LitleOnline
1130
1131
  text_node :litleTxnId, "litleTxnId", :default_value=>nil
1131
1132
  optional_choice_node :if, 'echeck', :then, (object_node :echeck, "echeck", :class=>Echeck, :default_value=>nil),
1132
1133
  :elsif, 'echeckToken', :then, (object_node :echeckToken, "echeckToken", :class=>EcheckToken, :default_value=>nil)
1134
+ object_node :merchantData, "merchantData", :class=>MerchantData, :default_value=>nil
1133
1135
  end
1134
1136
 
1135
1137
  class EcheckSale
@@ -1151,13 +1153,26 @@ module LitleOnline
1151
1153
  object_node :merchantData, "merchantData", :class=>MerchantData, :default_value=>nil
1152
1154
  end
1153
1155
 
1156
+ class UpdateCardValidationNumOnToken
1157
+ include XML::Mapping
1158
+ text_node :reportGroup, "@reportGroup", :default_value=>nil
1159
+ text_node :transactionId, "@id", :default_value=>nil
1160
+ text_node :customerId, "@customerId", :default_value=>nil
1161
+
1162
+ text_node :orderId, "orderId", :default_value=>nil
1163
+ text_node :litleToken, "litleToken", :default_value=>nil
1164
+ text_node :cardValidationNum, "cardValidationNum", :default_value=>nil
1165
+ end
1166
+
1167
+
1154
1168
  class OnlineRequest
1155
1169
  include XML::Mapping
1156
1170
  root_element_name "litleOnlineRequest"
1157
1171
  text_node :merchantId, "@merchantId", :default_value=>nil
1158
1172
  text_node :version, "@version", :default_value=>nil
1159
1173
  text_node :xmlns, "@xmlns", :default_value=>nil
1160
- text_node :merchantSdk, "@merchantSdk", :default_vaule=>nil
1174
+ text_node :merchantSdk, "@merchantSdk", :default_value=>nil
1175
+ text_node :loggedInUser, "@loggedInUser", :default_value=>nil
1161
1176
  object_node :authentication, "authentication", :class=>Authentication
1162
1177
  optional_choice_node :if, 'authorization', :then, (object_node :authorization, "authorization", :class=>Authorization),
1163
1178
  :elsif, 'sale', :then, (object_node :sale, "sale", :class=>Sale),
@@ -1172,7 +1187,8 @@ module LitleOnline
1172
1187
  :elsif, 'echeckSale', :then, (object_node :echeckSale, "echeckSale", :class=>EcheckSale),
1173
1188
  :elsif, 'echeckVoid', :then, (object_node :echeckVoid, "echeckVoid", :class=>EcheckVoid),
1174
1189
  :elsif, 'echeckVerification', :then, (object_node :echeckVerification, "echeckVerification", :class=>EcheckVerification),
1175
- :elsif, 'registerTokenRequest', :then, (object_node :registerTokenRequest, "registerTokenRequest", :class=>RegisterTokenRequest)
1190
+ :elsif, 'registerTokenRequest', :then, (object_node :registerTokenRequest, "registerTokenRequest", :class=>RegisterTokenRequest),
1191
+ :elsif, 'updateCardValidationNumOnToken', :then, (object_node :updateCardValidationNumOnToken, "updateCardValidationNumOnToken", :class=>UpdateCardValidationNumOnToken)
1176
1192
  def post_save(xml, options={:Mapping=>:_default})
1177
1193
  xml.each_element() {|el|
1178
1194
  if(el.name == 'captureTxn')
@@ -216,6 +216,22 @@ module LitleOnline
216
216
  response = LitleOnlineRequest.new.authorization(start_hash.merge({'customerInfo'=>{'ssn'=>'000112222'} }))
217
217
  assert_equal('000', response.authorizationResponse.response)
218
218
  end
219
+
220
+ def test_simple_auth_with_paypage
221
+ hash = {
222
+ 'orderId'=>'12344',
223
+ 'amount'=>'106',
224
+ 'orderSource'=>'ecommerce',
225
+ 'paypage'=>{
226
+ 'type'=>'VI',
227
+ 'paypageRegistrationId' =>'QU1pTFZnV2NGQWZrZzRKeTNVR0lzejB1K2Q5VDdWMTVqb2J5WFJ2Snh4U0U4eTBxaFg2cEVWaDBWSlhtMVZTTw==',
228
+ 'expDate' =>'1210',
229
+ 'cardValidationNum' => '123'
230
+ }
231
+ }
232
+ response= LitleOnlineRequest.new.authorization(hash)
233
+ assert_equal('000', response.authorizationResponse.response)
234
+ end
219
235
 
220
236
  end
221
237
  end
@@ -45,10 +45,11 @@ module LitleOnline
45
45
  'version'=>'8.8',
46
46
  'reportGroup'=>'Planets',
47
47
  'orderId'=>'12344',
48
- 'paypageRegistrationId'=>'1233456789101112'
48
+ 'paypageRegistrationId'=>'QU1pTFZnV2NGQWZrZzRKeTNVR0lzejB1K2Q5VDdWMTVqb2J5WFJ2Snh4U0U4eTBxaFg2cEVWaDBWSlhtMVZTTw=='
49
49
  }
50
50
  response= LitleOnlineRequest.new.register_token_request(hash)
51
51
  assert_equal('Valid Format', response.message)
52
+ assert_equal('1111222233334444', response.registerTokenResponse.litleToken)
52
53
  end
53
54
 
54
55
  def test_simple_token_echeck
@@ -0,0 +1,43 @@
1
+ =begin
2
+ Copyright (c) 2012 Litle & Co.
3
+
4
+ Permission is hereby granted, free of charge, to any person
5
+ obtaining a copy of this software and associated documentation
6
+ files (the "Software"), to deal in the Software without
7
+ restriction, including without limitation the rights to use,
8
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the
10
+ Software is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
+ OTHER DEALINGS IN THE SOFTWARE.
24
+ =end
25
+ require 'lib/LitleOnline'
26
+ require 'test/unit'
27
+
28
+ module LitleOnline
29
+ class TestUpdateCardValidationNumOnToken < Test::Unit::TestCase
30
+ def test_simple
31
+ hash = {
32
+ 'merchantId' => '101',
33
+ 'version'=>'8.8',
34
+ 'reportGroup'=>'Planets',
35
+ 'orderId'=>'12344',
36
+ 'litleToken'=>'1233456789103801',
37
+ 'cardValidationNum'=>'123'
38
+ }
39
+ response= LitleOnlineRequest.new.update_card_validation_num_on_token(hash)
40
+ assert_equal('Valid Format', response.message)
41
+ end
42
+ end
43
+ end
@@ -40,3 +40,4 @@ require_relative 'test_echeckSale'
40
40
  require_relative 'test_echeckCredit'
41
41
  require_relative 'test_echeckVerification'
42
42
  require_relative 'test_echeckVoid'
43
+ require_relative 'test_updateCardValidationNumOnToken'
@@ -244,9 +244,101 @@ module LitleOnline
244
244
  #Explicit - used for integrations
245
245
  assert_equal 'ActiveMerchant;3.2', litle.send(:get_merchant_sdk, {'merchantSdk'=>'ActiveMerchant;3.2'})
246
246
  #Implicit - used raw when nothing is specified
247
- assert_equal 'Ruby;8.13.2', litle.send(:get_merchant_sdk, {'NotMerchantSdk'=>'ActiveMerchant;3.2'})
247
+ assert_equal 'Ruby;8.16.0', litle.send(:get_merchant_sdk, {'NotMerchantSdk'=>'ActiveMerchant;3.2'})
248
248
  end
249
249
 
250
+ def test_sale_paypal_order_complete_typo
251
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
252
+ hash={
253
+ 'reportGroup'=>'Planets',
254
+ 'id' => '006',
255
+ 'orderId'=>'12344',
256
+ 'amount'=>'106',
257
+ 'orderSource'=>'ecommerce',
258
+ 'payPalOrderComplete'=>'true',
259
+ 'card'=>{
260
+ 'type'=>'VI',
261
+ 'number' =>'4100000000000001',
262
+ 'expDate' =>'1210'
263
+ }}
264
+
265
+ Communications.expects(:http_post).with(regexp_matches(/<litleOnlineRequest.*<sale.*<payPalOrderComplete>true<\/payPalOrderComplete>.*/m),kind_of(Hash))
266
+ XMLObject.expects(:new)
267
+
268
+ response = LitleOnlineRequest.new.sale(hash)
269
+ end
270
+
271
+ def test_version_matches_sdk_major_and_minor_version_ignoring_config
272
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
273
+ hash={
274
+ 'litleTxnId' => '006'
275
+ }
276
+
277
+ Communications.expects(:http_post).with(regexp_matches(/<litleOnlineRequest.*version="8\.16".*/m),kind_of(Hash))
278
+ XMLObject.expects(:new)
279
+
280
+ response = LitleOnlineRequest.new.void(hash)
281
+ end
250
282
 
283
+ def test_void_response_contains_recycling
284
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
285
+ hash={
286
+ 'litleTxnId' => '123'
287
+ }
288
+
289
+ Communications.expects(:http_post).with(kind_of(String),kind_of(Hash)).returns('<litleOnlineResponse><voidResponse><recycling><creditLitleTxnId>65</creditLitleTxnId></recycling></voidResponse></litleOnlineResponse>')
290
+
291
+ response = LitleOnlineRequest.new.void(hash)
292
+ assert_equal '65', response.voidResponse.recycling.creditLitleTxnId
293
+ end
294
+
295
+ def test_printxml_can_be_turned_on_by_setting_value_to_true
296
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10','printxml'=>true})
297
+ Communications.expects(:http_post).with(kind_of(String),kind_of(Hash)).returns('<litleOnlineResponse><voidResponse><recycling><creditLitleTxnId>65</creditLitleTxnId></recycling></voidResponse></litleOnlineResponse>')
298
+ Logger.any_instance.expects(:debug).with(kind_of(String)).twice
299
+ hash={
300
+ 'litleTxnId' => '123'
301
+ }
302
+
303
+ response = LitleOnlineRequest.new.void(hash)
304
+ logger = Logger.new(STDOUT)
305
+ logger.level = Logger::DEBUG
306
+ assert_equal logger.level, Configuration.logger.level
307
+ assert_equal logger.sev_threshold, Configuration.logger.sev_threshold
308
+ LitleOnline::Configuration.logger = nil
309
+ end
310
+
311
+ def test_printxml_can_be_turned_off_by_setting_value_to_false
312
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10','printxml'=>false})
313
+ Communications.expects(:http_post).with(kind_of(String),kind_of(Hash)).returns('<litleOnlineResponse><voidResponse><recycling><creditLitleTxnId>65</creditLitleTxnId></recycling></voidResponse></litleOnlineResponse>')
314
+ Logger.any_instance.expects(:debug).with(kind_of(String)).twice
315
+ hash={
316
+ 'litleTxnId' => '123'
317
+ }
318
+
319
+ response = LitleOnlineRequest.new.void(hash)
320
+ logger = Logger.new(STDOUT)
321
+ logger.level = Logger::INFO
322
+ assert_equal logger.level, Configuration.logger.level
323
+ assert_equal logger.sev_threshold, Configuration.logger.sev_threshold
324
+ LitleOnline::Configuration.logger = nil
325
+ end
326
+
327
+ def test_printxml_can_be_turned_off_by_not_setting_value
328
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
329
+ Communications.expects(:http_post).with(kind_of(String),kind_of(Hash)).returns('<litleOnlineResponse><voidResponse><recycling><creditLitleTxnId>65</creditLitleTxnId></recycling></voidResponse></litleOnlineResponse>')
330
+ Logger.any_instance.expects(:debug).with(kind_of(String)).twice
331
+ hash={
332
+ 'litleTxnId' => '123'
333
+ }
334
+
335
+ response = LitleOnlineRequest.new.void(hash)
336
+ logger = Logger.new(STDOUT)
337
+ logger.level = Logger::INFO
338
+ assert_equal logger.level, Configuration.logger.level
339
+ assert_equal logger.sev_threshold, Configuration.logger.sev_threshold
340
+ LitleOnline::Configuration.logger = nil
341
+ end
342
+
251
343
  end
252
344
  end
@@ -266,6 +266,20 @@ module LitleOnline
266
266
  Communications.expects(:http_post).with(regexp_matches(/.*<authentication.*?<password>TEST<\/password>.*?<\/authentication>.*/m),kind_of(Hash))
267
267
  LitleOnlineRequest.new.authorization(hash)
268
268
  end
269
+
270
+ def test_logged_in_user
271
+ hash = {
272
+ 'merchantSdk' => 'Ruby;8.14.0',
273
+ 'merchantId' => '101',
274
+ 'version'=>'8.8',
275
+ 'reportGroup'=>'Planets',
276
+ 'litleTxnId'=>'123456',
277
+ 'loggedInUser'=>'gdake'
278
+ }
279
+
280
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*loggedInUser="gdake".*merchantSdk="Ruby;8.14.0".*/m), is_a(Hash))
281
+ LitleOnlineRequest.new.authorization(hash)
282
+ end
269
283
 
270
284
  end
271
285
 
@@ -40,7 +40,20 @@ module LitleOnline
40
40
  }
41
41
  LitleXmlMapper.expects(:request).with(regexp_matches(/.*<litleTxnId>12345678000<\/litleTxnId>.*/m), is_a(Hash))
42
42
  LitleOnlineRequest.new.auth_reversal(hash)
43
-
43
+ end
44
+
45
+ def test_logged_in_user
46
+ hash = {
47
+ 'merchantSdk' => 'Ruby;8.14.0',
48
+ 'merchantId' => '101',
49
+ 'version'=>'8.8',
50
+ 'litleTxnId'=>'12345678000',
51
+ 'reportGroup'=>'Planets',
52
+ 'amount'=>'5000',
53
+ 'loggedInUser'=>'gdake'
54
+ }
55
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*loggedInUser="gdake".*merchantSdk="Ruby;8.14.0".*/m), is_a(Hash))
56
+ LitleOnlineRequest.new.auth_reversal(hash)
44
57
  end
45
58
  end
46
59
  end
@@ -35,6 +35,16 @@ module LitleOnline
35
35
  LitleXmlMapper.expects(:request).with(regexp_matches(/.*<litleTxnId>123456<\/litleTxnId>.*/m), is_a(Hash))
36
36
  LitleOnlineRequest.new.capture(hash)
37
37
  end
38
+ def test_logged_in_user
39
+ hash = {
40
+ 'merchantSdk' => 'Ruby;8.14.0',
41
+ 'litleTxnId'=>'123456',
42
+ 'loggedInUser'=>'gdake'
43
+ }
44
+
45
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*loggedInUser="gdake".*merchantSdk="Ruby;8.14.0".*/m), is_a(Hash))
46
+ LitleOnlineRequest.new.capture(hash)
47
+ end
38
48
  end
39
49
  end
40
50
 
@@ -87,6 +87,29 @@ module LitleOnline
87
87
  exception = assert_raise(RuntimeError){LitleOnlineRequest.new.capture_given_auth(hash)}
88
88
  assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
89
89
  end
90
+
91
+ def test_logged_in_user
92
+ hash = {
93
+ 'loggedInUser' => 'gdake',
94
+ 'merchantSdk' => 'Ruby;8.14.0',
95
+ 'merchantId' => '101',
96
+ 'version'=>'8.8',
97
+ 'reportGroup'=>'Planets',
98
+ 'orderId'=>'12344',
99
+ 'amount'=>'106',
100
+ 'orderSource'=>'ecommerce',
101
+ 'authInformation' => {
102
+ 'authDate'=>'2002-10-09','authCode'=>'543216',
103
+ 'authAmount'=>'12345'
104
+ },
105
+ 'card'=>{
106
+ 'type'=>'VI',
107
+ 'number' =>'4100000000000001',
108
+ 'expDate' =>'1210'
109
+ }}
110
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*loggedInUser="gdake".*merchantSdk="Ruby;8.14.0".*/m), is_a(Hash))
111
+ LitleOnlineRequest.new.capture_given_auth(hash)
112
+ end
90
113
  end
91
114
 
92
115
  end
@@ -226,5 +226,21 @@ module LitleOnline
226
226
  exception = assert_raise(RuntimeError){LitleOnlineRequest.new.credit(hash)}
227
227
  assert_match /If paypage is specified, it must have a paypageRegistrationId/, exception.message
228
228
  end
229
+
230
+ def test_logged_in_user
231
+ hash = {
232
+ 'loggedInUser' => 'gdake',
233
+ 'merchantSdk' => 'Ruby;8.14.0',
234
+ 'merchantId' => '101',
235
+ 'version'=>'8.12',
236
+ 'orderId'=>'1',
237
+ 'amount'=>'2',
238
+ 'orderSource'=>'ecommerce',
239
+ 'reportGroup'=>'Planets'
240
+ }
241
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*loggedInUser="gdake".*merchantSdk="Ruby;8.14.0".*/m), is_a(Hash))
242
+ LitleOnlineRequest.new.credit(hash)
243
+ end
244
+
229
245
  end
230
246
  end
@@ -39,6 +39,20 @@ module LitleOnline
39
39
  exception = assert_raise(RuntimeError){LitleOnlineRequest.new.echeck_credit(hash)}
40
40
  assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
41
41
  end
42
+
43
+ def test_logged_in_user
44
+ hash = {
45
+ 'loggedInUser' => 'gdake',
46
+ 'merchantSdk' => 'Ruby;8.14.0',
47
+ 'merchantId' => '101',
48
+ 'version'=>'8.8',
49
+ 'reportGroup'=>'Planets',
50
+ 'litleTxnId'=>'123456',
51
+ 'echeck' => {'accType'=>'Checking','accNum'=>'12345657890','routingNum'=>'123456789','checkNum'=>'123455'}
52
+ }
53
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*loggedInUser="gdake".*merchantSdk="Ruby;8.14.0".*/m), is_a(Hash))
54
+ LitleOnlineRequest.new.echeck_credit(hash)
55
+ end
42
56
 
43
57
  end
44
58
  end
@@ -63,5 +63,32 @@ module LitleOnline
63
63
  exception = assert_raise(RuntimeError) {LitleOnlineRequest.new.echeck_redeposit(hash)}
64
64
  assert_match /If echeckToken is specified, it must have a routingNum/, exception.message
65
65
  end
66
+
67
+ def test_logged_in_user
68
+ hash = {
69
+ 'loggedInUser' => 'gdake',
70
+ 'merchantSdk' => 'Ruby;8.14.0',
71
+ 'merchantId' => '101',
72
+ 'version'=>'8.8',
73
+ 'reportGroup'=>'Planets',
74
+ 'litleTxnId'=>'123456',
75
+ 'echeck' => {'accType'=>'Checking','accNum'=>'12345657890','routingNum'=>'123456789','checkNum'=>'123455'}
76
+ }
77
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*loggedInUser="gdake".*merchantSdk="Ruby;8.14.0".*/m), is_a(Hash))
78
+ LitleOnlineRequest.new.echeck_redeposit(hash)
79
+ end
80
+
81
+ def test_merchant_data
82
+ hash = {
83
+ 'merchantData' => {'campaign'=>'camping'},
84
+ 'merchantId' => '101',
85
+ 'version'=>'8.8',
86
+ 'reportGroup'=>'Planets',
87
+ 'litleTxnId'=>'123456',
88
+ 'echeck' => {'accType'=>'Checking','accNum'=>'12345657890','routingNum'=>'123456789','checkNum'=>'123455'}
89
+ }
90
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<\/echeck>.*<merchantData>.*<campaign>camping<\/campaign>.*<\/merchantData>/m), is_a(Hash))
91
+ LitleOnlineRequest.new.echeck_redeposit(hash)
92
+ end
66
93
  end
67
94
  end