braintree-rails 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +3 -3
- data/Gemfile.lock +4 -4
- data/README.md +6 -6
- data/braintree-rails.gemspec +4 -4
- data/lib/braintree-rails.rb +2 -0
- data/lib/braintree_rails/credit_card.rb +8 -0
- data/lib/braintree_rails/customer.rb +5 -9
- data/lib/braintree_rails/exceptions.rb +1 -1
- data/lib/braintree_rails/model.rb +14 -14
- data/lib/braintree_rails/transaction.rb +90 -0
- data/lib/braintree_rails/transactions.rb +29 -0
- data/log/braintree_test.log +164706 -136200
- data/test/fixtures/address.xml +1 -1
- data/test/fixtures/customer.xml +1 -1
- data/test/fixtures/transaction.xml +100 -0
- data/test/fixtures/transaction_error.xml +25 -0
- data/test/integration/braintree_rails/address_integration_test.rb +0 -33
- data/test/integration/braintree_rails/credit_card_integration_test.rb +1 -93
- data/test/integration/braintree_rails/transaction_integration_test.rb +50 -0
- data/test/test_helper.rb +26 -0
- data/test/unit/braintree_rails/transaction_test.rb +132 -0
- metadata +16 -10
data/test/fixtures/address.xml
CHANGED
data/test/fixtures/customer.xml
CHANGED
@@ -0,0 +1,100 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<transaction>
|
3
|
+
<id>transactionid</id>
|
4
|
+
<status>authorized</status>
|
5
|
+
<type>sale</type>
|
6
|
+
<currency-iso-code>USD</currency-iso-code>
|
7
|
+
<amount>10.00</amount>
|
8
|
+
<merchant-account-id>merchant_id</merchant-account-id>
|
9
|
+
<order-id nil="true"></order-id>
|
10
|
+
<created-at type="datetime">2012-09-15T01:07:58Z</created-at>
|
11
|
+
<updated-at type="datetime">2012-09-15T01:07:58Z</updated-at>
|
12
|
+
<customer>
|
13
|
+
<id>customer_id</id>
|
14
|
+
<first-name>Brain</first-name>
|
15
|
+
<last-name>Tree</last-name>
|
16
|
+
<company>Braintree</company>
|
17
|
+
<email>braintree@example.com</email>
|
18
|
+
<website>www.braintreepayments.com</website>
|
19
|
+
<phone>877.434.2894</phone>
|
20
|
+
<fax>888.781.6495</fax>
|
21
|
+
</customer>
|
22
|
+
<billing>
|
23
|
+
<id>address_id</id>
|
24
|
+
<first-name>Brain</first-name>
|
25
|
+
<last-name>Tree</last-name>
|
26
|
+
<company>Braintree</company>
|
27
|
+
<street-address>1134 Crane Avenue</street-address>
|
28
|
+
<extended-address>Suite 200</extended-address>
|
29
|
+
<locality>Menlo Park</locality>
|
30
|
+
<region>California</region>
|
31
|
+
<postal-code>94025</postal-code>
|
32
|
+
<country-name>United States of America</country-name>
|
33
|
+
<country-code-alpha2>US</country-code-alpha2>
|
34
|
+
<country-code-alpha3>USA</country-code-alpha3>
|
35
|
+
<country-code-numeric>840</country-code-numeric>
|
36
|
+
</billing>
|
37
|
+
<refund-id nil="true"></refund-id>
|
38
|
+
<refund-ids type="array"/>
|
39
|
+
<refunded-transaction-id nil="true"></refunded-transaction-id>
|
40
|
+
<settlement-batch-id nil="true"></settlement-batch-id>
|
41
|
+
<shipping>
|
42
|
+
<id nil="true"></id>
|
43
|
+
<first-name nil="true"></first-name>
|
44
|
+
<last-name nil="true"></last-name>
|
45
|
+
<company nil="true"></company>
|
46
|
+
<street-address nil="true"></street-address>
|
47
|
+
<extended-address nil="true"></extended-address>
|
48
|
+
<locality nil="true"></locality>
|
49
|
+
<region nil="true"></region>
|
50
|
+
<postal-code nil="true"></postal-code>
|
51
|
+
<country-name nil="true"></country-name>
|
52
|
+
<country-code-alpha2 nil="true"></country-code-alpha2>
|
53
|
+
<country-code-alpha3 nil="true"></country-code-alpha3>
|
54
|
+
<country-code-numeric nil="true"></country-code-numeric>
|
55
|
+
</shipping>
|
56
|
+
<custom-fields>
|
57
|
+
</custom-fields>
|
58
|
+
<avs-error-response-code nil="true"></avs-error-response-code>
|
59
|
+
<avs-postal-code-response-code>M</avs-postal-code-response-code>
|
60
|
+
<avs-street-address-response-code>M</avs-street-address-response-code>
|
61
|
+
<cvv-response-code>I</cvv-response-code>
|
62
|
+
<gateway-rejection-reason nil="true"></gateway-rejection-reason>
|
63
|
+
<processor-authorization-code>796RN2</processor-authorization-code>
|
64
|
+
<processor-response-code>1000</processor-response-code>
|
65
|
+
<processor-response-text>Approved</processor-response-text>
|
66
|
+
<purchase-order-number nil="true"></purchase-order-number>
|
67
|
+
<tax-amount nil="true"></tax-amount>
|
68
|
+
<tax-exempt type="boolean">false</tax-exempt>
|
69
|
+
<credit-card>
|
70
|
+
<token>credit_card_id</token>
|
71
|
+
<cardholder-name>Brain Tree</cardholder-name>
|
72
|
+
<customer-location>US</customer-location>
|
73
|
+
<card-type>MasterCard</card-type>
|
74
|
+
<bin>555555</bin>
|
75
|
+
<last-4>4444</last-4>
|
76
|
+
<expiration-month>05</expiration-month>
|
77
|
+
<expiration-year>2037</expiration-year>
|
78
|
+
</credit-card>
|
79
|
+
<status-history type="array">
|
80
|
+
<status-event>
|
81
|
+
<timestamp type="datetime">2012-09-15T01:07:58Z</timestamp>
|
82
|
+
<status>authorized</status>
|
83
|
+
<amount>10.00</amount>
|
84
|
+
<user>linyang84</user>
|
85
|
+
<transaction-source>API</transaction-source>
|
86
|
+
</status-event>
|
87
|
+
</status-history>
|
88
|
+
<plan-id nil="true"></plan-id>
|
89
|
+
<subscription-id nil="true"></subscription-id>
|
90
|
+
<subscription>
|
91
|
+
<billing-period-end-date nil="true"></billing-period-end-date>
|
92
|
+
<billing-period-start-date nil="true"></billing-period-start-date>
|
93
|
+
</subscription>
|
94
|
+
<add-ons type="array"/>
|
95
|
+
<discounts type="array"/>
|
96
|
+
<descriptor>
|
97
|
+
<name nil="true"></name>
|
98
|
+
<phone nil="true"></phone>
|
99
|
+
</descriptor>
|
100
|
+
</transaction>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<api-error-response>
|
3
|
+
<message>Cannot submit for settlement unless status is authorized.</message>
|
4
|
+
<errors>
|
5
|
+
<transaction>
|
6
|
+
<errors type="array">
|
7
|
+
<error>
|
8
|
+
<code>91507</code>
|
9
|
+
<message>Cannot submit for settlement unless status is authorized.</message>
|
10
|
+
<attribute type="symbol">base</attribute>
|
11
|
+
</error>
|
12
|
+
</errors>
|
13
|
+
</transaction>
|
14
|
+
<errors type="array"/>
|
15
|
+
</errors>
|
16
|
+
<params>
|
17
|
+
<merchant-id>merchant_id</merchant-id>
|
18
|
+
<action>submit_for_settlement</action>
|
19
|
+
<id>transactionid</id>
|
20
|
+
<transaction>
|
21
|
+
<amount nil="true"></amount>
|
22
|
+
</transaction>
|
23
|
+
<controller>transactions</controller>
|
24
|
+
</params>
|
25
|
+
</api-error-response>
|
@@ -7,17 +7,6 @@ describe 'Address Integration' do
|
|
7
7
|
|
8
8
|
it 'should be able to add address' do
|
9
9
|
customer = BraintreeRails::Customer.create!(:first_name => 'Brain', :last_name => 'Tree')
|
10
|
-
address_hash = {
|
11
|
-
:first_name => 'Brain',
|
12
|
-
:last_name => 'Tree',
|
13
|
-
:company => 'Braintree',
|
14
|
-
:street_address => '1134 Crane Avenue',
|
15
|
-
:extended_address => 'Suite 200',
|
16
|
-
:locality => 'Menlo Park',
|
17
|
-
:region => 'California',
|
18
|
-
:postal_code => '94025',
|
19
|
-
:country_name => 'United States of America'
|
20
|
-
}
|
21
10
|
customer.addresses.create!(address_hash)
|
22
11
|
braintree_customer = Braintree::Customer.find(customer.id)
|
23
12
|
braintree_address = braintree_customer.addresses.first
|
@@ -29,17 +18,6 @@ describe 'Address Integration' do
|
|
29
18
|
|
30
19
|
it 'should be able to update existing address' do
|
31
20
|
customer = BraintreeRails::Customer.create!(:first_name => 'Brain', :last_name => 'Tree')
|
32
|
-
address_hash = {
|
33
|
-
:first_name => 'Brain',
|
34
|
-
:last_name => 'Tree',
|
35
|
-
:company => 'Braintree',
|
36
|
-
:street_address => '1134 Crane Avenue',
|
37
|
-
:extended_address => 'Suite 200',
|
38
|
-
:locality => 'Menlo Park',
|
39
|
-
:region => 'California',
|
40
|
-
:postal_code => '94025',
|
41
|
-
:country_name => 'United States of America'
|
42
|
-
}
|
43
21
|
address = customer.addresses.create!(address_hash)
|
44
22
|
address.update_attributes!(:first_name => 'Foo', :last_name => 'Bar')
|
45
23
|
braintree_customer = Braintree::Customer.find(customer.id)
|
@@ -51,17 +29,6 @@ describe 'Address Integration' do
|
|
51
29
|
|
52
30
|
it 'should be able to destroy existing address' do
|
53
31
|
customer = BraintreeRails::Customer.create!(:first_name => 'Brain', :last_name => 'Tree')
|
54
|
-
address_hash = {
|
55
|
-
:first_name => 'Brain',
|
56
|
-
:last_name => 'Tree',
|
57
|
-
:company => 'Braintree',
|
58
|
-
:street_address => '1134 Crane Avenue',
|
59
|
-
:extended_address => 'Suite 200',
|
60
|
-
:locality => 'Menlo Park',
|
61
|
-
:region => 'California',
|
62
|
-
:postal_code => '94025',
|
63
|
-
:country_name => 'United States of America'
|
64
|
-
}
|
65
32
|
address = customer.addresses.create!(address_hash)
|
66
33
|
address.destroy!
|
67
34
|
lambda{ Braintree::Address.find(customer.id, address.id) }.must_raise Braintree::NotFoundError
|
@@ -6,28 +6,6 @@ describe 'Credit Card Integration' do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
it 'should be able to fetch from Braintree for given token' do
|
9
|
-
address_hash = {
|
10
|
-
:first_name => 'Brain',
|
11
|
-
:last_name => 'Tree',
|
12
|
-
:company => 'Braintree',
|
13
|
-
:street_address => '1134 Crane Avenue',
|
14
|
-
:extended_address => 'Suite 200',
|
15
|
-
:locality => 'Menlo Park',
|
16
|
-
:region => 'California',
|
17
|
-
:postal_code => '94025',
|
18
|
-
:country_name => 'United States of America'
|
19
|
-
}
|
20
|
-
|
21
|
-
credit_card_hash = {
|
22
|
-
:token => 'credit_card_id',
|
23
|
-
:number => '4111111111111111',
|
24
|
-
:cvv => '123',
|
25
|
-
:cardholder_name => 'Brain Tree',
|
26
|
-
:expiration_month => '05',
|
27
|
-
:expiration_year => '2037',
|
28
|
-
:billing_address => address_hash,
|
29
|
-
}
|
30
|
-
|
31
9
|
braintree_customer = Braintree::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
32
10
|
|
33
11
|
credit_card = BraintreeRails::CreditCard.new(braintree_customer.credit_cards.first.token)
|
@@ -43,30 +21,6 @@ describe 'Credit Card Integration' do
|
|
43
21
|
|
44
22
|
it 'should be able to add credit card' do
|
45
23
|
customer = BraintreeRails::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree')
|
46
|
-
|
47
|
-
address_hash = {
|
48
|
-
:first_name => 'Brain',
|
49
|
-
:last_name => 'Tree',
|
50
|
-
:company => 'Braintree',
|
51
|
-
:street_address => '1134 Crane Avenue',
|
52
|
-
:extended_address => 'Suite 200',
|
53
|
-
:locality => 'Menlo Park',
|
54
|
-
:region => 'California',
|
55
|
-
:postal_code => '94025',
|
56
|
-
:country_name => 'United States of America'
|
57
|
-
}
|
58
|
-
|
59
|
-
credit_card_hash = {
|
60
|
-
:token => 'credit_card_id',
|
61
|
-
:number => '4111111111111111',
|
62
|
-
:cvv => '123',
|
63
|
-
:customer_id => 'customer_id',
|
64
|
-
:cardholder_name => 'Brain Tree',
|
65
|
-
:expiration_month => '05',
|
66
|
-
:expiration_year => '2037',
|
67
|
-
:billing_address => address_hash,
|
68
|
-
}
|
69
|
-
|
70
24
|
credit_card = customer.credit_cards.create!(credit_card_hash)
|
71
25
|
|
72
26
|
braintree_credit_card = Braintree::CreditCard.find(credit_card.id)
|
@@ -82,30 +36,6 @@ describe 'Credit Card Integration' do
|
|
82
36
|
|
83
37
|
it 'should be able to update existing credit card' do
|
84
38
|
customer = BraintreeRails::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree')
|
85
|
-
|
86
|
-
address_hash = {
|
87
|
-
:first_name => 'Brain',
|
88
|
-
:last_name => 'Tree',
|
89
|
-
:company => 'Braintree',
|
90
|
-
:street_address => '1134 Crane Avenue',
|
91
|
-
:extended_address => 'Suite 200',
|
92
|
-
:locality => 'Menlo Park',
|
93
|
-
:region => 'California',
|
94
|
-
:postal_code => '94025',
|
95
|
-
:country_name => 'United States of America'
|
96
|
-
}
|
97
|
-
|
98
|
-
credit_card_hash = {
|
99
|
-
:token => 'credit_card_id',
|
100
|
-
:number => '4111111111111111',
|
101
|
-
:cvv => '123',
|
102
|
-
:customer_id => 'customer_id',
|
103
|
-
:cardholder_name => 'Brain Tree',
|
104
|
-
:expiration_month => '05',
|
105
|
-
:expiration_year => '2037',
|
106
|
-
:billing_address => address_hash,
|
107
|
-
}
|
108
|
-
|
109
39
|
credit_card = customer.credit_cards.create!(credit_card_hash)
|
110
40
|
|
111
41
|
credit_card.update_attributes!(:cardholder_name => 'Foo Bar')
|
@@ -114,31 +44,9 @@ describe 'Credit Card Integration' do
|
|
114
44
|
end
|
115
45
|
|
116
46
|
it 'should be able to destroy existing credit card' do
|
117
|
-
address_hash = {
|
118
|
-
:first_name => 'Brain',
|
119
|
-
:last_name => 'Tree',
|
120
|
-
:company => 'Braintree',
|
121
|
-
:street_address => '1134 Crane Avenue',
|
122
|
-
:extended_address => 'Suite 200',
|
123
|
-
:locality => 'Menlo Park',
|
124
|
-
:region => 'California',
|
125
|
-
:postal_code => '94025',
|
126
|
-
:country_name => 'United States of America'
|
127
|
-
}
|
128
|
-
|
129
|
-
credit_card_hash = {
|
130
|
-
:token => 'credit_card_id',
|
131
|
-
:number => '4111111111111111',
|
132
|
-
:cvv => '123',
|
133
|
-
:cardholder_name => 'Brain Tree',
|
134
|
-
:expiration_month => '05',
|
135
|
-
:expiration_year => '2037',
|
136
|
-
:billing_address => address_hash,
|
137
|
-
}
|
138
|
-
|
139
47
|
braintree_customer = Braintree::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
140
|
-
|
141
48
|
credit_card = BraintreeRails::CreditCard.new(braintree_customer.credit_cards.first.token)
|
49
|
+
|
142
50
|
credit_card.destroy!
|
143
51
|
lambda{ Braintree::CreditCard.find(credit_card.token) }.must_raise Braintree::NotFoundError
|
144
52
|
credit_card.persisted?.must_equal false
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../integration_test_helper'))
|
2
|
+
|
3
|
+
describe 'Transaction Integration' do
|
4
|
+
before do
|
5
|
+
Braintree::Customer.all.each { |c| Braintree::Customer.delete c.id }
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should be able to create, submit, void transactions for a customer' do
|
9
|
+
|
10
|
+
braintree_customer = Braintree::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
11
|
+
customer = BraintreeRails::Customer.new(braintree_customer)
|
12
|
+
credit_card = customer.credit_cards.first
|
13
|
+
|
14
|
+
[{:amount => rand(1..10), :customer => customer}, {:amount => rand(1..10), :customer => customer, :credit_card => credit_card}].each do |params|
|
15
|
+
transaction = BraintreeRails::Transaction.create!(params)
|
16
|
+
transaction.persisted?.must_equal true
|
17
|
+
transaction.amount.must_equal params[:amount]
|
18
|
+
transaction.status.must_equal Braintree::Transaction::Status::Authorized
|
19
|
+
|
20
|
+
transaction.submit_for_settlement!
|
21
|
+
transaction.status.must_equal Braintree::Transaction::Status::SubmittedForSettlement
|
22
|
+
|
23
|
+
transaction.void!
|
24
|
+
transaction.status.must_equal Braintree::Transaction::Status::Voided
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be able to load transactions for given customer and credit_card" do
|
29
|
+
braintree_customer = Braintree::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
30
|
+
customer = BraintreeRails::Customer.new(braintree_customer)
|
31
|
+
credit_card = customer.credit_cards.first
|
32
|
+
transaction = BraintreeRails::Transaction.create!(:amount => rand(1..10), :customer => customer)
|
33
|
+
|
34
|
+
customer.transactions.count.must_equal 1
|
35
|
+
credit_card.transactions.count.must_equal 1
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should be able to capture braintree api errors' do
|
39
|
+
braintree_customer = Braintree::Customer.create!(:id => 'customer_id', :first_name => 'Brain', :last_name => 'Tree', :credit_card => credit_card_hash)
|
40
|
+
customer = BraintreeRails::Customer.new(braintree_customer)
|
41
|
+
credit_card = customer.credit_cards.first
|
42
|
+
transaction = BraintreeRails::Transaction.create!(:amount => rand(1..10), :customer => customer)
|
43
|
+
|
44
|
+
transaction.void!
|
45
|
+
transaction.submit_for_settlement.must_equal false
|
46
|
+
transaction.errors[:base].wont_be :blank?
|
47
|
+
|
48
|
+
lambda{transaction.submit_for_settlement!}.must_raise Braintree::ValidationsFailed
|
49
|
+
end
|
50
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -19,6 +19,32 @@ MiniTest::Unit::TestCase.class_eval do
|
|
19
19
|
response = response.reverse_merge(:headers => {'Content-Type' => ['application/xml', 'charset=utf-8'], 'Content-Encoding' => 'gzip'})
|
20
20
|
stub_request(method, BraintreeBaseUri+path).to_return(response)
|
21
21
|
end
|
22
|
+
|
23
|
+
def address_hash
|
24
|
+
{
|
25
|
+
:first_name => 'Brain',
|
26
|
+
:last_name => 'Tree',
|
27
|
+
:company => 'Braintree',
|
28
|
+
:street_address => '1134 Crane Avenue',
|
29
|
+
:extended_address => 'Suite 200',
|
30
|
+
:locality => 'Menlo Park',
|
31
|
+
:region => 'California',
|
32
|
+
:postal_code => '94025',
|
33
|
+
:country_name => 'United States of America'
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def credit_card_hash
|
38
|
+
{
|
39
|
+
:token => 'credit_card_id',
|
40
|
+
:number => '4111111111111111',
|
41
|
+
:cvv => '123',
|
42
|
+
:cardholder_name => 'Brain Tree',
|
43
|
+
:expiration_month => '05',
|
44
|
+
:expiration_year => '2037',
|
45
|
+
:billing_address => address_hash,
|
46
|
+
}
|
47
|
+
end
|
22
48
|
end
|
23
49
|
|
24
50
|
String.class_eval do
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../unit_test_helper'))
|
2
|
+
|
3
|
+
describe BraintreeRails::Transaction do
|
4
|
+
before do
|
5
|
+
stub_braintree_request(:get, '/customers/customer_id', :body => fixture('customer.xml'))
|
6
|
+
stub_braintree_request(:get, '/payment_methods/credit_card_id', :body => fixture('credit_card.xml'))
|
7
|
+
stub_braintree_request(:get, '/transactions/transactionid', :body => fixture('transaction.xml'))
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#initialize' do
|
11
|
+
it 'should find transaction from braintree when given a transaction id' do
|
12
|
+
braintree_transaction = Braintree::Transaction.find('transactionid')
|
13
|
+
transaction = BraintreeRails::Transaction.new('transactionid')
|
14
|
+
|
15
|
+
transaction.persisted?.must_equal true
|
16
|
+
[:amount, :created_at, :updated_at].each do |attribute|
|
17
|
+
transaction.send(attribute).must_equal braintree_transaction.send(attribute)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should wrap a Braintree::Transaction' do
|
22
|
+
braintree_transaction = Braintree::Transaction.find('transactionid')
|
23
|
+
transaction = BraintreeRails::Transaction.new(braintree_transaction)
|
24
|
+
|
25
|
+
transaction.persisted?.must_equal true
|
26
|
+
[:amount, :created_at, :updated_at].each do |attribute|
|
27
|
+
transaction.send(attribute).must_equal braintree_transaction.send(attribute)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should extract values from hash' do
|
32
|
+
transaction = BraintreeRails::Transaction.new(:id => 'new_id')
|
33
|
+
|
34
|
+
transaction.persisted?.must_equal false
|
35
|
+
transaction.id.must_equal 'new_id'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should try to extract value from other types' do
|
39
|
+
transaction = BraintreeRails::Transaction.new(OpenStruct.new(:id => 'foobar', :amount => '10.00', :persisted? => true))
|
40
|
+
|
41
|
+
transaction.persisted?.must_equal true
|
42
|
+
transaction.id.must_equal 'foobar'
|
43
|
+
transaction.amount.must_equal '10.00'
|
44
|
+
|
45
|
+
transaction = BraintreeRails::Transaction.new(Object.new)
|
46
|
+
transaction.persisted?.must_equal false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
[:customer, :credit_card].each do |association|
|
51
|
+
describe association do
|
52
|
+
it "should load #{association} for persisted transaction" do
|
53
|
+
transaction = BraintreeRails::Transaction.new('transactionid')
|
54
|
+
transaction.send(association).persisted?.must_equal true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'validations' do
|
60
|
+
it 'should validate amount' do
|
61
|
+
[nil, 'abc', -1].each do |invalid_value|
|
62
|
+
transaction = BraintreeRails::Transaction.new(:amount => invalid_value)
|
63
|
+
transaction.valid?.must_equal false
|
64
|
+
transaction.errors[:amount].wont_be :blank?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'persistence' do
|
70
|
+
before do
|
71
|
+
stub_braintree_request(:post, '/transactions', :body => fixture('transaction.xml'))
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should create a sale transaction' do
|
75
|
+
customer = BraintreeRails::Customer.find('customer_id')
|
76
|
+
credit_card = BraintreeRails::CreditCard.find('credit_card_id')
|
77
|
+
transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer, :credit_card => credit_card)
|
78
|
+
|
79
|
+
transaction.save.must_equal true
|
80
|
+
transaction.status.must_equal Braintree::Transaction::Status::Authorized
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should use default credit card of customer if credit_card is not specified' do
|
84
|
+
customer = BraintreeRails::Customer.find('customer_id')
|
85
|
+
transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer)
|
86
|
+
transaction.save.must_equal true
|
87
|
+
transaction.status.must_equal Braintree::Transaction::Status::Authorized
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should be able to submit_for_settlement a transaction" do
|
91
|
+
customer = BraintreeRails::Customer.find('customer_id')
|
92
|
+
credit_card = BraintreeRails::CreditCard.find('credit_card_id')
|
93
|
+
transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer, :credit_card => credit_card)
|
94
|
+
transaction.save!
|
95
|
+
stub_braintree_request(:put, "/transactions/#{transaction.id}/submit_for_settlement", :body => fixture('transaction.xml'))
|
96
|
+
transaction.submit_for_settlement.must_equal true
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should be able to refund a transaction" do
|
100
|
+
customer = BraintreeRails::Customer.find('customer_id')
|
101
|
+
credit_card = BraintreeRails::CreditCard.find('credit_card_id')
|
102
|
+
transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer, :credit_card => credit_card)
|
103
|
+
transaction.save!
|
104
|
+
stub_braintree_request(:post, "/transactions/#{transaction.id}/refund", :body => fixture('transaction.xml'))
|
105
|
+
transaction.refund.must_equal true
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should be able to void a transaction" do
|
109
|
+
customer = BraintreeRails::Customer.find('customer_id')
|
110
|
+
credit_card = BraintreeRails::CreditCard.find('credit_card_id')
|
111
|
+
transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer, :credit_card => credit_card)
|
112
|
+
transaction.save!
|
113
|
+
stub_braintree_request(:put, "/transactions/#{transaction.id}/void", :body => fixture('transaction.xml'))
|
114
|
+
transaction.void.must_equal true
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should show errors when trying to submit already voided transaction' do
|
118
|
+
customer = BraintreeRails::Customer.find('customer_id')
|
119
|
+
credit_card = BraintreeRails::CreditCard.find('credit_card_id')
|
120
|
+
transaction = BraintreeRails::Transaction.new(:amount => '10.00', :customer => customer, :credit_card => credit_card)
|
121
|
+
transaction.save!
|
122
|
+
stub_braintree_request(:put, "/transactions/#{transaction.id}/void", :body => fixture('transaction.xml'))
|
123
|
+
transaction.void.must_equal true
|
124
|
+
|
125
|
+
stub_braintree_request(:put, "/transactions/#{transaction.id}/submit_for_settlement", :status => 422, :body => fixture('transaction_error.xml'))
|
126
|
+
transaction.submit_for_settlement.must_equal false
|
127
|
+
transaction.errors[:base].wont_be :blank?
|
128
|
+
|
129
|
+
lambda{transaction.submit_for_settlement!}.must_raise Braintree::ValidationsFailed
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|