braintree 1.2.1 → 2.0.0
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.
- 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
|