tns_payments 0.0.11 → 0.0.12
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.
- data/.env.example +4 -0
- data/.gitignore +1 -0
- data/lib/tns_payments/connection.rb +74 -52
- data/lib/tns_payments/request.rb +8 -10
- data/lib/tns_payments/response.rb +27 -7
- data/lib/tns_payments/test_support/card_session.rb +77 -0
- data/lib/tns_payments/version.rb +1 -1
- data/test/cassettes/test_amex_successful_purchase.yml +112 -0
- data/test/cassettes/test_available.yml +38 -0
- data/test/cassettes/test_card_enrolled_for_3ds.yml +112 -0
- data/test/cassettes/test_card_not_enrolled_for_3ds.yml +112 -0
- data/test/cassettes/test_deleting_tokenised_card.yml +223 -0
- data/test/cassettes/test_mastercard_successful_purchase.yml +112 -0
- data/test/cassettes/test_refund_successful_purchase.yml +149 -0
- data/test/cassettes/test_tokenise_creditcard_from_session_for_later_purchase.yml +149 -0
- data/test/cassettes/test_unsuccessful_purchase.yml +42 -0
- data/test/cassettes/test_unsupported_3ds_gateway.yml +114 -0
- data/test/cassettes/test_visa_successful_purchase.yml +112 -0
- data/test/helper.rb +48 -0
- data/test/integration/operations_test.rb +187 -0
- data/test/unit/response_test.rb +0 -4
- data/test/unit/transaction_test.rb +2 -0
- data/tns_payments.gemspec +11 -5
- metadata +218 -89
- data/test/unit/conntection_test.rb +0 -311
data/test/unit/response_test.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TNSPayments::ResponseTest < MiniTest::Unit::TestCase
|
4
|
-
def test_success_when_operating
|
5
|
-
assert Response.new({:status => 'OPERATING'}.to_json).success?
|
6
|
-
end
|
7
|
-
|
8
4
|
def test_success_when_success
|
9
5
|
assert Response.new({:result => 'SUCCESS'}.to_json).success?
|
10
6
|
end
|
@@ -4,6 +4,7 @@ class TNSPayments::TransactionTest < MiniTest::Unit::TestCase
|
|
4
4
|
def test_order_id_is_tns_minimum
|
5
5
|
transaction = MiniTest::Mock.new
|
6
6
|
transaction.expect :order_id, 0
|
7
|
+
transaction.expect :methods, []
|
7
8
|
|
8
9
|
assert_equal 10000000000, Transaction.new(transaction).order_id
|
9
10
|
assert transaction.verify
|
@@ -12,6 +13,7 @@ class TNSPayments::TransactionTest < MiniTest::Unit::TestCase
|
|
12
13
|
def test_minimum_order_id_is_injectable
|
13
14
|
mock = MiniTest::Mock.new
|
14
15
|
mock.expect :order_id, 10
|
16
|
+
mock.expect :methods, []
|
15
17
|
transaction = Transaction.new mock
|
16
18
|
transaction.minimum_order_id = 0
|
17
19
|
|
data/tns_payments.gemspec
CHANGED
@@ -15,9 +15,15 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.test_files = `git ls-files -- test/*`.split("\n")
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
|
18
|
-
s.add_runtime_dependency 'json'
|
19
|
-
s.add_runtime_dependency 'rest-client'
|
20
|
-
s.
|
21
|
-
s.
|
22
|
-
s.
|
18
|
+
s.add_runtime_dependency 'json', '1.4.6'
|
19
|
+
s.add_runtime_dependency 'rest-client', '1.6.7'
|
20
|
+
s.add_runtime_dependency 'mime-types', '~> 1.16'
|
21
|
+
s.add_runtime_dependency 'nokogiri', '~> 1.2'
|
22
|
+
s.add_runtime_dependency 'activesupport', '2.3.12'
|
23
|
+
s.add_development_dependency 'minitest', '2.11.4'
|
24
|
+
s.add_development_dependency 'rake', '0.8.7'
|
25
|
+
s.add_development_dependency 'webmock', '1.8.7'
|
26
|
+
s.add_development_dependency 'addressable', '2.2.8'
|
27
|
+
s.add_development_dependency 'vcr', '2.9.3'
|
28
|
+
s.add_development_dependency 'dotenv', '<= 1.1'
|
23
29
|
end
|
metadata
CHANGED
@@ -1,103 +1,206 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: tns_payments
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 12
|
10
|
+
version: 0.0.12
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Tim Cooper
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
17
|
+
|
18
|
+
date: 2016-01-14 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
22
21
|
type: :runtime
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - "="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 11
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 4
|
31
|
+
- 6
|
32
|
+
version: 1.4.6
|
33
|
+
version_requirements: *id001
|
34
|
+
name: json
|
23
35
|
prerelease: false
|
24
|
-
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
type: :runtime
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
25
39
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
|
40
|
+
requirements:
|
41
|
+
- - "="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 1
|
44
|
+
segments:
|
45
|
+
- 1
|
46
|
+
- 6
|
47
|
+
- 7
|
48
|
+
version: 1.6.7
|
49
|
+
version_requirements: *id002
|
31
50
|
name: rest-client
|
32
|
-
|
33
|
-
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
51
|
+
prerelease: false
|
52
|
+
- !ruby/object:Gem::Dependency
|
38
53
|
type: :runtime
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 47
|
60
|
+
segments:
|
61
|
+
- 1
|
62
|
+
- 16
|
63
|
+
version: "1.16"
|
64
|
+
version_requirements: *id003
|
65
|
+
name: mime-types
|
39
66
|
prerelease: false
|
40
|
-
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
type: :runtime
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
41
70
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
71
|
+
requirements:
|
72
|
+
- - ~>
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 11
|
75
|
+
segments:
|
76
|
+
- 1
|
77
|
+
- 2
|
78
|
+
version: "1.2"
|
79
|
+
version_requirements: *id004
|
80
|
+
name: nokogiri
|
81
|
+
prerelease: false
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
type: :runtime
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
49
85
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
86
|
+
requirements:
|
87
|
+
- - "="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 27
|
90
|
+
segments:
|
91
|
+
- 2
|
92
|
+
- 3
|
93
|
+
- 12
|
94
|
+
version: 2.3.12
|
95
|
+
version_requirements: *id005
|
96
|
+
name: activesupport
|
97
|
+
prerelease: false
|
98
|
+
- !ruby/object:Gem::Dependency
|
54
99
|
type: :development
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - "="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 43
|
106
|
+
segments:
|
107
|
+
- 2
|
108
|
+
- 11
|
109
|
+
- 4
|
110
|
+
version: 2.11.4
|
111
|
+
version_requirements: *id006
|
112
|
+
name: minitest
|
55
113
|
prerelease: false
|
56
|
-
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
type: :development
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
57
117
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
|
118
|
+
requirements:
|
119
|
+
- - "="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 49
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
- 8
|
125
|
+
- 7
|
126
|
+
version: 0.8.7
|
127
|
+
version_requirements: *id007
|
63
128
|
name: rake
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ! '>='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
|
-
type: :development
|
71
129
|
prerelease: false
|
72
|
-
|
130
|
+
- !ruby/object:Gem::Dependency
|
131
|
+
type: :development
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
73
133
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
|
134
|
+
requirements:
|
135
|
+
- - "="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
hash: 57
|
138
|
+
segments:
|
139
|
+
- 1
|
140
|
+
- 8
|
141
|
+
- 7
|
142
|
+
version: 1.8.7
|
143
|
+
version_requirements: *id008
|
79
144
|
name: webmock
|
80
|
-
|
145
|
+
prerelease: false
|
146
|
+
- !ruby/object:Gem::Dependency
|
147
|
+
type: :development
|
148
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
81
149
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
|
150
|
+
requirements:
|
151
|
+
- - "="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
hash: 23
|
154
|
+
segments:
|
155
|
+
- 2
|
156
|
+
- 2
|
157
|
+
- 8
|
158
|
+
version: 2.2.8
|
159
|
+
version_requirements: *id009
|
160
|
+
name: addressable
|
161
|
+
prerelease: false
|
162
|
+
- !ruby/object:Gem::Dependency
|
86
163
|
type: :development
|
164
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
165
|
+
none: false
|
166
|
+
requirements:
|
167
|
+
- - "="
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
hash: 45
|
170
|
+
segments:
|
171
|
+
- 2
|
172
|
+
- 9
|
173
|
+
- 3
|
174
|
+
version: 2.9.3
|
175
|
+
version_requirements: *id010
|
176
|
+
name: vcr
|
87
177
|
prerelease: false
|
88
|
-
|
178
|
+
- !ruby/object:Gem::Dependency
|
179
|
+
type: :development
|
180
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
89
181
|
none: false
|
90
|
-
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
|
182
|
+
requirements:
|
183
|
+
- - <=
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
hash: 13
|
186
|
+
segments:
|
187
|
+
- 1
|
188
|
+
- 1
|
189
|
+
version: "1.1"
|
190
|
+
version_requirements: *id011
|
191
|
+
name: dotenv
|
192
|
+
prerelease: false
|
94
193
|
description: Integration with TNS Payments Gateway
|
95
|
-
email:
|
194
|
+
email:
|
96
195
|
- coop@latrobest.com
|
97
196
|
executables: []
|
197
|
+
|
98
198
|
extensions: []
|
199
|
+
|
99
200
|
extra_rdoc_files: []
|
100
|
-
|
201
|
+
|
202
|
+
files:
|
203
|
+
- .env.example
|
101
204
|
- .gitignore
|
102
205
|
- CHANGELOG.md
|
103
206
|
- Gemfile
|
@@ -107,47 +210,73 @@ files:
|
|
107
210
|
- lib/tns_payments/error_response.rb
|
108
211
|
- lib/tns_payments/request.rb
|
109
212
|
- lib/tns_payments/response.rb
|
213
|
+
- lib/tns_payments/test_support/card_session.rb
|
110
214
|
- lib/tns_payments/transaction.rb
|
111
215
|
- lib/tns_payments/version.rb
|
216
|
+
- test/cassettes/test_amex_successful_purchase.yml
|
217
|
+
- test/cassettes/test_available.yml
|
218
|
+
- test/cassettes/test_card_enrolled_for_3ds.yml
|
219
|
+
- test/cassettes/test_card_not_enrolled_for_3ds.yml
|
220
|
+
- test/cassettes/test_deleting_tokenised_card.yml
|
221
|
+
- test/cassettes/test_mastercard_successful_purchase.yml
|
222
|
+
- test/cassettes/test_refund_successful_purchase.yml
|
223
|
+
- test/cassettes/test_tokenise_creditcard_from_session_for_later_purchase.yml
|
224
|
+
- test/cassettes/test_unsuccessful_purchase.yml
|
225
|
+
- test/cassettes/test_unsupported_3ds_gateway.yml
|
226
|
+
- test/cassettes/test_visa_successful_purchase.yml
|
112
227
|
- test/helper.rb
|
113
|
-
- test/
|
228
|
+
- test/integration/operations_test.rb
|
114
229
|
- test/unit/error_response_test.rb
|
115
230
|
- test/unit/response_test.rb
|
116
231
|
- test/unit/transaction_test.rb
|
117
232
|
- tns_payments.gemspec
|
118
|
-
homepage:
|
233
|
+
homepage: ""
|
119
234
|
licenses: []
|
235
|
+
|
120
236
|
post_install_message:
|
121
237
|
rdoc_options: []
|
122
|
-
|
238
|
+
|
239
|
+
require_paths:
|
123
240
|
- lib
|
124
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
241
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
125
242
|
none: false
|
126
|
-
requirements:
|
127
|
-
- -
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
|
130
|
-
segments:
|
243
|
+
requirements:
|
244
|
+
- - ">="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
hash: 3
|
247
|
+
segments:
|
131
248
|
- 0
|
132
|
-
|
133
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
249
|
+
version: "0"
|
250
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
251
|
none: false
|
135
|
-
requirements:
|
136
|
-
- -
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
|
139
|
-
segments:
|
252
|
+
requirements:
|
253
|
+
- - ">="
|
254
|
+
- !ruby/object:Gem::Version
|
255
|
+
hash: 3
|
256
|
+
segments:
|
140
257
|
- 0
|
141
|
-
|
258
|
+
version: "0"
|
142
259
|
requirements: []
|
260
|
+
|
143
261
|
rubyforge_project:
|
144
|
-
rubygems_version: 1.8.
|
262
|
+
rubygems_version: 1.8.15
|
145
263
|
signing_key:
|
146
264
|
specification_version: 3
|
147
265
|
summary: Integration with TNS Payments Gateway
|
148
|
-
test_files:
|
266
|
+
test_files:
|
267
|
+
- test/cassettes/test_amex_successful_purchase.yml
|
268
|
+
- test/cassettes/test_available.yml
|
269
|
+
- test/cassettes/test_card_enrolled_for_3ds.yml
|
270
|
+
- test/cassettes/test_card_not_enrolled_for_3ds.yml
|
271
|
+
- test/cassettes/test_deleting_tokenised_card.yml
|
272
|
+
- test/cassettes/test_mastercard_successful_purchase.yml
|
273
|
+
- test/cassettes/test_refund_successful_purchase.yml
|
274
|
+
- test/cassettes/test_tokenise_creditcard_from_session_for_later_purchase.yml
|
275
|
+
- test/cassettes/test_unsuccessful_purchase.yml
|
276
|
+
- test/cassettes/test_unsupported_3ds_gateway.yml
|
277
|
+
- test/cassettes/test_visa_successful_purchase.yml
|
149
278
|
- test/helper.rb
|
150
|
-
- test/
|
279
|
+
- test/integration/operations_test.rb
|
151
280
|
- test/unit/error_response_test.rb
|
152
281
|
- test/unit/response_test.rb
|
153
282
|
- test/unit/transaction_test.rb
|
@@ -1,311 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'webmock/minitest'
|
3
|
-
|
4
|
-
class TNSPayments::ConnectionTest < MiniTest::Unit::TestCase
|
5
|
-
def setup
|
6
|
-
@gateway = Connection.new :api_key => '123api456', :merchant_id => 'MERCHANT'
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_available_is_true_when_tns_gateway_is_operating
|
10
|
-
stub_availability_request.to_return(:status => 200, :body => '{"status":"OPERATING"}', :headers => {})
|
11
|
-
assert @gateway.available?
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_available_is_false_when_tns_gateway_is_not_operating
|
15
|
-
stub_availability_request.to_return(:status => 200, :body => '{"status":"EPIC_FAIL"}', :headers => {})
|
16
|
-
refute @gateway.available?
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_purchase_with_session_token_makes_a_successful_purchase
|
20
|
-
stub_successful_session_token_purchase_request mock_transaction, 'SESSIONTOKEN'
|
21
|
-
assert @gateway.purchase(mock_transaction, 'SESSIONTOKEN').success?
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_purchase_with_session_token_makes_an_unsuccessful_purchase
|
25
|
-
stub_unsuccessful_session_token_purchase_request mock_transaction, 'SESSIONTOKEN'
|
26
|
-
refute @gateway.purchase(mock_transaction, 'SESSIONTOKEN').success?
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_purchase_with_session_token_can_deal_with_timeout_errors
|
30
|
-
stub_session_token_purchase_request(mock_transaction, 'SESSIONTOKEN').to_timeout
|
31
|
-
refute @gateway.purchase(mock_transaction, 'SESSIONTOKEN').success?
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_purchase_with_credit_card_token_makes_a_successful_purchase
|
35
|
-
stub_successful_credit_card_token_purchase_request(mock_transaction, '9111111111111111')
|
36
|
-
assert @gateway.purchase(mock_transaction, '9111111111111111').success?
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_purchase_with_credit_card_token_makes_an_unsuccessful_purchase
|
40
|
-
stub_unsuccessful_credit_card_token_purchase_request mock_transaction, '9111111111111111'
|
41
|
-
refute @gateway.purchase(mock_transaction, '9111111111111111').success?
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_purchase_with_credit_card_token_can_deal_with_timeout_errors
|
45
|
-
stub_credit_card_token_purchase_request(mock_transaction, '9111111111111111').to_timeout
|
46
|
-
refute @gateway.purchase(mock_transaction, '9111111111111111').success?
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_refund_makes_successful_refund
|
50
|
-
stub_successful_refund_request mock_transaction
|
51
|
-
assert @gateway.refund(mock_transaction).success?
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_refund_makes_unsuccessful_refund
|
55
|
-
stub_unsuccessful_refund_request mock_transaction
|
56
|
-
refute @gateway.refund(mock_transaction).success?
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_refund_can_deal_with_timeout_errors
|
60
|
-
stub_refund_request(mock_transaction).to_timeout
|
61
|
-
refute @gateway.refund(mock_transaction).success?
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_create_credit_card_token_successfully_stores_creditcard
|
65
|
-
stub_successful_create_credit_card_token_request 'SESSIONTOKEN'
|
66
|
-
assert @gateway.create_credit_card_token('SESSIONTOKEN').success?
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_create_credit_card_token_returns_valid_card_token_when_successful
|
70
|
-
stub_successful_create_credit_card_token_request 'SESSIONTOKEN'
|
71
|
-
token = @gateway.create_credit_card_token('SESSIONTOKEN').response['cardToken']
|
72
|
-
assert_equal 16, token.size
|
73
|
-
assert_match Connection::CREDIT_CARD_TOKEN_FORMAT, token
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_create_credit_card_token_unsuccessfully_attempts_to_store_credit_card
|
77
|
-
stub_unsuccessful_create_credit_card_token_request 'SESSIONTOKEN'
|
78
|
-
refute @gateway.create_credit_card_token('SESSIONTOKEN').success?
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_delete_credit_card_token_successfully_deletes_a_stored_credit_card_token
|
82
|
-
stub_successful_delete_credit_card_token_request '9123456781234567'
|
83
|
-
assert @gateway.delete_credit_card_token('9123456781234567').success?
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_delete_credit_card_token_unsuccessfully_attempts_to_delete_a_stored_credit_card
|
87
|
-
stub_unsuccessful_delete_credit_card_token_request '9123456781234567'
|
88
|
-
refute @gateway.delete_credit_card_token('9123456781234567').success?
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_session_token_returns_token
|
92
|
-
stub_successful_session_token_request
|
93
|
-
assert_equal 'SESSIONTOKEN', @gateway.session_token
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_unsuccessful_session_token_request_raises_an_exception
|
97
|
-
stub_session_token_request.to_return(:status => 400, :body => '{"error":{"cause":"Invalid merchant_id"}}')
|
98
|
-
assert_raises SessionTokenException do
|
99
|
-
@gateway.session_token
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_successful_check_enrollment_request_returns_card_enrolled
|
104
|
-
transaction = mock_transaction
|
105
|
-
transaction.expect :three_domain_id, 'randomstring'
|
106
|
-
stub_successful_session_token_request
|
107
|
-
token = @gateway.session_token
|
108
|
-
stub_successful_check_enrollment_request transaction, token, 'http://google.com/'
|
109
|
-
response = @gateway.check_enrollment transaction, token, 'http://google.com/'
|
110
|
-
assert_equal 'CARD_ENROLLED', response.response['response']['3DSecure']['gatewayCode']
|
111
|
-
end
|
112
|
-
|
113
|
-
def test_successful_process_acs_result_request_returns_authorized
|
114
|
-
# transaction = mock_transaction
|
115
|
-
# transaction.expect :three_domain_id, 'randomstring'
|
116
|
-
# stub_successful_session_token_request
|
117
|
-
# token = @gateway.session_token
|
118
|
-
|
119
|
-
stub_successful_process_acs_result_request 'three_domain_id', 'pa_res'
|
120
|
-
response = @gateway.process_acs_result 'three_domain_id', 'pa_res'
|
121
|
-
assert_equal 'AUTHENTICATION_SUCCESSFUL', response.response['response']['3DSecure']['gatewayCode']
|
122
|
-
end
|
123
|
-
|
124
|
-
private
|
125
|
-
|
126
|
-
def stub_availability_request
|
127
|
-
stub_request(:get, "https://secure.ap.tnspayments.com/api/rest/version/4/information").
|
128
|
-
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'Application/json;charset=UTF-8'})
|
129
|
-
end
|
130
|
-
|
131
|
-
def stub_successful_refund_request transaction
|
132
|
-
stub_refund_request(transaction).
|
133
|
-
to_return :status => 200, :headers => {}, :body => <<-EOS
|
134
|
-
{"merchant":"#{@gateway.merchant_id}","order":{"id":#{transaction.order_id},"totalAuthorizedAmount":0.00,"totalCapturedAmount":0.00,"totalRefundedAmount":0.00},
|
135
|
-
"response":{"acquirerCode":"00","gatewayCode":"APPROVED"},"result":"SUCCESS","transaction":{"acquirer":{"id":"STGEORGE"},
|
136
|
-
"amount":#{transaction.amount},"authorizationCode":"000582","batch":20110707,"currency":"AUD","id":"#{transaction.transaction_id}",
|
137
|
-
"receipt":"110707000582","source":"INTERNET","terminal":"08845778","type":"REFUND"}}
|
138
|
-
EOS
|
139
|
-
end
|
140
|
-
|
141
|
-
def stub_unsuccessful_refund_request transaction
|
142
|
-
stub_refund_request(transaction).
|
143
|
-
to_return(:status => 200, :body => '{"result":"FAILURE"}', :headers => {})
|
144
|
-
end
|
145
|
-
|
146
|
-
def stub_successful_credit_card_token_purchase_request transaction, token
|
147
|
-
stub_credit_card_token_purchase_request(transaction, token).
|
148
|
-
to_return(:status => 200, :body => %[{"card":{"expiry":{"month":"5","year":"13"},"number":"xxxxxxxxxxxxxxxx","scheme":"MASTERCARD"},"merchant":"","order":{"id":"#{transaction.order_id}","totalAuthorizedAmount":0.00,"totalCapturedAmount":0.00,"totalRefundedAmount":0.00},"response":{"acquirerCode":"00","gatewayCode":"APPROVED"},"result":"SUCCESS","transaction":{"acquirer":{"id":"STGEORGE"},"amount":"#{transaction.amount}","authorizationCode":"000576","batch":20110707,"currency":"AUD","frequency":"SINGLE","id":"72637779534c67696c54b26f220dc4d3","receipt":"110707000576","source":"INTERNET","terminal":"08845778","type":"PAYMENT"}}], :headers => {})
|
149
|
-
end
|
150
|
-
|
151
|
-
def stub_unsuccessful_credit_card_token_purchase_request transaction, token
|
152
|
-
stub_credit_card_token_purchase_request(transaction, token).
|
153
|
-
to_return(:status => 200, :body => '{"result":"FAILURE"}', :headers => {})
|
154
|
-
end
|
155
|
-
|
156
|
-
def stub_successful_session_token_purchase_request transaction, token
|
157
|
-
stub_session_token_purchase_request(transaction, token).
|
158
|
-
to_return(:status => 200, :body => %[{"card":{"expiry":{"month":"5","year":"13"},"number":"xxxxxxxxxxxxxxxx","scheme":"MASTERCARD"},"merchant":"","order":{"id":"#{transaction.order_id}","totalAuthorizedAmount":0.00,"totalCapturedAmount":0.00,"totalRefundedAmount":0.00},"response":{"acquirerCode":"00","gatewayCode":"APPROVED"},"result":"SUCCESS","transaction":{"acquirer":{"id":"STGEORGE"},"amount":"#{transaction.amount}","authorizationCode":"000576","batch":20110707,"currency":"AUD","frequency":"SINGLE","id":"72637779534c67696c54b26f220dc4d3","receipt":"110707000576","source":"INTERNET","terminal":"08845778","type":"PAYMENT"}}], :headers => {})
|
159
|
-
end
|
160
|
-
|
161
|
-
def stub_unsuccessful_session_token_purchase_request transaction, token
|
162
|
-
stub_session_token_purchase_request(transaction, token).
|
163
|
-
to_return(:status => 200, :body => '{"result":"FAILURE"}', :headers => {})
|
164
|
-
end
|
165
|
-
|
166
|
-
def stub_successful_create_credit_card_token_request token
|
167
|
-
stub_create_credit_card_token_request(token).
|
168
|
-
to_return(:status => 200, :body => %{{"result":"SUCCESS", "response":{"gatewayCode":"BASIC_VERIFICATION_SUCCESSFUL"}, "card":{"number":"xxxxxxxxxxxxxxxx", "scheme":"MASTERCARD", "expiry":{"month":"5", "year":"13"}}, "cardToken":"9102370788509763"}}, :headers => {})
|
169
|
-
end
|
170
|
-
|
171
|
-
def stub_unsuccessful_create_credit_card_token_request token
|
172
|
-
stub_create_credit_card_token_request(token).
|
173
|
-
to_return(:status => 200, :body => '{"result":"FAILURE"}', :headers => {})
|
174
|
-
end
|
175
|
-
|
176
|
-
def stub_successful_delete_credit_card_token_request token
|
177
|
-
stub_delete_credit_card_token_request(token).
|
178
|
-
to_return(:status => 200, :body => '{"result":"SUCCESS"}', :headers => {})
|
179
|
-
end
|
180
|
-
|
181
|
-
def stub_unsuccessful_delete_credit_card_token_request token
|
182
|
-
stub_delete_credit_card_token_request(token).
|
183
|
-
to_return(:status => 200, :body => '{"result":"FAILURE"}', :headers => {})
|
184
|
-
end
|
185
|
-
|
186
|
-
def stub_successful_session_token_request
|
187
|
-
stub_session_token_request.
|
188
|
-
to_return(:status => 200, :body => '{"result":"SUCCESS","session":"SESSIONTOKEN"}', :headers => {})
|
189
|
-
end
|
190
|
-
|
191
|
-
def stub_session_token_request
|
192
|
-
stub_request(:post, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/session/).
|
193
|
-
with :headers => {
|
194
|
-
'Accept' => '*/*',
|
195
|
-
'Accept-Encoding' => 'gzip, deflate',
|
196
|
-
'Content-Length' => '2',
|
197
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
198
|
-
}
|
199
|
-
end
|
200
|
-
|
201
|
-
def stub_session_token_purchase_request transaction, token
|
202
|
-
transaction = Transaction.new transaction
|
203
|
-
stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
|
204
|
-
with :body => JSON.generate({
|
205
|
-
'apiOperation' => 'PAY',
|
206
|
-
'order' => {'reference' => transaction.reference.to_s},
|
207
|
-
'cardDetails' => {'session' => token.to_s},
|
208
|
-
'transaction' => {'amount' => transaction.amount.to_s, 'currency' => transaction.currency, 'reference' => transaction.transaction_id.to_s}
|
209
|
-
}),
|
210
|
-
:headers => {
|
211
|
-
'Accept' => '*/*',
|
212
|
-
'Accept-Encoding' => 'gzip, deflate',
|
213
|
-
'Content-Length' => '158',
|
214
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
215
|
-
}
|
216
|
-
end
|
217
|
-
|
218
|
-
def stub_credit_card_token_purchase_request transaction, token
|
219
|
-
transaction = Transaction.new transaction
|
220
|
-
stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
|
221
|
-
with :body => JSON.generate({
|
222
|
-
'apiOperation' => 'PAY',
|
223
|
-
'order' => {'reference' => transaction.reference.to_s},
|
224
|
-
'cardDetails' => {'cardToken' => token.to_s},
|
225
|
-
'transaction' => {'amount' => transaction.amount.to_s, 'currency' => transaction.currency, 'reference' => transaction.transaction_id.to_s}
|
226
|
-
}),
|
227
|
-
:headers => {
|
228
|
-
'Accept' => '*/*',
|
229
|
-
'Accept-Encoding' => 'gzip, deflate',
|
230
|
-
'Content-Length' => '164',
|
231
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
232
|
-
}
|
233
|
-
end
|
234
|
-
|
235
|
-
def stub_refund_request transaction
|
236
|
-
transaction = Transaction.new transaction
|
237
|
-
stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
|
238
|
-
with :body => JSON.generate({
|
239
|
-
'apiOperation' => 'REFUND',
|
240
|
-
'transaction' => {'amount' => transaction.amount.to_s, 'currency' => transaction.currency, 'reference' => transaction.transaction_id.to_s}
|
241
|
-
}),
|
242
|
-
:headers => {
|
243
|
-
'Accept' => '*/*',
|
244
|
-
'Accept-Encoding' => 'gzip, deflate',
|
245
|
-
'Content-Length' => '89',
|
246
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
247
|
-
}
|
248
|
-
end
|
249
|
-
|
250
|
-
def stub_create_credit_card_token_request token
|
251
|
-
stub_request(:post, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/token/).
|
252
|
-
with :body => JSON.generate({
|
253
|
-
'cardDetails' => {'session' => token}
|
254
|
-
}),
|
255
|
-
:headers => {
|
256
|
-
'Accept' => '*/*',
|
257
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
258
|
-
}
|
259
|
-
end
|
260
|
-
|
261
|
-
def stub_delete_credit_card_token_request token
|
262
|
-
stub_request(:delete, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/token\/#{token}/).
|
263
|
-
with :body => {},
|
264
|
-
:headers => {
|
265
|
-
'Accept' => '*/*',
|
266
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
267
|
-
}
|
268
|
-
end
|
269
|
-
|
270
|
-
def stub_successful_check_enrollment_request transaction, token, postback_url
|
271
|
-
stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/3DSecureId\/#{transaction.three_domain_id}/).
|
272
|
-
with(:body => JSON.generate({
|
273
|
-
'3DSecure' => {'authenticationRedirect' => {'pageGenerationMode' => 'CUSTOMIZED', 'responseUrl' => postback_url}},
|
274
|
-
'apiOperation' => 'CHECK_3DS_ENROLLMENT',
|
275
|
-
'cardDetails' => {'session' => token},
|
276
|
-
'transaction' => {'amount' => transaction.amount.to_s, 'currency' => transaction.currency}
|
277
|
-
}),
|
278
|
-
:headers => {
|
279
|
-
'Accept' => '*/*',
|
280
|
-
'Accept-Encoding' => 'gzip, deflate',
|
281
|
-
'Content-Length' => '237',
|
282
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
283
|
-
}).
|
284
|
-
to_return :status => 200, :headers => {}, :body => "{\"3DSecure\":{\"authenticationRedirect\":{\"customized\":{\"acsUrl\":\"https://secure.ap.tnspayments.com:443/acs/MastercardACS/4272b87b-2cc0-4232-a96e-e678ecbe7455\",\"paReq\":\"eAFVkd1ugkAQhe9NfAfCfV1ghVIzrNFq1aY/pNqY9I7AKCQCukILfZ2+SZ+sswq1vePMcGbPfAPDKt1p7yiPSZ55utkzdA2zMI+SbOvpr6u7K1cfim4HVrFEnCwxLCUKeMTjMdiilkSezrlpmJbh6gL80QseBDTjBE3rWcBaSS4ZxkFWCAjCw3jxJGyLG44NrJGQolxMhGnxvu1cu8DOGrIgRTGlMXUU1NocZa49FBGwUx3CvMwKWQvXcoC1Akq5E3FR7AeMITnJGJOvF+YpMNUDdknjlyrXkfaqkkg8R9HmrZotNx8pn8b17HNdGfexX64nfQ+Y+gOioEBhqa25aWsWH3BnYFPeUx2CVCUSs7GvfX8RA4MWPJdgr14anYWpGn8LQGwlwW9XaRVgtc8zpJEE8/cb2CX27VwhDQuCZ7f0bige7xOSpqGmJITJ5AYRbwQwZWXN3QjJ6axU+XfubucHAPGz0w==\"}},\"summaryStatus\":\"CARD_ENROLLED\",\"xid\":\"OddfZxGSfwm3EhyGzWx0JhPuWD4=\"},\"3DSecureId\":\"#{transaction.three_domain_id}\",\"merchant\":\"#{@gateway.merchant_id}\",\"response\":{\"3DSecure\":{\"gatewayCode\":\"CARD_ENROLLED\"}}}"
|
285
|
-
end
|
286
|
-
|
287
|
-
def stub_successful_process_acs_result_request three_domain_id, pa_res
|
288
|
-
stub_request(:post, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/3DSecureId\/#{three_domain_id}/).
|
289
|
-
with(:body => JSON.generate({
|
290
|
-
'3DSecure' => {'paRes' => pa_res},
|
291
|
-
'apiOperation' => 'PROCESS_ACS_RESULT'
|
292
|
-
}),
|
293
|
-
:headers => {
|
294
|
-
'Accept' => '*/*',
|
295
|
-
'Accept-Encoding' => 'gzip, deflate',
|
296
|
-
'Content-Length' => '67',
|
297
|
-
'Content-Type' => 'Application/json;charset=UTF-8'
|
298
|
-
}).
|
299
|
-
to_return :status => 200, :headers => {}, :body => "{\"response\":{\"3DSecure\":{\"gatewayCode\":\"AUTHENTICATION_SUCCESSFUL\"}}}"
|
300
|
-
end
|
301
|
-
|
302
|
-
def mock_transaction
|
303
|
-
mock = MiniTest::Mock.new
|
304
|
-
mock.expect :amount, 100
|
305
|
-
mock.expect :currency, 'AUD'
|
306
|
-
mock.expect :order_id, 10000000001
|
307
|
-
mock.expect :transaction_id, 1
|
308
|
-
mock.expect :reference, 'AUD123'
|
309
|
-
mock
|
310
|
-
end
|
311
|
-
end
|