braintree 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +6 -8
- data/lib/braintree.rb +1 -1
- data/lib/braintree/configuration.rb +1 -1
- data/lib/braintree/credit_card.rb +8 -4
- data/lib/braintree/customer.rb +8 -5
- data/lib/braintree/error_result.rb +3 -4
- data/lib/braintree/{paged_collection.rb → resource_collection.rb} +19 -19
- data/lib/braintree/subscription.rb +5 -1
- data/lib/braintree/transaction.rb +12 -6
- data/lib/braintree/transaction/credit_card_details.rb +2 -2
- data/lib/braintree/validation_error_collection.rb +4 -0
- data/lib/braintree/version.rb +3 -3
- data/lib/braintree/xml/generator.rb +7 -5
- data/spec/integration/braintree/credit_card_spec.rb +7 -30
- data/spec/integration/braintree/customer_spec.rb +7 -15
- data/spec/integration/braintree/subscription_spec.rb +24 -24
- data/spec/integration/braintree/test/transaction_amounts_spec.rb +2 -2
- data/spec/integration/braintree/transaction_spec.rb +25 -24
- data/spec/unit/braintree/resource_collection_spec.rb +68 -0
- data/spec/unit/braintree/transaction/credit_card_details_spec.rb +2 -1
- data/spec/unit/braintree/xml_spec.rb +10 -0
- metadata +31 -9
- data/spec/support/matchers/include_on_any_page.rb +0 -24
- data/spec/unit/braintree/paged_collection_spec.rb +0 -178
data/README.rdoc
CHANGED
@@ -26,13 +26,11 @@ The Braintree gem provides integration access to the Braintree Gateway.
|
|
26
26
|
)
|
27
27
|
|
28
28
|
if result.success?
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
puts " text: #{result.transaction.processor_response_text}"
|
35
|
-
end
|
29
|
+
puts "success!: #{result.transaction.id}"
|
30
|
+
elsif result.transaction
|
31
|
+
puts "Error processing transaction:"
|
32
|
+
puts " code: #{result.transaction.processor_response_code}"
|
33
|
+
puts " text: #{result.transaction.processor_response_text}"
|
36
34
|
else
|
37
35
|
p result.errors
|
38
36
|
end
|
@@ -45,7 +43,7 @@ the created or updated resource, or it will raise a ValidationsFailed exception.
|
|
45
43
|
|
46
44
|
Example of using non-bang method:
|
47
45
|
|
48
|
-
result = Braintree::Customer.create
|
46
|
+
result = Braintree::Customer.create(:first_name => "Josh")
|
49
47
|
if result.success?
|
50
48
|
puts "Created customer #{result.customer.id}
|
51
49
|
else
|
data/lib/braintree.rb
CHANGED
@@ -33,7 +33,7 @@ require "braintree/error_codes.rb"
|
|
33
33
|
require "braintree/error_result.rb"
|
34
34
|
require "braintree/errors.rb"
|
35
35
|
require "braintree/http.rb"
|
36
|
-
require "braintree/
|
36
|
+
require "braintree/resource_collection.rb"
|
37
37
|
require "braintree/ssl_expiration_check.rb"
|
38
38
|
require "braintree/subscription"
|
39
39
|
require "braintree/subscription_search"
|
@@ -8,7 +8,7 @@ module Braintree
|
|
8
8
|
# By default, the logger will log to +STDOUT+. The log level is set to info.
|
9
9
|
# The logger can be set to any Logger object.
|
10
10
|
module Configuration
|
11
|
-
API_VERSION = "
|
11
|
+
API_VERSION = "2" # :nodoc:
|
12
12
|
|
13
13
|
class << self
|
14
14
|
attr_accessor :logger
|
@@ -1,4 +1,8 @@
|
|
1
1
|
module Braintree
|
2
|
+
# == More Information
|
3
|
+
#
|
4
|
+
# For more detailed documentation on CreditCards, see http://www.braintreepaymentsolutions.com/gateway/credit-card-api
|
5
|
+
# For more detailed documentation on CreditCard verification, see http://www.braintreepaymentsolutions.com/gateway/credit-card-verification-api
|
2
6
|
class CreditCard
|
3
7
|
include BaseModule # :nodoc:
|
4
8
|
|
@@ -37,7 +41,7 @@ module Braintree
|
|
37
41
|
return_object_or_raise(:transaction) { credit(token, transaction_attributes) }
|
38
42
|
end
|
39
43
|
|
40
|
-
# Returns a
|
44
|
+
# Returns a ResourceCollection of expired credit cards.
|
41
45
|
def self.expired(options = {})
|
42
46
|
page_number = options[:page] || 1
|
43
47
|
response = Http.get("/payment_methods/all/expired?page=#{page_number}")
|
@@ -45,10 +49,10 @@ module Braintree
|
|
45
49
|
attributes[:items] = Util.extract_attribute_as_array(attributes, :credit_card).map do |payment_method_attributes|
|
46
50
|
new payment_method_attributes
|
47
51
|
end
|
48
|
-
|
52
|
+
ResourceCollection.new(attributes) { |page_number| CreditCard.expired(:page => page_number) }
|
49
53
|
end
|
50
54
|
|
51
|
-
# Returns a
|
55
|
+
# Returns a ResourceCollection of credit cards expiring between +start_date+ and +end_date+ inclusive.
|
52
56
|
# Only the month and year of the start and end dates are used.
|
53
57
|
def self.expiring_between(start_date, end_date, options = {})
|
54
58
|
page_number = options[:page] || 1
|
@@ -57,7 +61,7 @@ module Braintree
|
|
57
61
|
attributes[:items] = Util.extract_attribute_as_array(attributes, :credit_card).map do |payment_method_attributes|
|
58
62
|
new payment_method_attributes
|
59
63
|
end
|
60
|
-
|
64
|
+
ResourceCollection.new(attributes) { |page_number| CreditCard.expiring_between(start_date, end_date, :page => page_number) }
|
61
65
|
end
|
62
66
|
|
63
67
|
# Finds the credit card with the given +token+. Raises a NotFoundError if it cannot be found.
|
data/lib/braintree/customer.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
module Braintree
|
2
|
+
# == More Information
|
3
|
+
#
|
4
|
+
# For more detailed documentation on Customers, see http://www.braintreepaymentsolutions.com/gateway/customer-api
|
2
5
|
class Customer
|
3
6
|
include BaseModule
|
4
7
|
|
5
8
|
attr_reader :addresses, :company, :created_at, :credit_cards, :email, :fax, :first_name, :id, :last_name,
|
6
9
|
:phone, :updated_at, :website, :custom_fields
|
7
10
|
|
8
|
-
# Returns a
|
11
|
+
# Returns a ResourceCollection of all customers stored in the vault. Due to race conditions, this method
|
9
12
|
# may not reliably return all customers stored in the vault.
|
10
13
|
#
|
11
14
|
# page = Braintree::Customer.all
|
@@ -23,7 +26,7 @@ module Braintree
|
|
23
26
|
attributes[:items] = Util.extract_attribute_as_array(attributes, :customer).map do |customer_attributes|
|
24
27
|
new customer_attributes
|
25
28
|
end
|
26
|
-
|
29
|
+
ResourceCollection.new(attributes) { |page_number| Customer.all(:page => page_number) }
|
27
30
|
end
|
28
31
|
|
29
32
|
# Creates a customer using the given +attributes+. If <tt>:id</tt> is not passed,
|
@@ -95,7 +98,7 @@ module Braintree
|
|
95
98
|
return_object_or_raise(:transaction){ sale(customer_id, transaction_attributes) }
|
96
99
|
end
|
97
100
|
|
98
|
-
# Returns a
|
101
|
+
# Returns a ResourceCollection of transactions for the customer with the given +customer_id+.
|
99
102
|
def self.transactions(customer_id, options = {})
|
100
103
|
page_number = options[:page] || 1
|
101
104
|
response = Http.get "/customers/#{customer_id}/transactions?page=#{page_number}"
|
@@ -103,7 +106,7 @@ module Braintree
|
|
103
106
|
attributes[:items] = Util.extract_attribute_as_array(attributes, :transaction).map do |transaction_attributes|
|
104
107
|
Transaction._new transaction_attributes
|
105
108
|
end
|
106
|
-
|
109
|
+
ResourceCollection.new(attributes) { |page_number| Customer.transactions(customer_id, :page => page_number) }
|
107
110
|
end
|
108
111
|
|
109
112
|
def self.update(customer_id, attributes)
|
@@ -160,7 +163,7 @@ module Braintree
|
|
160
163
|
return_object_or_raise(:transaction) { sale(transaction_attributes) }
|
161
164
|
end
|
162
165
|
|
163
|
-
# Returns a
|
166
|
+
# Returns a ResourceCollection of transactions for the customer.
|
164
167
|
def transactions(options = {})
|
165
168
|
Customer.transactions(id, options)
|
166
169
|
end
|
@@ -17,13 +17,12 @@ module Braintree
|
|
17
17
|
# end
|
18
18
|
class ErrorResult
|
19
19
|
|
20
|
-
attr_reader :credit_card_verification, :errors, :params
|
20
|
+
attr_reader :credit_card_verification, :transaction, :errors, :params
|
21
21
|
|
22
22
|
def initialize(data) # :nodoc:
|
23
23
|
@params = data[:params]
|
24
|
-
if data[:verification]
|
25
|
-
|
26
|
-
end
|
24
|
+
@credit_card_verification = CreditCardVerification._new(data[:verification]) if data[:verification]
|
25
|
+
@transaction = Transaction._new(data[:transaction]) if data[:transaction]
|
27
26
|
@errors = Errors.new(data[:errors])
|
28
27
|
end
|
29
28
|
|
@@ -1,23 +1,22 @@
|
|
1
1
|
module Braintree
|
2
|
-
class
|
2
|
+
class ResourceCollection
|
3
3
|
include BaseModule
|
4
4
|
include Enumerable
|
5
5
|
|
6
|
-
attr_reader :current_page_number, :items, :next_page_number, :page_size, :previous_page_number, :total_items
|
7
|
-
|
8
6
|
def initialize(attributes, &block) # :nodoc:
|
9
7
|
set_instance_variables_from_hash attributes
|
10
8
|
@paging_block = block
|
11
9
|
end
|
12
10
|
|
13
|
-
# Returns the item from the current page at the given +index+.
|
14
|
-
def [](index)
|
15
|
-
@items[index]
|
16
|
-
end
|
17
|
-
|
18
11
|
# Yields each item on the current page.
|
19
12
|
def each(&block)
|
20
13
|
@items.each(&block)
|
14
|
+
|
15
|
+
_next_page.each(&block) unless _last_page?
|
16
|
+
end
|
17
|
+
|
18
|
+
def empty?
|
19
|
+
@items.empty?
|
21
20
|
end
|
22
21
|
|
23
22
|
# Returns the first item from the current page.
|
@@ -26,27 +25,28 @@ module Braintree
|
|
26
25
|
end
|
27
26
|
|
28
27
|
# Returns true if the page is the last page. False otherwise.
|
29
|
-
def
|
30
|
-
current_page_number ==
|
28
|
+
def _last_page?
|
29
|
+
@current_page_number == _total_pages
|
31
30
|
end
|
32
31
|
|
33
32
|
# Retrieves the next page of records.
|
34
|
-
def
|
35
|
-
if
|
33
|
+
def _next_page
|
34
|
+
if _last_page?
|
36
35
|
return nil
|
37
36
|
end
|
38
|
-
@paging_block.call(
|
37
|
+
@paging_block.call(@current_page_number + 1)
|
39
38
|
end
|
40
39
|
|
41
|
-
# The
|
42
|
-
|
43
|
-
|
40
|
+
# The size of a resource collection is only approximate due to race conditions when pulling back results. This method
|
41
|
+
# should be avoided.
|
42
|
+
def _approximate_size
|
43
|
+
@total_items
|
44
44
|
end
|
45
45
|
|
46
46
|
# Returns the total number of pages.
|
47
|
-
def
|
48
|
-
total = total_items / page_size
|
49
|
-
if total_items % page_size != 0
|
47
|
+
def _total_pages
|
48
|
+
total = @total_items / @page_size
|
49
|
+
if @total_items % @page_size != 0
|
50
50
|
total += 1
|
51
51
|
end
|
52
52
|
total
|
@@ -20,6 +20,10 @@ module Braintree
|
|
20
20
|
# :trial_duration => "2",
|
21
21
|
# :trial_duration_unit => Subscription::TrialDurationUnit::Day
|
22
22
|
# )
|
23
|
+
#
|
24
|
+
# == More Information
|
25
|
+
#
|
26
|
+
# For more detailed documentation on Subscriptions, see http://www.braintreepaymentsolutions.com/gateway/subscription-api
|
23
27
|
class Subscription
|
24
28
|
include BaseModule
|
25
29
|
|
@@ -90,7 +94,7 @@ module Braintree
|
|
90
94
|
response = Http.post "/subscriptions/advanced_search?page=#{page}", {:search => search.to_hash}
|
91
95
|
attributes = response[:subscriptions]
|
92
96
|
attributes[:items] = Util.extract_attribute_as_array(attributes, :subscription).map { |attrs| new(attrs) }
|
93
|
-
|
97
|
+
ResourceCollection.new(attributes) { |page_number| Subscription.search(page_number, &block) }
|
94
98
|
end
|
95
99
|
|
96
100
|
def self.update(subscription_id, attributes)
|
@@ -116,6 +116,10 @@ module Braintree
|
|
116
116
|
# :submit_for_settlement => true
|
117
117
|
# }
|
118
118
|
# )
|
119
|
+
#
|
120
|
+
# == More Information
|
121
|
+
#
|
122
|
+
# For more detailed documentation on Transactions, see http://www.braintreepaymentsolutions.com/gateway/transaction-api
|
119
123
|
class Transaction
|
120
124
|
include BaseModule
|
121
125
|
|
@@ -138,18 +142,20 @@ module Braintree
|
|
138
142
|
end
|
139
143
|
|
140
144
|
attr_reader :avs_error_response_code, :avs_postal_code_response_code, :avs_street_address_response_code
|
141
|
-
attr_reader :amount, :created_at, :credit_card_details, :customer_details, :id
|
145
|
+
attr_reader :amount, :created_at, :credit_card_details, :customer_details, :id
|
142
146
|
attr_reader :custom_fields
|
143
147
|
attr_reader :cvv_response_code
|
144
148
|
attr_reader :order_id
|
145
149
|
attr_reader :billing_details, :shipping_details
|
146
|
-
attr_reader :status_history
|
147
150
|
# The authorization code from the processor.
|
148
151
|
attr_reader :processor_authorization_code
|
149
152
|
# The response code from the processor.
|
150
153
|
attr_reader :processor_response_code
|
151
154
|
# The response text from the processor.
|
152
155
|
attr_reader :processor_response_text
|
156
|
+
# See Transaction::Status
|
157
|
+
attr_reader :status
|
158
|
+
attr_reader :status_history
|
153
159
|
# Will either be "sale" or "credit"
|
154
160
|
attr_reader :type
|
155
161
|
attr_reader :updated_at
|
@@ -200,7 +206,7 @@ module Braintree
|
|
200
206
|
return_object_or_raise(:transaction) { sale(attributes) }
|
201
207
|
end
|
202
208
|
|
203
|
-
# Returns a
|
209
|
+
# Returns a ResourceCollection of transactions matching the search query.
|
204
210
|
# If <tt>query</tt> is a string, the search will be a basic search.
|
205
211
|
# If <tt>query</tt> is a hash, the search will be an advanced search.
|
206
212
|
def self.search(query, options = {})
|
@@ -379,7 +385,7 @@ module Braintree
|
|
379
385
|
response = Http.post "/transactions/advanced_search?page=#{Util.url_encode(page)}", :search => query
|
380
386
|
attributes = response[:credit_card_transactions]
|
381
387
|
attributes[:items] = Util.extract_attribute_as_array(attributes, :transaction).map { |attrs| _new(attrs) }
|
382
|
-
|
388
|
+
ResourceCollection.new(attributes) { |page_number| Transaction.search(query, :page => page_number) }
|
383
389
|
end
|
384
390
|
|
385
391
|
def self._attributes # :nodoc:
|
@@ -391,13 +397,13 @@ module Braintree
|
|
391
397
|
response = Http.get "/transactions/all/search?q=#{Util.url_encode(query)}&page=#{Util.url_encode(page)}"
|
392
398
|
attributes = response[:credit_card_transactions]
|
393
399
|
attributes[:items] = Util.extract_attribute_as_array(attributes, :transaction).map { |attrs| _new(attrs) }
|
394
|
-
|
400
|
+
ResourceCollection.new(attributes) { |page_number| Transaction.search(query, :page => page_number) }
|
395
401
|
end
|
396
402
|
|
397
403
|
def self._create_signature # :nodoc:
|
398
404
|
[
|
399
405
|
:amount, :customer_id, :order_id, :payment_method_token, :type,
|
400
|
-
{:credit_card => [:token, :cvv, :expiration_date, :expiration_month, :expiration_year, :number]},
|
406
|
+
{:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number]},
|
401
407
|
{:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
|
402
408
|
{:billing => [:first_name, :last_name, :company, :country_name, :extended_address, :locality, :postal_code, :region, :street_address]},
|
403
409
|
{:shipping => [:first_name, :last_name, :company, :country_name, :extended_address, :locality, :postal_code, :region, :street_address]},
|
@@ -3,7 +3,7 @@ module Braintree
|
|
3
3
|
class CreditCardDetails # :nodoc:
|
4
4
|
include BaseModule
|
5
5
|
|
6
|
-
attr_reader :bin, :card_type, :customer_location, :expiration_month,
|
6
|
+
attr_reader :bin, :card_type, :cardholder_name, :customer_location, :expiration_month,
|
7
7
|
:expiration_year, :last_4, :token
|
8
8
|
|
9
9
|
def initialize(attributes)
|
@@ -11,7 +11,7 @@ module Braintree
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def inspect
|
14
|
-
attr_order = [:token, :bin, :last_4, :card_type, :expiration_date, :customer_location]
|
14
|
+
attr_order = [:token, :bin, :last_4, :card_type, :expiration_date, :cardholder_name, :customer_location]
|
15
15
|
formatted_attrs = attr_order.map do |attr|
|
16
16
|
"#{attr}: #{send(attr).inspect}"
|
17
17
|
end
|
@@ -18,6 +18,10 @@ module Braintree
|
|
18
18
|
# #=> [#<Braintree::ValidationError (81715) Credit card number is invalid.>]
|
19
19
|
# result.errors.for(:customer).for(:credit_card).for(:billing_address).on(:country_name)
|
20
20
|
# #=> [#<Braintree::ValidationError (91803) Country name is not an accepted country.>]
|
21
|
+
#
|
22
|
+
# == More Information
|
23
|
+
#
|
24
|
+
# For more detailed documentation on ValidationErrors, see http://www.braintreepaymentsolutions.com/gateway/validation-errors
|
21
25
|
class ValidationErrorCollection
|
22
26
|
include Enumerable
|
23
27
|
|
data/lib/braintree/version.rb
CHANGED
@@ -21,7 +21,7 @@ module Braintree
|
|
21
21
|
|
22
22
|
if contents.is_a?(String)
|
23
23
|
builder = Builder::XmlMarkup.new
|
24
|
-
builder.__send__(root) { |b| b.text! contents }
|
24
|
+
builder.__send__(_xml_escape(root)) { |b| b.text! contents }
|
25
25
|
else
|
26
26
|
_convert_to_xml contents, :root => root
|
27
27
|
end
|
@@ -32,7 +32,7 @@ module Braintree
|
|
32
32
|
options[:indent] ||= 2
|
33
33
|
options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
|
34
34
|
options[:builder].instruct! unless options.delete(:skip_instruct)
|
35
|
-
root = options[:root]
|
35
|
+
root = _xml_escape(options[:root])
|
36
36
|
|
37
37
|
options[:builder].__send__(:method_missing, root) do
|
38
38
|
hash_to_convert.each do |key, value|
|
@@ -44,14 +44,12 @@ module Braintree
|
|
44
44
|
else
|
45
45
|
type_name = XML_TYPE_NAMES[value.class.name]
|
46
46
|
|
47
|
-
key = key.to_s.tr("_", "-")
|
48
|
-
|
49
47
|
attributes = ((value.nil? || type_name.nil?) ? {} : { :type => type_name })
|
50
48
|
if value.nil?
|
51
49
|
attributes[:nil] = true
|
52
50
|
end
|
53
51
|
|
54
|
-
options[:builder].tag!(key,
|
52
|
+
options[:builder].tag!(_xml_escape(key),
|
55
53
|
XML_FORMATTING[type_name] ? XML_FORMATTING[type_name].call(value) : value,
|
56
54
|
attributes
|
57
55
|
)
|
@@ -80,6 +78,10 @@ module Braintree
|
|
80
78
|
end
|
81
79
|
end
|
82
80
|
end
|
81
|
+
|
82
|
+
def self._xml_escape(key)
|
83
|
+
key.to_s.tr("_", "-").to_xs
|
84
|
+
end
|
83
85
|
end
|
84
86
|
end
|
85
87
|
end
|
@@ -638,42 +638,19 @@ describe Braintree::CreditCard do
|
|
638
638
|
|
639
639
|
describe "self.expired" do
|
640
640
|
it "finds expired payment methods, paginated" do
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
first_page.all? { |pm| pm.expired?.should == true }
|
645
|
-
end
|
646
|
-
|
647
|
-
it "can get the next_page" do
|
648
|
-
first_page = Braintree::CreditCard.expired
|
649
|
-
first_page.current_page_number.should == 1
|
650
|
-
first_page.all? { |pm| pm.expired?.should == true }
|
651
|
-
second_page = first_page.next_page
|
652
|
-
# TODO: we don't have enough expired payment methods to go onto a second page
|
653
|
-
# second_page.current_page_number.should == 2
|
654
|
-
# second_page.all? { |pm| pm.expired?.should == true }
|
641
|
+
collection = Braintree::CreditCard.expired
|
642
|
+
collection._approximate_size.should > 0
|
643
|
+
collection.all? { |pm| pm.expired?.should == true }
|
655
644
|
end
|
656
645
|
end
|
657
646
|
|
658
647
|
describe "self.expiring_between" do
|
659
648
|
it "finds payment methods expiring between the given dates" do
|
660
649
|
next_year = Time.now.year + 1
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
first_page.all? { |pm| pm.expiration_year.should == next_year.to_s }
|
666
|
-
end
|
667
|
-
|
668
|
-
it "can get the next_page" do
|
669
|
-
next_year = Time.now.year + 1
|
670
|
-
first_page = Braintree::CreditCard.expiring_between(Time.mktime(next_year, 1), Time.mktime(next_year, 12))
|
671
|
-
first_page.current_page_number.should == 1
|
672
|
-
second_page = first_page.next_page
|
673
|
-
# TODO: we don't have enough expired payment methods to go onto a second page
|
674
|
-
# second_page.current_page_number.should == 2
|
675
|
-
# second_page.all? { |pm| pm.expired?.should == false }
|
676
|
-
# second_page.all? { |pm| pm.expiration_year.should == next_year.to_s }
|
650
|
+
collection = Braintree::CreditCard.expiring_between(Time.mktime(next_year, 1), Time.mktime(next_year, 12))
|
651
|
+
collection._approximate_size.should > 0
|
652
|
+
collection.all? { |pm| pm.expired?.should == false }
|
653
|
+
collection.all? { |pm| pm.expiration_year.should == next_year.to_s }
|
677
654
|
end
|
678
655
|
end
|
679
656
|
|
@@ -2,16 +2,12 @@ require File.dirname(__FILE__) + "/../spec_helper"
|
|
2
2
|
|
3
3
|
describe Braintree::Customer do
|
4
4
|
describe "self.all" do
|
5
|
-
it "
|
6
|
-
|
7
|
-
|
8
|
-
end
|
5
|
+
it "gets more than a page of customers" do
|
6
|
+
customers = Braintree::Customer.all
|
7
|
+
customers._approximate_size.should > 100
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
first_page.current_page_number.should == 1
|
13
|
-
second_page = first_page.next_page
|
14
|
-
second_page.current_page_number.should == 2
|
9
|
+
customer_ids = customers.map {|c| c.id }.uniq.compact
|
10
|
+
customer_ids.size.should == customers._approximate_size
|
15
11
|
end
|
16
12
|
end
|
17
13
|
|
@@ -298,9 +294,7 @@ describe Braintree::Customer do
|
|
298
294
|
)
|
299
295
|
transaction = customer.sale!(:amount => "100.00")
|
300
296
|
collection = Braintree::Customer.transactions(customer.id)
|
301
|
-
collection.
|
302
|
-
collection.total_items.should == 1
|
303
|
-
collection[0].should == transaction
|
297
|
+
collection.first.should == transaction
|
304
298
|
end
|
305
299
|
end
|
306
300
|
|
@@ -356,9 +350,7 @@ describe Braintree::Customer do
|
|
356
350
|
)
|
357
351
|
transaction = customer.sale!(:amount => "100.00")
|
358
352
|
collection = customer.transactions
|
359
|
-
collection.
|
360
|
-
collection.total_items.should == 1
|
361
|
-
collection[0].should == transaction
|
353
|
+
collection.first.should == transaction
|
362
354
|
end
|
363
355
|
end
|
364
356
|
|
@@ -419,11 +419,11 @@ describe Braintree::Subscription do
|
|
419
419
|
search.plan_id.is "not_a_real_plan_id"
|
420
420
|
end
|
421
421
|
|
422
|
-
collection.
|
422
|
+
collection._approximate_size.should == 0
|
423
423
|
end
|
424
424
|
|
425
425
|
context "is statement" do
|
426
|
-
it "returns
|
426
|
+
it "returns resource collection with matching results" do
|
427
427
|
trialless_subscription = Braintree::Subscription.create(
|
428
428
|
:payment_method_token => @credit_card.token,
|
429
429
|
:plan_id => TriallessPlan[:id]
|
@@ -438,13 +438,13 @@ describe Braintree::Subscription do
|
|
438
438
|
search.plan_id.is TriallessPlan[:id]
|
439
439
|
end
|
440
440
|
|
441
|
-
collection.should
|
442
|
-
collection.should_not
|
441
|
+
collection.should include(trialless_subscription)
|
442
|
+
collection.should_not include(trial_subscription)
|
443
443
|
end
|
444
444
|
end
|
445
445
|
|
446
446
|
context "is_not statement" do
|
447
|
-
it "returns
|
447
|
+
it "returns resource collection without matching results" do
|
448
448
|
trialless_subscription = Braintree::Subscription.create(
|
449
449
|
:payment_method_token => @credit_card.token,
|
450
450
|
:plan_id => TriallessPlan[:id]
|
@@ -459,13 +459,13 @@ describe Braintree::Subscription do
|
|
459
459
|
search.plan_id.is_not TriallessPlan[:id]
|
460
460
|
end
|
461
461
|
|
462
|
-
collection.should_not
|
463
|
-
collection.should
|
462
|
+
collection.should_not include(trialless_subscription)
|
463
|
+
collection.should include(trial_subscription)
|
464
464
|
end
|
465
465
|
end
|
466
466
|
|
467
467
|
context "ends_with statement" do
|
468
|
-
it "returns
|
468
|
+
it "returns resource collection with matching results" do
|
469
469
|
trialless_subscription = Braintree::Subscription.create(
|
470
470
|
:payment_method_token => @credit_card.token,
|
471
471
|
:plan_id => TriallessPlan[:id]
|
@@ -480,13 +480,13 @@ describe Braintree::Subscription do
|
|
480
480
|
search.plan_id.ends_with "trial_plan"
|
481
481
|
end
|
482
482
|
|
483
|
-
collection.should
|
484
|
-
collection.should_not
|
483
|
+
collection.should include(trial_subscription)
|
484
|
+
collection.should_not include(trialless_subscription)
|
485
485
|
end
|
486
486
|
end
|
487
487
|
|
488
488
|
context "starts_with statement" do
|
489
|
-
it "returns
|
489
|
+
it "returns resource collection with matching results" do
|
490
490
|
trialless_subscription = Braintree::Subscription.create(
|
491
491
|
:payment_method_token => @credit_card.token,
|
492
492
|
:plan_id => TriallessPlan[:id]
|
@@ -501,13 +501,13 @@ describe Braintree::Subscription do
|
|
501
501
|
search.plan_id.starts_with "integration_trial_p"
|
502
502
|
end
|
503
503
|
|
504
|
-
collection.should
|
505
|
-
collection.should_not
|
504
|
+
collection.should include(trial_subscription)
|
505
|
+
collection.should_not include(trialless_subscription)
|
506
506
|
end
|
507
507
|
end
|
508
508
|
|
509
509
|
context "contains statement" do
|
510
|
-
it "returns
|
510
|
+
it "returns resource collection with matching results" do
|
511
511
|
trialless_subscription = Braintree::Subscription.create(
|
512
512
|
:payment_method_token => @credit_card.token,
|
513
513
|
:plan_id => TriallessPlan[:id]
|
@@ -522,8 +522,8 @@ describe Braintree::Subscription do
|
|
522
522
|
search.plan_id.contains "trial_p"
|
523
523
|
end
|
524
524
|
|
525
|
-
collection.should
|
526
|
-
collection.should_not
|
525
|
+
collection.should include(trial_subscription)
|
526
|
+
collection.should_not include(trialless_subscription)
|
527
527
|
end
|
528
528
|
end
|
529
529
|
end
|
@@ -547,8 +547,8 @@ describe Braintree::Subscription do
|
|
547
547
|
search.plan_id.is TriallessPlan[:id]
|
548
548
|
end
|
549
549
|
|
550
|
-
collection.should
|
551
|
-
collection.should
|
550
|
+
collection.should include(subscription1)
|
551
|
+
collection.should include(subscription2)
|
552
552
|
end
|
553
553
|
|
554
554
|
it "returns only matching results" do
|
@@ -568,8 +568,8 @@ describe Braintree::Subscription do
|
|
568
568
|
search.status.in Braintree::Subscription::Status::Active
|
569
569
|
end
|
570
570
|
|
571
|
-
collection.should
|
572
|
-
collection.should_not
|
571
|
+
collection.should include(subscription1)
|
572
|
+
collection.should_not include(subscription2)
|
573
573
|
end
|
574
574
|
|
575
575
|
it "returns only matching results given an argument list" do
|
@@ -589,8 +589,8 @@ describe Braintree::Subscription do
|
|
589
589
|
search.status.in Braintree::Subscription::Status::Active, Braintree::Subscription::Status::Canceled
|
590
590
|
end
|
591
591
|
|
592
|
-
collection.should
|
593
|
-
collection.should
|
592
|
+
collection.should include(subscription1)
|
593
|
+
collection.should include(subscription2)
|
594
594
|
end
|
595
595
|
|
596
596
|
it "returns only matching results given an array" do
|
@@ -610,8 +610,8 @@ describe Braintree::Subscription do
|
|
610
610
|
search.status.in [Braintree::Subscription::Status::Active, Braintree::Subscription::Status::Canceled]
|
611
611
|
end
|
612
612
|
|
613
|
-
collection.should
|
614
|
-
collection.should
|
613
|
+
collection.should include(subscription1)
|
614
|
+
collection.should include(subscription2)
|
615
615
|
end
|
616
616
|
end
|
617
617
|
end
|
@@ -16,14 +16,14 @@ describe Braintree::Test::TransactionAmounts do
|
|
16
16
|
|
17
17
|
describe "Decline" do
|
18
18
|
it "creates a transaction with status processor_declined" do
|
19
|
-
|
19
|
+
result = Braintree::Transaction.sale(
|
20
20
|
:amount => Braintree::Test::TransactionAmounts::Decline,
|
21
21
|
:credit_card => {
|
22
22
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
23
23
|
:expiration_date => "12/2012"
|
24
24
|
}
|
25
25
|
)
|
26
|
-
transaction.status.should == Braintree::Transaction::Status::ProcessorDeclined
|
26
|
+
result.transaction.status.should == Braintree::Transaction::Status::ProcessorDeclined
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -31,7 +31,7 @@ describe Braintree::Transaction do
|
|
31
31
|
:expiration_date => "05/2009"
|
32
32
|
}
|
33
33
|
)
|
34
|
-
result.success?.should ==
|
34
|
+
result.success?.should == false
|
35
35
|
result.transaction.id.should =~ /^\w{6}$/
|
36
36
|
result.transaction.type.should == "sale"
|
37
37
|
result.transaction.status.should == Braintree::Transaction::Status::ProcessorDeclined
|
@@ -42,7 +42,7 @@ describe Braintree::Transaction do
|
|
42
42
|
it "accepts credit card expiration month and expiration year" do
|
43
43
|
result = Braintree::Transaction.create(
|
44
44
|
:type => "sale",
|
45
|
-
:amount => Braintree::Test::TransactionAmounts::
|
45
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
46
46
|
:credit_card => {
|
47
47
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
48
48
|
:expiration_month => "05",
|
@@ -256,6 +256,7 @@ describe Braintree::Transaction do
|
|
256
256
|
:amount => "100.00",
|
257
257
|
:order_id => "123",
|
258
258
|
:credit_card => {
|
259
|
+
:cardholder_name => "The Cardholder",
|
259
260
|
:number => "5105105105105100",
|
260
261
|
:expiration_date => "05/2011",
|
261
262
|
:cvv => "123"
|
@@ -303,6 +304,7 @@ describe Braintree::Transaction do
|
|
303
304
|
transaction.created_at.between?(Time.now - 5, Time.now).should == true
|
304
305
|
transaction.updated_at.between?(Time.now - 5, Time.now).should == true
|
305
306
|
transaction.credit_card_details.bin.should == "510510"
|
307
|
+
transaction.credit_card_details.cardholder_name.should == "The Cardholder"
|
306
308
|
transaction.credit_card_details.last_4.should == "5100"
|
307
309
|
transaction.credit_card_details.masked_number.should == "510510******5100"
|
308
310
|
transaction.credit_card_details.card_type.should == "MasterCard"
|
@@ -583,13 +585,13 @@ describe Braintree::Transaction do
|
|
583
585
|
end
|
584
586
|
|
585
587
|
it "returns an error result if status is not authorized" do
|
586
|
-
transaction = Braintree::Transaction.sale
|
588
|
+
transaction = Braintree::Transaction.sale(
|
587
589
|
:amount => Braintree::Test::TransactionAmounts::Decline,
|
588
590
|
:credit_card => {
|
589
591
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
590
592
|
:expiration_date => "06/2009"
|
591
593
|
}
|
592
|
-
)
|
594
|
+
).transaction
|
593
595
|
result = Braintree::Transaction.submit_for_settlement(transaction.id)
|
594
596
|
result.success?.should == false
|
595
597
|
result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::CannotSubmitForSettlement
|
@@ -729,6 +731,7 @@ describe Braintree::Transaction do
|
|
729
731
|
:order_id => "123",
|
730
732
|
:type => "sale",
|
731
733
|
:credit_card => {
|
734
|
+
:cardholder_name => "The Cardholder",
|
732
735
|
:number => "5105105105105100",
|
733
736
|
:expiration_date => "05/2011",
|
734
737
|
:cvv => "123"
|
@@ -781,6 +784,7 @@ describe Braintree::Transaction do
|
|
781
784
|
transaction.updated_at.between?(Time.now - 60, Time.now).should == true
|
782
785
|
transaction.credit_card_details.bin.should == "510510"
|
783
786
|
transaction.credit_card_details.last_4.should == "5100"
|
787
|
+
transaction.credit_card_details.cardholder_name.should == "The Cardholder"
|
784
788
|
transaction.credit_card_details.masked_number.should == "510510******5100"
|
785
789
|
transaction.credit_card_details.card_type.should == "MasterCard"
|
786
790
|
transaction.avs_error_response_code.should == nil
|
@@ -878,13 +882,13 @@ describe Braintree::Transaction do
|
|
878
882
|
end
|
879
883
|
|
880
884
|
it "returns an error result if unsuccessful" do
|
881
|
-
transaction = Braintree::Transaction.sale
|
885
|
+
transaction = Braintree::Transaction.sale(
|
882
886
|
:amount => Braintree::Test::TransactionAmounts::Decline,
|
883
887
|
:credit_card => {
|
884
888
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
885
889
|
:expiration_date => "05/2009"
|
886
890
|
}
|
887
|
-
)
|
891
|
+
).transaction
|
888
892
|
result = Braintree::Transaction.void(transaction.id)
|
889
893
|
result.success?.should == false
|
890
894
|
result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::CannotBeVoided
|
@@ -906,13 +910,13 @@ describe Braintree::Transaction do
|
|
906
910
|
end
|
907
911
|
|
908
912
|
it "raises a ValidationsFailed if unsuccessful" do
|
909
|
-
transaction = Braintree::Transaction.sale
|
913
|
+
transaction = Braintree::Transaction.sale(
|
910
914
|
:amount => Braintree::Test::TransactionAmounts::Decline,
|
911
915
|
:credit_card => {
|
912
916
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
913
917
|
:expiration_date => "05/2009"
|
914
918
|
}
|
915
|
-
)
|
919
|
+
).transaction
|
916
920
|
expect do
|
917
921
|
Braintree::Transaction.void!(transaction.id)
|
918
922
|
end.to raise_error(Braintree::ValidationsFailed)
|
@@ -992,7 +996,7 @@ describe Braintree::Transaction do
|
|
992
996
|
result.success?.should == true
|
993
997
|
transaction.amount.should == BigDecimal.new("999.99")
|
994
998
|
transaction.status.should == Braintree::Transaction::Status::SubmittedForSettlement
|
995
|
-
transaction.updated_at.between?(Time.now -
|
999
|
+
transaction.updated_at.between?(Time.now - 60, Time.now).should == true
|
996
1000
|
end
|
997
1001
|
|
998
1002
|
it "returns an error result if unsuccessful" do
|
@@ -1115,25 +1119,22 @@ describe Braintree::Transaction do
|
|
1115
1119
|
}
|
1116
1120
|
)
|
1117
1121
|
search_results = Braintree::Transaction.search(:transaction_id => {:is => transaction.id})
|
1118
|
-
search_results.
|
1119
|
-
search_results[0].should == transaction
|
1122
|
+
search_results.first.should == transaction
|
1120
1123
|
end
|
1121
1124
|
end
|
1122
1125
|
|
1123
1126
|
describe "basic" do
|
1124
|
-
it "returns
|
1127
|
+
it "returns transactions matching the given search terms" do
|
1125
1128
|
transactions = Braintree::Transaction.search "1111"
|
1126
|
-
transactions.
|
1129
|
+
transactions._approximate_size.should > 0
|
1127
1130
|
end
|
1128
1131
|
|
1129
|
-
it "
|
1130
|
-
transactions = Braintree::Transaction.search "
|
1131
|
-
transactions.
|
1132
|
-
end
|
1132
|
+
it "can iterate over the entire collection" do
|
1133
|
+
transactions = Braintree::Transaction.search "411111"
|
1134
|
+
transactions._approximate_size.should > 100
|
1133
1135
|
|
1134
|
-
|
1135
|
-
|
1136
|
-
transactions.next_page.current_page_number.should == 2
|
1136
|
+
transaction_ids = transactions.map {|t| t.id }.uniq.compact
|
1137
|
+
transaction_ids.size.should == transactions._approximate_size
|
1137
1138
|
end
|
1138
1139
|
end
|
1139
1140
|
end
|
@@ -1224,13 +1225,13 @@ describe Braintree::Transaction do
|
|
1224
1225
|
end
|
1225
1226
|
|
1226
1227
|
it "returns an error result if unsuccessful" do
|
1227
|
-
transaction = Braintree::Transaction.sale
|
1228
|
+
transaction = Braintree::Transaction.sale(
|
1228
1229
|
:amount => Braintree::Test::TransactionAmounts::Decline,
|
1229
1230
|
:credit_card => {
|
1230
1231
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
1231
1232
|
:expiration_date => "05/2009"
|
1232
1233
|
}
|
1233
|
-
)
|
1234
|
+
).transaction
|
1234
1235
|
transaction.status.should == Braintree::Transaction::Status::ProcessorDeclined
|
1235
1236
|
result = transaction.void
|
1236
1237
|
result.success?.should == false
|
@@ -1252,13 +1253,13 @@ describe Braintree::Transaction do
|
|
1252
1253
|
end
|
1253
1254
|
|
1254
1255
|
it "raises a ValidationsFailed if unsuccessful" do
|
1255
|
-
transaction = Braintree::Transaction.sale
|
1256
|
+
transaction = Braintree::Transaction.sale(
|
1256
1257
|
:amount => Braintree::Test::TransactionAmounts::Decline,
|
1257
1258
|
:credit_card => {
|
1258
1259
|
:number => Braintree::Test::CreditCardNumbers::Visa,
|
1259
1260
|
:expiration_date => "05/2009"
|
1260
1261
|
}
|
1261
|
-
)
|
1262
|
+
).transaction
|
1262
1263
|
transaction.status.should == Braintree::Transaction::Status::ProcessorDeclined
|
1263
1264
|
expect do
|
1264
1265
|
transaction.void!
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe "Braintree::ResourceCollection" do
|
4
|
+
it "includes enumerable" do
|
5
|
+
collection = Braintree::ResourceCollection.new(:items => ["a"])
|
6
|
+
collection.detect { |item| item == "a" }.should == "a"
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "each" do
|
10
|
+
it "iterates over the contents" do
|
11
|
+
expected = ["apples", "bananas", "cherries"]
|
12
|
+
collection = Braintree::ResourceCollection.new(
|
13
|
+
:current_page_number => 1,
|
14
|
+
:items => expected,
|
15
|
+
:page_size => 5,
|
16
|
+
:total_items => expected.size
|
17
|
+
)
|
18
|
+
actual = []
|
19
|
+
collection.each do |item|
|
20
|
+
actual << item
|
21
|
+
end
|
22
|
+
actual.should == expected
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "empty?" do
|
27
|
+
it "returns true if there are no items" do
|
28
|
+
collection = Braintree::ResourceCollection.new(
|
29
|
+
:current_page_number => 1,
|
30
|
+
:items => [],
|
31
|
+
:page_size => 5,
|
32
|
+
:total_items => 0
|
33
|
+
)
|
34
|
+
collection.should be_empty
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns false if there are items" do
|
38
|
+
collection = Braintree::ResourceCollection.new(
|
39
|
+
:current_page_number => 1,
|
40
|
+
:items => ["one"],
|
41
|
+
:page_size => 5,
|
42
|
+
:total_items => 1
|
43
|
+
)
|
44
|
+
collection.should_not be_empty
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "first" do
|
49
|
+
it "returns the first element" do
|
50
|
+
collection = Braintree::ResourceCollection.new(
|
51
|
+
:items => ["apples", "bananas", "cherries"]
|
52
|
+
)
|
53
|
+
collection.first.should == "apples"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "_last_page?" do
|
58
|
+
it "returns true if the page is the last page" do
|
59
|
+
collection = Braintree::ResourceCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 150)
|
60
|
+
collection._last_page?.should == true
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns false if the page is not the last page" do
|
64
|
+
collection = Braintree::ResourceCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 151)
|
65
|
+
collection._last_page?.should == false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -16,13 +16,14 @@ describe Braintree::Transaction::CreditCardDetails do
|
|
16
16
|
details = Braintree::Transaction::CreditCardDetails.new(
|
17
17
|
:bin => "123456",
|
18
18
|
:card_type => "Visa",
|
19
|
+
:cardholder_name => "The Cardholder",
|
19
20
|
:expiration_month => "05",
|
20
21
|
:expiration_year => "2012",
|
21
22
|
:last_4 => "6789",
|
22
23
|
:token => "token",
|
23
24
|
:customer_location => "US"
|
24
25
|
)
|
25
|
-
details.inspect.should == %(#<token: "token", bin: "123456", last_4: "6789", card_type: "Visa", expiration_date: "05/2012", customer_location: "US">)
|
26
|
+
details.inspect.should == %(#<token: "token", bin: "123456", last_4: "6789", card_type: "Visa", expiration_date: "05/2012", cardholder_name: "The Cardholder", customer_location: "US">)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
@@ -123,5 +123,15 @@ describe Braintree::Xml do
|
|
123
123
|
hash = {:id => "123"}
|
124
124
|
verify_to_xml_and_back hash
|
125
125
|
end
|
126
|
+
|
127
|
+
it "escapes keys and values" do
|
128
|
+
hash = { "ke<y" => "val>ue" }
|
129
|
+
Braintree::Xml.hash_to_xml(hash).should include("<ke<y>val>ue</ke<y>")
|
130
|
+
end
|
131
|
+
|
132
|
+
it "escapes nested keys and values" do
|
133
|
+
hash = { "top<" => { "ke<y" => "val>ue" } }
|
134
|
+
Braintree::Xml.hash_to_xml(hash).gsub(/\s/, '').should include("<top<><ke<y>val>ue</ke<y></top<>")
|
135
|
+
end
|
126
136
|
end
|
127
137
|
end
|
metadata
CHANGED
@@ -3,10 +3,10 @@ name: braintree
|
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
|
-
- 1
|
7
6
|
- 2
|
8
|
-
-
|
9
|
-
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 2.0.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Braintree Payment Solutions
|
@@ -14,10 +14,33 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-23 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: builder
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: libxml-ruby
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
41
|
+
version: "0"
|
42
|
+
type: :runtime
|
43
|
+
version_requirements: *id002
|
21
44
|
description: Ruby library for integrating with the Braintree Gateway
|
22
45
|
email: devs@getbraintree.com
|
23
46
|
executables: []
|
@@ -42,7 +65,7 @@ files:
|
|
42
65
|
- lib/braintree/errors.rb
|
43
66
|
- lib/braintree/exceptions.rb
|
44
67
|
- lib/braintree/http.rb
|
45
|
-
- lib/braintree/
|
68
|
+
- lib/braintree/resource_collection.rb
|
46
69
|
- lib/braintree/ssl_expiration_check.rb
|
47
70
|
- lib/braintree/subscription.rb
|
48
71
|
- lib/braintree/subscription_search.rb
|
@@ -77,7 +100,6 @@ files:
|
|
77
100
|
- spec/integration/spec_helper.rb
|
78
101
|
- spec/script/httpsd.rb
|
79
102
|
- spec/spec_helper.rb
|
80
|
-
- spec/support/matchers/include_on_any_page.rb
|
81
103
|
- spec/unit/braintree/address_spec.rb
|
82
104
|
- spec/unit/braintree/base_module_spec.rb
|
83
105
|
- spec/unit/braintree/configuration_spec.rb
|
@@ -88,7 +110,7 @@ files:
|
|
88
110
|
- spec/unit/braintree/error_result_spec.rb
|
89
111
|
- spec/unit/braintree/errors_spec.rb
|
90
112
|
- spec/unit/braintree/http_spec.rb
|
91
|
-
- spec/unit/braintree/
|
113
|
+
- spec/unit/braintree/resource_collection_spec.rb
|
92
114
|
- spec/unit/braintree/ssl_expiration_check_spec.rb
|
93
115
|
- spec/unit/braintree/subscription_search_spec.rb
|
94
116
|
- spec/unit/braintree/subscription_spec.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
Spec::Matchers.define :include_on_any_page do |expected|
|
2
|
-
match do |collection|
|
3
|
-
on_any_page?(collection, expected)
|
4
|
-
end
|
5
|
-
|
6
|
-
def on_any_page?(collection, expected)
|
7
|
-
return true if collection.any? { |item| item.id == expected.id }
|
8
|
-
return false if collection.last_page?
|
9
|
-
|
10
|
-
on_any_page?(collection.next_page, expected)
|
11
|
-
end
|
12
|
-
|
13
|
-
failure_message_for_should do |collection|
|
14
|
-
"expected that the paged collection would include an item with id #{expected.id}"
|
15
|
-
end
|
16
|
-
|
17
|
-
failure_message_for_should_not do |collection|
|
18
|
-
"expected that the paged collection would not include an item with id #{expected.id}"
|
19
|
-
end
|
20
|
-
|
21
|
-
description do
|
22
|
-
"include the given subsription in the paged collection"
|
23
|
-
end
|
24
|
-
end
|
@@ -1,178 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
-
|
3
|
-
describe "Braintree::PagedCollection" do
|
4
|
-
it "includes enumerable" do
|
5
|
-
collection = Braintree::PagedCollection.new(:items => ["a"])
|
6
|
-
collection.detect { |item| item == "a" }.should == "a"
|
7
|
-
end
|
8
|
-
|
9
|
-
describe "[]" do
|
10
|
-
it "returns the element at the given index" do
|
11
|
-
collection = Braintree::PagedCollection.new(:items => ["one", "two", "three"])
|
12
|
-
collection[0].should == "one"
|
13
|
-
collection[2].should == "three"
|
14
|
-
collection[3].should == nil
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "each" do
|
19
|
-
it "iterates over the contents" do
|
20
|
-
expected = ["apples", "bananas", "cherries"]
|
21
|
-
collection = Braintree::PagedCollection.new(
|
22
|
-
:items => expected
|
23
|
-
)
|
24
|
-
actual = []
|
25
|
-
collection.each do |item|
|
26
|
-
actual << item
|
27
|
-
end
|
28
|
-
actual.should == expected
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe "first" do
|
33
|
-
it "returns the first element" do
|
34
|
-
collection = Braintree::PagedCollection.new(
|
35
|
-
:items => ["apples", "bananas", "cherries"]
|
36
|
-
)
|
37
|
-
collection.first.should == "apples"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe "initialize" do
|
42
|
-
it "initializes attributes as expected" do
|
43
|
-
collection = Braintree::PagedCollection.new(
|
44
|
-
:current_page_number => 1,
|
45
|
-
:page_size => 2,
|
46
|
-
:total_items => 4,
|
47
|
-
:items => ["apples", "bananas", "cherries"]
|
48
|
-
)
|
49
|
-
collection.current_page_number.should == 1
|
50
|
-
collection.page_size.should == 2
|
51
|
-
collection.total_items.should == 4
|
52
|
-
collection.items.should == ["apples", "bananas", "cherries"]
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe "last_page?" do
|
57
|
-
it "returns true if the page is the last page" do
|
58
|
-
collection = Braintree::PagedCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 150)
|
59
|
-
collection.last_page?.should == true
|
60
|
-
end
|
61
|
-
|
62
|
-
it "returns false if the page is not the last page" do
|
63
|
-
collection = Braintree::PagedCollection.new(:current_page_number => 3, :page_size => 50, :total_items => 151)
|
64
|
-
collection.last_page?.should == false
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe "next_page" do
|
69
|
-
it "returns the next page of results" do
|
70
|
-
collection = Braintree::PagedCollection.new(
|
71
|
-
:current_page_number => 1,
|
72
|
-
:page_size => 1,
|
73
|
-
:total_items => 2
|
74
|
-
) do |page_num|
|
75
|
-
"contents of page #{page_num}"
|
76
|
-
end
|
77
|
-
collection.next_page.should == "contents of page 2"
|
78
|
-
end
|
79
|
-
|
80
|
-
it "returns nil if on last page" do
|
81
|
-
collection = Braintree::PagedCollection.new(
|
82
|
-
:current_page_number => 2,
|
83
|
-
:page_size => 2,
|
84
|
-
:total_items => 4
|
85
|
-
)
|
86
|
-
collection.next_page.should == nil
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe "next_page_number" do
|
91
|
-
it "returns the next page number when not on the last page" do
|
92
|
-
collection = Braintree::PagedCollection.new(
|
93
|
-
:current_page_number => 2,
|
94
|
-
:page_size => 1,
|
95
|
-
:total_items => 50
|
96
|
-
)
|
97
|
-
collection.next_page_number.should == 3
|
98
|
-
end
|
99
|
-
|
100
|
-
it "returns nil when on the last page" do
|
101
|
-
collection = Braintree::PagedCollection.new(
|
102
|
-
:current_page_number => 1,
|
103
|
-
:page_size => 1,
|
104
|
-
:total_items => 1
|
105
|
-
)
|
106
|
-
collection.next_page_number.should == nil
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe "total_pages" do
|
111
|
-
it "calculates the total number of pages when total items is not evenly divisible by page size" do
|
112
|
-
collection = Braintree::PagedCollection.new(
|
113
|
-
:page_size => 5,
|
114
|
-
:total_items => 13
|
115
|
-
)
|
116
|
-
collection.total_pages.should == 3
|
117
|
-
end
|
118
|
-
|
119
|
-
it "calculates the total number of pages when total items is not evenly divisible by page size" do
|
120
|
-
collection = Braintree::PagedCollection.new(
|
121
|
-
:page_size => 5,
|
122
|
-
:total_items => 20
|
123
|
-
)
|
124
|
-
collection.total_pages.should == 4
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
context "custom matchers" do
|
129
|
-
require 'enumerator'
|
130
|
-
|
131
|
-
DummyItem = Struct.new(:id)
|
132
|
-
|
133
|
-
def paged_collection(items, page_size)
|
134
|
-
pages = []
|
135
|
-
items.each_slice(page_size) do |slice|
|
136
|
-
pages << slice
|
137
|
-
end
|
138
|
-
|
139
|
-
_build_collection(pages, page_size, items.size, 1)
|
140
|
-
end
|
141
|
-
|
142
|
-
def _build_collection(paged_items, page_size, total_size, current_page)
|
143
|
-
Braintree::PagedCollection.new(:items => paged_items[current_page - 1], :total_items => total_size, :page_size => page_size, :current_page_number => current_page) do |page|
|
144
|
-
_build_collection(paged_items, page_size, total_size, page)
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
describe "include_on_any_page" do
|
149
|
-
it "finds a match in a simple collection" do
|
150
|
-
element = DummyItem.new(123)
|
151
|
-
collection = paged_collection([element], 10)
|
152
|
-
|
153
|
-
collection.should include_on_any_page(element)
|
154
|
-
end
|
155
|
-
|
156
|
-
it "does not find a match in a simple collection" do
|
157
|
-
element = DummyItem.new(1)
|
158
|
-
collection = paged_collection([DummyItem.new(2)], 10)
|
159
|
-
|
160
|
-
collection.should_not include_on_any_page(element)
|
161
|
-
end
|
162
|
-
|
163
|
-
it "finds a match on a subsequent page" do
|
164
|
-
element = DummyItem.new(1)
|
165
|
-
collection = paged_collection([DummyItem.new(2), element], 1)
|
166
|
-
|
167
|
-
collection.should include_on_any_page(element)
|
168
|
-
end
|
169
|
-
|
170
|
-
it "does not find a match on a subsequent page" do
|
171
|
-
element = DummyItem.new(1)
|
172
|
-
collection = paged_collection([DummyItem.new(2), DummyItem.new(3)], 1)
|
173
|
-
|
174
|
-
collection.should_not include_on_any_page(element)
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|