braintree-rails 1.2.2 → 1.2.3
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/.travis.yml +0 -1
- data/CHANGELOG.md +9 -0
- data/lib/braintree_rails/association.rb +5 -5
- data/lib/braintree_rails/credit_card.rb +11 -4
- data/lib/braintree_rails/credit_card_validator.rb +3 -3
- data/lib/braintree_rails/customer.rb +16 -2
- data/lib/braintree_rails/customer_validator.rb +15 -0
- data/lib/braintree_rails/version.rb +1 -1
- data/test/integration/braintree_rails/credit_card_integration_test.rb +25 -0
- data/test/integration/braintree_rails/customer_integration_test.rb +14 -0
- data/test/unit/braintree_rails/customer_test.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56202c668de2552e6a850a95602e323bfebff239
|
4
|
+
data.tar.gz: 1c0f8bf6594cbfb8550d56cbd7be0589af412694
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b11a071290144088a5e2c068957fdfcebace2b616c2e7801735843c324ae43d64f2534100918833233626aa834e003e91451dd12eb14d6f596e9c774ef2b5917
|
7
|
+
data.tar.gz: a5f3167d16569e8127f16c9188b212aa7114a831668edd34b164c54b65f0fcf2c7b7eaeb138371da7948bee333fd0a873a80318535b63b2a58450aed39c91978
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
## Unreleased (master)
|
2
|
+
### Enhancements
|
3
|
+
* Customer create/update now accepts an optional :credit_card params.
|
4
|
+
|
5
|
+
### Bug Fixes
|
6
|
+
* Fixed a bug where it failed to update credit card expiry date when only expiration year changed. (Thanks, @vedanova)
|
7
|
+
|
8
|
+
## v1.2.2 (370fab4), Oct 14 2013
|
9
|
+
### Bug Fixes
|
10
|
+
* Fixed gemspec to only package necessary files to reduce the gem file size. (Thanks, @ivankocienski)
|
2
11
|
|
3
12
|
## v1.2.1 (370fab4), Jul 01 2013
|
4
13
|
### Enhancements
|
@@ -27,11 +27,11 @@ module BraintreeRails
|
|
27
27
|
|
28
28
|
def define_association_reader(name, options)
|
29
29
|
define_method(name) do
|
30
|
-
value = instance_variable_get("@#{name}")
|
31
|
-
|
32
|
-
value =
|
33
|
-
|
34
|
-
|
30
|
+
if value = instance_variable_get("@#{name}")
|
31
|
+
return value
|
32
|
+
elsif options[:foreign_key] && value = send(options[:foreign_key])
|
33
|
+
instance_variable_set("@#{name}", options[:class].new(value))
|
34
|
+
end
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -14,11 +14,13 @@ module BraintreeRails
|
|
14
14
|
has_many :transactions, :class => Transactions
|
15
15
|
has_many :subscriptions, :class => Subscriptions
|
16
16
|
belongs_to :customer, :class => Customer, :foreign_key => :customer_id
|
17
|
+
has_one :billing_address, :class => BillingAddress
|
17
18
|
|
18
19
|
alias_method :id, :token
|
19
20
|
alias_method :id=, :token=
|
20
21
|
|
21
22
|
around_persist :clear_encryped_attributes
|
23
|
+
before_update :normalize_expiration_date, :if => :expiry_date_changed?
|
22
24
|
|
23
25
|
def ensure_model(model)
|
24
26
|
if Braintree::Transaction::CreditCardDetails === model
|
@@ -42,10 +44,6 @@ module BraintreeRails
|
|
42
44
|
"#{bin}******#{last_4}"
|
43
45
|
end
|
44
46
|
|
45
|
-
def billing_address=(value)
|
46
|
-
@billing_address = value && BillingAddress.new(value)
|
47
|
-
end
|
48
|
-
|
49
47
|
def add_errors(validation_errors)
|
50
48
|
billing_address.add_errors(validation_errors.except(:base)) if billing_address
|
51
49
|
super(validation_errors)
|
@@ -67,5 +65,14 @@ module BraintreeRails
|
|
67
65
|
self.send(encrypted_attribute, nil)
|
68
66
|
end
|
69
67
|
end
|
68
|
+
|
69
|
+
def normalize_expiration_date
|
70
|
+
self.expiration_date = [self.expiration_month, self.expiration_year].join("/")
|
71
|
+
self.expiration_month = self.expiration_year = nil
|
72
|
+
end
|
73
|
+
|
74
|
+
def expiry_date_changed?
|
75
|
+
changed.include?(:expiration_month) || changed.include?(:expiration_year)
|
76
|
+
end
|
70
77
|
end
|
71
78
|
end
|
@@ -15,14 +15,14 @@ module BraintreeRails
|
|
15
15
|
]
|
16
16
|
|
17
17
|
def validate(credit_card)
|
18
|
-
|
18
|
+
has_valid_billing_address(credit_card) if validate_billing_address?
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def has_valid_billing_address(credit_card)
|
22
22
|
credit_card.instance_eval do
|
23
23
|
errors.add(:billing_address, "is empty") and return if billing_address.blank?
|
24
24
|
if billing_address.invalid?
|
25
|
-
errors.add(:billing_address, "is
|
25
|
+
errors.add(:billing_address, "is invalid")
|
26
26
|
billing_address.errors.full_messages.each do |message|
|
27
27
|
errors.add(:base, message)
|
28
28
|
end
|
@@ -3,8 +3,8 @@ module BraintreeRails
|
|
3
3
|
include Model
|
4
4
|
|
5
5
|
define_attributes(
|
6
|
-
:create => [:company, :custom_fields, :email, :fax, :first_name, :id, :last_name, :options, :phone, :website],
|
7
|
-
:update => [:company, :custom_fields, :email, :fax, :first_name, :last_name, :options, :phone, :website],
|
6
|
+
:create => [:company, :custom_fields, :email, :fax, :first_name, :id, :last_name, :options, :phone, :website, :credit_card],
|
7
|
+
:update => [:company, :custom_fields, :email, :fax, :first_name, :last_name, :options, :phone, :website, :credit_card],
|
8
8
|
:readonly => [:created_at, :updated_at],
|
9
9
|
:as_association => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]
|
10
10
|
)
|
@@ -12,6 +12,7 @@ module BraintreeRails
|
|
12
12
|
has_many :addresses, :class => Addresses
|
13
13
|
has_many :transactions, :class => Transactions
|
14
14
|
has_many :credit_cards, :class => CreditCards
|
15
|
+
has_one :credit_card, :class => CreditCard
|
15
16
|
|
16
17
|
def ensure_model(model)
|
17
18
|
if Braintree::Transaction::CustomerDetails === model
|
@@ -27,8 +28,21 @@ module BraintreeRails
|
|
27
28
|
"#{first_name} #{last_name}".strip
|
28
29
|
end
|
29
30
|
|
31
|
+
def add_errors(validation_errors)
|
32
|
+
credit_card.add_errors(validation_errors.except(:base)) if credit_card
|
33
|
+
super(validation_errors)
|
34
|
+
end
|
35
|
+
|
36
|
+
def attributes_for(action)
|
37
|
+
super.merge(credit_card_attributes(action))
|
38
|
+
end
|
39
|
+
|
30
40
|
def default_credit_card
|
31
41
|
credit_cards.find(&:default?)
|
32
42
|
end
|
43
|
+
|
44
|
+
def credit_card_attributes(action)
|
45
|
+
credit_card.present? ? {:credit_card => credit_card.attributes_for(action).except(:customer_id, :token)} : {}
|
46
|
+
end
|
33
47
|
end
|
34
48
|
end
|
@@ -4,5 +4,20 @@ module BraintreeRails
|
|
4
4
|
[:id, :format => {:with => /\A[-_a-z0-9]*\z/i}, :length => {:maximum => 36}, :exclusion => {:in => %w(all new)}],
|
5
5
|
[:first_name, :last_name, :company, :website, :phone, :fax, :length => {:maximum => 255}]
|
6
6
|
]
|
7
|
+
|
8
|
+
def validate(customer)
|
9
|
+
validate_credit_card(customer) if customer.credit_card.present?
|
10
|
+
end
|
11
|
+
|
12
|
+
def validate_credit_card(customer)
|
13
|
+
customer.instance_eval do
|
14
|
+
if credit_card.invalid?
|
15
|
+
errors.add(:credit_card, "is invalid")
|
16
|
+
credit_card.errors.full_messages.each do |message|
|
17
|
+
errors.add(:base, message)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
7
22
|
end
|
8
23
|
end
|
@@ -46,6 +46,31 @@ describe 'Credit Card Integration' do
|
|
46
46
|
braintree_credit_card.billing_address.postal_code.must_equal '56789'
|
47
47
|
end
|
48
48
|
|
49
|
+
it 'should be able to update just expiration year' do
|
50
|
+
customer = BraintreeRails::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree')
|
51
|
+
credit_card = customer.credit_cards.create!(credit_card_hash.merge(:expiration_month => '07', :expiration_year => '2012'))
|
52
|
+
|
53
|
+
credit_card.update_attributes!(:cardholder_name => 'Foo Bar', :number => '4111111111111111', :options => {:verify_card => true}, :expiration_month => '07', :expiration_year => '2013', :billing_address => address_hash.merge(:postal_code => '56789'))
|
54
|
+
braintree_credit_card = Braintree::CreditCard.find(credit_card.id)
|
55
|
+
braintree_credit_card.cardholder_name.must_equal 'Foo Bar'
|
56
|
+
braintree_credit_card.billing_address.postal_code.must_equal '56789'
|
57
|
+
braintree_credit_card.expiration_month.must_equal '07'
|
58
|
+
braintree_credit_card.expiration_year.must_equal '2013'
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should be able to update by expiration date' do
|
62
|
+
customer = BraintreeRails::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree')
|
63
|
+
credit_card = customer.credit_cards.create!(credit_card_hash.merge(:expiration_month => '07', :expiration_year => '2012'))
|
64
|
+
|
65
|
+
credit_card.update_attributes!(:cardholder_name => 'Foo Bar', :number => '4111111111111111', :options => {:verify_card => true}, :expiration_date => '08/2013', :billing_address => address_hash.merge(:postal_code => '56789'))
|
66
|
+
braintree_credit_card = Braintree::CreditCard.find(credit_card.id)
|
67
|
+
braintree_credit_card.cardholder_name.must_equal 'Foo Bar'
|
68
|
+
braintree_credit_card.billing_address.postal_code.must_equal '56789'
|
69
|
+
braintree_credit_card.expiration_month.must_equal '08'
|
70
|
+
braintree_credit_card.expiration_year.must_equal '2013'
|
71
|
+
braintree_credit_card.expiration_date.must_equal '08/2013'
|
72
|
+
end
|
73
|
+
|
49
74
|
it 'should be able to destroy existing credit card' do
|
50
75
|
braintree_customer = Braintree::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
51
76
|
credit_card = BraintreeRails::CreditCard.new(braintree_customer.credit_cards.first.token)
|
@@ -22,6 +22,12 @@ describe 'Customer Integration' do
|
|
22
22
|
braintree_customer.last_name.must_equal 'Tree'
|
23
23
|
end
|
24
24
|
|
25
|
+
it 'should be able to create new customer with a credit card' do
|
26
|
+
customer = BraintreeRails::Customer.create(:first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
27
|
+
braintree_customer = Braintree::Customer.find(customer.id)
|
28
|
+
braintree_customer.credit_cards.count.must_equal 1
|
29
|
+
end
|
30
|
+
|
25
31
|
it 'should be able to update existing customer' do
|
26
32
|
customer = BraintreeRails::Customer.create!(:first_name => 'Brain', :last_name => 'Tree')
|
27
33
|
customer.update_attributes!(:first_name => 'Foo', :last_name => 'Bar')
|
@@ -31,6 +37,14 @@ describe 'Customer Integration' do
|
|
31
37
|
braintree_customer.last_name.must_equal 'Bar'
|
32
38
|
end
|
33
39
|
|
40
|
+
it 'should be able to update existing customer with new credit card' do
|
41
|
+
customer = BraintreeRails::Customer.create(:first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
42
|
+
customer.update_attributes!(:first_name => 'Foo', :last_name => 'Bar', :credit_card => credit_card_hash.merge(:cardholder_name => "FooBar"))
|
43
|
+
|
44
|
+
braintree_customer = Braintree::Customer.find(customer.id)
|
45
|
+
braintree_customer.credit_cards.first.cardholder_name.must_equal "FooBar"
|
46
|
+
end
|
47
|
+
|
34
48
|
it 'should be able to destroy existing customer' do
|
35
49
|
customer = BraintreeRails::Customer.create!(:first_name => 'Brain', :last_name => 'Tree')
|
36
50
|
customer.destroy
|
@@ -123,6 +123,18 @@ describe BraintreeRails::Customer do
|
|
123
123
|
customer.errors[attribute].wont_be :blank?
|
124
124
|
end
|
125
125
|
end
|
126
|
+
|
127
|
+
describe 'credit_card' do
|
128
|
+
it 'is valid if new credit card is valid' do
|
129
|
+
customer = BraintreeRails::Customer.new(:credit_card => credit_card_hash)
|
130
|
+
customer.valid?.must_equal true
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'is not valid if new credit card is invalid' do
|
134
|
+
customer = BraintreeRails::Customer.new(:credit_card => credit_card_hash.except(:number))
|
135
|
+
customer.valid?.must_equal false
|
136
|
+
end
|
137
|
+
end
|
126
138
|
end
|
127
139
|
|
128
140
|
describe 'persistence' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: braintree-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lin Yang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: braintree
|