killbill-braintree_blue 0.3.0 → 0.3.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 +103 -128
- data/.gitignore +0 -35
- data/.travis.yml +0 -41
- data/Gemfile +0 -3
- data/Gemfile.head +0 -5
- data/Gemfile.lock +0 -152
- data/Jarfile +0 -12
- data/Jarfile.lock +0 -66
- data/LICENSE +0 -201
- data/NEWS +0 -17
- data/README.md +0 -265
- data/Rakefile +0 -30
- data/VERSION +0 -1
- data/braintree_blue.yml +0 -34
- data/config.ru +0 -4
- data/db/ddl.sql +0 -88
- data/db/schema.rb +0 -89
- data/killbill-braintree_blue.gemspec +0 -54
- data/killbill.properties +0 -3
- data/pom.xml +0 -44
- data/release.sh +0 -61
- data/spec/braintree_blue/base_plugin_spec.rb +0 -60
- data/spec/braintree_blue/braintree_blue_payment_method_spec.rb +0 -85
- data/spec/braintree_blue/braintree_blue_response_spec.rb +0 -70
- data/spec/braintree_blue/remote/integration_spec.rb +0 -206
- data/spec/spec_helper.rb +0 -24
@@ -1,54 +0,0 @@
|
|
1
|
-
version = File.read(File.expand_path('../VERSION', __FILE__)).strip
|
2
|
-
|
3
|
-
Gem::Specification.new do |s|
|
4
|
-
s.name = 'killbill-braintree_blue'
|
5
|
-
s.version = version
|
6
|
-
s.summary = 'Plugin to use BraintreeBlue as a gateway.'
|
7
|
-
s.description = 'Kill Bill payment plugin for BraintreeBlue.'
|
8
|
-
|
9
|
-
s.required_ruby_version = '>= 1.9.3'
|
10
|
-
|
11
|
-
s.license = 'Apache License (2.0)'
|
12
|
-
|
13
|
-
s.author = 'Kill Bill core team'
|
14
|
-
s.email = 'killbilling-users@googlegroups.com'
|
15
|
-
s.homepage = 'http://killbill.io'
|
16
|
-
|
17
|
-
s.files = `git ls-files`.split("\n")
|
18
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
-
s.bindir = 'bin'
|
20
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
21
|
-
s.require_paths = ['lib']
|
22
|
-
|
23
|
-
s.rdoc_options << '--exclude' << '.'
|
24
|
-
|
25
|
-
s.add_dependency 'killbill', '~> 8.0'
|
26
|
-
|
27
|
-
s.add_dependency 'braintree', '~> 2.0'
|
28
|
-
|
29
|
-
s.add_dependency 'sinatra', '~> 1.3.4'
|
30
|
-
s.add_dependency 'thread_safe', '~> 0.3.4'
|
31
|
-
s.add_dependency 'activerecord', '~> 4.1.0'
|
32
|
-
if defined?(JRUBY_VERSION)
|
33
|
-
s.add_dependency 'activerecord-bogacs', '~> 0.3'
|
34
|
-
s.add_dependency 'activerecord-jdbc-adapter', '~> 1.3'
|
35
|
-
# Required to avoid errors like java.lang.NoClassDefFoundError: org/bouncycastle/asn1/DERBoolean
|
36
|
-
s.add_dependency 'jruby-openssl', '~> 0.9.6'
|
37
|
-
end
|
38
|
-
s.add_dependency 'actionpack', '~> 4.1.0'
|
39
|
-
s.add_dependency 'actionview', '~> 4.1.0'
|
40
|
-
s.add_dependency 'activemerchant', '~> 1.55.0'
|
41
|
-
s.add_dependency 'offsite_payments', '~> 2.1.0'
|
42
|
-
s.add_dependency 'monetize', '~> 1.1.0'
|
43
|
-
s.add_dependency 'money', '~> 6.5.1'
|
44
|
-
|
45
|
-
s.add_development_dependency 'jbundler', '~> 0.9.2'
|
46
|
-
s.add_development_dependency 'rake', '>= 10.0.0'
|
47
|
-
s.add_development_dependency 'rspec', '~> 2.12.0'
|
48
|
-
if defined?(JRUBY_VERSION)
|
49
|
-
s.add_development_dependency 'jdbc-sqlite3', '~> 3.7'
|
50
|
-
s.add_development_dependency 'jdbc-mariadb', '~> 1.1'
|
51
|
-
else
|
52
|
-
s.add_development_dependency 'sqlite3', '~> 1.3.7'
|
53
|
-
end
|
54
|
-
end
|
data/killbill.properties
DELETED
data/pom.xml
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<!--
|
3
|
-
~ Copyright 2014-2015 The Billing Project, LLC
|
4
|
-
~
|
5
|
-
~ The Billing Project licenses this file to you under the Apache License, version 2.0
|
6
|
-
~ (the "License"); you may not use this file except in compliance with the
|
7
|
-
~ License. You may obtain a copy of the License at:
|
8
|
-
~
|
9
|
-
~ http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
~
|
11
|
-
~ Unless required by applicable law or agreed to in writing, software
|
12
|
-
~ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
13
|
-
~ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
14
|
-
~ License for the specific language governing permissions and limitations
|
15
|
-
~ under the License.
|
16
|
-
-->
|
17
|
-
|
18
|
-
<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">
|
19
|
-
<parent>
|
20
|
-
<groupId>org.sonatype.oss</groupId>
|
21
|
-
<artifactId>oss-parent</artifactId>
|
22
|
-
<version>5</version>
|
23
|
-
</parent>
|
24
|
-
<modelVersion>4.0.0</modelVersion>
|
25
|
-
<groupId>org.kill-bill.billing.plugin.ruby</groupId>
|
26
|
-
<artifactId>braintree_blue-plugin</artifactId>
|
27
|
-
<packaging>pom</packaging>
|
28
|
-
<version>0.3.0</version>
|
29
|
-
<name>braintree_blue-plugin</name>
|
30
|
-
<url>http://github.com/killbill/killbill-braintree_blue-plugin</url>
|
31
|
-
<description>Plugin for accessing BraintreeBlue as a payment gateway</description>
|
32
|
-
<licenses>
|
33
|
-
<license>
|
34
|
-
<name>Apache License 2.0</name>
|
35
|
-
<url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
|
36
|
-
<distribution>repo</distribution>
|
37
|
-
</license>
|
38
|
-
</licenses>
|
39
|
-
<scm>
|
40
|
-
<connection>scm:git:git://github.com/killbill/killbill-braintree_blue-plugin.git</connection>
|
41
|
-
<url>https://github.com/killbill/killbill-braintree_blue-plugin/</url>
|
42
|
-
<developerConnection>scm:git:git@github.com:killbill/killbill-braintree_blue-plugin.git</developerConnection>
|
43
|
-
</scm>
|
44
|
-
</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-braintree_blue-$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=braintree_blue-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::BraintreeBlue::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, 'braintree_blue.yml'), 'w+')
|
10
|
-
file.write(<<-eos)
|
11
|
-
:braintree_blue:
|
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::BraintreeBlue::PaymentPlugin, 'braintree_blue', 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
|
-
=begin
|
32
|
-
it 'should generate forms correctly' do
|
33
|
-
kb_account_id = SecureRandom.uuid
|
34
|
-
kb_tenant_id = SecureRandom.uuid
|
35
|
-
context = @plugin.kb_apis.create_context(kb_tenant_id)
|
36
|
-
fields = @plugin.hash_to_properties({
|
37
|
-
:order_id => '1234',
|
38
|
-
:amount => 10
|
39
|
-
})
|
40
|
-
form = @plugin.build_form_descriptor kb_account_id, fields, [], context
|
41
|
-
|
42
|
-
form.kb_account_id.should == kb_account_id
|
43
|
-
form.form_method.should == 'POST'
|
44
|
-
form.form_url.should == 'https://braintree_blue.com'
|
45
|
-
|
46
|
-
form_fields = @plugin.properties_to_hash(form.form_fields)
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'should receive notifications correctly' do
|
50
|
-
description = 'description'
|
51
|
-
|
52
|
-
kb_tenant_id = SecureRandom.uuid
|
53
|
-
context = @plugin.kb_apis.create_context(kb_tenant_id)
|
54
|
-
properties = @plugin.hash_to_properties({ :description => description })
|
55
|
-
|
56
|
-
notification = ""
|
57
|
-
gw_notification = @plugin.process_notification notification, properties, context
|
58
|
-
end
|
59
|
-
=end
|
60
|
-
end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Killbill::BraintreeBlue::BraintreeBluePaymentMethod do
|
4
|
-
before :all do
|
5
|
-
Killbill::BraintreeBlue::BraintreeBluePaymentMethod.delete_all
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'should search all fields' do
|
9
|
-
kb_tenant_id = '77-88-99-00'
|
10
|
-
|
11
|
-
do_search('foo', kb_tenant_id).size.should == 0
|
12
|
-
|
13
|
-
pm = Killbill::BraintreeBlue::BraintreeBluePaymentMethod.create :kb_account_id => '11-22-33-44',
|
14
|
-
:kb_payment_method_id => '55-66-77-88',
|
15
|
-
:kb_tenant_id => kb_tenant_id,
|
16
|
-
:braintree_customer_id => '123xka',
|
17
|
-
:token => '38102343',
|
18
|
-
:cc_first_name => 'ccFirstName',
|
19
|
-
:cc_last_name => 'ccLastName',
|
20
|
-
:cc_type => 'ccType',
|
21
|
-
:cc_exp_month => 10,
|
22
|
-
:cc_exp_year => 11,
|
23
|
-
:cc_last_4 => 1234,
|
24
|
-
:address1 => 'address1',
|
25
|
-
:address2 => 'address2',
|
26
|
-
:city => 'city',
|
27
|
-
:state => 'state',
|
28
|
-
:zip => 'zip',
|
29
|
-
:country => 'country',
|
30
|
-
:created_at => Time.now,
|
31
|
-
:updated_at => Time.now
|
32
|
-
|
33
|
-
do_search('foo', kb_tenant_id).size.should == 0
|
34
|
-
do_search(pm.token, kb_tenant_id).size.should == 1
|
35
|
-
do_search('ccType', kb_tenant_id).size.should == 1
|
36
|
-
# Exact match only for cc_last_4
|
37
|
-
do_search('123', kb_tenant_id).size.should == 0
|
38
|
-
do_search('1234', kb_tenant_id).size.should == 1
|
39
|
-
# Test partial match
|
40
|
-
do_search('address', kb_tenant_id).size.should == 1
|
41
|
-
do_search('Name', kb_tenant_id).size.should == 1
|
42
|
-
|
43
|
-
pm2 = Killbill::BraintreeBlue::BraintreeBluePaymentMethod.create :kb_account_id => '22-33-44-55',
|
44
|
-
:kb_payment_method_id => '66-77-88-99',
|
45
|
-
:kb_tenant_id => kb_tenant_id,
|
46
|
-
:braintree_customer_id => '123xka',
|
47
|
-
:token => '49384029302',
|
48
|
-
:cc_first_name => 'ccFirstName',
|
49
|
-
:cc_last_name => 'ccLastName',
|
50
|
-
:cc_type => 'ccType',
|
51
|
-
:cc_exp_month => 10,
|
52
|
-
:cc_exp_year => 11,
|
53
|
-
:cc_last_4 => 1234,
|
54
|
-
:address1 => 'address1',
|
55
|
-
:address2 => 'address2',
|
56
|
-
:city => 'city',
|
57
|
-
:state => 'state',
|
58
|
-
:zip => 'zip',
|
59
|
-
:country => 'country',
|
60
|
-
:created_at => Time.now,
|
61
|
-
:updated_at => Time.now
|
62
|
-
|
63
|
-
do_search('foo', kb_tenant_id).size.should == 0
|
64
|
-
do_search(pm.token, kb_tenant_id).size.should == 1
|
65
|
-
do_search(pm2.token, kb_tenant_id).size.should == 1
|
66
|
-
do_search('ccType', kb_tenant_id).size.should == 2
|
67
|
-
# Exact match only for cc_last_4
|
68
|
-
do_search('123', kb_tenant_id).size.should == 0
|
69
|
-
do_search('1234', kb_tenant_id).size.should == 2
|
70
|
-
# Test partial match
|
71
|
-
do_search('cc', kb_tenant_id).size.should == 2
|
72
|
-
do_search('address', kb_tenant_id).size.should == 2
|
73
|
-
do_search('Name', kb_tenant_id).size.should == 2
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
def do_search(search_key, kb_tenant_id)
|
79
|
-
pagination = Killbill::BraintreeBlue::BraintreeBluePaymentMethod.search(search_key, kb_tenant_id)
|
80
|
-
pagination.current_offset.should == 0
|
81
|
-
results = pagination.iterator.to_a
|
82
|
-
pagination.total_nb_records.should == results.size
|
83
|
-
results
|
84
|
-
end
|
85
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Killbill::BraintreeBlue::BraintreeBlueResponse do
|
4
|
-
before :all do
|
5
|
-
Killbill::BraintreeBlue::BraintreeBlueResponse.delete_all
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'should search all fields' do
|
9
|
-
kb_account_id = '33-44-55-66'
|
10
|
-
kb_tenant_id = '77-88-99-00'
|
11
|
-
|
12
|
-
do_search('foo', kb_tenant_id).size.should == 0
|
13
|
-
|
14
|
-
pm = Killbill::BraintreeBlue::BraintreeBlueResponse.create :api_call => 'charge',
|
15
|
-
:kb_payment_id => '11-22-33-44',
|
16
|
-
:kb_account_id => kb_account_id,
|
17
|
-
:kb_tenant_id => kb_tenant_id,
|
18
|
-
:authorization => 'aa-bb-cc-dd',
|
19
|
-
:params_braintree_customer_id => '123456',
|
20
|
-
:params_braintree_customer_credit_card_token => '38102343',
|
21
|
-
:success => true,
|
22
|
-
:created_at => Time.now,
|
23
|
-
:updated_at => Time.now
|
24
|
-
# Not successful
|
25
|
-
ignored2 = Killbill::BraintreeBlue::BraintreeBlueResponse.create :api_call => 'charge',
|
26
|
-
:kb_payment_id => pm.kb_payment_id,
|
27
|
-
:kb_account_id => kb_account_id,
|
28
|
-
:kb_tenant_id => kb_tenant_id,
|
29
|
-
:authorization => pm.authorization,
|
30
|
-
:params_braintree_customer_id => pm.params_braintree_customer_id,
|
31
|
-
:params_braintree_customer_credit_card_token => pm.params_braintree_customer_credit_card_token,
|
32
|
-
:success => false,
|
33
|
-
:created_at => Time.now,
|
34
|
-
:updated_at => Time.now
|
35
|
-
|
36
|
-
do_search('foo', kb_tenant_id).size.should == 0
|
37
|
-
do_search(pm.authorization, kb_tenant_id).size.should == 1
|
38
|
-
do_search(pm.params_braintree_customer_id, kb_tenant_id).size.should == 1
|
39
|
-
do_search(pm.params_braintree_customer_credit_card_token, kb_tenant_id).size.should == 1
|
40
|
-
|
41
|
-
pm2 = Killbill::BraintreeBlue::BraintreeBlueResponse.create :api_call => 'charge',
|
42
|
-
:kb_payment_id => '11-22-33-44',
|
43
|
-
:kb_account_id => kb_account_id,
|
44
|
-
:kb_tenant_id => kb_tenant_id,
|
45
|
-
:authorization => 'AA-BB-CC-DD',
|
46
|
-
:params_braintree_customer_id => '1234567',
|
47
|
-
:params_braintree_customer_credit_card_token => pm.params_braintree_customer_credit_card_token,
|
48
|
-
:success => true,
|
49
|
-
:created_at => Time.now,
|
50
|
-
:updated_at => Time.now
|
51
|
-
|
52
|
-
do_search('foo', kb_tenant_id).size.should == 0
|
53
|
-
do_search(pm.authorization, kb_tenant_id).size.should == 1
|
54
|
-
do_search(pm.params_braintree_customer_id, kb_tenant_id).size.should == 1
|
55
|
-
do_search(pm.params_braintree_customer_credit_card_token, kb_tenant_id).size.should == 2
|
56
|
-
do_search(pm2.authorization, kb_tenant_id).size.should == 1
|
57
|
-
do_search(pm2.params_braintree_customer_id, kb_tenant_id).size.should == 1
|
58
|
-
do_search(pm2.params_braintree_customer_credit_card_token, kb_tenant_id).size.should == 2
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
def do_search(search_key, kb_tenant_id)
|
64
|
-
pagination = Killbill::BraintreeBlue::BraintreeBlueResponse.search(search_key, kb_tenant_id)
|
65
|
-
pagination.current_offset.should == 0
|
66
|
-
results = pagination.iterator.to_a
|
67
|
-
pagination.total_nb_records.should == results.size
|
68
|
-
results
|
69
|
-
end
|
70
|
-
end
|
@@ -1,206 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
ActiveMerchant::Billing::Base.mode = :test
|
4
|
-
|
5
|
-
describe Killbill::BraintreeBlue::PaymentPlugin do
|
6
|
-
|
7
|
-
include ::Killbill::Plugin::ActiveMerchant::RSpec
|
8
|
-
|
9
|
-
before(:each) do
|
10
|
-
::Killbill::BraintreeBlue::BraintreeBluePaymentMethod.delete_all
|
11
|
-
::Killbill::BraintreeBlue::BraintreeBlueResponse.delete_all
|
12
|
-
::Killbill::BraintreeBlue::BraintreeBlueTransaction.delete_all
|
13
|
-
|
14
|
-
@plugin = build_plugin(::Killbill::BraintreeBlue::PaymentPlugin, 'braintree_blue')
|
15
|
-
@plugin.start_plugin
|
16
|
-
|
17
|
-
@call_context = build_call_context
|
18
|
-
|
19
|
-
@properties = []
|
20
|
-
pm_overrides = {
|
21
|
-
# ActiveMerchant wants zip to be a string
|
22
|
-
:zip => '12345',
|
23
|
-
:cc_verification_value => 123
|
24
|
-
}
|
25
|
-
@pm = create_payment_method(::Killbill::BraintreeBlue::BraintreeBluePaymentMethod, nil, @call_context.tenant_id, @properties, pm_overrides)
|
26
|
-
@amount = BigDecimal.new('100')
|
27
|
-
@currency = 'USD'
|
28
|
-
|
29
|
-
kb_payment_id = SecureRandom.uuid
|
30
|
-
1.upto(6) do
|
31
|
-
@kb_payment = @plugin.kb_apis.proxied_services[:payment_api].add_payment(kb_payment_id)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
after(:each) do
|
36
|
-
@plugin.stop_plugin
|
37
|
-
end
|
38
|
-
|
39
|
-
# See https://github.com/killbill/killbill-braintree-blue-plugin/issues/3
|
40
|
-
it 'should be able to add multiple cards to the same customer' do
|
41
|
-
kb_account_id = SecureRandom.uuid
|
42
|
-
kb_tenant_id = @call_context.tenant_id
|
43
|
-
::Killbill::BraintreeBlue::BraintreeBluePaymentMethod.braintree_customer_id_from_kb_account_id(kb_account_id, kb_tenant_id).should be_nil
|
44
|
-
|
45
|
-
properties = []
|
46
|
-
pm_overrides = {
|
47
|
-
:zip => '12345',
|
48
|
-
:cc_verification_value => 123
|
49
|
-
}
|
50
|
-
create_payment_method(::Killbill::BraintreeBlue::BraintreeBluePaymentMethod, kb_account_id, kb_tenant_id, properties, pm_overrides.dup)
|
51
|
-
b_customer_id = ::Killbill::BraintreeBlue::BraintreeBluePaymentMethod.braintree_customer_id_from_kb_account_id(kb_account_id, kb_tenant_id)
|
52
|
-
b_customer_id.should_not be_nil
|
53
|
-
|
54
|
-
# Add a second card on the same account (same Braintree customer)
|
55
|
-
pm_overrides[:cc_number] = '4111111111111111'
|
56
|
-
create_payment_method(::Killbill::BraintreeBlue::BraintreeBluePaymentMethod, kb_account_id, kb_tenant_id, properties, pm_overrides.dup)
|
57
|
-
::Killbill::BraintreeBlue::BraintreeBluePaymentMethod.braintree_customer_id_from_kb_account_id(kb_account_id, kb_tenant_id).should == b_customer_id
|
58
|
-
|
59
|
-
pms = @plugin.get_payment_methods(kb_account_id, false, properties, @call_context)
|
60
|
-
pms.size.should == 2
|
61
|
-
|
62
|
-
# Verify tokens are different, and don't match the Braintree customer id
|
63
|
-
pm1 = @plugin.get_payment_method_detail(kb_account_id, pms[0].payment_method_id, properties, @call_context)
|
64
|
-
pm2 = @plugin.get_payment_method_detail(kb_account_id, pms[1].payment_method_id, properties, @call_context)
|
65
|
-
pm1.external_payment_method_id.should_not == pm2.external_payment_method_id
|
66
|
-
pm1.external_payment_method_id.should_not == b_customer_id
|
67
|
-
pm2.external_payment_method_id.should_not == b_customer_id
|
68
|
-
|
69
|
-
# Add a third card on the same account (same Braintree customer)
|
70
|
-
pm_overrides[:cc_number] = '5555555555554444'
|
71
|
-
create_payment_method(::Killbill::BraintreeBlue::BraintreeBluePaymentMethod, kb_account_id, kb_tenant_id, properties, pm_overrides.dup)
|
72
|
-
::Killbill::BraintreeBlue::BraintreeBluePaymentMethod.braintree_customer_id_from_kb_account_id(kb_account_id, kb_tenant_id).should == b_customer_id
|
73
|
-
|
74
|
-
pms = @plugin.get_payment_methods(kb_account_id, false, properties, @call_context)
|
75
|
-
pms.size.should == 3
|
76
|
-
|
77
|
-
# Verify tokens are different, and don't match the Braintree customer id
|
78
|
-
pm1 = @plugin.get_payment_method_detail(kb_account_id, pms[0].payment_method_id, properties, @call_context)
|
79
|
-
pm2 = @plugin.get_payment_method_detail(kb_account_id, pms[1].payment_method_id, properties, @call_context)
|
80
|
-
pm3 = @plugin.get_payment_method_detail(kb_account_id, pms[2].payment_method_id, properties, @call_context)
|
81
|
-
pm1.external_payment_method_id.should_not == pm2.external_payment_method_id
|
82
|
-
pm1.external_payment_method_id.should_not == pm3.external_payment_method_id
|
83
|
-
pm2.external_payment_method_id.should_not == pm3.external_payment_method_id
|
84
|
-
pm1.external_payment_method_id.should_not == b_customer_id
|
85
|
-
pm2.external_payment_method_id.should_not == b_customer_id
|
86
|
-
pm3.external_payment_method_id.should_not == b_customer_id
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'should be able to create a customer with a nonce' do
|
90
|
-
kb_account_id = SecureRandom.uuid
|
91
|
-
kb_payment_method_id = SecureRandom.uuid
|
92
|
-
|
93
|
-
info = ::Killbill::Plugin::Model::PaymentMethodPlugin.new
|
94
|
-
info.properties = []
|
95
|
-
info.properties << build_property('token', 'ABCDEF')
|
96
|
-
info.properties << build_property('cc_first_name', 'John')
|
97
|
-
info.properties << build_property('cc_last_name', 'Doe')
|
98
|
-
|
99
|
-
begin
|
100
|
-
@plugin.add_payment_method(kb_account_id, kb_payment_method_id, info, true, [], @call_context)
|
101
|
-
fail('it should not accept a random nonce')
|
102
|
-
rescue => e
|
103
|
-
# TODO Could we generate a valid nonce?
|
104
|
-
e.message.starts_with?('Unknown or expired payment_method_nonce.').should be_true
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'should be able to charge a Credit Card directly' do
|
109
|
-
properties = build_pm_properties(nil,
|
110
|
-
{
|
111
|
-
# ActiveMerchant wants zip to be a string
|
112
|
-
:zip => '12345',
|
113
|
-
:cc_verification_value => 123
|
114
|
-
})
|
115
|
-
|
116
|
-
# We created the payment method, hence the rows
|
117
|
-
Killbill::BraintreeBlue::BraintreeBlueResponse.all.size.should == 1
|
118
|
-
Killbill::BraintreeBlue::BraintreeBlueTransaction.all.size.should == 0
|
119
|
-
|
120
|
-
payment_response = @plugin.purchase_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[0].id, @pm.kb_payment_method_id, @amount, @currency, properties, @call_context)
|
121
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
122
|
-
payment_response.amount.should == @amount
|
123
|
-
payment_response.transaction_type.should == :PURCHASE
|
124
|
-
|
125
|
-
responses = Killbill::BraintreeBlue::BraintreeBlueResponse.all
|
126
|
-
responses.size.should == 2
|
127
|
-
responses[0].api_call.should == 'add_payment_method'
|
128
|
-
responses[0].message.should == 'OK'
|
129
|
-
responses[1].api_call.should == 'purchase'
|
130
|
-
responses[1].message.should == '1000 Approved'
|
131
|
-
transactions = Killbill::BraintreeBlue::BraintreeBlueTransaction.all
|
132
|
-
transactions.size.should == 1
|
133
|
-
transactions[0].api_call.should == 'purchase'
|
134
|
-
end
|
135
|
-
|
136
|
-
# TODO Settlement?
|
137
|
-
xit 'should be able to charge and refund' do
|
138
|
-
payment_response = @plugin.purchase_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[0].id, @pm.kb_payment_method_id, @amount, @currency, @properties, @call_context)
|
139
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
140
|
-
payment_response.amount.should == @amount
|
141
|
-
payment_response.transaction_type.should == :PURCHASE
|
142
|
-
|
143
|
-
# Try a full refund
|
144
|
-
refund_response = @plugin.refund_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[1].id, @pm.kb_payment_method_id, @amount, @currency, @properties, @call_context)
|
145
|
-
refund_response.status.should eq(:PROCESSED), refund_response.gateway_error
|
146
|
-
refund_response.amount.should == @amount
|
147
|
-
refund_response.transaction_type.should == :REFUND
|
148
|
-
end
|
149
|
-
|
150
|
-
# TODO Settlement?
|
151
|
-
xit 'should be able to auth, capture and refund' do
|
152
|
-
payment_response = @plugin.authorize_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[0].id, @pm.kb_payment_method_id, @amount, @currency, @properties, @call_context)
|
153
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
154
|
-
payment_response.amount.should == @amount
|
155
|
-
payment_response.transaction_type.should == :AUTHORIZE
|
156
|
-
|
157
|
-
# Try multiple partial captures
|
158
|
-
partial_capture_amount = BigDecimal.new('10')
|
159
|
-
1.upto(3) do |i|
|
160
|
-
payment_response = @plugin.capture_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[i].id, @pm.kb_payment_method_id, partial_capture_amount, @currency, @properties, @call_context)
|
161
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
162
|
-
payment_response.amount.should == partial_capture_amount
|
163
|
-
payment_response.transaction_type.should == :CAPTURE
|
164
|
-
end
|
165
|
-
|
166
|
-
# Try a partial refund
|
167
|
-
refund_response = @plugin.refund_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[4].id, @pm.kb_payment_method_id, partial_capture_amount, @currency, @properties, @call_context)
|
168
|
-
refund_response.status.should eq(:PROCESSED), refund_response.gateway_error
|
169
|
-
refund_response.amount.should == partial_capture_amount
|
170
|
-
refund_response.transaction_type.should == :REFUND
|
171
|
-
|
172
|
-
# Try to capture again
|
173
|
-
payment_response = @plugin.capture_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[5].id, @pm.kb_payment_method_id, partial_capture_amount, @currency, @properties, @call_context)
|
174
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
175
|
-
payment_response.amount.should == partial_capture_amount
|
176
|
-
payment_response.transaction_type.should == :CAPTURE
|
177
|
-
end
|
178
|
-
|
179
|
-
it 'should be able to auth and void' do
|
180
|
-
payment_response = @plugin.authorize_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[0].id, @pm.kb_payment_method_id, @amount, @currency, @properties, @call_context)
|
181
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
182
|
-
payment_response.amount.should == @amount
|
183
|
-
payment_response.transaction_type.should == :AUTHORIZE
|
184
|
-
|
185
|
-
payment_response = @plugin.void_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[1].id, @pm.kb_payment_method_id, @properties, @call_context)
|
186
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
187
|
-
payment_response.transaction_type.should == :VOID
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'should be able to auth, partial capture and void' do
|
191
|
-
payment_response = @plugin.authorize_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[0].id, @pm.kb_payment_method_id, @amount, @currency, @properties, @call_context)
|
192
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
193
|
-
payment_response.amount.should == @amount
|
194
|
-
payment_response.transaction_type.should == :AUTHORIZE
|
195
|
-
|
196
|
-
partial_capture_amount = BigDecimal.new('10')
|
197
|
-
payment_response = @plugin.capture_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[1].id, @pm.kb_payment_method_id, partial_capture_amount, @currency, @properties, @call_context)
|
198
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
199
|
-
payment_response.amount.should == partial_capture_amount
|
200
|
-
payment_response.transaction_type.should == :CAPTURE
|
201
|
-
|
202
|
-
payment_response = @plugin.void_payment(@pm.kb_account_id, @kb_payment.id, @kb_payment.transactions[2].id, @pm.kb_payment_method_id, @properties, @call_context)
|
203
|
-
payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
|
204
|
-
payment_response.transaction_type.should == :VOID
|
205
|
-
end
|
206
|
-
end
|