killbill-litle 1.10.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,44 +0,0 @@
1
- module Killbill::Litle
2
- class LitleTransaction < ActiveRecord::Base
3
- belongs_to :litle_response
4
- attr_accessible :amount_in_cents, :currency, :api_call, :kb_payment_id, :litle_txn_id
5
-
6
- def self.from_kb_payment_id(kb_payment_id)
7
- transaction_from_kb_payment_id :charge, kb_payment_id, :single
8
- end
9
-
10
- def self.refunds_from_kb_payment_id(kb_payment_id)
11
- transaction_from_kb_payment_id :refund, kb_payment_id, :multiple
12
- end
13
-
14
- def self.find_candidate_transaction_for_refund(kb_payment_id, amount_in_cents)
15
- # Find one successful charge which amount is at least the amount we are trying to refund
16
- litle_transactions = LitleTransaction.where("litle_transactions.amount_in_cents >= ?", amount_in_cents)
17
- .find_all_by_api_call_and_kb_payment_id(:charge, kb_payment_id)
18
- raise "Unable to find Litle transaction id for payment #{kb_payment_id}" if litle_transactions.size == 0
19
-
20
- # We have candidates, but we now need to make sure we didn't refund more than for the specified amount
21
- amount_refunded_in_cents = Killbill::Litle::LitleTransaction.where("api_call = ? and kb_payment_id = ?", :refund, kb_payment_id)
22
- .sum("amount_in_cents")
23
-
24
- amount_left_to_refund_in_cents = -amount_refunded_in_cents
25
- litle_transactions.map { |transaction| amount_left_to_refund_in_cents += transaction.amount_in_cents }
26
- raise "Amount #{amount_in_cents} too large to refund for payment #{kb_payment_id}" if amount_left_to_refund_in_cents < amount_in_cents
27
-
28
- litle_transactions.first
29
- end
30
-
31
- private
32
-
33
- def self.transaction_from_kb_payment_id(api_call, kb_payment_id, how_many)
34
- litle_transactions = find_all_by_api_call_and_kb_payment_id(api_call, kb_payment_id)
35
- raise "Unable to find Litle transaction id for payment #{kb_payment_id}" if litle_transactions.empty?
36
- if how_many == :single
37
- raise "Killbill payment mapping to multiple Litle transactions for payment #{kb_payment_id}" if litle_transactions.size > 1
38
- litle_transactions[0]
39
- else
40
- litle_transactions
41
- end
42
- end
43
- end
44
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Killbill::Litle do
4
-
5
- before :all do
6
- Killbill::Litle.initialize!
7
- end
8
-
9
- it 'should not make currency conversion' do
10
- Killbill::Litle.converted_currency(:USD).should be_false
11
- Killbill::Litle.converted_currency('usd').should be_false
12
- Killbill::Litle.converted_currency('USD').should be_false
13
- end
14
-
15
- it 'should make currency conversion' do
16
- Killbill::Litle.converted_currency(:BRL).should == 'USD'
17
- Killbill::Litle.converted_currency('brl').should == 'USD'
18
- Killbill::Litle.converted_currency('BRL').should == 'USD'
19
- end
20
-
21
- end
@@ -1,95 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Killbill::Litle::LitlePaymentMethod do
4
- before :all do
5
- Killbill::Litle::LitlePaymentMethod.delete_all
6
- end
7
-
8
- it 'should generate the right SQL query' do
9
- # Check count query (search query numeric)
10
- expected_query = "SELECT COUNT(DISTINCT \"litle_payment_methods\".\"id\") FROM \"litle_payment_methods\" WHERE ((((((((((((\"litle_payment_methods\".\"litle_token\" = '1234' OR \"litle_payment_methods\".\"cc_type\" = '1234') OR \"litle_payment_methods\".\"state\" = '1234') OR \"litle_payment_methods\".\"zip\" = '1234') OR \"litle_payment_methods\".\"cc_first_name\" LIKE '%1234%') OR \"litle_payment_methods\".\"cc_last_name\" LIKE '%1234%') OR \"litle_payment_methods\".\"address1\" LIKE '%1234%') OR \"litle_payment_methods\".\"address2\" LIKE '%1234%') OR \"litle_payment_methods\".\"city\" LIKE '%1234%') OR \"litle_payment_methods\".\"country\" LIKE '%1234%') OR \"litle_payment_methods\".\"cc_exp_month\" = 1234) OR \"litle_payment_methods\".\"cc_exp_year\" = 1234) OR \"litle_payment_methods\".\"cc_last_4\" = 1234) ORDER BY \"litle_payment_methods\".\"id\""
11
- # Note that Kill Bill will pass a String, even for numeric types
12
- Killbill::Litle::LitlePaymentMethod.search_query('1234').to_sql.should == expected_query
13
-
14
- # Check query with results (search query numeric)
15
- expected_query = "SELECT DISTINCT \"litle_payment_methods\".* FROM \"litle_payment_methods\" WHERE ((((((((((((\"litle_payment_methods\".\"litle_token\" = '1234' OR \"litle_payment_methods\".\"cc_type\" = '1234') OR \"litle_payment_methods\".\"state\" = '1234') OR \"litle_payment_methods\".\"zip\" = '1234') OR \"litle_payment_methods\".\"cc_first_name\" LIKE '%1234%') OR \"litle_payment_methods\".\"cc_last_name\" LIKE '%1234%') OR \"litle_payment_methods\".\"address1\" LIKE '%1234%') OR \"litle_payment_methods\".\"address2\" LIKE '%1234%') OR \"litle_payment_methods\".\"city\" LIKE '%1234%') OR \"litle_payment_methods\".\"country\" LIKE '%1234%') OR \"litle_payment_methods\".\"cc_exp_month\" = 1234) OR \"litle_payment_methods\".\"cc_exp_year\" = 1234) OR \"litle_payment_methods\".\"cc_last_4\" = 1234) ORDER BY \"litle_payment_methods\".\"id\" LIMIT 10 OFFSET 0"
16
- # Note that Kill Bill will pass a String, even for numeric types
17
- Killbill::Litle::LitlePaymentMethod.search_query('1234', 0, 10).to_sql.should == expected_query
18
-
19
- # Check count query (search query string)
20
- expected_query = "SELECT COUNT(DISTINCT \"litle_payment_methods\".\"id\") FROM \"litle_payment_methods\" WHERE (((((((((\"litle_payment_methods\".\"litle_token\" = 'XXX' OR \"litle_payment_methods\".\"cc_type\" = 'XXX') OR \"litle_payment_methods\".\"state\" = 'XXX') OR \"litle_payment_methods\".\"zip\" = 'XXX') OR \"litle_payment_methods\".\"cc_first_name\" LIKE '%XXX%') OR \"litle_payment_methods\".\"cc_last_name\" LIKE '%XXX%') OR \"litle_payment_methods\".\"address1\" LIKE '%XXX%') OR \"litle_payment_methods\".\"address2\" LIKE '%XXX%') OR \"litle_payment_methods\".\"city\" LIKE '%XXX%') OR \"litle_payment_methods\".\"country\" LIKE '%XXX%') ORDER BY \"litle_payment_methods\".\"id\""
21
- Killbill::Litle::LitlePaymentMethod.search_query('XXX').to_sql.should == expected_query
22
-
23
- # Check query with results (search query string)
24
- expected_query = "SELECT DISTINCT \"litle_payment_methods\".* FROM \"litle_payment_methods\" WHERE (((((((((\"litle_payment_methods\".\"litle_token\" = 'XXX' OR \"litle_payment_methods\".\"cc_type\" = 'XXX') OR \"litle_payment_methods\".\"state\" = 'XXX') OR \"litle_payment_methods\".\"zip\" = 'XXX') OR \"litle_payment_methods\".\"cc_first_name\" LIKE '%XXX%') OR \"litle_payment_methods\".\"cc_last_name\" LIKE '%XXX%') OR \"litle_payment_methods\".\"address1\" LIKE '%XXX%') OR \"litle_payment_methods\".\"address2\" LIKE '%XXX%') OR \"litle_payment_methods\".\"city\" LIKE '%XXX%') OR \"litle_payment_methods\".\"country\" LIKE '%XXX%') ORDER BY \"litle_payment_methods\".\"id\" LIMIT 10 OFFSET 0"
25
- Killbill::Litle::LitlePaymentMethod.search_query('XXX', 0, 10).to_sql.should == expected_query
26
- end
27
-
28
- it 'should search all fields' do
29
- do_search('foo').size.should == 0
30
-
31
- pm = Killbill::Litle::LitlePaymentMethod.create :kb_account_id => '11-22-33-44',
32
- :kb_payment_method_id => '55-66-77-88',
33
- :litle_token => 38102343,
34
- :cc_first_name => 'ccFirstName',
35
- :cc_last_name => 'ccLastName',
36
- :cc_type => 'ccType',
37
- :cc_exp_month => 10,
38
- :cc_exp_year => 11,
39
- :cc_last_4 => 1234,
40
- :address1 => 'address1',
41
- :address2 => 'address2',
42
- :city => 'city',
43
- :state => 'state',
44
- :zip => 'zip',
45
- :country => 'country'
46
-
47
- do_search('foo').size.should == 0
48
- do_search(pm.litle_token).size.should == 1
49
- do_search('ccType').size.should == 1
50
- # Exact match only for cc_last_4
51
- do_search('123').size.should == 0
52
- do_search('1234').size.should == 1
53
- # Test partial match
54
- do_search('address').size.should == 1
55
- do_search('Name').size.should == 1
56
-
57
- pm2 = Killbill::Litle::LitlePaymentMethod.create :kb_account_id => '22-33-44-55',
58
- :kb_payment_method_id => '66-77-88-99',
59
- :litle_token => 49384029302,
60
- :cc_first_name => 'ccFirstName',
61
- :cc_last_name => 'ccLastName',
62
- :cc_type => 'ccType',
63
- :cc_exp_month => 10,
64
- :cc_exp_year => 11,
65
- :cc_last_4 => 1234,
66
- :address1 => 'address1',
67
- :address2 => 'address2',
68
- :city => 'city',
69
- :state => 'state',
70
- :zip => 'zip',
71
- :country => 'country'
72
-
73
- do_search('foo').size.should == 0
74
- do_search(pm.litle_token).size.should == 1
75
- do_search(pm2.litle_token).size.should == 1
76
- do_search('ccType').size.should == 2
77
- # Exact match only for cc_last_4
78
- do_search('123').size.should == 0
79
- do_search('1234').size.should == 2
80
- # Test partial match
81
- do_search('cc').size.should == 2
82
- do_search('address').size.should == 2
83
- do_search('Name').size.should == 2
84
- end
85
-
86
- private
87
-
88
- def do_search(search_key)
89
- pagination = Killbill::Litle::LitlePaymentMethod.search(search_key)
90
- pagination.current_offset.should == 0
91
- results = pagination.iterator.to_a
92
- pagination.total_nb_records.should == results.size
93
- results
94
- end
95
- end
@@ -1,91 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Killbill::Litle::LitleResponse do
4
- before :all do
5
- Killbill::Litle::LitleResponse.delete_all
6
- end
7
-
8
- it 'should generate the right SQL query' do
9
- # Check count query (search query numeric)
10
- expected_query = "SELECT COUNT(DISTINCT \"litle_responses\".\"id\") FROM \"litle_responses\" WHERE (((\"litle_responses\".\"params_litleonelineresponse_saleresponse_id\" = '1234' OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_litle_txn_id\" = '1234') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_order_id\" = '1234') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_auth_code\" = '1234') AND \"litle_responses\".\"api_call\" = 'charge' AND \"litle_responses\".\"success\" = 't' ORDER BY \"litle_responses\".\"id\""
11
- # Note that Kill Bill will pass a String, even for numeric types
12
- Killbill::Litle::LitleResponse.search_query('charge', '1234').to_sql.should == expected_query
13
-
14
- # Check query with results (search query numeric)
15
- expected_query = "SELECT DISTINCT \"litle_responses\".* FROM \"litle_responses\" WHERE (((\"litle_responses\".\"params_litleonelineresponse_saleresponse_id\" = '1234' OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_litle_txn_id\" = '1234') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_order_id\" = '1234') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_auth_code\" = '1234') AND \"litle_responses\".\"api_call\" = 'charge' AND \"litle_responses\".\"success\" = 't' ORDER BY \"litle_responses\".\"id\" LIMIT 10 OFFSET 0"
16
- # Note that Kill Bill will pass a String, even for numeric types
17
- Killbill::Litle::LitleResponse.search_query('charge', '1234', 0, 10).to_sql.should == expected_query
18
-
19
- # Check count query (search query string)
20
- expected_query = "SELECT COUNT(DISTINCT \"litle_responses\".\"id\") FROM \"litle_responses\" WHERE (((\"litle_responses\".\"params_litleonelineresponse_saleresponse_id\" = 'XXX' OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_litle_txn_id\" = 'XXX') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_order_id\" = 'XXX') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_auth_code\" = 'XXX') AND \"litle_responses\".\"api_call\" = 'charge' AND \"litle_responses\".\"success\" = 't' ORDER BY \"litle_responses\".\"id\""
21
- Killbill::Litle::LitleResponse.search_query('charge', 'XXX').to_sql.should == expected_query
22
-
23
- # Check query with results (search query string)
24
- expected_query = "SELECT DISTINCT \"litle_responses\".* FROM \"litle_responses\" WHERE (((\"litle_responses\".\"params_litleonelineresponse_saleresponse_id\" = 'XXX' OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_litle_txn_id\" = 'XXX') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_order_id\" = 'XXX') OR \"litle_responses\".\"params_litleonelineresponse_saleresponse_auth_code\" = 'XXX') AND \"litle_responses\".\"api_call\" = 'charge' AND \"litle_responses\".\"success\" = 't' ORDER BY \"litle_responses\".\"id\" LIMIT 10 OFFSET 0"
25
- Killbill::Litle::LitleResponse.search_query('charge', 'XXX', 0, 10).to_sql.should == expected_query
26
- end
27
-
28
- it 'should search all fields' do
29
- do_search('foo').size.should == 0
30
-
31
- pm = Killbill::Litle::LitleResponse.create :api_call => 'charge',
32
- :kb_payment_id => '11-22-33-44',
33
- :params_litleonelineresponse_saleresponse_id => '55-66-77-88',
34
- :params_litleonelineresponse_saleresponse_litle_txn_id => 38102343,
35
- :params_litleonelineresponse_saleresponse_order_id => 'order-id-1',
36
- :params_litleonelineresponse_saleresponse_auth_code => 'auth-code-1',
37
- :success => true
38
-
39
- # Wrong api_call
40
- ignored1 = Killbill::Litle::LitleResponse.create :api_call => 'add_payment_method',
41
- :kb_payment_id => pm.kb_payment_id,
42
- :params_litleonelineresponse_saleresponse_id => pm.params_litleonelineresponse_saleresponse_id,
43
- :params_litleonelineresponse_saleresponse_litle_txn_id => pm.params_litleonelineresponse_saleresponse_litle_txn_id,
44
- :params_litleonelineresponse_saleresponse_order_id => pm.params_litleonelineresponse_saleresponse_order_id,
45
- :params_litleonelineresponse_saleresponse_auth_code => pm.params_litleonelineresponse_saleresponse_auth_code,
46
- :success => true
47
-
48
- # Not successful
49
- ignored2 = Killbill::Litle::LitleResponse.create :api_call => 'charge',
50
- :kb_payment_id => pm.kb_payment_id,
51
- :params_litleonelineresponse_saleresponse_id => pm.params_litleonelineresponse_saleresponse_id,
52
- :params_litleonelineresponse_saleresponse_litle_txn_id => pm.params_litleonelineresponse_saleresponse_litle_txn_id,
53
- :params_litleonelineresponse_saleresponse_order_id => pm.params_litleonelineresponse_saleresponse_order_id,
54
- :params_litleonelineresponse_saleresponse_auth_code => pm.params_litleonelineresponse_saleresponse_auth_code,
55
- :success => false
56
-
57
- do_search('foo').size.should == 0
58
- do_search(pm.params_litleonelineresponse_saleresponse_id).size.should == 1
59
- do_search(pm.params_litleonelineresponse_saleresponse_litle_txn_id).size.should == 1
60
- do_search(pm.params_litleonelineresponse_saleresponse_order_id).size.should == 1
61
- do_search(pm.params_litleonelineresponse_saleresponse_auth_code).size.should == 1
62
-
63
- pm2 = Killbill::Litle::LitleResponse.create :api_call => 'charge',
64
- :kb_payment_id => '11-22-33-44',
65
- :params_litleonelineresponse_saleresponse_id => '11-22-33-44',
66
- :params_litleonelineresponse_saleresponse_litle_txn_id => pm.params_litleonelineresponse_saleresponse_litle_txn_id,
67
- :params_litleonelineresponse_saleresponse_order_id => 'order-id-2',
68
- :params_litleonelineresponse_saleresponse_auth_code => 'auth-code-2',
69
- :success => true
70
-
71
- do_search('foo').size.should == 0
72
- do_search(pm.params_litleonelineresponse_saleresponse_id).size.should == 1
73
- do_search(pm.params_litleonelineresponse_saleresponse_litle_txn_id).size.should == 2
74
- do_search(pm.params_litleonelineresponse_saleresponse_order_id).size.should == 1
75
- do_search(pm.params_litleonelineresponse_saleresponse_auth_code).size.should == 1
76
- do_search(pm2.params_litleonelineresponse_saleresponse_id).size.should == 1
77
- do_search(pm2.params_litleonelineresponse_saleresponse_litle_txn_id).size.should == 2
78
- do_search(pm2.params_litleonelineresponse_saleresponse_order_id).size.should == 1
79
- do_search(pm2.params_litleonelineresponse_saleresponse_auth_code).size.should == 1
80
- end
81
-
82
- private
83
-
84
- def do_search(search_key)
85
- pagination = Killbill::Litle::LitleResponse.search(search_key)
86
- pagination.current_offset.should == 0
87
- results = pagination.iterator.to_a
88
- pagination.total_nb_records.should == results.size
89
- results
90
- end
91
- end
@@ -1,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Killbill::Litle::Utils do
4
- it "should convert back and forth UUIDs" do
5
- uuid = SecureRandom.uuid
6
- packed = Killbill::Litle::Utils.compact_uuid(uuid)
7
- unpacked = Killbill::Litle::Utils.unpack_uuid(packed)
8
- unpacked.should == uuid
9
- end
10
-
11
- it "should respect leading 0s" do
12
- uuid = "0ae18a4c-be57-44c3-84ba-a82962a2de03"
13
- 0.upto(35) do |i|
14
- # Skip hyphens
15
- next if [8, 13, 18, 23].include?(i)
16
- uuid[i] = '0'
17
- packed = Killbill::Litle::Utils.compact_uuid(uuid)
18
- unpacked = Killbill::Litle::Utils.unpack_uuid(packed)
19
- unpacked.should == uuid
20
- end
21
- end
22
- end