killbill 3.1.5 → 3.1.6

Sign up to get free protection for your applications and to get access to all the features.
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