tns_payments 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,114 @@
|
|
1
|
+
---
|
2
|
+
recorded_with: VCR 2.9.3
|
3
|
+
http_interactions:
|
4
|
+
- request:
|
5
|
+
method: post
|
6
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/session
|
7
|
+
body:
|
8
|
+
string: ""
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*"
|
12
|
+
Content-Type:
|
13
|
+
- Application/json;charset=UTF-8
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip, deflate
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 201
|
19
|
+
message: Created
|
20
|
+
headers:
|
21
|
+
Content-Length:
|
22
|
+
- "149"
|
23
|
+
Content-Type:
|
24
|
+
- application/json;charset=UTF-8
|
25
|
+
Date:
|
26
|
+
- Mon, 11 Jan 2016 23:51:14 GMT
|
27
|
+
Pragma:
|
28
|
+
- no-cache
|
29
|
+
Expires:
|
30
|
+
- "0"
|
31
|
+
Set-Cookie:
|
32
|
+
- TS018aacab=01c9ad79a06dde739255b51ec92c260efb205ccd88a9961f27908e9f6e8ac7fbd285ec27f8; Path=/
|
33
|
+
Cache-Control:
|
34
|
+
- no-cache, no-store, must-revalidate
|
35
|
+
body:
|
36
|
+
string: "{\"merchant\":\"<TNS_MERCHANT_ID>\",\"result\":\"SUCCESS\",\"session\":{\"id\":\"SESSION0002019574105M4098673I82\",\"updateStatus\":\"NO_UPDATE\",\"version\":\"343a7dec01\"}}"
|
37
|
+
http_version:
|
38
|
+
recorded_at: Mon, 11 Jan 2016 23:51:15 GMT
|
39
|
+
- request:
|
40
|
+
method: put
|
41
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/session/SESSION0002019574105M4098673I82
|
42
|
+
body:
|
43
|
+
string: "{\"sourceOfFunds\":{\"type\":\"CARD\",\"provided\":{\"card\":{\"number\":\"4005550000000001\",\"expiry\":{\"month\":\"05\",\"year\":\"17\"},\"securityCode\":\"123\"}}}}"
|
44
|
+
headers:
|
45
|
+
Accept:
|
46
|
+
- "*/*"
|
47
|
+
Content-Length:
|
48
|
+
- "140"
|
49
|
+
Content-Type:
|
50
|
+
- Application/json;charset=UTF-8
|
51
|
+
Accept-Encoding:
|
52
|
+
- gzip, deflate
|
53
|
+
response:
|
54
|
+
status:
|
55
|
+
code: 200
|
56
|
+
message: OK
|
57
|
+
headers:
|
58
|
+
Content-Length:
|
59
|
+
- "337"
|
60
|
+
Content-Type:
|
61
|
+
- application/json;charset=UTF-8
|
62
|
+
Date:
|
63
|
+
- Mon, 11 Jan 2016 23:51:14 GMT
|
64
|
+
Pragma:
|
65
|
+
- no-cache
|
66
|
+
Expires:
|
67
|
+
- "0"
|
68
|
+
Set-Cookie:
|
69
|
+
- TS018aacab=01c9ad79a071a665b9d48249c765377f6f047b0259310dfdd45ee0e4b85a31907c7635ecee; Path=/
|
70
|
+
Cache-Control:
|
71
|
+
- no-cache, no-store, must-revalidate
|
72
|
+
body:
|
73
|
+
string: "{\"merchant\":\"<TNS_MERCHANT_ID>\",\"session\":{\"id\":\"SESSION0002019574105M4098673I82\",\"updateStatus\":\"SUCCESS\",\"version\":\"dff8884502\"},\"sourceOfFunds\":{\"provided\":{\"card\":{\"brand\":\"VISA\",\"expiry\":{\"month\":\"5\",\"year\":\"17\"},\"fundingMethod\":\"CREDIT\",\"number\":\"400555xxxxxx0001\",\"scheme\":\"VISA\",\"securityCode\":\"xxx\"}},\"type\":\"CARD\"},\"version\":\"32\"}"
|
74
|
+
http_version:
|
75
|
+
recorded_at: Mon, 11 Jan 2016 23:51:15 GMT
|
76
|
+
- request:
|
77
|
+
method: put
|
78
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/3DSecureId/65ccba0dc0797b93da4d0d0544d00cfcb8d54c4d
|
79
|
+
body:
|
80
|
+
string: "{\"apiOperation\":\"CHECK_3DS_ENROLLMENT\",\"3DSecure\":{\"authenticationRedirect\":{\"pageGenerationMode\":\"CUSTOMIZED\",\"responseUrl\":\"http://google.com\"}},\"session\":{\"id\":\"SESSION0002019574105M4098673I82\"},\"order\":{\"amount\":\"100.00\",\"currency\":\"EUR\"}}"
|
81
|
+
headers:
|
82
|
+
Accept:
|
83
|
+
- "*/*"
|
84
|
+
Content-Length:
|
85
|
+
- "243"
|
86
|
+
Content-Type:
|
87
|
+
- Application/json;charset=UTF-8
|
88
|
+
Accept-Encoding:
|
89
|
+
- gzip, deflate
|
90
|
+
response:
|
91
|
+
status:
|
92
|
+
code: 400
|
93
|
+
message: Bad Request
|
94
|
+
headers:
|
95
|
+
Content-Length:
|
96
|
+
- "173"
|
97
|
+
Content-Type:
|
98
|
+
- application/json;charset=UTF-8
|
99
|
+
Date:
|
100
|
+
- Mon, 11 Jan 2016 23:51:14 GMT
|
101
|
+
Pragma:
|
102
|
+
- no-cache
|
103
|
+
Expires:
|
104
|
+
- "0"
|
105
|
+
Set-Cookie:
|
106
|
+
- TS018aacab=01c9ad79a03296ec5867ae2026006a379b6119aa45e009c45c94d2794ff069cf0c583a0caf; Path=/
|
107
|
+
Cache-Control:
|
108
|
+
- no-cache, no-store, must-revalidate
|
109
|
+
X-Cnection:
|
110
|
+
- close
|
111
|
+
body:
|
112
|
+
string: "{\"error\":{\"cause\":\"INVALID_REQUEST\",\"explanation\":\"Merchant : Everyday Hero Pty Ltd is not configured to support 3D Secure operations for this card type.\"},\"result\":\"ERROR\"}"
|
113
|
+
http_version:
|
114
|
+
recorded_at: Mon, 11 Jan 2016 23:51:15 GMT
|
@@ -0,0 +1,112 @@
|
|
1
|
+
---
|
2
|
+
recorded_with: VCR 2.9.3
|
3
|
+
http_interactions:
|
4
|
+
- request:
|
5
|
+
method: post
|
6
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/session
|
7
|
+
body:
|
8
|
+
string: ""
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*"
|
12
|
+
Content-Type:
|
13
|
+
- Application/json;charset=UTF-8
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip, deflate
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 201
|
19
|
+
message: Created
|
20
|
+
headers:
|
21
|
+
Content-Length:
|
22
|
+
- "149"
|
23
|
+
Content-Type:
|
24
|
+
- application/json;charset=UTF-8
|
25
|
+
Date:
|
26
|
+
- Mon, 11 Jan 2016 23:51:12 GMT
|
27
|
+
Pragma:
|
28
|
+
- no-cache
|
29
|
+
Expires:
|
30
|
+
- "0"
|
31
|
+
Set-Cookie:
|
32
|
+
- TS018aacab=01c9ad79a0c60f40c76dbf326595c6bc70d210a981d4645792f9f90d7743d0cfd0897f0124; Path=/
|
33
|
+
Cache-Control:
|
34
|
+
- no-cache, no-store, must-revalidate
|
35
|
+
body:
|
36
|
+
string: "{\"merchant\":\"<TNS_MERCHANT_ID>\",\"result\":\"SUCCESS\",\"session\":{\"id\":\"SESSION0002349344166L7073972K85\",\"updateStatus\":\"NO_UPDATE\",\"version\":\"43d96eab01\"}}"
|
37
|
+
http_version:
|
38
|
+
recorded_at: Mon, 11 Jan 2016 23:51:13 GMT
|
39
|
+
- request:
|
40
|
+
method: put
|
41
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/session/SESSION0002349344166L7073972K85
|
42
|
+
body:
|
43
|
+
string: "{\"sourceOfFunds\":{\"type\":\"CARD\",\"provided\":{\"card\":{\"number\":\"4005550000000001\",\"expiry\":{\"month\":\"5\",\"year\":\"17\"},\"securityCode\":\"123\"}}}}"
|
44
|
+
headers:
|
45
|
+
Accept:
|
46
|
+
- "*/*"
|
47
|
+
Content-Length:
|
48
|
+
- "139"
|
49
|
+
Content-Type:
|
50
|
+
- Application/json;charset=UTF-8
|
51
|
+
Accept-Encoding:
|
52
|
+
- gzip, deflate
|
53
|
+
response:
|
54
|
+
status:
|
55
|
+
code: 200
|
56
|
+
message: OK
|
57
|
+
headers:
|
58
|
+
Content-Length:
|
59
|
+
- "337"
|
60
|
+
Content-Type:
|
61
|
+
- application/json;charset=UTF-8
|
62
|
+
Date:
|
63
|
+
- Mon, 11 Jan 2016 23:51:13 GMT
|
64
|
+
Pragma:
|
65
|
+
- no-cache
|
66
|
+
Expires:
|
67
|
+
- "0"
|
68
|
+
Set-Cookie:
|
69
|
+
- TS018aacab=01c9ad79a01f8a0f43774fac25c77e314f73b74985f1ee45251c3e2ce336977766e6cf5335; Path=/
|
70
|
+
Cache-Control:
|
71
|
+
- no-cache, no-store, must-revalidate
|
72
|
+
body:
|
73
|
+
string: "{\"merchant\":\"<TNS_MERCHANT_ID>\",\"session\":{\"id\":\"SESSION0002349344166L7073972K85\",\"updateStatus\":\"SUCCESS\",\"version\":\"75b57d6e02\"},\"sourceOfFunds\":{\"provided\":{\"card\":{\"brand\":\"VISA\",\"expiry\":{\"month\":\"5\",\"year\":\"17\"},\"fundingMethod\":\"CREDIT\",\"number\":\"400555xxxxxx0001\",\"scheme\":\"VISA\",\"securityCode\":\"xxx\"}},\"type\":\"CARD\"},\"version\":\"32\"}"
|
74
|
+
http_version:
|
75
|
+
recorded_at: Mon, 11 Jan 2016 23:51:14 GMT
|
76
|
+
- request:
|
77
|
+
method: put
|
78
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/order/10000001602/transaction/PAY
|
79
|
+
body:
|
80
|
+
string: "{\"apiOperation\":\"PAY\",\"order\":{\"amount\":\"100.00\",\"currency\":\"EUR\",\"reference\":\"PAY\"},\"transaction\":{\"reference\":\"PAY\"},\"sourceOfFunds\":{\"type\":\"CARD\"},\"session\":{\"id\":\"SESSION0002349344166L7073972K85\"}}"
|
81
|
+
headers:
|
82
|
+
Accept:
|
83
|
+
- "*/*"
|
84
|
+
Content-Length:
|
85
|
+
- "202"
|
86
|
+
Content-Type:
|
87
|
+
- Application/json;charset=UTF-8
|
88
|
+
Accept-Encoding:
|
89
|
+
- gzip, deflate
|
90
|
+
response:
|
91
|
+
status:
|
92
|
+
code: 201
|
93
|
+
message: Created
|
94
|
+
headers:
|
95
|
+
Content-Length:
|
96
|
+
- "1610"
|
97
|
+
Content-Type:
|
98
|
+
- application/json;charset=UTF-8
|
99
|
+
Date:
|
100
|
+
- Mon, 11 Jan 2016 23:51:13 GMT
|
101
|
+
Pragma:
|
102
|
+
- no-cache
|
103
|
+
Expires:
|
104
|
+
- "0"
|
105
|
+
Set-Cookie:
|
106
|
+
- TS018aacab=01c9ad79a0a8dd38e9e052f9023b6c35ae14d889e0f74a18014dc274cd485b412b7c4282ea; Path=/
|
107
|
+
Cache-Control:
|
108
|
+
- no-cache, no-store, must-revalidate
|
109
|
+
body:
|
110
|
+
string: "{\"gatewayEntryPoint\":\"WEB_SERVICES_API\",\"merchant\":\"<TNS_MERCHANT_ID>\",\"order\":{\"amount\":100.00,\"creationTime\":\"2016-01-11T23:51:13.668Z\",\"currency\":\"EUR\",\"id\":\"10000001602\",\"reference\":\"PAY\",\"status\":\"CAPTURED\",\"totalAuthorizedAmount\":100.00,\"totalCapturedAmount\":100.00,\"totalRefundedAmount\":0.00},\"response\":{\"acquirerCode\":\"00\",\"acquirerMessage\":\"Approved\",\"cardSecurityCode\":{\"acquirerCode\":\"1\",\"gatewayCode\":\"NOT_PROCESSED\"},\"gatewayCode\":\"APPROVED\"},\"result\":\"SUCCESS\",\"risk\":{\"response\":{\"gatewayCode\":\"ACCEPTED\",\"review\":{\"decision\":\"NOT_REQUIRED\"},\"rule\":[{\"data\":\"400555\",\"name\":\"MERCHANT_BIN_RANGE\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"data\":\"P\",\"name\":\"MERCHANT_CSC\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"name\":\"SUSPECT_CARD_LIST\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"name\":\"TRUSTED_CARD_LIST\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"data\":\"400555\",\"name\":\"MSO_BIN_RANGE\",\"recommendation\":\"NO_ACTION\",\"type\":\"MSO_RULE\"},{\"data\":\"P\",\"name\":\"MSO_CSC\",\"recommendation\":\"NO_ACTION\",\"type\":\"MSO_RULE\"}]}},\"sourceOfFunds\":{\"provided\":{\"card\":{\"brand\":\"VISA\",\"expiry\":{\"month\":\"5\",\"year\":\"17\"},\"fundingMethod\":\"CREDIT\",\"issuer\":\"JPMORGAN CHASE BANK, N.A.\",\"number\":\"400555xxxxxx0001\",\"scheme\":\"VISA\"}},\"type\":\"CARD\"},\"timeOfRecord\":\"2016-01-11T23:51:13.668Z\",\"transaction\":{\"acquirer\":{\"batch\":1,\"id\":\"AIB\",\"merchantId\":\"011855511\"},\"amount\":100.00,\"authorizationCode\":\"029331\",\"currency\":\"EUR\",\"frequency\":\"SINGLE\",\"id\":\"PAY\",\"receipt\":\"AAAAC5BK7Q\",\"reference\":\"PAY\",\"source\":\"MOTO\",\"terminal\":\"31208585\",\"type\":\"PAYMENT\"},\"version\":\"32\"}"
|
111
|
+
http_version:
|
112
|
+
recorded_at: Mon, 11 Jan 2016 23:51:14 GMT
|
data/test/helper.rb
CHANGED
@@ -2,3 +2,51 @@ require 'minitest/autorun'
|
|
2
2
|
require 'tns_payments'
|
3
3
|
|
4
4
|
include TNSPayments
|
5
|
+
|
6
|
+
require 'dotenv'
|
7
|
+
Dotenv.load
|
8
|
+
|
9
|
+
require 'webmock/minitest'
|
10
|
+
|
11
|
+
require 'vcr'
|
12
|
+
VCR.configure do |config|
|
13
|
+
config.cassette_library_dir = 'test/cassettes'
|
14
|
+
config.hook_into :webmock
|
15
|
+
config.default_cassette_options = {
|
16
|
+
:match_requests_on => [:method, :uri, :body, :host],
|
17
|
+
:record => :once,
|
18
|
+
}
|
19
|
+
ENV.keys.grep(/TNS_(3DS_)?(MERCHANT_ID|API_KEY)/).each do |key|
|
20
|
+
config.filter_sensitive_data("<#{key}>") { ENV.fetch(key) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def tns
|
25
|
+
@tns ||= TNSPayments.new(
|
26
|
+
:merchant_id => ENV.fetch("TNS_MERCHANT_ID"),
|
27
|
+
:api_key => ENV.fetch("TNS_API_KEY")
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def tns_3ds
|
32
|
+
@tns_3ds ||= TNSPayments.new(
|
33
|
+
:merchant_id => ENV.fetch("TNS_3DS_MERCHANT_ID"),
|
34
|
+
:api_key => ENV.fetch("TNS_3DS_API_KEY")
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def with_3ds_enabled_tns
|
39
|
+
yield(tns_3ds)
|
40
|
+
end
|
41
|
+
|
42
|
+
def with_3ds_disabled_tns
|
43
|
+
yield(tns)
|
44
|
+
end
|
45
|
+
|
46
|
+
def with_cassette
|
47
|
+
caller[0] =~ /`([^']*)'/
|
48
|
+
|
49
|
+
VCR.use_cassette($1.to_s) do
|
50
|
+
yield
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,187 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'digest'
|
4
|
+
require 'tns_payments/test_support/card_session'
|
5
|
+
|
6
|
+
class TNSPayments::OperationsTest < MiniTest::Unit::TestCase
|
7
|
+
def test_available
|
8
|
+
with_cassette do
|
9
|
+
assert tns.available?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_mastercard_successful_purchase
|
14
|
+
order_id = 1
|
15
|
+
|
16
|
+
with_cassette do
|
17
|
+
session = TestSupport::CardSession.sample(:mastercard, tns)
|
18
|
+
transaction = create_transaction(order_id)
|
19
|
+
result = tns.purchase(transaction, session)
|
20
|
+
response = result.response
|
21
|
+
|
22
|
+
assert result.success?
|
23
|
+
assert_equal 'CAPTURED', response['order']['status']
|
24
|
+
assert_equal 'MASTERCARD', response['sourceOfFunds']['provided']['card']['brand']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_visa_successful_purchase
|
29
|
+
order_id = 2
|
30
|
+
|
31
|
+
with_cassette do
|
32
|
+
session = TestSupport::CardSession.sample(:visa, tns)
|
33
|
+
transaction = create_transaction(order_id)
|
34
|
+
result = tns.purchase(transaction, session)
|
35
|
+
response = result.response
|
36
|
+
|
37
|
+
assert result.success?
|
38
|
+
assert_equal 'CAPTURED', response['order']['status']
|
39
|
+
assert_equal 'VISA', response['sourceOfFunds']['provided']['card']['brand']
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_amex_successful_purchase
|
44
|
+
order_id = 3
|
45
|
+
|
46
|
+
with_cassette do
|
47
|
+
session = TestSupport::CardSession.sample(:amex, tns)
|
48
|
+
transaction = create_transaction(order_id)
|
49
|
+
result = tns.purchase(transaction, session)
|
50
|
+
response = result.response
|
51
|
+
|
52
|
+
assert result.success?
|
53
|
+
assert_equal 'CAPTURED', response['order']['status']
|
54
|
+
assert_equal 'AMEX', response['sourceOfFunds']['provided']['card']['brand']
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_unsuccessful_purchase
|
59
|
+
order_id = 10
|
60
|
+
|
61
|
+
with_cassette do
|
62
|
+
transaction = create_transaction(order_id)
|
63
|
+
result = tns.purchase(transaction, "LOLSESSIONTOKEN")
|
64
|
+
response = result.response
|
65
|
+
|
66
|
+
refute result.success?
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_refund_successful_purchase
|
71
|
+
order_id = 4
|
72
|
+
|
73
|
+
with_cassette do
|
74
|
+
session = TestSupport::CardSession.sample(:visa, tns)
|
75
|
+
payment_transaction = create_transaction(order_id)
|
76
|
+
result = tns.purchase(payment_transaction, session)
|
77
|
+
response = result.response
|
78
|
+
assert result.success?
|
79
|
+
|
80
|
+
refund_transaction = create_refund_transaction(order_id)
|
81
|
+
result = tns.refund(refund_transaction)
|
82
|
+
response = result.response
|
83
|
+
assert result.success?
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_tokenise_creditcard_from_session_for_later_purchase
|
88
|
+
order_id = 5
|
89
|
+
|
90
|
+
with_cassette do
|
91
|
+
session = TestSupport::CardSession.sample(:visa, tns)
|
92
|
+
result = tns.create_credit_card_token(session)
|
93
|
+
response = result.response
|
94
|
+
|
95
|
+
assert result.success?
|
96
|
+
token = response['token']
|
97
|
+
refute_nil token
|
98
|
+
|
99
|
+
transaction = create_transaction(order_id)
|
100
|
+
assert tns.purchase(transaction, token).success?
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_deleting_tokenised_card
|
105
|
+
successful_order_id = 6
|
106
|
+
failed_order_id = 7
|
107
|
+
successful_transaction = create_transaction(successful_order_id)
|
108
|
+
failed_transaction = create_transaction(failed_order_id)
|
109
|
+
|
110
|
+
with_cassette do
|
111
|
+
session = TestSupport::CardSession.sample(:visa, tns)
|
112
|
+
token = tns.create_credit_card_token(session).response['token']
|
113
|
+
|
114
|
+
assert tns.purchase(successful_transaction, token).success?
|
115
|
+
assert tns.delete_credit_card_token(token).success?
|
116
|
+
refute tns.purchase(failed_transaction, token).success?
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_card_enrolled_for_3ds
|
121
|
+
order_id = 8
|
122
|
+
|
123
|
+
with_3ds_enabled_tns do |tns|
|
124
|
+
with_cassette do
|
125
|
+
session = TestSupport::CardSession.sample(:visa_enrolled_3ds, tns)
|
126
|
+
transaction = create_transaction(order_id, :currency => "GBP")
|
127
|
+
|
128
|
+
result = tns.check_enrollment(transaction, session, "http://google.com")
|
129
|
+
assert result.success?
|
130
|
+
assert_equal 'CARD_ENROLLED', result.response['3DSecure']['summaryStatus']
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_card_not_enrolled_for_3ds
|
136
|
+
order_id = 9
|
137
|
+
|
138
|
+
with_3ds_enabled_tns do |tns|
|
139
|
+
with_cassette do
|
140
|
+
session = TestSupport::CardSession.sample(:visa_not_enrolled_3ds, tns)
|
141
|
+
transaction = create_transaction(order_id, :currency => "GBP")
|
142
|
+
|
143
|
+
result = tns.check_enrollment(transaction, session, "http://google.com")
|
144
|
+
assert result.success?
|
145
|
+
assert_equal 'CARD_NOT_ENROLLED', result.response['3DSecure']['summaryStatus']
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_unsupported_3ds_gateway
|
151
|
+
order_id = 10
|
152
|
+
|
153
|
+
with_3ds_disabled_tns do |tns|
|
154
|
+
with_cassette do
|
155
|
+
session = TestSupport::CardSession.sample(:visa_not_enrolled_3ds, tns)
|
156
|
+
transaction = create_transaction(order_id, :currency => "EUR")
|
157
|
+
|
158
|
+
result = tns.check_enrollment(transaction, session, "http://google.com")
|
159
|
+
refute result.success?
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
private
|
165
|
+
|
166
|
+
def create_transaction(order_id, options = {})
|
167
|
+
transaction_id = options.fetch(:transaction_id) { "PAY" }
|
168
|
+
currency = options.fetch(:currency) { "EUR" }
|
169
|
+
|
170
|
+
OpenStruct.new(
|
171
|
+
:amount => "100.00",
|
172
|
+
:currency => currency,
|
173
|
+
:order_id => prefix(order_id),
|
174
|
+
:transaction_id => transaction_id,
|
175
|
+
:reference => "PAY",
|
176
|
+
:three_domain_id => Digest::SHA1.hexdigest(prefix(order_id).to_s)
|
177
|
+
)
|
178
|
+
end
|
179
|
+
|
180
|
+
def create_refund_transaction(order_id)
|
181
|
+
create_transaction(order_id, :transaction_id => "REFUND")
|
182
|
+
end
|
183
|
+
|
184
|
+
def prefix(order_id)
|
185
|
+
1_600 + order_id
|
186
|
+
end
|
187
|
+
end
|