braintree 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +22 -0
- data/README.rdoc +62 -0
- data/lib/braintree.rb +66 -0
- data/lib/braintree/address.rb +122 -0
- data/lib/braintree/base_module.rb +29 -0
- data/lib/braintree/configuration.rb +99 -0
- data/lib/braintree/credit_card.rb +231 -0
- data/lib/braintree/credit_card_verification.rb +31 -0
- data/lib/braintree/customer.rb +231 -0
- data/lib/braintree/digest.rb +20 -0
- data/lib/braintree/error_codes.rb +95 -0
- data/lib/braintree/error_result.rb +39 -0
- data/lib/braintree/errors.rb +29 -0
- data/lib/braintree/http.rb +105 -0
- data/lib/braintree/paged_collection.rb +55 -0
- data/lib/braintree/ssl_expiration_check.rb +28 -0
- data/lib/braintree/successful_result.rb +38 -0
- data/lib/braintree/test/credit_card_numbers.rb +50 -0
- data/lib/braintree/test/transaction_amounts.rb +10 -0
- data/lib/braintree/transaction.rb +360 -0
- data/lib/braintree/transaction/address_details.rb +15 -0
- data/lib/braintree/transaction/credit_card_details.rb +22 -0
- data/lib/braintree/transaction/customer_details.rb +13 -0
- data/lib/braintree/transparent_redirect.rb +110 -0
- data/lib/braintree/util.rb +94 -0
- data/lib/braintree/validation_error.rb +15 -0
- data/lib/braintree/validation_error_collection.rb +80 -0
- data/lib/braintree/version.rb +9 -0
- data/lib/braintree/xml.rb +12 -0
- data/lib/braintree/xml/generator.rb +80 -0
- data/lib/braintree/xml/libxml.rb +69 -0
- data/lib/braintree/xml/parser.rb +93 -0
- data/lib/ssl/securetrust_ca.crt +44 -0
- data/lib/ssl/valicert_ca.crt +18 -0
- data/spec/integration/braintree/address_spec.rb +352 -0
- data/spec/integration/braintree/credit_card_spec.rb +676 -0
- data/spec/integration/braintree/customer_spec.rb +664 -0
- data/spec/integration/braintree/http_spec.rb +201 -0
- data/spec/integration/braintree/test/transaction_amounts_spec.rb +29 -0
- data/spec/integration/braintree/transaction_spec.rb +900 -0
- data/spec/integration/spec_helper.rb +38 -0
- data/spec/script/httpsd.rb +27 -0
- data/spec/spec_helper.rb +41 -0
- data/spec/unit/braintree/address_spec.rb +86 -0
- data/spec/unit/braintree/configuration_spec.rb +190 -0
- data/spec/unit/braintree/credit_card_spec.rb +137 -0
- data/spec/unit/braintree/credit_card_verification_spec.rb +17 -0
- data/spec/unit/braintree/customer_spec.rb +103 -0
- data/spec/unit/braintree/digest_spec.rb +28 -0
- data/spec/unit/braintree/error_result_spec.rb +42 -0
- data/spec/unit/braintree/errors_spec.rb +81 -0
- data/spec/unit/braintree/http_spec.rb +42 -0
- data/spec/unit/braintree/paged_collection_spec.rb +128 -0
- data/spec/unit/braintree/ssl_expiration_check_spec.rb +92 -0
- data/spec/unit/braintree/successful_result_spec.rb +27 -0
- data/spec/unit/braintree/transaction/credit_card_details_spec.rb +22 -0
- data/spec/unit/braintree/transaction_spec.rb +136 -0
- data/spec/unit/braintree/transparent_redirect_spec.rb +154 -0
- data/spec/unit/braintree/util_spec.rb +142 -0
- data/spec/unit/braintree/validation_error_collection_spec.rb +128 -0
- data/spec/unit/braintree/validation_error_spec.rb +19 -0
- data/spec/unit/braintree/xml/libxml_spec.rb +51 -0
- data/spec/unit/braintree/xml_spec.rb +122 -0
- data/spec/unit/spec_helper.rb +1 -0
- metadata +118 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe Braintree::CreditCardVerification do
|
4
|
+
describe "inspect" do
|
5
|
+
it "is better than the default inspect" do
|
6
|
+
verification = Braintree::CreditCardVerification._new(
|
7
|
+
:status => "verified",
|
8
|
+
:avs_error_response_code => "I",
|
9
|
+
:avs_postal_code_response_code => "I",
|
10
|
+
:avs_street_address_response_code => "I",
|
11
|
+
:cvv_response_code => "I"
|
12
|
+
)
|
13
|
+
verification.inspect.should == %(#<Braintree::CreditCardVerification status: "verified", cvv_response_code: "I", avs_error_response_code: "I", avs_postal_code_response_code: "I", avs_street_address_response_code: "I">)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe Braintree::Customer do
|
4
|
+
describe "inspect" do
|
5
|
+
it "includes the id first" do
|
6
|
+
output = Braintree::Customer._new({:first_name => 'Dan', :id => '1234'}).inspect
|
7
|
+
output.should include("#<Braintree::Customer id: \"1234\",")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "includes all customer attributes" do
|
11
|
+
customer = Braintree::Customer._new(
|
12
|
+
:company => "Company",
|
13
|
+
:email => "e@mail.com",
|
14
|
+
:fax => "483-438-5821",
|
15
|
+
:first_name => "Patrick",
|
16
|
+
:last_name => "Smith",
|
17
|
+
:phone => "802-483-5932",
|
18
|
+
:website => "patrick.smith.com",
|
19
|
+
:created_at => Time.now,
|
20
|
+
:updated_at => Time.now
|
21
|
+
)
|
22
|
+
output = customer.inspect
|
23
|
+
output.should include(%q(company: "Company"))
|
24
|
+
output.should include(%q(email: "e@mail.com"))
|
25
|
+
output.should include(%q(fax: "483-438-5821"))
|
26
|
+
output.should include(%q(first_name: "Patrick"))
|
27
|
+
output.should include(%q(last_name: "Smith"))
|
28
|
+
output.should include(%q(phone: "802-483-5932"))
|
29
|
+
output.should include(%q(website: "patrick.smith.com"))
|
30
|
+
output.should include(%Q(created_at: #{customer.created_at.inspect}))
|
31
|
+
output.should include(%Q(updated_at: #{customer.updated_at.inspect}))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "self.create" do
|
36
|
+
it "raises an exception if hash includes an invalid key" do
|
37
|
+
expect do
|
38
|
+
Braintree::Customer.create(:first_name => "Joe", :invalid_key => "foo")
|
39
|
+
end.to raise_error(ArgumentError, "invalid keys: invalid_key")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "self.update" do
|
44
|
+
it "raises an exception if hash includes an invalid key" do
|
45
|
+
expect do
|
46
|
+
Braintree::Customer.update("customer_id", :first_name => "Joe", :invalid_key => "foo")
|
47
|
+
end.to raise_error(ArgumentError, "invalid keys: invalid_key")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "self.create_from_transparent_redirect" do
|
52
|
+
it "raises an exception if the query string is forged" do
|
53
|
+
expect do
|
54
|
+
Braintree::Customer.create_from_transparent_redirect("forged=query_string")
|
55
|
+
end.to raise_error(Braintree::ForgedQueryString)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "==" do
|
60
|
+
it "returns true when given a customer with the same id" do
|
61
|
+
first = Braintree::Customer._new(:id => 123)
|
62
|
+
second = Braintree::Customer._new(:id => 123)
|
63
|
+
|
64
|
+
first.should == second
|
65
|
+
second.should == first
|
66
|
+
end
|
67
|
+
|
68
|
+
it "returns false when given a customer with a different id" do
|
69
|
+
first = Braintree::Customer._new(:id => 123)
|
70
|
+
second = Braintree::Customer._new(:id => 124)
|
71
|
+
|
72
|
+
first.should_not == second
|
73
|
+
second.should_not == first
|
74
|
+
end
|
75
|
+
|
76
|
+
it "returns false when not given a customer" do
|
77
|
+
customer = Braintree::Customer._new(:id => 123)
|
78
|
+
customer.should_not == "not a customer"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "initialize" do
|
83
|
+
it "converts payment method hashes into payment method objects" do
|
84
|
+
customer = Braintree::Customer._new(
|
85
|
+
:credit_cards => [
|
86
|
+
{:token => "pm1"},
|
87
|
+
{:token => "pm2"}
|
88
|
+
]
|
89
|
+
)
|
90
|
+
customer.credit_cards.size.should == 2
|
91
|
+
customer.credit_cards[0].token.should == "pm1"
|
92
|
+
customer.credit_cards[1].token.should == "pm2"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "new" do
|
97
|
+
it "is protected" do
|
98
|
+
expect do
|
99
|
+
Braintree::Customer.new
|
100
|
+
end.to raise_error(NoMethodError, /protected method .new/)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe Braintree::Digest do
|
4
|
+
describe "self.hexdigest" do
|
5
|
+
it "returns the sha1 hmac of the input string (test case 6 from RFC 2202)" do
|
6
|
+
begin
|
7
|
+
original_key = Braintree::Configuration.private_key
|
8
|
+
Braintree::Configuration.private_key = "\xaa" * 80
|
9
|
+
data = "Test Using Larger Than Block-Size Key - Hash Key First"
|
10
|
+
Braintree::Digest.hexdigest(data).should == "aa4ae5e15272d00e95705637ce8a3b55ed402112"
|
11
|
+
ensure
|
12
|
+
Braintree::Configuration.private_key = original_key
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns the sha1 hmac of the input string (test case 7 from RFC 2202)" do
|
17
|
+
begin
|
18
|
+
original_key = Braintree::Configuration.private_key
|
19
|
+
Braintree::Configuration.private_key = "\xaa" * 80
|
20
|
+
data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"
|
21
|
+
Braintree::Digest.hexdigest(data).should == "e8e99d0f45237d786d6bbaa7965c7808bbff1a91"
|
22
|
+
ensure
|
23
|
+
Braintree::Configuration.private_key = original_key
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe Braintree::ErrorResult do
|
4
|
+
describe "initialize" do
|
5
|
+
it "initializes params and errors" do
|
6
|
+
errors = {
|
7
|
+
:scope => {
|
8
|
+
:errors => [{:code => "123", :message => "something is invalid", :attribute => "something"}]
|
9
|
+
}
|
10
|
+
}
|
11
|
+
result = Braintree::ErrorResult.new(:params => "params", :errors => errors)
|
12
|
+
result.success?.should == false
|
13
|
+
result.params.should == "params"
|
14
|
+
result.errors.size.should == 1
|
15
|
+
result.errors.for(:scope)[0].message.should == "something is invalid"
|
16
|
+
result.errors.for(:scope)[0].attribute.should == "something"
|
17
|
+
result.errors.for(:scope)[0].code.should == "123"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "ignores data other than params and errors" do
|
21
|
+
# so that we can add more data into the response in the future without breaking the client lib
|
22
|
+
expect do
|
23
|
+
result = Braintree::ErrorResult.new(:params => "params", :errors => {:errors => []}, :extra => "is ignored")
|
24
|
+
end.to_not raise_error
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "inspect" do
|
29
|
+
it "shows errors 2 levels deep" do
|
30
|
+
errors = {
|
31
|
+
:level1 => {
|
32
|
+
:errors => [{:code => "code1", :attribute => "attr", :message => "message"}],
|
33
|
+
:level2 => {
|
34
|
+
:errors => [{:code => "code2", :attribute => "attr2", :message => "message2"}],
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
result = Braintree::ErrorResult.new(:params => "params", :errors => errors)
|
39
|
+
result.inspect.should == "#<Braintree::ErrorResult params:{...} errors:<level1:[(code1) message], level1/level2:[(code2) message2]>>"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe Braintree::Errors do
|
4
|
+
describe "for" do
|
5
|
+
it "accesses errors for the given scope" do
|
6
|
+
errors = Braintree::Errors.new(
|
7
|
+
:level1 => {:errors => [{:code => "code1", :attribute => "attr", :message => "message"}]}
|
8
|
+
)
|
9
|
+
errors.for(:level1).size.should == 1
|
10
|
+
errors.for(:level1)[0].code.should == "code1"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns nil if there are no errors at the given scope" do
|
14
|
+
errors = Braintree::Errors.new(
|
15
|
+
:level1 => {:errors => [{:code => "code1", :attribute => "attr", :message => "message"}]}
|
16
|
+
)
|
17
|
+
errors.for(:no_errors_here).should == nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "inspect" do
|
22
|
+
it "is better than the default inspect" do
|
23
|
+
errors = Braintree::Errors.new(
|
24
|
+
:level1 => {:errors => [{:code => "code1", :attribute => "attr", :message => "message"}]}
|
25
|
+
)
|
26
|
+
errors.inspect.should == "#<Braintree::Errors level1:[(code1) message]>"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "shows errors 2 levels deep" do
|
30
|
+
errors = Braintree::Errors.new(
|
31
|
+
:level1 => {
|
32
|
+
:errors => [{:code => "code1", :attribute => "attr", :message => "message"}],
|
33
|
+
:level2 => {
|
34
|
+
:errors => [{:code => "code2", :attribute => "attr2", :message => "message2"}],
|
35
|
+
}
|
36
|
+
}
|
37
|
+
)
|
38
|
+
errors.inspect.should == "#<Braintree::Errors level1:[(code1) message], level1/level2:[(code2) message2]>"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "shows errors 3 levels deep" do
|
42
|
+
errors = Braintree::Errors.new(
|
43
|
+
:level1 => {
|
44
|
+
:errors => [{:code => "code1", :attribute => "attr", :message => "message"}],
|
45
|
+
:level2 => {
|
46
|
+
:errors => [{:code => "code2", :attribute => "attr2", :message => "message2"}],
|
47
|
+
:level3 => {
|
48
|
+
:errors => [{:code => "code3", :attribute => "attr3", :message => "message3"}],
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
)
|
53
|
+
errors.inspect.should == "#<Braintree::Errors level1:[(code1) message], level1/level2:[(code2) message2], level1/level2/level3:[(code3) message3]>"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "size" do
|
58
|
+
it "returns the number of validation errors at the first level if only has one level" do
|
59
|
+
errors = Braintree::Errors.new(
|
60
|
+
:level1 => {:errors => [{:code => "1", :attribute => "attr", :message => "message"}]}
|
61
|
+
)
|
62
|
+
errors.size.should == 1
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns the total number of validation errors in the hierarchy" do
|
66
|
+
errors = Braintree::Errors.new(
|
67
|
+
:level1 => {
|
68
|
+
:errors => [{:code => "1", :attribute => "attr", :message => "message"}],
|
69
|
+
:level2 => {
|
70
|
+
:errors => [
|
71
|
+
{:code => "2", :attribute => "attr2", :message => "message2"},
|
72
|
+
{:code => "3", :attribute => "attr3", :message => "message3"}
|
73
|
+
],
|
74
|
+
}
|
75
|
+
}
|
76
|
+
)
|
77
|
+
errors.size.should == 3
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe Braintree::Http do
|
4
|
+
describe "self._format_and_sanitize_body_for_log" do
|
5
|
+
it "adds [Braintree] before each line" do
|
6
|
+
input_xml = <<-END
|
7
|
+
<customer>
|
8
|
+
<first-name>Joe</first-name>
|
9
|
+
<last-name>Doe</last-name>
|
10
|
+
</customer>
|
11
|
+
END
|
12
|
+
expected_xml = <<-END
|
13
|
+
[Braintree] <customer>
|
14
|
+
[Braintree] <first-name>Joe</first-name>
|
15
|
+
[Braintree] <last-name>Doe</last-name>
|
16
|
+
[Braintree] </customer>
|
17
|
+
END
|
18
|
+
Braintree::Http._format_and_sanitize_body_for_log(input_xml).should == expected_xml
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sanitizes credit card number and cvv" do
|
22
|
+
input_xml = <<-END
|
23
|
+
<customer>
|
24
|
+
<first-name>Joe</first-name>
|
25
|
+
<last-name>Doe</last-name>
|
26
|
+
<number>1234560000001234</number>
|
27
|
+
<cvv>123</cvv>
|
28
|
+
</customer>
|
29
|
+
END
|
30
|
+
|
31
|
+
expected_xml = <<-END
|
32
|
+
[Braintree] <customer>
|
33
|
+
[Braintree] <first-name>Joe</first-name>
|
34
|
+
[Braintree] <last-name>Doe</last-name>
|
35
|
+
[Braintree] <number>123456******1234</number>
|
36
|
+
[Braintree] <cvv>***</cvv>
|
37
|
+
[Braintree] </customer>
|
38
|
+
END
|
39
|
+
Braintree::Http._format_and_sanitize_body_for_log(input_xml).should == expected_xml
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,128 @@
|
|
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
|
+
end
|