LitleOnline 8.18.0 → 8.19.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.
@@ -0,0 +1,44 @@
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
+
26
+ require 'lib/LitleOnline'
27
+
28
+ #test driver for running all tests
29
+ require_relative 'test_xmlfields'
30
+ require_relative 'test_sale'
31
+ require_relative 'test_auth'
32
+ require_relative 'test_authReversal'
33
+ require_relative 'test_credit'
34
+ require_relative 'test_token'
35
+ require_relative 'test_forceCapture'
36
+ require_relative 'test_capture'
37
+ require_relative 'test_captureGivenAuth'
38
+ require_relative 'test_echeckRedeposit'
39
+ require_relative 'test_echeckSale'
40
+ require_relative 'test_echeckCredit'
41
+ require_relative 'test_echeckVerification'
42
+ require_relative 'test_echeckVoid'
43
+ require_relative 'test_updateCardValidationNumOnToken'
44
+
@@ -244,7 +244,7 @@ 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.18.0', litle.send(:get_merchant_sdk, {'NotMerchantSdk'=>'ActiveMerchant;3.2'})
247
+ assert_equal 'Ruby;8.19.0', litle.send(:get_merchant_sdk, {'NotMerchantSdk'=>'ActiveMerchant;3.2'})
248
248
  end
249
249
 
250
250
  def test_sale_paypal_order_complete_typo
@@ -274,7 +274,7 @@ module LitleOnline
274
274
  'litleTxnId' => '006'
275
275
  }
276
276
 
277
- Communications.expects(:http_post).with(regexp_matches(/<litleOnlineRequest.*version="8\.18".*/m),kind_of(Hash))
277
+ Communications.expects(:http_post).with(regexp_matches(/<litleOnlineRequest.*version="8\.19".*/m),kind_of(Hash))
278
278
  XMLObject.expects(:new)
279
279
 
280
280
  response = LitleOnlineRequest.new.void(hash)
@@ -293,4 +293,4 @@ module LitleOnline
293
293
  end
294
294
 
295
295
  end
296
- end
296
+ end
@@ -0,0 +1,296 @@
1
+ =begin
2
+ Copyright (c) 2011 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 'lib/LitleOnlineRequest'
27
+ require 'test/unit'
28
+ require 'mocha/setup'
29
+
30
+ module LitleOnline
31
+
32
+ class TestLitleOnlineRequest < Test::Unit::TestCase
33
+ def test_set_merchant_id
34
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}})
35
+ litle = LitleOnlineRequest.new
36
+ assert_equal '2', litle.send(:get_merchant_id, {'merchantId'=>'2'})
37
+ assert_equal '1', litle.send(:get_merchant_id, {'NotMerchantId'=>'2'})
38
+ end
39
+
40
+ def test_simple
41
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
42
+ hash = {
43
+ 'reportGroup'=>'Planets',
44
+ 'orderId'=>'12344',
45
+ 'amount'=>'106',
46
+ 'orderSource'=>'ecommerce',
47
+ 'card'=>{
48
+ 'type'=>'VI',
49
+ 'number' =>'4100000000000001',
50
+ 'expDate' =>'1210'
51
+ }}
52
+
53
+ Communications.expects(:http_post).with(regexp_matches(/<litleOnlineRequest .*/m),kind_of(Hash))
54
+ XMLObject.expects(:new)
55
+
56
+ response = LitleOnlineRequest.new.authorization(hash)
57
+ end
58
+
59
+ def test_authorization_attributes
60
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
61
+ hash={
62
+ 'reportGroup'=>'Planets',
63
+ 'id' => '003',
64
+ 'orderId'=>'12344',
65
+ 'amount'=>'106',
66
+ 'orderSource'=>'ecommerce',
67
+ 'card'=>{
68
+ 'type'=>'VI',
69
+ 'number' =>'4100000000000001',
70
+ 'expDate' =>'1210'
71
+ }}
72
+
73
+ Communications.expects(:http_post).with(regexp_matches(/.*<authorization ((reportGroup="Planets" id="003")|(id="003" reportGroup="Planets")).*/m),kind_of(Hash))
74
+ XMLObject.expects(:new)
75
+
76
+ response = LitleOnlineRequest.new.authorization(hash)
77
+ end
78
+
79
+ def test_authorization_elements
80
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
81
+ hash={
82
+ 'reportGroup'=>'Planets',
83
+ 'id' => '004',
84
+ 'orderId'=>'12344',
85
+ 'amount'=>'106',
86
+ 'orderSource'=>'ecommerce',
87
+ 'card'=>{
88
+ 'type'=>'VI',
89
+ 'number' =>'4100000000000001',
90
+ 'expDate' =>'1210'
91
+ }}
92
+
93
+ Communications.expects(:http_post).with(regexp_matches(/.*<authorization.*<orderId>12344.*<amount>106.*<orderSource>ecommerce.*/m),kind_of(Hash))
94
+ XMLObject.expects(:new)
95
+
96
+ response = LitleOnlineRequest.new.authorization(hash)
97
+ end
98
+
99
+ def test_authorization_card_field
100
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
101
+ hash={
102
+ 'reportGroup'=>'Planets',
103
+ 'id' => '005',
104
+ 'orderId'=>'12344',
105
+ 'amount'=>'106',
106
+ 'orderSource'=>'ecommerce',
107
+ 'card'=>{
108
+ 'type'=>'VI',
109
+ 'number' =>'4100000000000001',
110
+ 'expDate' =>'1210'
111
+ }}
112
+
113
+ Communications.expects(:http_post).with(regexp_matches(/.*<authorization.*<card>.*<number>4100000000000001.*<expDate>1210.*/m),kind_of(Hash))
114
+ XMLObject.expects(:new)
115
+
116
+ response = LitleOnlineRequest.new.authorization(hash)
117
+ end
118
+
119
+ def test_sale_card_field
120
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
121
+ hash = {
122
+ 'reportGroup'=>'Planets',
123
+ 'id' => '006',
124
+ 'orderId'=>'12344',
125
+ 'amount'=>'106',
126
+ 'orderSource'=>'ecommerce',
127
+ 'card'=>{
128
+ 'type'=>'VI',
129
+ 'number' =>'4100000000000001',
130
+ 'expDate' =>'1210'
131
+ }}
132
+
133
+ Communications.expects(:http_post).with(regexp_matches(/<litleOnlineRequest.*<sale.*<card>.*<number>4100000000000001.*<expDate>1210.*/m),kind_of(Hash))
134
+ XMLObject.expects(:new)
135
+
136
+ response = LitleOnlineRequest.new.sale(hash)
137
+ end
138
+
139
+ def test_capture_amount_unset_should_not_be_in_xml
140
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
141
+ hash={
142
+ 'id' => '006',
143
+ 'reportGroup'=>'Planets',
144
+ 'litleTxnId'=>'123456789012345678'
145
+ }
146
+
147
+ Communications.expects(:http_post).with(Not(regexp_matches(/.*amount.*/m)),kind_of(Hash))
148
+ XMLObject.expects(:new)
149
+
150
+ response = LitleOnlineRequest.new.capture(hash)
151
+ end
152
+
153
+ def test_force_capture_amount_unset_should_not_be_in_xml
154
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
155
+ hash={
156
+ 'id' => '006',
157
+ 'orderId'=>'12344',
158
+ 'reportGroup'=>'Planets',
159
+ 'orderSource'=>'ecommerce',
160
+ 'litleTxnId'=>'123456789012345678'
161
+ }
162
+
163
+ Communications.expects(:http_post).with(Not(regexp_matches(/.*amount.*/m)),kind_of(Hash))
164
+ XMLObject.expects(:new)
165
+
166
+ response = LitleOnlineRequest.new.force_capture(hash)
167
+ end
168
+
169
+ def test_amount_is_not_required_in_echeck_credit
170
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
171
+ hash={
172
+ 'id' => '006',
173
+ 'orderId'=>'12344',
174
+ 'reportGroup'=>'Planets',
175
+ 'orderSource'=>'ecommerce',
176
+ 'litleTxnId'=>'123456789012345678',
177
+ }
178
+
179
+ Communications.expects(:http_post).with(Not(regexp_matches(/.*amount.*/m)),kind_of(Hash))
180
+ XMLObject.expects(:new)
181
+
182
+ response = LitleOnlineRequest.new.echeck_credit(hash)
183
+ end
184
+
185
+ def test_amount_is_not_required_in_echeck_sale
186
+ Configuration.any_instance.stubs(:config).returns({'currency_merchant_map'=>{'DEFAULT'=>'1'}, 'user'=>'a','password'=>'b','version'=>'8.10'})
187
+ hash={
188
+ 'id' => '006',
189
+ 'orderId'=>'12344',
190
+ 'reportGroup'=>'Planets',
191
+ 'orderSource'=>'ecommerce',
192
+ 'litleTxnId'=>'123456789012345678',
193
+ }
194
+
195
+ Communications.expects(:http_post).with(Not(regexp_matches(/.*amount.*/m)),kind_of(Hash))
196
+ XMLObject.expects(:new)
197
+
198
+ response = LitleOnlineRequest.new.echeck_sale(hash)
199
+ end
200
+
201
+ def test_choice_between_card_token
202
+ start_hash = {
203
+ 'orderId'=>'12344',
204
+ 'merchantId'=>'101',
205
+ 'reportGroup'=>'Planets',
206
+ 'amount'=>'101',
207
+ 'orderSource'=>'ecommerce'
208
+ }
209
+
210
+ card_only = {
211
+ 'card' => {
212
+ 'type' => 'VI',
213
+ 'number' => '1111222233334444'
214
+ }
215
+ }
216
+
217
+ XMLObject.expects(:new)
218
+ Communications.expects(:http_post).with(regexp_matches(/.*card.*/m),kind_of(Hash))
219
+ LitleOnlineRequest.new.authorization(start_hash.merge(card_only))
220
+ end
221
+
222
+ def test_choice_between_card_token2
223
+ start_hash = {
224
+ 'orderId'=>'12344',
225
+ 'merchantId'=>'101',
226
+ 'reportGroup'=>'Planets',
227
+ 'amount'=>'101',
228
+ 'orderSource'=>'ecommerce'
229
+ }
230
+
231
+ token_only = {
232
+ 'token'=> {
233
+ 'litleToken' => '1111222233334444'
234
+ }
235
+ }
236
+
237
+ XMLObject.expects(:new)
238
+ Communications.expects(:http_post).with(regexp_matches(/.*token.*/m),kind_of(Hash))
239
+ LitleOnlineRequest.new.authorization(start_hash.merge(token_only))
240
+ end
241
+
242
+ def test_set_merchant_sdk
243
+ litle = LitleOnlineRequest.new
244
+ #Explicit - used for integrations
245
+ assert_equal 'ActiveMerchant;3.2', litle.send(:get_merchant_sdk, {'merchantSdk'=>'ActiveMerchant;3.2'})
246
+ #Implicit - used raw when nothing is specified
247
+ assert_equal 'Ruby;8.19.0', litle.send(:get_merchant_sdk, {'NotMerchantSdk'=>'ActiveMerchant;3.2'})
248
+ end
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\.19".*/m),kind_of(Hash))
278
+ XMLObject.expects(:new)
279
+
280
+ response = LitleOnlineRequest.new.void(hash)
281
+ end
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
+ end
296
+ end
@@ -326,11 +326,11 @@ module LitleOnline
326
326
  'recurringRequest'=>{
327
327
  'subscription'=>{
328
328
  'planCode'=>'abc123',
329
- 'numberOfPaymentsRemaining'=>'12'
329
+ 'numberOfPayments'=>'12'
330
330
  }
331
331
  }
332
332
  }
333
- LitleXmlMapper.expects(:request).with(regexp_matches(/.*<fraudFilterOverride>true<\/fraudFilterOverride><recurringRequest><subscription><planCode>abc123<\/planCode><numberOfPaymentsRemaining>12<\/numberOfPaymentsRemaining><\/subscription><\/recurringRequest>.*/m), is_a(Hash))
333
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<fraudFilterOverride>true<\/fraudFilterOverride><recurringRequest><subscription><planCode>abc123<\/planCode><numberOfPayments>12<\/numberOfPayments><\/subscription><\/recurringRequest>.*/m), is_a(Hash))
334
334
  LitleOnlineRequest.new.sale(hash)
335
335
  end
336
336
 
@@ -387,4 +387,4 @@ module LitleOnline
387
387
  end
388
388
 
389
389
  end
390
- end
390
+ end
@@ -0,0 +1,390 @@
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
+ require 'mocha/setup'
28
+
29
+ module LitleOnline
30
+ class TestSale < Test::Unit::TestCase
31
+
32
+ def test_both_choices_fraud_check_and_card_holder
33
+ hash = {
34
+ 'merchantId' => '101',
35
+ 'version'=>'8.8',
36
+ 'reportGroup'=>'Planets',
37
+ 'litleTxnId'=>'123456',
38
+ 'orderId'=>'12344',
39
+ 'amount'=>'106',
40
+ 'orderSource'=>'ecommerce',
41
+ 'fraudCheck'=>{'authenticationTransactionId'=>'123'},
42
+ 'cardholderAuthentication'=>{'authenticationTransactionId'=>'123'},
43
+ 'card'=>{
44
+ 'type'=>'VI',
45
+ 'number' =>'4100000000000002',
46
+ 'expDate' =>'1210'
47
+ }}
48
+
49
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
50
+ assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
51
+ end
52
+
53
+ def test_both_choices_card_and_paypal
54
+ hash = {
55
+ 'merchantId' => '101',
56
+ 'version'=>'8.8',
57
+ 'reportGroup'=>'Planets',
58
+ 'litleTxnId'=>'123456',
59
+ 'orderId'=>'12344',
60
+ 'amount'=>'106',
61
+ 'orderSource'=>'ecommerce',
62
+ 'fraudCheck'=>{'authenticationTransactionId'=>'123'},
63
+ 'cardholderAuthentication'=>{'authenticationTransactionId'=>'123'},
64
+ 'card'=>{
65
+ 'type'=>'VI',
66
+ 'number' =>'4100000000000002',
67
+ 'expDate' =>'1210'
68
+ },
69
+ 'paypal'=>{
70
+ 'payerId'=>'1234',
71
+ 'token'=>'1234',
72
+ 'transactionId'=>'123456'
73
+ }}
74
+
75
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
76
+ assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
77
+ end
78
+
79
+ def test_both_choices_card_and_token
80
+ hash = {
81
+ 'merchantId' => '101',
82
+ 'version'=>'8.8',
83
+ 'reportGroup'=>'Planets',
84
+ 'litleTxnId'=>'123456',
85
+ 'orderId'=>'12344',
86
+ 'amount'=>'106',
87
+ 'orderSource'=>'ecommerce',
88
+ 'fraudCheck'=>{'authenticationTransactionId'=>'123'},
89
+ 'cardholderAuthentication'=>{'authenticationTransactionId'=>'123'},
90
+ 'card'=>{
91
+ 'type'=>'VI',
92
+ 'number' =>'4100000000000002',
93
+ 'expDate' =>'1210'
94
+ },
95
+ 'token'=> {
96
+ 'litleToken'=>'1234567890123',
97
+ 'expDate'=>'1210',
98
+ 'cardValidationNum'=>'555',
99
+ 'type'=>'VI'
100
+ }}
101
+
102
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
103
+ assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
104
+ end
105
+
106
+ def test_both_choices_card_and_paypage
107
+ hash = {
108
+ 'merchantId' => '101',
109
+ 'version'=>'8.8',
110
+ 'reportGroup'=>'Planets',
111
+ 'litleTxnId'=>'123456',
112
+ 'orderId'=>'12344',
113
+ 'amount'=>'106',
114
+ 'orderSource'=>'ecommerce',
115
+ 'fraudCheck'=>{'authenticationTransactionId'=>'123'},
116
+ 'cardholderAuthentication'=>{'authenticationTransactionId'=>'123'},
117
+ 'card'=>{
118
+ 'type'=>'VI',
119
+ 'number' =>'4100000000000002',
120
+ 'expDate' =>'1210'
121
+ },
122
+ 'paypage'=> {
123
+ 'paypageRegistrationId'=>'1234',
124
+ 'expDate'=>'1210',
125
+ 'cardValidationNum'=>'555',
126
+ 'type'=>'VI'
127
+ }}
128
+
129
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
130
+ assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
131
+ end
132
+
133
+ def test_three_choices_card_and_paypage_and_paypal
134
+ hash = {
135
+ 'merchantId' => '101',
136
+ 'version'=>'8.8',
137
+ 'reportGroup'=>'Planets',
138
+ 'litleTxnId'=>'123456',
139
+ 'orderId'=>'12344',
140
+ 'amount'=>'106',
141
+ 'orderSource'=>'ecommerce',
142
+ 'fraudCheck'=>{'authenticationTransactionId'=>'123'},
143
+ 'cardholderAuthentication'=>{'authenticationTransactionId'=>'123'},
144
+ 'card'=>{
145
+ 'type'=>'VI',
146
+ 'number' =>'4100000000000002',
147
+ 'expDate' =>'1210'
148
+ },
149
+ 'paypage'=> {
150
+ 'paypageRegistrationId'=>'1234',
151
+ 'expDate'=>'1210',
152
+ 'cardValidationNum'=>'555',
153
+ 'type'=>'VI'},
154
+ 'paypal'=>{
155
+ 'payerId'=>'1234',
156
+ 'token'=>'1234',
157
+ 'transactionId'=>'123456'
158
+ }}
159
+
160
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
161
+ assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
162
+ end
163
+
164
+ def test_all_choices_card_and_paypage_and_paypal_and_token
165
+ hash = {
166
+ 'merchantId' => '101',
167
+ 'version'=>'8.8',
168
+ 'reportGroup'=>'Planets',
169
+ 'litleTxnId'=>'123456',
170
+ 'orderId'=>'12344',
171
+ 'amount'=>'106',
172
+ 'orderSource'=>'ecommerce',
173
+ 'fraudCheck'=>{'authenticationTransactionId'=>'123'},
174
+ 'cardholderAuthentication'=>{'authenticationTransactionId'=>'123'},
175
+ 'card'=>{
176
+ 'type'=>'VI',
177
+ 'number' =>'4100000000000002',
178
+ 'expDate' =>'1210'
179
+ },
180
+ 'paypage'=> {
181
+ 'paypageRegistrationId'=>'1234',
182
+ 'expDate'=>'1210',
183
+ 'cardValidationNum'=>'555',
184
+ 'type'=>'VI'},
185
+ 'paypal'=>{
186
+ 'payerId'=>'1234',
187
+ 'token'=>'1234',
188
+ 'transactionId'=>'123456'},
189
+ 'token'=> {
190
+ 'litleToken'=>'1234567890123',
191
+ 'expDate'=>'1210',
192
+ 'cardValidationNum'=>'555',
193
+ 'type'=>'VI'
194
+ }}
195
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
196
+ assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
197
+ end
198
+
199
+ def test_merchant_data_sale
200
+ hash = {
201
+ 'merchantId' => '101',
202
+ 'version'=>'8.12',
203
+ 'orderId'=>'1',
204
+ 'amount'=>'0',
205
+ 'orderSource'=>'ecommerce',
206
+ 'reportGroup'=>'Planets',
207
+ 'merchantData'=> {
208
+ 'affiliate'=>'bar'
209
+ }
210
+ }
211
+
212
+ XMLObject.expects(:new)
213
+ Communications.expects(:http_post).with(regexp_matches(/.*<merchantData>.*?<affiliate>bar<\/affiliate>.*?<\/merchantData>.*/m),kind_of(Hash))
214
+ LitleOnlineRequest.new.sale(hash)
215
+ end
216
+
217
+ def test_invalid_embedded_field_values
218
+ #becasue there are sub fields under fraud check that are not specified
219
+ hash = {
220
+ 'merchantId' => '101',
221
+ 'version'=>'8.8',
222
+ 'reportGroup'=>'Planets',
223
+ 'litleTxnId'=>'123456',
224
+ 'orderId'=>'12344',
225
+ 'amount'=>'106',
226
+ 'orderSource'=>'ecommerce',
227
+ 'fraudCheck'=>'one',
228
+ 'cardholderAuthentication'=>'two',
229
+ 'card'=>{
230
+ 'type'=>'VI',
231
+ 'number' =>'4100000000000000',
232
+ }}
233
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
234
+ assert_match /Entered an Invalid Amount of Choices for a Field, please only fill out one Choice!!!!/, exception.message
235
+ end
236
+
237
+ def test_fraud_filter_override
238
+ hash = {
239
+ 'merchantId' => '101',
240
+ 'version'=>'8.12',
241
+ 'orderId'=>'1',
242
+ 'amount'=>'0',
243
+ 'orderSource'=>'ecommerce',
244
+ 'reportGroup'=>'Planets',
245
+ 'fraudFilterOverride'=> 'false'
246
+ }
247
+
248
+ XMLObject.expects(:new)
249
+ Communications.expects(:http_post).with(regexp_matches(/.*<sale.*?<fraudFilterOverride>false<\/fraudFilterOverride>.*?<\/sale>.*/m),kind_of(Hash))
250
+ LitleOnlineRequest.new.sale(hash)
251
+ end
252
+
253
+ def test_illegal_card_type
254
+ hash = {
255
+ 'merchantId' => '101',
256
+ 'version'=>'8.8',
257
+ 'reportGroup'=>'Planets',
258
+ 'litleTxnId'=>'123456',
259
+ 'orderId'=>'12344',
260
+ 'amount'=>'106',
261
+ 'orderSource'=>'ecommerce',
262
+ 'card'=>{
263
+ 'type'=>'NO',
264
+ 'number' =>'4100000000000002',
265
+ 'expDate' =>'1210'
266
+ }}
267
+ exception = assert_raise(RuntimeError){LitleOnlineRequest.new.sale(hash)}
268
+ assert_match /If card type is specified, it must be in /, exception.message
269
+ end
270
+
271
+ def test_logged_in_user
272
+ hash = {
273
+ 'loggedInUser' => 'gdake',
274
+ 'merchantSdk' => 'Ruby;8.14.0',
275
+ 'merchantId' => '101',
276
+ 'version'=>'8.8',
277
+ 'reportGroup'=>'Planets',
278
+ 'litleTxnId'=>'123456',
279
+ 'orderId'=>'12344',
280
+ 'amount'=>'106',
281
+ 'orderSource'=>'ecommerce',
282
+ 'card'=>{
283
+ 'type'=>'VI',
284
+ 'number' =>'4100000000000002',
285
+ 'expDate' =>'1210'
286
+ }}
287
+
288
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*(loggedInUser="gdake".*merchantSdk="Ruby;8.14.0")|(merchantSdk="Ruby;8.14.0".*loggedInUser="gdake").*/m), is_a(Hash))
289
+ LitleOnlineRequest.new.sale(hash)
290
+ end
291
+
292
+ def test_surcharge_amount
293
+ hash = {
294
+ 'orderId' => '12344',
295
+ 'amount' => '2',
296
+ 'surchargeAmount' => '1',
297
+ 'orderSource' => 'ecommerce',
298
+ 'reportGroup' => 'Planets'
299
+ }
300
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<amount>2<\/amount><surchargeAmount>1<\/surchargeAmount><orderSource>ecommerce<\/orderSource>.*/m), is_a(Hash))
301
+ LitleOnlineRequest.new.sale(hash)
302
+ end
303
+
304
+ def test_surcharge_amount_optional
305
+ hash = {
306
+ 'orderId' => '12344',
307
+ 'amount' => '2',
308
+ 'orderSource' => 'ecommerce',
309
+ 'reportGroup' => 'Planets'
310
+ }
311
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<amount>2<\/amount><orderSource>ecommerce<\/orderSource>.*/m), is_a(Hash))
312
+ LitleOnlineRequest.new.sale(hash)
313
+ end
314
+
315
+ def test_recurringRequest
316
+ hash = {
317
+ 'card'=>{
318
+ 'type'=>'VI',
319
+ 'number'=>'4100000000000001',
320
+ 'expDate'=>'1213',
321
+ },
322
+ 'orderId'=>'12344',
323
+ 'amount'=>'2',
324
+ 'orderSource'=>'ecommerce',
325
+ 'fraudFilterOverride'=>'true',
326
+ 'recurringRequest'=>{
327
+ 'subscription'=>{
328
+ 'planCode'=>'abc123',
329
+ 'numberOfPaymentsRemaining'=>'12'
330
+ }
331
+ }
332
+ }
333
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<fraudFilterOverride>true<\/fraudFilterOverride><recurringRequest><subscription><planCode>abc123<\/planCode><numberOfPaymentsRemaining>12<\/numberOfPaymentsRemaining><\/subscription><\/recurringRequest>.*/m), is_a(Hash))
334
+ LitleOnlineRequest.new.sale(hash)
335
+ end
336
+
337
+ def test_recurringRequest_optional
338
+ hash = {
339
+ 'card'=>{
340
+ 'type'=>'VI',
341
+ 'number'=>'4100000000000001',
342
+ 'expDate'=>'1213',
343
+ },
344
+ 'orderId'=>'12344',
345
+ 'amount'=>'2',
346
+ 'orderSource'=>'ecommerce',
347
+ 'fraudFilterOverride'=>'true',
348
+ }
349
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<fraudFilterOverride>true<\/fraudFilterOverride><\/sale>.*/m), is_a(Hash))
350
+ LitleOnlineRequest.new.sale(hash)
351
+ end
352
+
353
+ def test_litleInternalRecurringRequest
354
+ hash = {
355
+ 'card'=>{
356
+ 'type'=>'VI',
357
+ 'number'=>'4100000000000001',
358
+ 'expDate'=>'1213',
359
+ },
360
+ 'orderId'=>'12344',
361
+ 'amount'=>'2',
362
+ 'orderSource'=>'ecommerce',
363
+ 'fraudFilterOverride'=>'true',
364
+ 'litleInternalRecurringRequest'=>{
365
+ 'subscriptionId'=>'1234567890123456789',
366
+ 'recurringTxnId'=>'1234567890123456789',
367
+ },
368
+ }
369
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<fraudFilterOverride>true<\/fraudFilterOverride><litleInternalRecurringRequest><subscriptionId>1234567890123456789<\/subscriptionId><recurringTxnId>1234567890123456789<\/recurringTxnId><\/litleInternalRecurringRequest>.*/m), is_a(Hash))
370
+ LitleOnlineRequest.new.sale(hash)
371
+ end
372
+
373
+ def test_litleInternalRecurringRequest_optional
374
+ hash = {
375
+ 'card'=>{
376
+ 'type'=>'VI',
377
+ 'number'=>'4100000000000001',
378
+ 'expDate'=>'1213',
379
+ },
380
+ 'orderId'=>'12344',
381
+ 'amount'=>'2',
382
+ 'orderSource'=>'ecommerce',
383
+ 'fraudFilterOverride'=>'true',
384
+ }
385
+ LitleXmlMapper.expects(:request).with(regexp_matches(/.*<fraudFilterOverride>true<\/fraudFilterOverride><\/sale>.*/m), is_a(Hash))
386
+ LitleOnlineRequest.new.sale(hash)
387
+ end
388
+
389
+ end
390
+ end