killbill-litle 4.0.0 → 4.0.1
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.
- checksums.yaml +4 -4
- metadata +107 -131
- data/.gitignore +0 -35
- data/.travis.yml +0 -41
- data/Gemfile +0 -3
- data/Gemfile.head +0 -5
- data/Gemfile.lock +0 -151
- data/Jarfile +0 -12
- data/Jarfile.lock +0 -66
- data/LICENSE +0 -201
- data/NEWS +0 -78
- data/README.md +0 -87
- data/Rakefile +0 -30
- data/VERSION +0 -1
- data/config.ru +0 -4
- data/db/ddl.sql +0 -82
- data/db/schema.rb +0 -83
- data/killbill-litle.gemspec +0 -53
- data/killbill.properties +0 -3
- data/litle.yml +0 -38
- data/pom.xml +0 -45
- data/release.sh +0 -61
- data/spec/litle/base_plugin_spec.rb +0 -60
- data/spec/litle/remote/certification/certification_spec.rb +0 -713
- data/spec/litle/remote/integration_spec.rb +0 -125
- data/spec/spec_helper.rb +0 -24
data/pom.xml
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<!--
|
3
|
-
~ Copyright 2010-2013 Ning, Inc.
|
4
|
-
~ Copyright 2014-2015 The Billing Project, LLC
|
5
|
-
~
|
6
|
-
~ The Billing Project licenses this file to you under the Apache License, version 2.0
|
7
|
-
~ (the "License"); you may not use this file except in compliance with the
|
8
|
-
~ License. You may obtain a copy of the License at:
|
9
|
-
~
|
10
|
-
~ http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
~
|
12
|
-
~ Unless required by applicable law or agreed to in writing, software
|
13
|
-
~ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
14
|
-
~ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
15
|
-
~ License for the specific language governing permissions and limitations
|
16
|
-
~ under the License.
|
17
|
-
-->
|
18
|
-
|
19
|
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
20
|
-
<parent>
|
21
|
-
<groupId>org.sonatype.oss</groupId>
|
22
|
-
<artifactId>oss-parent</artifactId>
|
23
|
-
<version>5</version>
|
24
|
-
</parent>
|
25
|
-
<modelVersion>4.0.0</modelVersion>
|
26
|
-
<groupId>org.kill-bill.billing.plugin.ruby</groupId>
|
27
|
-
<artifactId>litle-plugin</artifactId>
|
28
|
-
<packaging>pom</packaging>
|
29
|
-
<version>4.0.0</version>
|
30
|
-
<name>litle-plugin</name>
|
31
|
-
<url>http://github.com/killbill/killbill-litle-plugin</url>
|
32
|
-
<description>Plugin for accessing Litle as a payment gateway</description>
|
33
|
-
<licenses>
|
34
|
-
<license>
|
35
|
-
<name>Apache License 2.0</name>
|
36
|
-
<url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
|
37
|
-
<distribution>repo</distribution>
|
38
|
-
</license>
|
39
|
-
</licenses>
|
40
|
-
<scm>
|
41
|
-
<connection>scm:git:git://github.com/killbill/killbill-litle-plugin.git</connection>
|
42
|
-
<url>https://github.com/killbill/killbill-litle-plugin/</url>
|
43
|
-
<developerConnection>scm:git:git@github.com:killbill/killbill-litle-plugin.git</developerConnection>
|
44
|
-
</scm>
|
45
|
-
</project>
|
data/release.sh
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
set -e
|
2
|
-
|
3
|
-
BUNDLE=${BUNDLE-"bundle exec"}
|
4
|
-
MVN=${MVN-"mvn"}
|
5
|
-
|
6
|
-
if [ 'GNU' != "$(tar --help | grep GNU | head -1 | awk '{print $1}')" ]; then
|
7
|
-
echo 'Unable to release: make sure to use GNU tar'
|
8
|
-
exit 1
|
9
|
-
fi
|
10
|
-
|
11
|
-
if $(ruby -e'require "java"'); then
|
12
|
-
# Good
|
13
|
-
echo 'Detected JRuby'
|
14
|
-
else
|
15
|
-
echo 'Unable to release: make sure to use JRuby'
|
16
|
-
exit 1
|
17
|
-
fi
|
18
|
-
|
19
|
-
VERSION=`grep -E '<version>([0-9]+\.[0-9]+\.[0-9]+)</version>' pom.xml | sed 's/[\t \n]*<version>\(.*\)<\/version>[\t \n]*/\1/'`
|
20
|
-
if [[ -z "$NO_RELEASE" && "$VERSION" != "$(cat $PWD/VERSION)" ]]; then
|
21
|
-
echo 'Unable to release: make sure the versions in pom.xml and VERSION match'
|
22
|
-
exit 1
|
23
|
-
fi
|
24
|
-
|
25
|
-
echo 'Cleaning up'
|
26
|
-
$BUNDLE rake killbill:clean
|
27
|
-
|
28
|
-
echo 'Building gem'
|
29
|
-
$BUNDLE rake build
|
30
|
-
|
31
|
-
if [[ -z "$NO_RELEASE" ]]; then
|
32
|
-
echo 'Pushing the gem to Rubygems'
|
33
|
-
$BUNDLE rake release
|
34
|
-
fi
|
35
|
-
|
36
|
-
echo 'Building artifact'
|
37
|
-
$BUNDLE rake killbill:package
|
38
|
-
|
39
|
-
ARTIFACT="$PWD/pkg/killbill-litle-$VERSION.tar.gz"
|
40
|
-
echo "Pushing $ARTIFACT to Maven Central"
|
41
|
-
|
42
|
-
if [[ -z "$NO_RELEASE" ]]; then
|
43
|
-
GOAL=gpg:sign-and-deploy-file
|
44
|
-
REPOSITORY_ID=ossrh-releases
|
45
|
-
URL=https://oss.sonatype.org/service/local/staging/deploy/maven2/
|
46
|
-
else
|
47
|
-
GOAL=deploy:deploy-file
|
48
|
-
REPOSITORY_ID=sonatype-nexus-snapshots
|
49
|
-
URL=https://oss.sonatype.org/content/repositories/snapshots/
|
50
|
-
VERSION="$VERSION-SNAPSHOT"
|
51
|
-
fi
|
52
|
-
|
53
|
-
$MVN $GOAL \
|
54
|
-
-DgroupId=org.kill-bill.billing.plugin.ruby \
|
55
|
-
-DartifactId=litle-plugin \
|
56
|
-
-Dversion=$VERSION \
|
57
|
-
-Dpackaging=tar.gz \
|
58
|
-
-DrepositoryId=$REPOSITORY_ID \
|
59
|
-
-Durl=$URL \
|
60
|
-
-Dfile=$ARTIFACT \
|
61
|
-
-DpomFile=pom.xml
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Killbill::Litle::PaymentPlugin do
|
4
|
-
|
5
|
-
include ::Killbill::Plugin::ActiveMerchant::RSpec
|
6
|
-
|
7
|
-
before(:each) do
|
8
|
-
Dir.mktmpdir do |dir|
|
9
|
-
file = File.new(File.join(dir, 'litle.yml'), 'w+')
|
10
|
-
file.write(<<-eos)
|
11
|
-
:litle:
|
12
|
-
:test: true
|
13
|
-
# As defined by spec_helper.rb
|
14
|
-
:database:
|
15
|
-
:adapter: 'sqlite3'
|
16
|
-
:database: 'test.db'
|
17
|
-
eos
|
18
|
-
file.close
|
19
|
-
|
20
|
-
@plugin = build_plugin(::Killbill::Litle::PaymentPlugin, 'litle', File.dirname(file))
|
21
|
-
|
22
|
-
# Start the plugin here - since the config file will be deleted
|
23
|
-
@plugin.start_plugin
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should start and stop correctly' do
|
28
|
-
@plugin.stop_plugin
|
29
|
-
end
|
30
|
-
|
31
|
-
# No offsite payments integration
|
32
|
-
|
33
|
-
#xit 'should generate forms correctly' do
|
34
|
-
# kb_account_id = SecureRandom.uuid
|
35
|
-
# kb_tenant_id = SecureRandom.uuid
|
36
|
-
# context = @plugin.kb_apis.create_context(kb_tenant_id)
|
37
|
-
# fields = @plugin.hash_to_properties({
|
38
|
-
# :order_id => '1234',
|
39
|
-
# :amount => 10
|
40
|
-
# })
|
41
|
-
# form = @plugin.build_form_descriptor kb_account_id, fields, [], context
|
42
|
-
#
|
43
|
-
# form.kb_account_id.should == kb_account_id
|
44
|
-
# form.form_method.should == 'POST'
|
45
|
-
# form.form_url.should == 'https://litle.com'
|
46
|
-
#
|
47
|
-
# form_fields = @plugin.properties_to_hash(form.form_fields)
|
48
|
-
#end
|
49
|
-
|
50
|
-
#xit 'should receive notifications correctly' do
|
51
|
-
# description = 'description'
|
52
|
-
#
|
53
|
-
# kb_tenant_id = SecureRandom.uuid
|
54
|
-
# context = @plugin.kb_apis.create_context(kb_tenant_id)
|
55
|
-
# properties = @plugin.hash_to_properties({ :description => description })
|
56
|
-
#
|
57
|
-
# notification = ""
|
58
|
-
# gw_notification = @plugin.process_notification notification, properties, context
|
59
|
-
#end
|
60
|
-
end
|
@@ -1,713 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
ActiveMerchant::Billing::Base.mode = :test
|
4
|
-
|
5
|
-
describe Killbill::Litle::PaymentPlugin do
|
6
|
-
|
7
|
-
include ::Killbill::Plugin::ActiveMerchant::RSpec
|
8
|
-
|
9
|
-
before(:all) do
|
10
|
-
::Killbill::Litle::LitlePaymentMethod.delete_all
|
11
|
-
::Killbill::Litle::LitleResponse.delete_all
|
12
|
-
::Killbill::Litle::LitleTransaction.delete_all
|
13
|
-
end
|
14
|
-
|
15
|
-
after(:all) do
|
16
|
-
puts 'orderId,litleTxnId,api_call,message'
|
17
|
-
::Killbill::Litle::LitleResponse.all.each do |response|
|
18
|
-
next if response.params_litle_txn_id.blank?
|
19
|
-
puts "#{response.params_order_id},#{response.params_litle_txn_id},#{response.api_call},#{response.message}"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
before(:each) do
|
24
|
-
@plugin = build_plugin(::Killbill::Litle::PaymentPlugin, 'litle')
|
25
|
-
@plugin.start_plugin
|
26
|
-
|
27
|
-
@call_context = build_call_context
|
28
|
-
|
29
|
-
@properties = []
|
30
|
-
@pm = create_payment_method(::Killbill::Litle::LitlePaymentMethod, nil, @call_context.tenant_id, [build_property(:skip_gw, true)], {}, false)
|
31
|
-
@currency = 'USD'
|
32
|
-
|
33
|
-
kb_payment_id = SecureRandom.uuid
|
34
|
-
1.upto(8) do
|
35
|
-
@kb_payment = @plugin.kb_apis.proxied_services[:payment_api].add_payment(kb_payment_id)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
after(:each) do
|
40
|
-
@plugin.stop_plugin
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'passes certification for order id 1' do
|
44
|
-
properties = build_pm_properties(nil,
|
45
|
-
{
|
46
|
-
:cc_number => '4457010000000009',
|
47
|
-
:cc_first_name => 'John',
|
48
|
-
:cc_last_name => 'Smith',
|
49
|
-
:cc_type => 'visa',
|
50
|
-
:cc_exp_month => '01',
|
51
|
-
:cc_exp_year => '2016',
|
52
|
-
:cc_verification_value => '349',
|
53
|
-
:address1 => '1 Main St.',
|
54
|
-
:city => 'Burlington',
|
55
|
-
:state => 'MA',
|
56
|
-
:zip => '01803-3747',
|
57
|
-
:country => 'US'
|
58
|
-
},
|
59
|
-
false)
|
60
|
-
|
61
|
-
assertions = {
|
62
|
-
:avs => 'X',
|
63
|
-
:cvv => 'M'
|
64
|
-
}
|
65
|
-
|
66
|
-
txn_nb = 0
|
67
|
-
|
68
|
-
txn_nb = auth_assertions('1', 100.10, txn_nb, properties, assertions)
|
69
|
-
|
70
|
-
# 1: authorize avs
|
71
|
-
txn_nb = avs_assertions('1', txn_nb, properties, assertions)
|
72
|
-
|
73
|
-
sale_assertions('1', 100.10, txn_nb, properties, assertions)
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'passes certification for order id 2' do
|
77
|
-
properties = build_pm_properties(nil,
|
78
|
-
{
|
79
|
-
:cc_number => '5112010000000003',
|
80
|
-
:cc_first_name => 'Mike J.',
|
81
|
-
:cc_last_name => 'Hammer',
|
82
|
-
:cc_type => 'master',
|
83
|
-
:cc_exp_month => '02',
|
84
|
-
:cc_exp_year => '2016',
|
85
|
-
:cc_verification_value => '261',
|
86
|
-
:address1 => '2 Main St.',
|
87
|
-
:city => 'Riverside',
|
88
|
-
:state => 'RI',
|
89
|
-
:zip => '02915',
|
90
|
-
:country => 'US'
|
91
|
-
},
|
92
|
-
false)
|
93
|
-
|
94
|
-
assertions = {
|
95
|
-
:avs => 'Z',
|
96
|
-
:cvv => 'M'
|
97
|
-
}
|
98
|
-
|
99
|
-
txn_nb = 0
|
100
|
-
|
101
|
-
txn_nb = auth_assertions('2', 200.20, txn_nb, properties, assertions)
|
102
|
-
|
103
|
-
# 2: authorize avs
|
104
|
-
txn_nb = avs_assertions('2', txn_nb, properties, assertions)
|
105
|
-
|
106
|
-
sale_assertions('2', 200.20, txn_nb, properties, assertions)
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'passes certification for order id 3' do
|
110
|
-
properties = build_pm_properties(nil,
|
111
|
-
{
|
112
|
-
:cc_number => '6011010000000003',
|
113
|
-
:cc_first_name => 'Eileen',
|
114
|
-
:cc_last_name => 'Jones',
|
115
|
-
:cc_type => 'discover',
|
116
|
-
:cc_exp_month => '03',
|
117
|
-
:cc_exp_year => '2016',
|
118
|
-
:cc_verification_value => '758',
|
119
|
-
:address1 => '3 Main St.',
|
120
|
-
:city => 'Bloomfield',
|
121
|
-
:state => 'CT',
|
122
|
-
:zip => '06002',
|
123
|
-
:country => 'US'
|
124
|
-
},
|
125
|
-
false)
|
126
|
-
|
127
|
-
assertions = {
|
128
|
-
:avs => 'Z',
|
129
|
-
:cvv => 'M'
|
130
|
-
}
|
131
|
-
|
132
|
-
txn_nb = 0
|
133
|
-
|
134
|
-
auth_assertions('3', 300.30, txn_nb, properties, assertions)
|
135
|
-
|
136
|
-
# 3: authorize avs
|
137
|
-
txn_nb = avs_assertions('3', txn_nb, properties, assertions)
|
138
|
-
|
139
|
-
sale_assertions('3', 300.30, txn_nb, properties, assertions)
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'passes certification for order id 4' do
|
143
|
-
properties = build_pm_properties(nil,
|
144
|
-
{
|
145
|
-
:cc_number => '375001000000005',
|
146
|
-
:cc_first_name => 'Bob',
|
147
|
-
:cc_last_name => 'Black',
|
148
|
-
:cc_type => 'american_express',
|
149
|
-
:cc_exp_month => '04',
|
150
|
-
:cc_exp_year => '2016',
|
151
|
-
:cc_verification_value => '261',
|
152
|
-
:address1 => '4 Main St.',
|
153
|
-
:city => 'Laurel',
|
154
|
-
:state => 'MD',
|
155
|
-
:zip => '20708',
|
156
|
-
:country => 'US'
|
157
|
-
},
|
158
|
-
false)
|
159
|
-
|
160
|
-
assertions = {
|
161
|
-
:avs => 'A',
|
162
|
-
:cvv => nil
|
163
|
-
}
|
164
|
-
|
165
|
-
txn_nb = 0
|
166
|
-
|
167
|
-
txn_nb = auth_assertions('4', 400.40, txn_nb, properties, assertions)
|
168
|
-
|
169
|
-
# 3: authorize avs
|
170
|
-
txn_nb = avs_assertions('4', txn_nb, properties, assertions)
|
171
|
-
|
172
|
-
sale_assertions('4', 400.40, txn_nb, properties, assertions)
|
173
|
-
end
|
174
|
-
|
175
|
-
it 'passes certification for order id 6' do
|
176
|
-
properties = build_pm_properties(nil,
|
177
|
-
{
|
178
|
-
:cc_number => '4457010100000008',
|
179
|
-
:cc_first_name => 'Joe',
|
180
|
-
:cc_last_name => 'Green',
|
181
|
-
:cc_type => 'visa',
|
182
|
-
:cc_exp_month => '06',
|
183
|
-
:cc_exp_year => '2016',
|
184
|
-
:cc_verification_value => '992',
|
185
|
-
:address1 => '6 Main St.',
|
186
|
-
:city => 'Derry',
|
187
|
-
:state => 'NH',
|
188
|
-
:zip => '03038',
|
189
|
-
:country => 'US'
|
190
|
-
},
|
191
|
-
false)
|
192
|
-
|
193
|
-
assertions = {
|
194
|
-
:success => false,
|
195
|
-
:message => 'Insufficient Funds',
|
196
|
-
:avs => 'I',
|
197
|
-
:cvv => 'P'
|
198
|
-
}
|
199
|
-
|
200
|
-
txn_nb = 0
|
201
|
-
|
202
|
-
txn_nb = authorize_assertions('6', 600.60, txn_nb, properties, assertions)
|
203
|
-
txn_nb = purchase_assertions('6', 600.60, txn_nb, properties, assertions)
|
204
|
-
|
205
|
-
assertions = {
|
206
|
-
:success => false,
|
207
|
-
:message => 'No transaction found with specified litleTxnId'
|
208
|
-
}
|
209
|
-
|
210
|
-
# Cannot be run since there is no successful Auth nor Purchase
|
211
|
-
# void_assertions('6', txn_nb, properties, assertions)
|
212
|
-
end
|
213
|
-
|
214
|
-
it 'passes certification for order id 7' do
|
215
|
-
properties = build_pm_properties(nil,
|
216
|
-
{
|
217
|
-
:cc_number => '5112010100000002',
|
218
|
-
:cc_first_name => 'Jane',
|
219
|
-
:cc_last_name => 'Murray',
|
220
|
-
:cc_type => 'master',
|
221
|
-
:cc_exp_month => '07',
|
222
|
-
:cc_exp_year => '2016',
|
223
|
-
:cc_verification_value => '992',
|
224
|
-
:address1 => '7 Main St.',
|
225
|
-
:city => 'Amesbury',
|
226
|
-
:state => 'MA',
|
227
|
-
:zip => '01913',
|
228
|
-
:country => 'US'
|
229
|
-
},
|
230
|
-
false)
|
231
|
-
|
232
|
-
assertions = {
|
233
|
-
:success => false,
|
234
|
-
:message => 'Invalid Account Number',
|
235
|
-
:avs => 'I',
|
236
|
-
:cvv => 'N'
|
237
|
-
}
|
238
|
-
|
239
|
-
txn_nb = 0
|
240
|
-
|
241
|
-
txn_nb = authorize_assertions('7', 700.70, txn_nb, properties, assertions)
|
242
|
-
txn_nb = avs_assertions('7', txn_nb, properties, assertions)
|
243
|
-
purchase_assertions('7', 700.70, txn_nb, properties, assertions)
|
244
|
-
end
|
245
|
-
|
246
|
-
it 'passes certification for order id 8' do
|
247
|
-
properties = build_pm_properties(nil,
|
248
|
-
{
|
249
|
-
:cc_number => '6011010100000002',
|
250
|
-
:cc_first_name => 'Mark',
|
251
|
-
:cc_last_name => 'Johnson',
|
252
|
-
:cc_type => 'discover',
|
253
|
-
:cc_exp_month => '08',
|
254
|
-
:cc_exp_year => '2016',
|
255
|
-
:cc_verification_value => '184',
|
256
|
-
:address1 => '8 Main St.',
|
257
|
-
:city => 'Manchester',
|
258
|
-
:state => 'MH',
|
259
|
-
:zip => '03101',
|
260
|
-
:country => 'US'
|
261
|
-
},
|
262
|
-
false)
|
263
|
-
|
264
|
-
assertions = {
|
265
|
-
:success => false,
|
266
|
-
:message => 'Call Discover',
|
267
|
-
:avs => 'I',
|
268
|
-
:cvv => 'P'
|
269
|
-
}
|
270
|
-
|
271
|
-
txn_nb = 0
|
272
|
-
|
273
|
-
txn_nb = authorize_assertions('8', 800.80, txn_nb, properties, assertions)
|
274
|
-
txn_nb = avs_assertions('8', txn_nb, properties, assertions)
|
275
|
-
purchase_assertions('8', 800.80, txn_nb, properties, assertions)
|
276
|
-
end
|
277
|
-
|
278
|
-
it 'passes certification for order id 9' do
|
279
|
-
properties = build_pm_properties(nil,
|
280
|
-
{
|
281
|
-
:cc_number => '375001010000003',
|
282
|
-
:cc_first_name => 'James',
|
283
|
-
:cc_last_name => 'Miller',
|
284
|
-
:cc_type => 'american_express',
|
285
|
-
:cc_exp_month => '09',
|
286
|
-
:cc_exp_year => '2016',
|
287
|
-
:cc_verification_value => '0421',
|
288
|
-
:address1 => '9 Main St.',
|
289
|
-
:city => 'Boston',
|
290
|
-
:state => 'MA',
|
291
|
-
:zip => '02134',
|
292
|
-
:country => 'US'
|
293
|
-
},
|
294
|
-
false)
|
295
|
-
|
296
|
-
assertions = {
|
297
|
-
:success => false,
|
298
|
-
:message => 'Pick Up Card',
|
299
|
-
:avs => 'I'
|
300
|
-
}
|
301
|
-
|
302
|
-
txn_nb = 0
|
303
|
-
|
304
|
-
txn_nb = authorize_assertions('9', 900.90, txn_nb, properties, assertions)
|
305
|
-
txn_nb = avs_assertions('9', txn_nb, properties, assertions)
|
306
|
-
purchase_assertions('9', 900.90, txn_nb, properties, assertions)
|
307
|
-
end
|
308
|
-
|
309
|
-
it 'passes certification for order id 32' do
|
310
|
-
properties = build_pm_properties(nil,
|
311
|
-
{
|
312
|
-
:cc_number => '4457010000000009',
|
313
|
-
:cc_first_name => 'John',
|
314
|
-
:cc_last_name => 'Smith',
|
315
|
-
:cc_type => 'visa',
|
316
|
-
:cc_exp_month => '01',
|
317
|
-
:cc_exp_year => '2016',
|
318
|
-
:cc_verification_value => '349',
|
319
|
-
:address1 => '1 Main St.',
|
320
|
-
:city => 'Burlington',
|
321
|
-
:state => 'MA',
|
322
|
-
:zip => '01803-3747',
|
323
|
-
:country => 'US'
|
324
|
-
},
|
325
|
-
false)
|
326
|
-
|
327
|
-
assertions = {}
|
328
|
-
|
329
|
-
txn_nb = 0
|
330
|
-
|
331
|
-
txn_nb = authorize_assertions('32', 100.10, txn_nb, properties, assertions)
|
332
|
-
|
333
|
-
txn_nb = capture_assertions('32A', 50.50, txn_nb, properties, assertions)
|
334
|
-
|
335
|
-
assertions = {
|
336
|
-
:success => false,
|
337
|
-
:message => 'Authorization amount has already been depleted'
|
338
|
-
}
|
339
|
-
|
340
|
-
properties << build_property(:linked_transaction_type, :authorize)
|
341
|
-
|
342
|
-
void_assertions('32B', txn_nb, properties, assertions)
|
343
|
-
end
|
344
|
-
|
345
|
-
it 'passes certification for order id 33' do
|
346
|
-
properties = build_pm_properties(nil,
|
347
|
-
{
|
348
|
-
:cc_number => '5112010000000003',
|
349
|
-
:cc_first_name => 'Mike J.',
|
350
|
-
:cc_last_name => 'Hammer',
|
351
|
-
:cc_type => 'master',
|
352
|
-
:cc_exp_month => '02',
|
353
|
-
:cc_exp_year => '2016',
|
354
|
-
:cc_verification_value => '261',
|
355
|
-
:address1 => '2 Main St.',
|
356
|
-
:city => 'Riverside',
|
357
|
-
:state => 'RI',
|
358
|
-
:zip => '02915',
|
359
|
-
:country => 'US'
|
360
|
-
},
|
361
|
-
false)
|
362
|
-
|
363
|
-
assertions = {}
|
364
|
-
|
365
|
-
txn_nb = 0
|
366
|
-
|
367
|
-
txn_nb = authorize_assertions('33', 200.20, txn_nb, properties, assertions)
|
368
|
-
|
369
|
-
properties << build_property(:linked_transaction_type, :authorize)
|
370
|
-
|
371
|
-
void_assertions('33A', txn_nb, properties, assertions)
|
372
|
-
end
|
373
|
-
|
374
|
-
it 'passes certification for order id 34' do
|
375
|
-
properties = build_pm_properties(nil,
|
376
|
-
{
|
377
|
-
:cc_number => '6011010000000003',
|
378
|
-
:cc_first_name => 'Eileen',
|
379
|
-
:cc_last_name => 'Jones',
|
380
|
-
:cc_type => 'discover',
|
381
|
-
:cc_exp_month => '03',
|
382
|
-
:cc_exp_year => '2016',
|
383
|
-
:cc_verification_value => '261',
|
384
|
-
:address1 => '3 Main St.',
|
385
|
-
:city => 'Bloomfield',
|
386
|
-
:state => 'CT',
|
387
|
-
:zip => '06002',
|
388
|
-
:country => 'US'
|
389
|
-
},
|
390
|
-
false)
|
391
|
-
|
392
|
-
assertions = {}
|
393
|
-
|
394
|
-
txn_nb = 0
|
395
|
-
|
396
|
-
txn_nb = authorize_assertions('34', 300.30, txn_nb, properties, assertions)
|
397
|
-
|
398
|
-
properties << build_property(:linked_transaction_type, :authorize)
|
399
|
-
|
400
|
-
void_assertions('34A', txn_nb, properties, assertions)
|
401
|
-
end
|
402
|
-
|
403
|
-
it 'passes certification for order id 35' do
|
404
|
-
properties = build_pm_properties(nil,
|
405
|
-
{
|
406
|
-
:cc_number => '375001000000005',
|
407
|
-
:cc_first_name => 'Bob',
|
408
|
-
:cc_last_name => 'Black',
|
409
|
-
:cc_type => 'american_express',
|
410
|
-
:cc_exp_month => '04',
|
411
|
-
:cc_exp_year => '2016',
|
412
|
-
:cc_verification_value => '261',
|
413
|
-
:address1 => '4 Main St.',
|
414
|
-
:city => 'Laurel',
|
415
|
-
:state => 'MD',
|
416
|
-
:zip => '20708',
|
417
|
-
:country => 'US'
|
418
|
-
},
|
419
|
-
false)
|
420
|
-
|
421
|
-
assertions = {}
|
422
|
-
|
423
|
-
txn_nb = 0
|
424
|
-
|
425
|
-
txn_nb = authorize_assertions('35', 101.00, txn_nb, properties, assertions)
|
426
|
-
|
427
|
-
txn_nb = capture_assertions('35A', 50.50, txn_nb, properties, assertions)
|
428
|
-
|
429
|
-
assertions = {
|
430
|
-
:success => false,
|
431
|
-
:message => 'Reversal amount does not match Authorization amount'
|
432
|
-
}
|
433
|
-
|
434
|
-
properties << build_property(:linked_transaction_type, :authorize)
|
435
|
-
|
436
|
-
# ActiveMerchant doesn't pass an amount in the void call
|
437
|
-
#void_assertions('35B', txn_nb, properties, assertions)
|
438
|
-
end
|
439
|
-
|
440
|
-
it 'passes certification for order id 36' do
|
441
|
-
properties = build_pm_properties(nil,
|
442
|
-
{
|
443
|
-
:cc_number => '375000026600004',
|
444
|
-
:cc_type => 'american_express',
|
445
|
-
:cc_exp_month => '05',
|
446
|
-
:cc_exp_year => '2016'
|
447
|
-
},
|
448
|
-
false)
|
449
|
-
|
450
|
-
assertions = {}
|
451
|
-
|
452
|
-
txn_nb = 0
|
453
|
-
|
454
|
-
txn_nb = authorize_assertions('36', 205.00, txn_nb, properties, assertions)
|
455
|
-
|
456
|
-
assertions = {
|
457
|
-
:success => false,
|
458
|
-
:message => 'Reversal amount does not match Authorization amount'
|
459
|
-
}
|
460
|
-
|
461
|
-
properties << build_property(:linked_transaction_type, :authorize)
|
462
|
-
properties << build_property(:amount, 10000)
|
463
|
-
|
464
|
-
# ActiveMerchant doesn't pass an amount in the void call
|
465
|
-
#void_assertions('36A', txn_nb, properties, assertions)
|
466
|
-
end
|
467
|
-
|
468
|
-
# Conflicts with 52
|
469
|
-
xit 'passes certification for order id 50' do
|
470
|
-
properties = build_pm_properties(nil,
|
471
|
-
{
|
472
|
-
:cc_number => '4457119922390123'
|
473
|
-
},
|
474
|
-
false)
|
475
|
-
|
476
|
-
assertions = {
|
477
|
-
:success => false,
|
478
|
-
:message => 'Account number was successfully registered'
|
479
|
-
}
|
480
|
-
|
481
|
-
store_assertions('50', properties, assertions)
|
482
|
-
end
|
483
|
-
|
484
|
-
it 'passes certification for order id 51' do
|
485
|
-
properties = build_pm_properties(nil,
|
486
|
-
{
|
487
|
-
:cc_number => '4457119999999999'
|
488
|
-
},
|
489
|
-
false)
|
490
|
-
|
491
|
-
assertions = {
|
492
|
-
:success => false,
|
493
|
-
:message => 'Credit card number was invalid'
|
494
|
-
}
|
495
|
-
|
496
|
-
store_assertions('51', properties, assertions)
|
497
|
-
end
|
498
|
-
|
499
|
-
it 'passes certification for order id 52' do
|
500
|
-
properties = build_pm_properties(nil,
|
501
|
-
{
|
502
|
-
:cc_number => '4457119922390123'
|
503
|
-
},
|
504
|
-
false)
|
505
|
-
|
506
|
-
assertions = {
|
507
|
-
:success => false,
|
508
|
-
:message => 'Account number was previously registered'
|
509
|
-
}
|
510
|
-
|
511
|
-
store_assertions('52', properties, assertions)
|
512
|
-
end
|
513
|
-
|
514
|
-
it 'passes certification for PayPage test case 14' do
|
515
|
-
properties = build_pm_properties(nil,
|
516
|
-
{
|
517
|
-
:cc_exp_month => '12',
|
518
|
-
:cc_exp_year => '2030',
|
519
|
-
:cc_verification_value => '987',
|
520
|
-
:paypageRegistrationId => 'cDZJcmd1VjNlYXNaSlRMTGpocVZQY1NWVXE4ZW5UTko4NU9KK3p1L1p1Vzg4YzVPQVlSUHNITG1JN2I0NzlyTg=='
|
521
|
-
},
|
522
|
-
false)
|
523
|
-
|
524
|
-
assertions = {
|
525
|
-
:success => false,
|
526
|
-
:message => 'Token was not found'
|
527
|
-
}
|
528
|
-
|
529
|
-
txn_nb = 0
|
530
|
-
|
531
|
-
authorize_assertions('14', 100.10, txn_nb, properties, assertions)
|
532
|
-
end
|
533
|
-
|
534
|
-
it 'passes certification for PayPage test case 15' do
|
535
|
-
properties = build_pm_properties(nil,
|
536
|
-
{
|
537
|
-
:cc_exp_month => '12',
|
538
|
-
:cc_exp_year => '2030',
|
539
|
-
:cc_verification_value => '987',
|
540
|
-
:paypageRegistrationId => 'RGFQNCt6U1d1M21SeVByVTM4dHlHb1FsVkUrSmpnWXhNY0o5UkMzRlZFanZiUHVnYjN1enJXbG1WSDF4aXlNcA=='
|
541
|
-
},
|
542
|
-
false)
|
543
|
-
|
544
|
-
assertions = {
|
545
|
-
:success => false,
|
546
|
-
:message => 'Expired paypage registration id'
|
547
|
-
}
|
548
|
-
|
549
|
-
txn_nb = 0
|
550
|
-
|
551
|
-
authorize_assertions('15', 100.10, txn_nb, properties, assertions)
|
552
|
-
end
|
553
|
-
|
554
|
-
private
|
555
|
-
|
556
|
-
def avs_assertions(order_id, txn_nb, properties, assertions = {})
|
557
|
-
authorize_assertions(order_id, 0, txn_nb, properties, assertions)
|
558
|
-
end
|
559
|
-
|
560
|
-
def auth_assertions(order_id, amount, txn_nb, properties, assertions = {})
|
561
|
-
assertions = assertions.clone
|
562
|
-
|
563
|
-
# 1: authorize
|
564
|
-
txn_nb = authorize_assertions(order_id, amount, txn_nb, properties, assertions)
|
565
|
-
|
566
|
-
# No more AVS / CVV checks
|
567
|
-
assertions.delete(:avs)
|
568
|
-
assertions.delete(:cvv)
|
569
|
-
|
570
|
-
# 1A: capture
|
571
|
-
txn_nb = capture_assertions("#{order_id}A", amount, txn_nb, properties, assertions)
|
572
|
-
|
573
|
-
# 1B: credit
|
574
|
-
txn_nb = credit_assertions("#{order_id}B", amount, txn_nb, properties, assertions)
|
575
|
-
|
576
|
-
# 1C: void
|
577
|
-
void_assertions("#{order_id}C", txn_nb, properties, assertions)
|
578
|
-
end
|
579
|
-
|
580
|
-
def sale_assertions(order_id, amount, txn_nb, properties, assertions = {})
|
581
|
-
assertions = assertions.clone
|
582
|
-
|
583
|
-
# 1: sale
|
584
|
-
txn_nb = purchase_assertions(order_id, amount, txn_nb, properties, assertions)
|
585
|
-
|
586
|
-
# No more AVS / CVV checks
|
587
|
-
assertions.delete(:avs)
|
588
|
-
assertions.delete(:cvv)
|
589
|
-
|
590
|
-
# 1B: credit
|
591
|
-
txn_nb = credit_assertions("#{order_id}B", amount, txn_nb, properties, assertions)
|
592
|
-
|
593
|
-
# 1C: void
|
594
|
-
void_assertions("#{order_id}C", txn_nb, properties, assertions)
|
595
|
-
end
|
596
|
-
|
597
|
-
def authorize_assertions(order_id, amount, txn_nb, properties, assertions = {})
|
598
|
-
properties = properties.clone
|
599
|
-
properties << build_property(:order_id, order_id)
|
600
|
-
|
601
|
-
payment_response = @plugin.authorize_payment(@pm.kb_account_id,
|
602
|
-
@kb_payment.id,
|
603
|
-
@kb_payment.transactions[txn_nb].id,
|
604
|
-
@pm.kb_payment_method_id,
|
605
|
-
amount,
|
606
|
-
@currency,
|
607
|
-
properties,
|
608
|
-
@call_context)
|
609
|
-
common_checks(payment_response, assertions)
|
610
|
-
|
611
|
-
txn_nb + 1
|
612
|
-
end
|
613
|
-
|
614
|
-
def capture_assertions(order_id, amount, txn_nb, properties, assertions = {})
|
615
|
-
properties = properties.clone
|
616
|
-
properties << build_property(:order_id, order_id)
|
617
|
-
|
618
|
-
payment_response = @plugin.capture_payment(@pm.kb_account_id,
|
619
|
-
@kb_payment.id,
|
620
|
-
@kb_payment.transactions[txn_nb].id,
|
621
|
-
@pm.kb_payment_method_id,
|
622
|
-
amount,
|
623
|
-
@currency,
|
624
|
-
properties,
|
625
|
-
@call_context)
|
626
|
-
common_checks(payment_response, assertions)
|
627
|
-
|
628
|
-
txn_nb + 1
|
629
|
-
end
|
630
|
-
|
631
|
-
def purchase_assertions(order_id, amount, txn_nb, properties, assertions = {})
|
632
|
-
properties = properties.clone
|
633
|
-
properties << build_property(:order_id, order_id)
|
634
|
-
|
635
|
-
payment_response = @plugin.purchase_payment(@pm.kb_account_id,
|
636
|
-
@kb_payment.id,
|
637
|
-
@kb_payment.transactions[txn_nb].id,
|
638
|
-
@pm.kb_payment_method_id,
|
639
|
-
amount,
|
640
|
-
@currency,
|
641
|
-
properties,
|
642
|
-
@call_context)
|
643
|
-
common_checks(payment_response, assertions)
|
644
|
-
|
645
|
-
txn_nb + 1
|
646
|
-
end
|
647
|
-
|
648
|
-
def credit_assertions(order_id, amount, txn_nb, properties, assertions = {})
|
649
|
-
# TODO Unsupported by ActiveMerchant
|
650
|
-
return txn_nb + 1
|
651
|
-
|
652
|
-
properties = properties.clone
|
653
|
-
properties << build_property(:order_id, order_id)
|
654
|
-
|
655
|
-
payment_response = @plugin.credit_payment(@pm.kb_account_id,
|
656
|
-
@kb_payment.id,
|
657
|
-
@kb_payment.transactions[txn_nb].id,
|
658
|
-
@pm.kb_payment_method_id,
|
659
|
-
amount,
|
660
|
-
@currency,
|
661
|
-
properties,
|
662
|
-
@call_context)
|
663
|
-
common_checks(payment_response, assertions)
|
664
|
-
|
665
|
-
txn_nb + 1
|
666
|
-
end
|
667
|
-
|
668
|
-
def void_assertions(order_id, txn_nb, properties, assertions = {})
|
669
|
-
properties = properties.clone
|
670
|
-
properties << build_property(:order_id, order_id)
|
671
|
-
|
672
|
-
payment_response = @plugin.void_payment(@pm.kb_account_id,
|
673
|
-
@kb_payment.id,
|
674
|
-
@kb_payment.transactions[txn_nb].id,
|
675
|
-
@pm.kb_payment_method_id,
|
676
|
-
properties,
|
677
|
-
@call_context)
|
678
|
-
common_checks(payment_response, assertions)
|
679
|
-
|
680
|
-
txn_nb + 1
|
681
|
-
end
|
682
|
-
|
683
|
-
def common_checks(payment_response, assertions = {})
|
684
|
-
assertions[:success] = true if assertions[:success].nil?
|
685
|
-
payment_response.status.should eq(assertions[:success] ? :PROCESSED : :ERROR), payment_response.gateway_error
|
686
|
-
payment_response.gateway_error.should == (assertions[:message] || 'Approved')
|
687
|
-
check_property(payment_response.properties, 'avsResultCode', assertions[:avs]) if assertions[:avs]
|
688
|
-
check_property(payment_response.properties, 'cvvResultCode', assertions[:cvv]) if assertions[:cvv]
|
689
|
-
end
|
690
|
-
|
691
|
-
def check_property(properties, key, value)
|
692
|
-
(properties.find { |prop| prop.key == key }).value.should == value
|
693
|
-
end
|
694
|
-
|
695
|
-
def store_assertions(order_id, properties, assertions = {})
|
696
|
-
properties = properties.clone
|
697
|
-
properties << build_property(:order_id, order_id)
|
698
|
-
|
699
|
-
info = Killbill::Plugin::Model::PaymentMethodPlugin.new
|
700
|
-
info.properties = []
|
701
|
-
|
702
|
-
@plugin.add_payment_method(@pm.kb_account_id,
|
703
|
-
@pm.kb_payment_method_id,
|
704
|
-
info,
|
705
|
-
true,
|
706
|
-
properties,
|
707
|
-
@call_context)
|
708
|
-
rescue => e
|
709
|
-
e.message.should == assertions[:message]
|
710
|
-
ensure
|
711
|
-
::Killbill::Litle::LitleResponse.last.message.should == assertions[:message]
|
712
|
-
end
|
713
|
-
end
|