killbill 3.1.5 → 3.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6141d190c01d2ec61eda77a25f6695333d63621b
4
- data.tar.gz: 9f4e38f84685bbdbdfa38029b35b7788f628356d
3
+ metadata.gz: ce31dbfe71c1ea2aae402a3a5f30d4635f1f44dc
4
+ data.tar.gz: 028044c61a02e5957099524601055f15c596e9a8
5
5
  SHA512:
6
- metadata.gz: 6f00d1843589dbed8539e0f50032cce941b10c065a6e045ba451be1e336b5f21e34a6e65dda277a14313cd2680277726086ee72f88884e25e110ca222b144857
7
- data.tar.gz: a70b7729a4ff199f52fbeee6b8f37c5a9c803edb70739c5c68c4407fb833dd01ca229fcbd6a86c456fdffe4e37dc310cb4ecbe9d9649997449d50e26f145063c
6
+ metadata.gz: 579efbe60b305303205c3e2cedc03b66cd6b2622244f304b0d05f5fe87729edeff61c07c7117819f38d422d48e8cb8d563c5e5f6759f3ba4fd79eaf061ffc55d
7
+ data.tar.gz: 99c8c98f3085e9fa83b1745cef3bd224c74c23efdd394a56cf9dde919ffc1090f59d96873d8fe7c64a1d0d9eadcef0a72fe7bdcff7d38dbc94310c5e37ad398d
data/Jarfile CHANGED
@@ -1,4 +1,4 @@
1
- jar 'org.kill-bill.billing:killbill-api', '0.9.7'
1
+ jar 'org.kill-bill.billing:killbill-api', '0.9.8'
2
2
  jar 'org.kill-bill.billing.plugin:killbill-plugin-api-notification', '0.7.4'
3
3
  jar 'org.kill-bill.billing.plugin:killbill-plugin-api-payment', '0.7.4'
4
4
  jar 'org.kill-bill.billing.plugin:killbill-plugin-api-currency', '0.7.4'
data/NEWS CHANGED
@@ -1,3 +1,8 @@
1
+ 3.1.6
2
+ Updates to support killbill-api 0.9.8
3
+ Fix properties handling in add_payment_method
4
+ Performance improvements
5
+
1
6
  3.1.5
2
7
  Updates to support killbill-api 0.9.7
3
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.1.5
1
+ 3.1.6
@@ -1,4 +1,4 @@
1
- jar 'org.kill-bill.billing:killbill-api', '0.9.6'
1
+ jar 'org.kill-bill.billing:killbill-api', '0.9.8'
2
2
  jar 'org.kill-bill.billing.plugin:killbill-plugin-api-notification', '0.7.4'
3
3
  jar 'org.kill-bill.billing.plugin:killbill-plugin-api-payment', '0.7.4'
4
4
  jar 'org.kill-bill.billing.plugin:killbill-plugin-api-currency', '0.7.4'
@@ -6,7 +6,7 @@ module Killbill #:nodoc:
6
6
 
7
7
  has_one :<%= identifier %>_transaction
8
8
 
9
- def self.from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, response, extra_params = {})
9
+ def self.from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, response, extra_params = {}, model = ::Killbill::<%= class_name %>::<%= class_name %>Response)
10
10
  super(api_call,
11
11
  kb_account_id,
12
12
  kb_payment_id,
@@ -19,7 +19,7 @@ module Killbill #:nodoc:
19
19
  #:params_id => extract(response, 'id'),
20
20
  #:params_card_id => extract(response, 'card', 'id')
21
21
  }.merge!(extra_params),
22
- ::Killbill::<%= class_name %>::<%= class_name %>Response)
22
+ model)
23
23
  end
24
24
  end
25
25
  end
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.rdoc_options << '--exclude' << '.'
24
24
 
25
- s.add_dependency 'killbill', '~> 3.1.4'
25
+ s.add_dependency 'killbill', '~> 3.1.6'
26
26
  s.add_dependency 'activemerchant', '~> 1.42.9'
27
27
  s.add_dependency 'activerecord', '~> 4.1.0'
28
28
  s.add_dependency 'actionpack', '~> 4.1.0'
@@ -0,0 +1,43 @@
1
+ ###################################################################################
2
+ # #
3
+ # Copyright 2010-2013 Ning, Inc. #
4
+ # Copyright 2014 The Billing Project, LLC #
5
+ # #
6
+ # The Billing Project licenses this file to you under the Apache License, #
7
+ # version 2.0 (the "License"); you may not use this file except in #
8
+ # compliance with the 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
+
20
+
21
+ #
22
+ # DO NOT EDIT!!!
23
+ # File automatically generated by killbill-java-parser (git@github.com:killbill/killbill-java-parser.git)
24
+ #
25
+
26
+
27
+ module Killbill
28
+ module Plugin
29
+ module Api
30
+
31
+ java_package 'org.killbill.billing'
32
+ class KillbillApi
33
+
34
+ include org.killbill.billing.KillbillApi
35
+
36
+ def initialize(real_java_api)
37
+ @real_java_api = real_java_api
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -86,6 +86,7 @@ require 'killbill/gen/api/invoice_item'
86
86
  require 'killbill/gen/api/invoice_payment'
87
87
  require 'killbill/gen/api/invoice_payment_api'
88
88
  require 'killbill/gen/api/invoice_user_api'
89
+ require 'killbill/gen/api/killbill_api'
89
90
  require 'killbill/gen/api/plugin_config_service_api'
90
91
  require 'killbill/gen/api/osgi_killbill'
91
92
  require 'killbill/gen/api/osgi_plugin_properties'
@@ -3,6 +3,37 @@ module Killbill
3
3
  module ActiveMerchant
4
4
  module Helpers
5
5
 
6
+ # In our profiling, we noticed that ActiveRecord::Sanitization::ClassMethods.sanitize_sql was taking
7
+ # about 50% of where queries calls time, mainly because of the String#gsub magic in ActiveRecord::Sanitization::ClassMethods.replace_bind_variables.
8
+ # We don't want to issue raw SQL because we still want to be able to support multiple back-ends (at least SQLite and MySQL),
9
+ # so we cache the quoted values (this should also give us SQL injection protection).
10
+ # The gain is not 50% but more around 30% due to the Mutex overhead in the cache
11
+ def build_quotes_cache(max_size=1000)
12
+ # See ::ActiveRecord::Sanitization::ClassMethods.quote_bound_value
13
+ quote_bound_value_proc = Proc.new { |value|
14
+ c = connection
15
+
16
+ if value.respond_to?(:map) && !value.acts_like?(:string)
17
+ if value.respond_to?(:empty?) && value.empty?
18
+ c.quote(nil)
19
+ else
20
+ value.map { |v| c.quote(v) }.join(',')
21
+ end
22
+ else
23
+ c.quote(value)
24
+ end
25
+ }
26
+
27
+ Killbill::Plugin::ActiveMerchant::Utils::BoundedLRUCache.new(quote_bound_value_proc, max_size)
28
+ end
29
+
30
+ def shared_activerecord_options
31
+ {
32
+ # We don't use validations -- small performance gain by bypassing the stack
33
+ :validate => false
34
+ }
35
+ end
36
+
6
37
  # Useful helper to extract params from AM response objects, e.g. extract(response, 'card', 'address_country')
7
38
  def extract(response, key1, key2=nil, key3=nil)
8
39
  return nil if response.nil? || response.params.nil?
@@ -12,6 +12,8 @@ module Killbill
12
12
 
13
13
  self.abstract_class = true
14
14
 
15
+ @@quotes_cache = build_quotes_cache
16
+
15
17
  def self.from_response(kb_account_id, kb_payment_method_id, kb_tenant_id, cc_or_token, response, options, extra_params = {}, model = PaymentMethod)
16
18
  model.new({
17
19
  :kb_account_id => kb_account_id,
@@ -35,17 +37,17 @@ module Killbill
35
37
 
36
38
  def self.from_kb_account_id(kb_account_id, kb_tenant_id)
37
39
  if kb_tenant_id.nil?
38
- where('kb_account_id = ? AND kb_tenant_id is NULL AND is_deleted = ?', kb_account_id, false)
40
+ where("kb_account_id = #{@@quotes_cache[kb_account_id]} AND kb_tenant_id is NULL AND is_deleted = #{@@quotes_cache[false]}")
39
41
  else
40
- where('kb_account_id = ? AND kb_tenant_id = ? AND is_deleted = ?', kb_account_id, kb_tenant_id, false)
42
+ where("kb_account_id = #{@@quotes_cache[kb_account_id]} AND kb_tenant_id = #{@@quotes_cache[kb_tenant_id]} AND is_deleted = #{@@quotes_cache[false]}")
41
43
  end
42
44
  end
43
45
 
44
46
  def self.from_kb_payment_method_id(kb_payment_method_id, kb_tenant_id)
45
47
  if kb_tenant_id.nil?
46
- payment_methods = where('kb_payment_method_id = ? AND kb_tenant_id is NULL AND is_deleted = ?', kb_payment_method_id, false)
48
+ payment_methods = where("kb_payment_method_id = #{@@quotes_cache[kb_payment_method_id]} AND kb_tenant_id is NULL AND is_deleted = #{@@quotes_cache[false]}")
47
49
  else
48
- payment_methods = where('kb_payment_method_id = ? AND kb_tenant_id = ? AND is_deleted = ?', kb_payment_method_id, kb_tenant_id, false)
50
+ payment_methods = where("kb_payment_method_id = #{@@quotes_cache[kb_payment_method_id]} AND kb_tenant_id = #{@@quotes_cache[kb_tenant_id]} AND is_deleted = #{@@quotes_cache[false]}")
49
51
  end
50
52
  raise "No payment method found for payment method #{kb_payment_method_id}" if payment_methods.empty?
51
53
  raise "Kill Bill payment method #{kb_payment_method_id} mapping to multiple active plugin payment methods" if payment_methods.size > 1
@@ -55,7 +57,7 @@ module Killbill
55
57
  def self.mark_as_deleted!(kb_payment_method_id, kb_tenant_id)
56
58
  payment_method = from_kb_payment_method_id(kb_payment_method_id, kb_tenant_id)
57
59
  payment_method.is_deleted = true
58
- payment_method.save!
60
+ payment_method.save!(shared_activerecord_options)
59
61
  end
60
62
 
61
63
  # Override in your plugin if needed
@@ -35,6 +35,46 @@ module Killbill
35
35
  }.merge!(extra_params))
36
36
  end
37
37
 
38
+ def self.create_response_and_transaction(identifier, transaction_model, api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, am_response, amount_in_cents, currency, extra_params = {}, model = Response)
39
+ response, transaction, exception = nil
40
+
41
+ # Rails wraps all create/save calls in a transaction. To speed things up, create a single transaction for both rows.
42
+ # This has a small gotcha in the unhappy path though (see below).
43
+ transaction do
44
+ # Save the response to our logs
45
+ response = from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, am_response, extra_params, model)
46
+ response.save!(shared_activerecord_options)
47
+
48
+ transaction = nil
49
+ txn_id = response.txn_id
50
+ if response.success and !kb_payment_id.blank? and !txn_id.blank?
51
+ # Record the transaction
52
+ # Note that we want to avoid throwing an exception here because we don't want to rollback the response row
53
+ begin
54
+ # Originally, we used response.send("build_#{identifier}_transaction"), but the ActiveRecord magic was adding
55
+ # about 20% overhead - instead, we now construct the transaction record manually
56
+ transaction = transaction_model.new(:kb_account_id => kb_account_id,
57
+ :kb_tenant_id => kb_tenant_id,
58
+ :amount_in_cents => amount_in_cents,
59
+ :currency => currency,
60
+ :api_call => api_call,
61
+ :kb_payment_id => kb_payment_id,
62
+ :kb_payment_transaction_id => kb_payment_transaction_id,
63
+ :transaction_type => transaction_type,
64
+ :txn_id => txn_id,
65
+ "#{identifier}_response_id" => response.id)
66
+ transaction.save!(shared_activerecord_options)
67
+ rescue => e
68
+ exception = e
69
+ end
70
+ end
71
+ end
72
+
73
+ raise exception unless exception.nil?
74
+
75
+ return response, transaction
76
+ end
77
+
38
78
  def to_transaction_info_plugin(transaction=nil)
39
79
  if transaction.nil?
40
80
  amount_in_cents = nil
@@ -6,9 +6,14 @@ module Killbill
6
6
 
7
7
  class Transaction < ::ActiveRecord::Base
8
8
 
9
+ extend ::Killbill::Plugin::ActiveMerchant::Helpers
10
+
9
11
  self.abstract_class = true
10
12
 
13
+ @@quotes_cache = build_quotes_cache
14
+
11
15
  class << self
16
+
12
17
  def transactions_from_kb_payment_id(kb_payment_id, kb_tenant_id)
13
18
  where(:kb_payment_id => kb_payment_id, :kb_tenant_id => kb_tenant_id).order(:created_at)
14
19
  end
@@ -44,15 +49,14 @@ module Killbill
44
49
  def do_find_candidate_transaction_for_refund(api_call, kb_payment_id, kb_tenant_id, amount_in_cents)
45
50
  # Find one successful charge which amount is at least the amount we are trying to refund
46
51
  if kb_tenant_id.nil?
47
- transactions = where('amount_in_cents >= ? AND api_call = ? AND kb_tenant_id is NULL AND kb_payment_id = ?', amount_in_cents, api_call, kb_payment_id).order(:created_at)
52
+ transactions = where("amount_in_cents >= #{@@quotes_cache[amount_in_cents]} AND api_call = #{@@quotes_cache[api_call]} AND kb_tenant_id is NULL AND kb_payment_id = #{@@quotes_cache[kb_payment_id]}").order(:created_at)
48
53
  else
49
- transactions = where('amount_in_cents >= ? AND api_call = ? AND kb_tenant_id = ? AND kb_payment_id = ?', amount_in_cents, api_call, kb_tenant_id, kb_payment_id).order(:created_at)
54
+ transactions = where("amount_in_cents >= #{@@quotes_cache[amount_in_cents]} AND api_call = #{@@quotes_cache[api_call]} AND kb_tenant_id = #{@@quotes_cache[kb_tenant_id]} AND kb_payment_id = #{@@quotes_cache[kb_payment_id]}").order(:created_at)
50
55
  end
51
56
  raise "Unable to find transaction for payment #{kb_payment_id} and api_call #{api_call}" if transactions.size == 0
52
57
 
53
58
  # We have candidates, but we now need to make sure we didn't refund more than for the specified amount
54
- amount_refunded_in_cents = where('api_call = ? and kb_payment_id = ?', :refund, kb_payment_id)
55
- .sum('amount_in_cents')
59
+ amount_refunded_in_cents = where("api_call = #{@@quotes_cache['refund']} and kb_payment_id = #{@@quotes_cache[kb_payment_id]}").sum('amount_in_cents')
56
60
 
57
61
  amount_left_to_refund_in_cents = -amount_refunded_in_cents
58
62
  transactions.map { |transaction| amount_left_to_refund_in_cents += transaction.amount_in_cents }
@@ -67,13 +71,13 @@ module Killbill
67
71
  if transaction_type.nil?
68
72
  transactions = where("kb_tenant_id is NULL AND #{attribute.to_s} = ?", attribute_value).order(:created_at)
69
73
  else
70
- transactions = where("transaction_type = ? AND kb_tenant_id is NULL AND #{attribute.to_s} = ?", transaction_type, attribute_value).order(:created_at)
74
+ transactions = where("transaction_type = #{@@quotes_cache[transaction_type]} AND kb_tenant_id is NULL AND #{attribute.to_s} = #{@@quotes_cache[attribute_value]}").order(:created_at)
71
75
  end
72
76
  else
73
77
  if transaction_type.nil?
74
- transactions = where("kb_tenant_id = ? AND #{attribute.to_s} = ?", kb_tenant_id, attribute_value).order(:created_at)
78
+ transactions = where("kb_tenant_id = #{@@quotes_cache[kb_tenant_id]} AND #{attribute.to_s} = #{@@quotes_cache[attribute_value]}").order(:created_at)
75
79
  else
76
- transactions = where("transaction_type = ? AND kb_tenant_id = ? AND #{attribute.to_s} = ?", transaction_type, kb_tenant_id, attribute_value).order(:created_at)
80
+ transactions = where("transaction_type = #{@@quotes_cache[transaction_type]} AND kb_tenant_id = #{@@quotes_cache[kb_tenant_id]} AND #{attribute.to_s} = #{@@quotes_cache[attribute_value]}").order(:created_at)
77
81
  end
78
82
  end
79
83
  if how_many == :single
@@ -152,7 +152,7 @@ module Killbill
152
152
  end
153
153
 
154
154
  def add_payment_method(kb_account_id, kb_payment_method_id, payment_method_props, set_default, properties, context)
155
- all_properties = (payment_method_props || payment_method_props.properties || []) + properties
155
+ all_properties = (payment_method_props.nil? || payment_method_props.properties.nil? ? [] : payment_method_props.properties) + properties
156
156
  options = properties_to_hash(properties)
157
157
  options[:set_default] ||= set_default
158
158
  options[:order_id] ||= kb_payment_method_id
@@ -401,27 +401,10 @@ module Killbill
401
401
  def save_response_and_transaction(response, api_call, kb_account_id, kb_tenant_id, kb_payment_id=nil, kb_payment_transaction_id=nil, transaction_type=nil, amount_in_cents=0, currency=nil)
402
402
  @logger.warn "Unsuccessful #{api_call}: #{response.message}" unless response.success?
403
403
 
404
- # Save the response to our logs
405
- response = @response_model.from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, response)
406
- response.save!
407
-
408
- transaction = nil
409
- txn_id = response.txn_id
410
- if response.success and !kb_payment_id.blank? and !txn_id.blank?
411
- # Record the transaction
412
- transaction = response.send("create_#{@identifier}_transaction!",
413
- :kb_account_id => kb_account_id,
414
- :kb_tenant_id => kb_tenant_id,
415
- :amount_in_cents => amount_in_cents,
416
- :currency => currency,
417
- :api_call => api_call,
418
- :kb_payment_id => kb_payment_id,
419
- :kb_payment_transaction_id => kb_payment_transaction_id,
420
- :transaction_type => transaction_type,
421
- :txn_id => txn_id)
422
-
423
- @logger.debug "Recorded transaction: #{transaction.inspect}"
424
- end
404
+ 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, kb_tenant_id, response, amount_in_cents, currency, {}, @response_model)
405
+
406
+ @logger.debug "Recorded transaction: #{transaction.inspect}" unless transaction.nil?
407
+
425
408
  return response, transaction
426
409
  end
427
410
 
@@ -7,15 +7,53 @@ module Killbill
7
7
 
8
8
  def self.compact_uuid(uuid)
9
9
  uuid = uuid.gsub(/-/, '')
10
- uuid.hex.base(62).map{ |i| BASE62[i].chr } * ''
10
+ uuid.hex.base(62).map { |i| BASE62[i].chr } * ''
11
11
  end
12
12
 
13
13
  def self.unpack_uuid(base62_uuid)
14
- as_hex = base62_uuid.split(//).inject(0) { |i,e| i*62 + BASE62.index(e[0]) }
14
+ as_hex = base62_uuid.split(//).inject(0) { |i, e| i*62 + BASE62.index(e[0]) }
15
15
  no_hyphens = "%x" % as_hex
16
16
  no_hyphens = '0' * (32 - no_hyphens.size) + no_hyphens
17
17
  no_hyphens.insert(8, "-").insert(13, "-").insert(18, "-").insert(23, "-")
18
18
  end
19
+
20
+ # Relies on the fact that hashes enumerate their values in the order that the corresponding keys were inserted (Ruby 1.9+)
21
+ class BoundedLRUCache
22
+
23
+ def initialize(proc, max_size=1000)
24
+ @proc = proc
25
+ @max_size = max_size
26
+
27
+ @semaphore = Mutex.new
28
+ # TODO Pre-allocate?
29
+ @data = {}
30
+ end
31
+
32
+ def [](key)
33
+ @semaphore.synchronize do
34
+ found = true
35
+ value = @data.delete(key) { found = false }
36
+ if found
37
+ @data[key] = value
38
+ else
39
+ value = @proc.call(key)
40
+ @data[key] = value
41
+ value
42
+ end
43
+ end
44
+ end
45
+
46
+ def []=(key, val)
47
+ @semaphore.synchronize do
48
+ @data.delete(key)
49
+ @data[key] = val
50
+ if @data.length > @max_size
51
+ @data.delete(@data.first[0])
52
+ end
53
+ val
54
+ end
55
+ end
56
+ end
19
57
  end
20
58
  end
21
59
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'spec/killbill/helpers/transaction_spec'
2
3
 
3
4
  module Killbill #:nodoc:
4
5
  module Test #:nodoc:
@@ -6,6 +7,8 @@ module Killbill #:nodoc:
6
7
 
7
8
  self.table_name = 'test_responses'
8
9
 
10
+ has_one :test_transaction
11
+
9
12
  end
10
13
  end
11
14
  end
@@ -66,6 +69,37 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::Response do
66
69
  ptip.properties.size.should == 11
67
70
  end
68
71
 
72
+ it 'should create responses and transactions correctly' do
73
+ api_call = 'for debugging only'
74
+ kb_account_id = SecureRandom.uuid
75
+ kb_payment_id = SecureRandom.uuid
76
+ kb_payment_transaction_id = SecureRandom.uuid
77
+ transaction_type = :PURCHASE
78
+ kb_tenant_id = SecureRandom.uuid
79
+ success_response = ::ActiveMerchant::Billing::Response.new(true, 'Message', {}, {
80
+ :authorization => SecureRandom.uuid,
81
+ :avs_result => ::ActiveMerchant::Billing::AVSResult.new(:code => 'P')
82
+ })
83
+ failure_response = ::ActiveMerchant::Billing::Response.new(false, 'Message', {}, {
84
+ :authorization => SecureRandom.uuid,
85
+ :avs_result => ::ActiveMerchant::Billing::AVSResult.new(:code => 'P')
86
+ })
87
+
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, kb_tenant_id, success_response, 120, 'USD', {}, ::Killbill::Test::TestResponse)
89
+ found_response = ::Killbill::Test::TestResponse.find(response.id)
90
+ found_response.should == response
91
+ found_response.test_transaction.should == transaction
92
+ found_transaction = ::Killbill::Test::TestTransaction.find(transaction.id)
93
+ found_transaction.should == transaction
94
+ found_transaction.test_response.should == response
95
+
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, kb_tenant_id, failure_response, 120, 'USD', {}, ::Killbill::Test::TestResponse)
97
+ transaction.should be_nil
98
+ found_response = ::Killbill::Test::TestResponse.find(response.id)
99
+ found_response.should == response
100
+ found_response.test_transaction.should be_nil
101
+ end
102
+
69
103
  it 'should generate the right SQL query' do
70
104
  # Check count query (search query numeric)
71
105
  expected_query = "SELECT COUNT(DISTINCT \"test_responses\".\"id\") FROM \"test_responses\" WHERE ((((\"test_responses\".\"kb_payment_id\" = '1234' OR \"test_responses\".\"kb_payment_transaction_id\" = '1234') OR \"test_responses\".\"message\" = '1234') OR \"test_responses\".\"authorization\" = '1234') OR \"test_responses\".\"fraud_review\" = '1234') AND \"test_responses\".\"success\" = 't' AND \"test_responses\".\"kb_tenant_id\" = '11-22-33' ORDER BY \"test_responses\".\"id\""
@@ -27,11 +27,12 @@ ActiveRecord::Schema.define(:version => 20140410153635) do
27
27
  add_index(:test_payment_methods, :kb_payment_method_id)
28
28
 
29
29
  create_table "test_transactions", :force => true do |t|
30
- t.integer "response_id", :null => false
30
+ t.integer "test_response_id", :null => false
31
31
  t.string "api_call", :null => false
32
32
  t.string "kb_payment_id", :null => false
33
33
  t.string "kb_payment_transaction_id", :null => false
34
34
  t.string "transaction_type", :null => false
35
+ t.string "txn_id"
35
36
  t.integer "amount_in_cents", :null => false
36
37
  t.string "currency", :null => false
37
38
  t.datetime "created_at", :null => false
@@ -43,7 +44,7 @@ ActiveRecord::Schema.define(:version => 20140410153635) do
43
44
  add_index(:test_transactions, :kb_payment_id)
44
45
 
45
46
  create_table "test_responses", :force => true do |t|
46
- t.string "api_call", :null => false
47
+ t.string "api_call", :null => false
47
48
  t.string "kb_payment_id"
48
49
  t.string "kb_payment_transaction_id"
49
50
  t.string "transaction_type"
@@ -6,6 +6,8 @@ module Killbill #:nodoc:
6
6
 
7
7
  self.table_name = 'test_transactions'
8
8
 
9
+ belongs_to :test_response
10
+
9
11
  end
10
12
  end
11
13
  end
@@ -129,6 +131,6 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::Transaction do
129
131
  :currency => currency,
130
132
  :kb_account_id => kb_account_id,
131
133
  :kb_tenant_id => kb_tenant_id,
132
- :response_id => 0)
134
+ :test_response_id => 0)
133
135
  end
134
136
  end
@@ -11,6 +11,7 @@ require 'killbill/http_servlet'
11
11
  require 'killbill/payment_test'
12
12
  require 'killbill/notification_test'
13
13
  require 'killbill/helpers/active_merchant'
14
+ require 'killbill/helpers/active_merchant/active_record/models/helpers'
14
15
 
15
16
  %w(
16
17
  MockAccountUserApi
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: killbill
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.5
4
+ version: 3.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kill Bill core team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-12 00:00:00.000000000 Z
11
+ date: 2014-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -247,6 +247,7 @@ files:
247
247
  - lib/killbill/gen/api/invoice_payment.rb
248
248
  - lib/killbill/gen/api/invoice_payment_api.rb
249
249
  - lib/killbill/gen/api/invoice_user_api.rb
250
+ - lib/killbill/gen/api/killbill_api.rb
250
251
  - lib/killbill/gen/api/limit.rb
251
252
  - lib/killbill/gen/api/listing.rb
252
253
  - lib/killbill/gen/api/migration_plan.rb