killbill 3.1.11 → 3.1.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.
- checksums.yaml +4 -4
- data/Jarfile +6 -6
- data/NEWS +6 -0
- data/VERSION +1 -1
- data/generators/active_merchant/templates/Jarfile.rb +7 -7
- data/generators/active_merchant/templates/db/ddl.sql.rb +2 -0
- data/generators/active_merchant/templates/db/schema.rb +2 -0
- data/generators/active_merchant/templates/lib/application.rb +1 -5
- data/generators/active_merchant/templates/lib/models/response.rb +2 -1
- data/generators/active_merchant/templates/lib/plugin.rb +1 -0
- data/generators/active_merchant/templates/lib/private_api.rb +7 -0
- data/generators/active_merchant/templates/plugin.gemspec.rb +3 -2
- data/generators/active_merchant/templates/spec/integration_spec.rb +103 -2
- data/killbill.gemspec +4 -1
- data/lib/killbill/gen/api/dry_run_arguments.rb +100 -0
- data/lib/killbill/gen/api/invoice_user_api.rb +5 -5
- data/lib/killbill/gen/api/killbill_api.rb +19 -18
- data/lib/killbill/gen/api/payment_options.rb +17 -5
- data/lib/killbill/gen/api/require_gen.rb +5 -0
- data/lib/killbill/gen/api/rolled_up_unit.rb +63 -0
- data/lib/killbill/gen/api/rolled_up_usage.rb +31 -35
- data/lib/killbill/gen/api/static_catalog.rb +8 -8
- data/lib/killbill/gen/api/subscription_usage_record.rb +75 -0
- data/lib/killbill/gen/api/unit_usage_record.rb +74 -0
- data/lib/killbill/gen/api/usage_record.rb +66 -0
- data/lib/killbill/gen/api/usage_user_api.rb +22 -56
- data/lib/killbill/gen/plugin-api/currency_plugin_api.rb +19 -18
- data/lib/killbill/gen/plugin-api/ext_bus_event.rb +19 -18
- data/lib/killbill/gen/plugin-api/gateway_notification.rb +19 -18
- data/lib/killbill/gen/plugin-api/hosted_payment_page_form_descriptor.rb +19 -18
- data/lib/killbill/gen/plugin-api/notification_plugin_api.rb +19 -18
- data/lib/killbill/gen/plugin-api/payment_method_info_plugin.rb +19 -18
- data/lib/killbill/gen/plugin-api/payment_plugin_api.rb +19 -18
- data/lib/killbill/gen/plugin-api/payment_plugin_api_exception.rb +19 -18
- data/lib/killbill/gen/plugin-api/payment_transaction_info_plugin.rb +19 -18
- data/lib/killbill/gen/plugin-api/require_gen.rb +19 -18
- data/lib/killbill/helpers/active_merchant/active_record/models/payment_method.rb +4 -0
- data/lib/killbill/helpers/active_merchant/active_record/models/response.rb +65 -34
- data/lib/killbill/helpers/active_merchant/active_record/models/streamy_result_set.rb +14 -2
- data/lib/killbill/helpers/active_merchant/active_record/models/transaction.rb +9 -5
- data/lib/killbill/helpers/active_merchant/killbill_spec_helper.rb +28 -23
- data/lib/killbill/helpers/active_merchant/payment_plugin.rb +66 -36
- data/lib/killbill/helpers/active_merchant/private_payment_plugin.rb +18 -31
- data/lib/killbill/helpers/active_merchant/sinatra.rb +7 -2
- data/lib/killbill/helpers/active_merchant/utils.rb +12 -0
- data/spec/killbill/helpers/killbill_spec_helper_spec.rb +24 -0
- data/spec/killbill/helpers/payment_method_spec.rb +5 -0
- data/spec/killbill/helpers/payment_plugin_spec.rb +33 -2
- data/spec/killbill/helpers/private_payment_plugin_spec.rb +83 -0
- data/spec/killbill/helpers/response_spec.rb +47 -24
- data/spec/killbill/helpers/streamy_result_set_spec.rb +38 -0
- data/spec/killbill/helpers/test_schema.rb +2 -0
- metadata +57 -8
- data/lib/killbill/gen/api/payment_attempt.rb +0 -117
- data/lib/killbill/gen/api/payment_method_kv_info.rb +0 -71
- data/lib/killbill/gen/plugin-api/billing_address.rb +0 -85
- data/lib/killbill/gen/plugin-api/customer.rb +0 -73
@@ -3,8 +3,10 @@ module Killbill
|
|
3
3
|
module ActiveMerchant
|
4
4
|
require 'action_controller'
|
5
5
|
require 'action_view'
|
6
|
+
require 'active_merchant'
|
6
7
|
require 'active_support'
|
7
8
|
require 'cgi'
|
9
|
+
require 'offsite_payments'
|
8
10
|
|
9
11
|
class PrivatePaymentPlugin < ::Killbill::Plugin::Payment
|
10
12
|
|
@@ -13,7 +15,7 @@ module Killbill
|
|
13
15
|
include ::ActionController::RequestForgeryProtection
|
14
16
|
include ::ActionView::Context
|
15
17
|
include ::ActionView::Helpers::FormTagHelper
|
16
|
-
include ::
|
18
|
+
include ::OffsitePayments::ActionViewHelper
|
17
19
|
|
18
20
|
# For RequestForgeryProtection
|
19
21
|
attr_reader :session
|
@@ -33,7 +35,7 @@ module Killbill
|
|
33
35
|
#
|
34
36
|
# Additionally, you can have a :html key which will be passed through to the link_to helper
|
35
37
|
def payment_link_for(name, order_id, account_id, service, options = {})
|
36
|
-
integration_module = ::
|
38
|
+
integration_module = ::OffsitePayments.integration(service.to_s.camelize)
|
37
39
|
service_class = integration_module.const_get('Helper')
|
38
40
|
|
39
41
|
link_options = options.delete(:html) || {}
|
@@ -69,36 +71,13 @@ module Killbill
|
|
69
71
|
output_buffer
|
70
72
|
end
|
71
73
|
|
72
|
-
|
74
|
+
def save_response_and_transaction(gw_response, api_call, kb_account_id, kb_tenant_id, payment_processor_account_id, kb_payment_id=nil, kb_payment_transaction_id=nil, transaction_type=nil, amount_in_cents=0, currency=nil)
|
75
|
+
logger.warn "Unsuccessful #{api_call}: #{gw_response.message}" unless gw_response.success?
|
73
76
|
|
74
|
-
|
75
|
-
@output_buffer = ''
|
76
|
-
end
|
77
|
+
response, transaction = @response_model.create_response_and_transaction(@identifier, @transaction_model, api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, payment_processor_account_id, kb_tenant_id, gw_response, amount_in_cents, currency, {}, @response_model)
|
77
78
|
|
78
|
-
|
79
|
-
save_response_and_transaction(response, api_call)[0]
|
80
|
-
end
|
79
|
+
logger.debug "Recorded transaction: #{transaction.inspect}" unless transaction.nil?
|
81
80
|
|
82
|
-
def save_response_and_transaction(response, api_call, kb_payment_id=nil, amount_in_cents=0, currency=nil)
|
83
|
-
logger.warn "Unsuccessful #{api_call}: #{response.message}" unless response.success?
|
84
|
-
|
85
|
-
# Save the response to our logs
|
86
|
-
response = @response_model.from_response(api_call, kb_payment_id, response)
|
87
|
-
response.save!
|
88
|
-
|
89
|
-
transaction = nil
|
90
|
-
txn_id = response.txn_id
|
91
|
-
if response.success and !kb_payment_id.blank? and !txn_id.blank?
|
92
|
-
# Record the transaction
|
93
|
-
transaction = response.send("create_#{@identifier}_transaction!",
|
94
|
-
:amount_in_cents => amount_in_cents,
|
95
|
-
:currency => currency,
|
96
|
-
:api_call => api_call,
|
97
|
-
:kb_payment_id => kb_payment_id,
|
98
|
-
:txn_id => txn_id)
|
99
|
-
|
100
|
-
logger.debug "Recorded transaction: #{transaction.inspect}"
|
101
|
-
end
|
102
81
|
return response, transaction
|
103
82
|
end
|
104
83
|
|
@@ -106,13 +85,21 @@ module Killbill
|
|
106
85
|
::Killbill::Plugin::ActiveMerchant.kb_apis
|
107
86
|
end
|
108
87
|
|
109
|
-
def gateway
|
110
|
-
::Killbill::Plugin::ActiveMerchant.
|
88
|
+
def gateway(payment_processor_account_id=:default)
|
89
|
+
gateway = ::Killbill::Plugin::ActiveMerchant.gateways[payment_processor_account_id.to_sym]
|
90
|
+
raise "Unable to lookup gateway for payment_processor_account_id #{payment_processor_account_id}, gateways: #{::Killbill::Plugin::ActiveMerchant.gateways}" if gateway.nil?
|
91
|
+
gateway
|
111
92
|
end
|
112
93
|
|
113
94
|
def logger
|
114
95
|
::Killbill::Plugin::ActiveMerchant.logger
|
115
96
|
end
|
97
|
+
|
98
|
+
protected
|
99
|
+
|
100
|
+
def reset_output_buffer
|
101
|
+
@output_buffer = ''
|
102
|
+
end
|
116
103
|
end
|
117
104
|
end
|
118
105
|
end
|
@@ -22,9 +22,14 @@ module Killbill
|
|
22
22
|
|
23
23
|
after do
|
24
24
|
# return DB connections to the Pool if required
|
25
|
-
::ActiveRecord::Base.
|
25
|
+
pool = ::ActiveRecord::Base.connection_pool
|
26
|
+
if pool.active_connection?
|
27
|
+
connection = ::ActiveRecord::Base.connection
|
28
|
+
pool.remove(connection)
|
29
|
+
connection.disconnect!
|
30
|
+
end
|
26
31
|
end
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
30
|
-
end
|
35
|
+
end
|
@@ -17,6 +17,18 @@ module Killbill
|
|
17
17
|
no_hyphens.insert(8, "-").insert(13, "-").insert(18, "-").insert(23, "-")
|
18
18
|
end
|
19
19
|
|
20
|
+
def self.ip
|
21
|
+
first_public_ipv4 ? first_public_ipv4.ip_address : first_private_ipv4.ip_address
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.first_private_ipv4
|
25
|
+
Socket.ip_address_list.detect { |intf| intf.ipv4_private? }
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.first_public_ipv4
|
29
|
+
Socket.ip_address_list.detect { |intf| intf.ipv4? and !intf.ipv4_loopback? and !intf.ipv4_multicast? and !intf.ipv4_private? }
|
30
|
+
end
|
31
|
+
|
20
32
|
class KBWiredumpDevice < IO
|
21
33
|
|
22
34
|
# Required for compatibility, but unused
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Killbill::Plugin::ActiveMerchant::RSpec do
|
4
|
+
include Killbill::Plugin::ActiveMerchant::RSpec
|
5
|
+
|
6
|
+
it 'should build payment method properties' do
|
7
|
+
overridden_city = SecureRandom.uuid
|
8
|
+
|
9
|
+
props1 = build_pm_properties
|
10
|
+
props2 = build_pm_properties(nil, {:city => overridden_city})
|
11
|
+
props3 = build_pm_properties(nil, {:city => overridden_city, :foo => :bar})
|
12
|
+
|
13
|
+
props1.size.should == props2.size
|
14
|
+
props3.size.should == props1.size + 1
|
15
|
+
|
16
|
+
city1 = props1.find { |p| p.key == 'city' }
|
17
|
+
city2 = props2.find { |p| p.key == 'city' }
|
18
|
+
city3 = props3.find { |p| p.key == 'city' }
|
19
|
+
city1.value.should_not == city2.value
|
20
|
+
city2.value.should == city3.value
|
21
|
+
|
22
|
+
(props3.find { |p| p.key == :foo }).value.should == :bar
|
23
|
+
end
|
24
|
+
end
|
@@ -149,6 +149,11 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::PaymentMethod do
|
|
149
149
|
expect { ::Killbill::Test::TestPaymentMethod.from_kb_payment_method_id(SecureRandom.uuid, kb_tenant_id) }.to raise_error
|
150
150
|
::Killbill::Test::TestPaymentMethod.from_kb_payment_method_id(kb_payment_method_id, kb_tenant_id).kb_payment_method_id.should == kb_payment_method_id
|
151
151
|
|
152
|
+
# Retrieve by account id and token
|
153
|
+
pms = ::Killbill::Test::TestPaymentMethod.from_kb_account_id_and_token(token, kb_account_id, kb_tenant_id)
|
154
|
+
pms.size.should == 1
|
155
|
+
pms[0].kb_payment_method_id.should == kb_payment_method_id
|
156
|
+
|
152
157
|
# Delete the payment method and verify we cannot find it anymore
|
153
158
|
::Killbill::Test::TestPaymentMethod.mark_as_deleted!(kb_payment_method_id, kb_tenant_id)
|
154
159
|
::Killbill::Test::TestPaymentMethod.from_kb_account_id(kb_account_id, kb_tenant_id).size.should == 0
|
@@ -10,7 +10,10 @@ describe Killbill::Plugin::ActiveMerchant::PaymentPlugin do
|
|
10
10
|
file = File.new(File.join(dir, 'test.yml'), "w+")
|
11
11
|
file.write(<<-eos)
|
12
12
|
:test:
|
13
|
-
:
|
13
|
+
- :account_id: default
|
14
|
+
:test: true
|
15
|
+
- :account_id: something_non_standard
|
16
|
+
:test: true
|
14
17
|
# As defined by spec_helper.rb
|
15
18
|
:database:
|
16
19
|
:adapter: 'sqlite3'
|
@@ -49,6 +52,12 @@ describe Killbill::Plugin::ActiveMerchant::PaymentPlugin do
|
|
49
52
|
property.value = 'true'
|
50
53
|
@properties = [property]
|
51
54
|
|
55
|
+
@ppai = ::Killbill::Plugin::Model::PluginProperty.new
|
56
|
+
@ppai.key = 'payment_processor_account_id'
|
57
|
+
@ppai.value = 'something_non_standard'
|
58
|
+
@properties_with_ppai = @properties.dup
|
59
|
+
@properties_with_ppai << @ppai
|
60
|
+
|
52
61
|
token = ::Killbill::Plugin::Model::PluginProperty.new
|
53
62
|
token.key = 'token'
|
54
63
|
token.value = SecureRandom.uuid
|
@@ -101,9 +110,28 @@ describe Killbill::Plugin::ActiveMerchant::PaymentPlugin do
|
|
101
110
|
@plugin.get_payment_methods(@kb_account_id, true, @properties, @call_context).size.should == 0
|
102
111
|
end
|
103
112
|
|
113
|
+
it 'should support different payment_processor_account_ids' do
|
114
|
+
@plugin.get_payment_methods(@kb_account_id, true, @properties, @call_context).size.should == 0
|
115
|
+
|
116
|
+
@plugin.add_payment_method(@kb_account_id, @kb_payment_method_id, @payment_method_props, true, @properties, @call_context)
|
117
|
+
@plugin.get_payment_methods(@kb_account_id, true, @properties, @call_context).size.should == 1
|
118
|
+
::Killbill::Test::TestPaymentMethod.where(:kb_payment_method_id => @kb_payment_method_id).first.token.should == @payment_method_props.properties[0].value
|
119
|
+
|
120
|
+
authorization_id = SecureRandom.uuid
|
121
|
+
@payment_api.add_payment(@kb_payment_id, authorization_id, SecureRandom.uuid, :AUTHORIZE)
|
122
|
+
authorization = @plugin.authorize_payment(@kb_account_id, @kb_payment_id, authorization_id, @kb_payment_method_id, @amount_in_cents, @currency, @properties_with_ppai, @call_context)
|
123
|
+
verify_transaction_info_plugin(authorization, authorization_id, :AUTHORIZE, 1, @ppai.value)
|
124
|
+
|
125
|
+
capture_id = SecureRandom.uuid
|
126
|
+
@payment_api.add_payment(@kb_payment_id, capture_id, SecureRandom.uuid, :CAPTURE)
|
127
|
+
# We omit the payment_processor_account_id to verify we can retrieve it
|
128
|
+
capture = @plugin.capture_payment(@kb_account_id, @kb_payment_id, capture_id, @kb_payment_method_id, @amount_in_cents, @currency, @properties, @call_context)
|
129
|
+
verify_transaction_info_plugin(capture, capture_id, :CAPTURE, 2, @ppai.value)
|
130
|
+
end
|
131
|
+
|
104
132
|
private
|
105
133
|
|
106
|
-
def verify_transaction_info_plugin(t_info_plugin, kb_transaction_id, type, transaction_nb)
|
134
|
+
def verify_transaction_info_plugin(t_info_plugin, kb_transaction_id, type, transaction_nb, payment_processor_account_id='default')
|
107
135
|
t_info_plugin.kb_payment_id.should == @kb_payment_id
|
108
136
|
t_info_plugin.kb_transaction_payment_id.should == kb_transaction_id
|
109
137
|
t_info_plugin.transaction_type.should == type
|
@@ -116,6 +144,9 @@ describe Killbill::Plugin::ActiveMerchant::PaymentPlugin do
|
|
116
144
|
end
|
117
145
|
t_info_plugin.status.should == :PROCESSED
|
118
146
|
|
147
|
+
# Verify we routed to the right gateway
|
148
|
+
(t_info_plugin.properties.find { |kv| kv.key.to_s == 'payment_processor_account_id' }).value.to_s.should == payment_processor_account_id
|
149
|
+
|
119
150
|
transactions = @plugin.get_payment_info(@kb_account_id, @kb_payment_id, [], @call_context)
|
120
151
|
transactions.size.should == transaction_nb
|
121
152
|
transactions[transaction_nb - 1].to_json.should == t_info_plugin.to_json
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'spec/killbill/helpers/payment_method_spec'
|
3
|
+
require 'spec/killbill/helpers/response_spec'
|
4
|
+
require 'spec/killbill/helpers/transaction_spec'
|
5
|
+
|
6
|
+
describe Killbill::Plugin::ActiveMerchant::PrivatePaymentPlugin do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@order_id = SecureRandom.uuid
|
10
|
+
@account_id = SecureRandom.uuid
|
11
|
+
@options = {:amount => 120, :country => 'US', :forward_url => 'http://kill-bill.org', :html => {:authenticity_token => false}}
|
12
|
+
@session = {:foo => :bar}
|
13
|
+
|
14
|
+
setup_public_plugin
|
15
|
+
|
16
|
+
@plugin = Killbill::Plugin::ActiveMerchant::PrivatePaymentPlugin.new(:test,
|
17
|
+
::Killbill::Test::TestPaymentMethod,
|
18
|
+
::Killbill::Test::TestTransaction,
|
19
|
+
::Killbill::Test::TestResponse,
|
20
|
+
@session)
|
21
|
+
@plugin.session.should == @session
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should build payment links' do
|
25
|
+
link = @plugin.payment_link_for('Pay!', @order_id, @account_id, :bogus, @options)
|
26
|
+
link.should == "<a account=\"#{@account_id}\" amount=\"#{@options[:amount]}\" authenticity_token=\"false\" href=\"http://www.bogus.com?order=#{@order_id}&account=#{@account_id}&amount=#{@options[:amount]}\">Pay!</a>"
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should build payment forms' do
|
30
|
+
form = @plugin.payment_form_for(@order_id, @account_id, :bogus, @options) do |service|
|
31
|
+
service.token = 'Pay!'
|
32
|
+
end
|
33
|
+
form.should == "<form accept-charset=\"UTF-8\" action=\"http://www.bogus.com\" disable_authenticity_token=\"true\" method=\"post\"><div style=\"display:none\"></div>
|
34
|
+
Pay!
|
35
|
+
<input id=\"order\" name=\"order\" type=\"hidden\" value=\"#{@order_id}\" />
|
36
|
+
<input id=\"account\" name=\"account\" type=\"hidden\" value=\"#{@account_id}\" />
|
37
|
+
<input id=\"amount\" name=\"amount\" type=\"hidden\" value=\"#{@options[:amount]}\" />
|
38
|
+
</form>"
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should save responses and transactions' do
|
42
|
+
response, transaction = @plugin.save_response_and_transaction(::ActiveMerchant::Billing::Response.new(true, 'OK'), :custom_thinggy, @account_id, SecureRandom.uuid, :default, SecureRandom.uuid, SecureRandom.uuid, :op, 1242, 'USD')
|
43
|
+
|
44
|
+
response.api_call.should == :custom_thinggy
|
45
|
+
transaction.transaction_type.should == :op
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should access global variables' do
|
49
|
+
@plugin.kb_apis.is_a?(::Killbill::Plugin::KillbillApi).should be_true
|
50
|
+
@plugin.gateway.is_a?(::Killbill::Plugin::ActiveMerchant::Gateway).should be_true
|
51
|
+
@plugin.logger.respond_to?(:info).should be_true
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def setup_public_plugin
|
57
|
+
Dir.mktmpdir do |dir|
|
58
|
+
file = File.new(File.join(dir, 'test.yml'), 'w+')
|
59
|
+
file.write(<<-eos)
|
60
|
+
:test:
|
61
|
+
:test: true
|
62
|
+
# As defined by spec_helper.rb
|
63
|
+
:database:
|
64
|
+
:adapter: 'sqlite3'
|
65
|
+
:database: 'test.db'
|
66
|
+
eos
|
67
|
+
file.close
|
68
|
+
|
69
|
+
plugin = ::Killbill::Plugin::ActiveMerchant::PaymentPlugin.new(Proc.new { |config| nil },
|
70
|
+
:test,
|
71
|
+
::Killbill::Test::TestPaymentMethod,
|
72
|
+
::Killbill::Test::TestTransaction,
|
73
|
+
::Killbill::Test::TestResponse)
|
74
|
+
payment_api = ::Killbill::Plugin::ActiveMerchant::RSpec::FakeJavaPaymentApi.new
|
75
|
+
plugin.kb_apis = ::Killbill::Plugin::KillbillApi.new('test', {:payment_api => payment_api})
|
76
|
+
plugin.logger = Logger.new(STDOUT)
|
77
|
+
plugin.conf_dir = File.dirname(file)
|
78
|
+
|
79
|
+
# Start the plugin here - since the config file will be deleted
|
80
|
+
plugin.start_plugin
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -20,24 +20,26 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::Response do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'should construct responses correctly' do
|
23
|
-
api_call
|
24
|
-
kb_account_id
|
25
|
-
kb_payment_id
|
26
|
-
kb_payment_transaction_id
|
27
|
-
transaction_type
|
28
|
-
|
29
|
-
|
23
|
+
api_call = 'for debugging only'
|
24
|
+
kb_account_id = SecureRandom.uuid
|
25
|
+
kb_payment_id = SecureRandom.uuid
|
26
|
+
kb_payment_transaction_id = SecureRandom.uuid
|
27
|
+
transaction_type = :PURCHASE
|
28
|
+
payment_processor_account_id = 'petit_poucet'
|
29
|
+
kb_tenant_id = SecureRandom.uuid
|
30
|
+
response = ::ActiveMerchant::Billing::Response.new(true, 'Message', {}, {
|
30
31
|
:authorization => SecureRandom.uuid,
|
31
32
|
:avs_result => ::ActiveMerchant::Billing::AVSResult.new(:code => 'P')
|
32
33
|
})
|
33
34
|
|
34
|
-
r = ::Killbill::Test::TestResponse.from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, response, {}, ::Killbill::Test::TestResponse)
|
35
|
+
r = ::Killbill::Test::TestResponse.from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, payment_processor_account_id, kb_tenant_id, response, {}, ::Killbill::Test::TestResponse)
|
35
36
|
r.api_call.should == api_call
|
36
|
-
r.kb_account_id.should ==kb_account_id
|
37
|
-
r.kb_payment_id.should ==kb_payment_id
|
38
|
-
r.kb_payment_transaction_id.should ==kb_payment_transaction_id
|
39
|
-
r.transaction_type.should ==transaction_type
|
40
|
-
r.
|
37
|
+
r.kb_account_id.should == kb_account_id
|
38
|
+
r.kb_payment_id.should == kb_payment_id
|
39
|
+
r.kb_payment_transaction_id.should == kb_payment_transaction_id
|
40
|
+
r.transaction_type.should == transaction_type
|
41
|
+
r.payment_processor_account_id.should == payment_processor_account_id
|
42
|
+
r.kb_tenant_id.should == kb_tenant_id
|
41
43
|
r.message.should == response.message
|
42
44
|
r.authorization.should == response.authorization
|
43
45
|
r.fraud_review.should == response.fraud_review?
|
@@ -63,26 +65,27 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::Response do
|
|
63
65
|
ptip.gateway_error_code.should be_nil
|
64
66
|
ptip.first_payment_reference_id.should be_nil
|
65
67
|
ptip.second_payment_reference_id.should be_nil
|
66
|
-
ptip.properties.size.should ==
|
68
|
+
ptip.properties.size.should == 12
|
67
69
|
end
|
68
70
|
|
69
71
|
it 'should create responses and transactions correctly' do
|
70
|
-
api_call
|
71
|
-
kb_account_id
|
72
|
-
kb_payment_id
|
73
|
-
kb_payment_transaction_id
|
74
|
-
transaction_type
|
75
|
-
|
76
|
-
|
72
|
+
api_call = 'for debugging only'
|
73
|
+
kb_account_id = SecureRandom.uuid
|
74
|
+
kb_payment_id = SecureRandom.uuid
|
75
|
+
kb_payment_transaction_id = SecureRandom.uuid
|
76
|
+
transaction_type = :PURCHASE
|
77
|
+
payment_processor_account_id = 'petit_poucet'
|
78
|
+
kb_tenant_id = SecureRandom.uuid
|
79
|
+
success_response = ::ActiveMerchant::Billing::Response.new(true, 'Message', {}, {
|
77
80
|
:authorization => SecureRandom.uuid,
|
78
81
|
:avs_result => ::ActiveMerchant::Billing::AVSResult.new(:code => 'P')
|
79
82
|
})
|
80
|
-
failure_response
|
83
|
+
failure_response = ::ActiveMerchant::Billing::Response.new(false, 'Message', {}, {
|
81
84
|
:authorization => SecureRandom.uuid,
|
82
85
|
:avs_result => ::ActiveMerchant::Billing::AVSResult.new(:code => 'P')
|
83
86
|
})
|
84
87
|
|
85
|
-
response, transaction = ::Killbill::Test::TestResponse.create_response_and_transaction('test', ::Killbill::Test::TestTransaction, api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, success_response, 120, 'USD', {}, ::Killbill::Test::TestResponse)
|
88
|
+
response, transaction = ::Killbill::Test::TestResponse.create_response_and_transaction('test', ::Killbill::Test::TestTransaction, api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, payment_processor_account_id, kb_tenant_id, success_response, 120, 'USD', {}, ::Killbill::Test::TestResponse)
|
86
89
|
found_response = ::Killbill::Test::TestResponse.find(response.id)
|
87
90
|
found_response.should == response
|
88
91
|
found_response.test_transaction.should == transaction
|
@@ -90,11 +93,31 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::Response do
|
|
90
93
|
found_transaction.should == transaction
|
91
94
|
found_transaction.test_response.should == response
|
92
95
|
|
93
|
-
response, transaction = ::Killbill::Test::TestResponse.create_response_and_transaction('test', ::Killbill::Test::TestTransaction, api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, failure_response, 120, 'USD', {}, ::Killbill::Test::TestResponse)
|
96
|
+
response, transaction = ::Killbill::Test::TestResponse.create_response_and_transaction('test', ::Killbill::Test::TestTransaction, api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, payment_processor_account_id, kb_tenant_id, failure_response, 120, 'USD', {}, ::Killbill::Test::TestResponse)
|
94
97
|
transaction.should be_nil
|
95
98
|
found_response = ::Killbill::Test::TestResponse.find(response.id)
|
96
99
|
found_response.should == response
|
97
100
|
found_response.test_transaction.should be_nil
|
101
|
+
|
102
|
+
# Lookup responses for kb_payment_id
|
103
|
+
responses = ::Killbill::Test::TestResponse.responses_from_kb_payment_id(transaction_type, kb_payment_id, kb_tenant_id)
|
104
|
+
responses.size.should == 2
|
105
|
+
responses[0].success.should be_true
|
106
|
+
responses[1].success.should be_false
|
107
|
+
|
108
|
+
# Lookup responses for kb_payment_transaction_id
|
109
|
+
responses = ::Killbill::Test::TestResponse.responses_from_kb_payment_transaction_id(transaction_type, kb_payment_transaction_id, kb_tenant_id)
|
110
|
+
responses.size.should == 2
|
111
|
+
responses[0].success.should be_true
|
112
|
+
responses[1].success.should be_false
|
113
|
+
|
114
|
+
# Dummy queries
|
115
|
+
::Killbill::Test::TestResponse.responses_from_kb_payment_id(:foo, kb_payment_id, kb_tenant_id).size.should == 0
|
116
|
+
::Killbill::Test::TestResponse.responses_from_kb_payment_id(transaction_type, SecureRandom.uuid, kb_tenant_id).size.should == 0
|
117
|
+
::Killbill::Test::TestResponse.responses_from_kb_payment_id(transaction_type, kb_payment_id, SecureRandom.uuid).size.should == 0
|
118
|
+
::Killbill::Test::TestResponse.responses_from_kb_payment_transaction_id(:foo, kb_payment_transaction_id, kb_tenant_id).size.should == 0
|
119
|
+
::Killbill::Test::TestResponse.responses_from_kb_payment_transaction_id(transaction_type, SecureRandom.uuid, kb_tenant_id).size.should == 0
|
120
|
+
::Killbill::Test::TestResponse.responses_from_kb_payment_transaction_id(transaction_type, kb_payment_transaction_id, SecureRandom.uuid).size.should == 0
|
98
121
|
end
|
99
122
|
|
100
123
|
it 'should generate the right SQL query' do
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'spec/killbill/helpers/payment_method_spec'
|
3
|
+
|
4
|
+
describe Killbill::Plugin::ActiveMerchant::ActiveRecord do
|
5
|
+
|
6
|
+
before(:all) do
|
7
|
+
::Killbill::Test::TestPaymentMethod.delete_all
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should stream results per batch' do
|
11
|
+
1.upto(35) do
|
12
|
+
::Killbill::Test::TestPaymentMethod.create(:kb_account_id => SecureRandom.uuid,
|
13
|
+
:kb_payment_method_id => SecureRandom.uuid,
|
14
|
+
:kb_tenant_id => SecureRandom.uuid,
|
15
|
+
:token => SecureRandom.uuid)
|
16
|
+
end
|
17
|
+
::Killbill::Test::TestPaymentMethod.count.should == 35
|
18
|
+
|
19
|
+
enum = ::Killbill::Plugin::ActiveMerchant::ActiveRecord::StreamyResultSet.new(40, 10) do |offset, limit|
|
20
|
+
::Killbill::Test::TestPaymentMethod.where('kb_payment_method_id is not NULL')
|
21
|
+
.order('id ASC')
|
22
|
+
.offset(offset)
|
23
|
+
.limit(limit)
|
24
|
+
end
|
25
|
+
|
26
|
+
i = 0
|
27
|
+
enum.each do |results|
|
28
|
+
if i < 3
|
29
|
+
results.size.should == 10
|
30
|
+
elsif i == 3
|
31
|
+
results.size.should == 5
|
32
|
+
else
|
33
|
+
fail 'Too many results'
|
34
|
+
end
|
35
|
+
i += 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|