paid 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.txt +6 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/paid.rb +32 -207
- data/lib/paid/account.rb +22 -10
- data/lib/paid/api_list.rb +56 -17
- data/lib/paid/api_method.rb +93 -0
- data/lib/paid/api_resource.rb +130 -8
- data/lib/paid/customer.rb +104 -40
- data/lib/paid/errors/api_connection_error.rb +1 -1
- data/lib/paid/errors/api_error.rb +25 -3
- data/lib/paid/errors/authentication_error.rb +1 -1
- data/lib/paid/errors/paid_error.rb +2 -9
- data/lib/paid/event.rb +28 -17
- data/lib/paid/event_data.rb +10 -0
- data/lib/paid/headers_builder.rb +75 -0
- data/lib/paid/invoice.rb +55 -16
- data/lib/paid/params_builder.rb +26 -0
- data/lib/paid/path_builder.rb +38 -0
- data/lib/paid/plan.rb +38 -13
- data/lib/paid/refund_list.rb +26 -0
- data/lib/paid/requester.rb +97 -0
- data/lib/paid/subscription.rb +47 -16
- data/lib/paid/transaction.rb +64 -16
- data/lib/paid/util.rb +14 -40
- data/paid.gemspec +1 -1
- data/test/paid/{api_class_test.rb → _api_resource_test.rb} +31 -17
- data/test/paid/account_test.rb +3 -3
- data/test/paid/api_list_test.rb +14 -8
- data/test/paid/api_method_test.rb +89 -0
- data/test/paid/customer_test.rb +20 -10
- data/test/paid/event_test.rb +3 -4
- data/test/paid/headers_builder_test.rb +39 -0
- data/test/paid/invoice_test.rb +3 -3
- data/test/paid/params_builder_test.rb +57 -0
- data/test/paid/path_builder_test.rb +67 -0
- data/test/paid/plan_test.rb +3 -3
- data/test/paid/requester_test.rb +86 -0
- data/test/paid/subscription_test.rb +3 -3
- data/test/paid/transaction_test.rb +4 -4
- data/test/paid/util_test.rb +36 -35
- data/test/test_data.rb +9 -2
- data/test/test_helper.rb +14 -14
- metadata +23 -19
- data/lib/paid/api_class.rb +0 -338
- data/lib/paid/api_singleton.rb +0 -5
- data/lib/paid/errors/invalid_request_error.rb +0 -10
- data/test/mock_resource.rb +0 -69
- data/test/paid/api_resource_test.rb +0 -28
- data/test/paid/api_singleton_test.rb +0 -12
- data/test/paid/authentication_test.rb +0 -50
- data/test/paid/status_codes_test.rb +0 -63
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Paid
|
4
|
+
class HeadersBuilderTest < ::Test::Unit::TestCase
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@headers = {
|
8
|
+
:dog => "dog-value"
|
9
|
+
}
|
10
|
+
@api_key = "test-api-key"
|
11
|
+
@built_headers = HeadersBuilder.build(@headers, @api_key)
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'set the content_type' do
|
15
|
+
assert(@built_headers.has_key?(:content_type))
|
16
|
+
assert_equal('application/x-www-form-urlencoded', @built_headers[:content_type])
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'set the user_agent' do
|
20
|
+
assert(@built_headers.has_key?(:user_agent))
|
21
|
+
assert(@built_headers[:user_agent].include?(Paid::VERSION))
|
22
|
+
assert(@built_headers[:user_agent].include?(Paid.api_version))
|
23
|
+
end
|
24
|
+
|
25
|
+
should 'set the basic auth header' do
|
26
|
+
assert(@built_headers.has_key?("Authorization"))
|
27
|
+
encoded_api_key = Base64.encode64("#{@api_key}:")
|
28
|
+
assert(@built_headers["Authorization"].include?(encoded_api_key))
|
29
|
+
end
|
30
|
+
|
31
|
+
should 'set the custom auth header' do
|
32
|
+
auth_key = "CLIENT-TOKEN"
|
33
|
+
header = HeadersBuilder.build(@headers, @api_key, auth_key)
|
34
|
+
assert(header.has_key?(auth_key))
|
35
|
+
assert_equal(@api_key, header[auth_key])
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
data/test/paid/invoice_test.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Paid
|
4
4
|
class InvoiceTest < Test::Unit::TestCase
|
5
5
|
setup do
|
6
|
-
@invoice_url = "#{Paid.api_base}/
|
6
|
+
@invoice_url = "#{Paid.api_base}/invoices"
|
7
7
|
end
|
8
8
|
|
9
9
|
context 'Invoice class' do
|
@@ -106,8 +106,8 @@ module Paid
|
|
106
106
|
end
|
107
107
|
|
108
108
|
should 'be registered' do
|
109
|
-
assert(
|
110
|
-
assert_equal(Paid::Invoice,
|
109
|
+
assert(APIResource.api_subclasses.include?(Paid::Invoice))
|
110
|
+
assert_equal(Paid::Invoice, APIResource.api_subclass_fetch("invoice"))
|
111
111
|
end
|
112
112
|
|
113
113
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Paid
|
4
|
+
class ParamsBuilderTest < ::Test::Unit::TestCase
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@params = {
|
8
|
+
:dog => "dog-value",
|
9
|
+
"string" => "str-value"
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
context '#clean' do
|
14
|
+
setup do
|
15
|
+
@built_params = ParamsBuilder.clean(@params)
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'convert keys to symbols' do
|
19
|
+
assert(@built_params.has_key?(:string))
|
20
|
+
assert_equal(@params["string"], @built_params[:string])
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'not have any string keys' do
|
24
|
+
@built_params.each do |k, v|
|
25
|
+
assert(k.is_a?(Symbol))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context '#merge' do
|
31
|
+
setup do
|
32
|
+
@to_merge = {
|
33
|
+
:string => "other-str-value",
|
34
|
+
"cat" => "cat-value"
|
35
|
+
}
|
36
|
+
@built_params = ParamsBuilder.merge(@params, @to_merge)
|
37
|
+
end
|
38
|
+
|
39
|
+
should 'convert keys to symbols' do
|
40
|
+
assert(@built_params.has_key?(:cat))
|
41
|
+
assert(@built_params.has_key?(:string))
|
42
|
+
assert(!@built_params.has_key?("string"))
|
43
|
+
end
|
44
|
+
|
45
|
+
should 'merge in all values' do
|
46
|
+
assert_equal(@params[:dog], @built_params[:dog])
|
47
|
+
assert_equal(@to_merge[:string], @built_params[:string])
|
48
|
+
assert_equal(@to_merge["cat"], @built_params[:cat])
|
49
|
+
end
|
50
|
+
|
51
|
+
should 'prioritize values in @to_merge' do
|
52
|
+
assert_equal(@to_merge[:string], @built_params[:string])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Paid
|
4
|
+
class PathBuilderTest < ::Test::Unit::TestCase
|
5
|
+
class FakeClass < APIResource
|
6
|
+
attr_reader :id
|
7
|
+
def initialize(id); @id = id; end
|
8
|
+
def abc; return "abc-value"; end
|
9
|
+
def self.xyz; return "xyz-value"; end
|
10
|
+
end
|
11
|
+
|
12
|
+
setup do
|
13
|
+
@params = {
|
14
|
+
:dog => "dog-value"
|
15
|
+
}
|
16
|
+
@obj = FakeClass.new("fake-id")
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'use instance methods' do
|
20
|
+
path = "/a/:abc/123"
|
21
|
+
expected = "/a/abc-value/123"
|
22
|
+
|
23
|
+
actual = PathBuilder.build(path, @obj, nil)
|
24
|
+
assert_equal(expected, actual)
|
25
|
+
end
|
26
|
+
|
27
|
+
should 'use instance attributes' do
|
28
|
+
path = "/a/:id/123"
|
29
|
+
expected = "/a/fake-id/123"
|
30
|
+
actual = PathBuilder.build(path, @obj, nil)
|
31
|
+
assert_equal(expected, actual)
|
32
|
+
end
|
33
|
+
|
34
|
+
should 'use class methods' do
|
35
|
+
path = "/a/:xyz/123"
|
36
|
+
expected = "/a/xyz-value/123"
|
37
|
+
|
38
|
+
actual = PathBuilder.build(path, FakeClass, nil)
|
39
|
+
assert_equal(expected, actual)
|
40
|
+
end
|
41
|
+
|
42
|
+
should 'not use class #id methods (1.8.7)' do
|
43
|
+
path = "/a/:id/123"
|
44
|
+
expected = "/a/param-id/123"
|
45
|
+
|
46
|
+
actual = PathBuilder.build(path, FakeClass, { :id => "param-id" })
|
47
|
+
assert_equal(expected, actual)
|
48
|
+
end
|
49
|
+
|
50
|
+
should 'use param values' do
|
51
|
+
path = "/a/:dog/123"
|
52
|
+
expected = "/a/dog-value/123"
|
53
|
+
|
54
|
+
actual = PathBuilder.build(path, nil, @params)
|
55
|
+
assert_equal(expected, actual)
|
56
|
+
end
|
57
|
+
|
58
|
+
should 'use both methods and params' do
|
59
|
+
path = "/a/:dog/:abc/123"
|
60
|
+
expected = "/a/dog-value/abc-value/123"
|
61
|
+
|
62
|
+
actual = PathBuilder.build(path, @obj, @params)
|
63
|
+
assert_equal(expected, actual)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
data/test/paid/plan_test.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Paid
|
4
4
|
class PlanTest < Test::Unit::TestCase
|
5
5
|
setup do
|
6
|
-
@plan_url = "#{Paid.api_base}/
|
6
|
+
@plan_url = "#{Paid.api_base}/plans"
|
7
7
|
end
|
8
8
|
|
9
9
|
context 'Plan class' do
|
@@ -84,8 +84,8 @@ module Paid
|
|
84
84
|
end
|
85
85
|
|
86
86
|
should 'be registered' do
|
87
|
-
assert(
|
88
|
-
assert_equal(Paid::Plan,
|
87
|
+
assert(APIResource.api_subclasses.include?(Paid::Plan))
|
88
|
+
assert_equal(Paid::Plan, APIResource.api_subclass_fetch("plan"))
|
89
89
|
end
|
90
90
|
|
91
91
|
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Paid
|
4
|
+
class RequesterTest < ::Test::Unit::TestCase
|
5
|
+
setup do
|
6
|
+
end
|
7
|
+
|
8
|
+
context '#prepare_params' do
|
9
|
+
setup do
|
10
|
+
@url = "test_url"
|
11
|
+
@params = { :a => 1, :b => [2, 3] }
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'convert :get params to a query string' do
|
15
|
+
url, params = Requester.prepare_params(@url, @params, :get)
|
16
|
+
assert(url != @url)
|
17
|
+
assert(params.nil?)
|
18
|
+
end
|
19
|
+
|
20
|
+
should 'convert :delete params to a query string' do
|
21
|
+
url, params = Requester.prepare_params(@url, @params, :delete)
|
22
|
+
assert(url != @url)
|
23
|
+
assert(params.nil?)
|
24
|
+
end
|
25
|
+
|
26
|
+
should 'convert :head params to a query string' do
|
27
|
+
url, params = Requester.prepare_params(@url, @params, :head)
|
28
|
+
assert(url != @url)
|
29
|
+
assert(params.nil?)
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'method = :post' do
|
33
|
+
setup do
|
34
|
+
@method = :post
|
35
|
+
end
|
36
|
+
|
37
|
+
should 'not convert params to a query string if a file is in them' do
|
38
|
+
expected = { :file => File.new(__FILE__) }
|
39
|
+
url, params = Requester.prepare_params(@url, expected, @method)
|
40
|
+
assert_equal(expected, params)
|
41
|
+
end
|
42
|
+
|
43
|
+
should 'convert params to a query string if a file is not present' do
|
44
|
+
url, params = Requester.prepare_params(@url, @params, @method)
|
45
|
+
assert(params.is_a?(String))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context '#query_string' do
|
51
|
+
should 'join #query_array results with an "&"' do
|
52
|
+
start = { :a => 1, :b => [2, 3] }
|
53
|
+
expected = ["a=1", "b[]=2", "b[]=3"]
|
54
|
+
|
55
|
+
actual = Requester.query_string(start).split('&')
|
56
|
+
actual.each do |str|
|
57
|
+
assert(expected.include?(str))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context '#query_array' do
|
63
|
+
should 'convert { :a => "value" } to []' do
|
64
|
+
start = { :a => "value" }
|
65
|
+
finish = ["a=value"]
|
66
|
+
|
67
|
+
assert_equal(finish, Requester.query_array(start))
|
68
|
+
end
|
69
|
+
|
70
|
+
should 'convert { :a => { :b => { :c => "cvalue" } } } to ["a[b][c]=cvalue"]' do
|
71
|
+
start = { :a => { :b => { :c => "cvalue" } } }
|
72
|
+
finish = ["a[b][c]=cvalue"]
|
73
|
+
|
74
|
+
assert_equal(finish, Requester.query_array(start))
|
75
|
+
end
|
76
|
+
|
77
|
+
should 'convert { :a => [1, 2] } to ["a[]=1", "a[]=2"]' do
|
78
|
+
start = { :a => [1, 2] }
|
79
|
+
finish = ["a[]=1", "a[]=2"]
|
80
|
+
|
81
|
+
assert_equal(finish, Requester.query_array(start))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -3,7 +3,7 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Paid
|
4
4
|
class SubscriptionTest < Test::Unit::TestCase
|
5
5
|
setup do
|
6
|
-
@subscription_url = "#{Paid.api_base}/
|
6
|
+
@subscription_url = "#{Paid.api_base}/subscriptions"
|
7
7
|
end
|
8
8
|
|
9
9
|
context 'Subscription class' do
|
@@ -103,8 +103,8 @@ module Paid
|
|
103
103
|
end
|
104
104
|
|
105
105
|
should 'be registered' do
|
106
|
-
assert(
|
107
|
-
assert_equal(Paid::Subscription,
|
106
|
+
assert(APIResource.api_subclasses.include?(Paid::Subscription))
|
107
|
+
assert_equal(Paid::Subscription, APIResource.api_subclass_fetch("subscription"))
|
108
108
|
end
|
109
109
|
|
110
110
|
end
|
@@ -3,7 +3,7 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Paid
|
4
4
|
class TransactionTest < Test::Unit::TestCase
|
5
5
|
setup do
|
6
|
-
@transaction_url = "#{Paid.api_base}/
|
6
|
+
@transaction_url = "#{Paid.api_base}/transactions"
|
7
7
|
end
|
8
8
|
|
9
9
|
context 'Transaction class' do
|
@@ -49,7 +49,7 @@ module Paid
|
|
49
49
|
transaction.description = "new description"
|
50
50
|
|
51
51
|
@mock.expects(:put).once.with do |url, headers, params|
|
52
|
-
params == transaction.
|
52
|
+
params == transaction.changed_api_attributes && url == "#{@transaction_url}/#{transaction.id}"
|
53
53
|
end.returns(test_response(test_transaction))
|
54
54
|
|
55
55
|
# This should update this instance with test_transaction since it was returned
|
@@ -115,8 +115,8 @@ module Paid
|
|
115
115
|
end
|
116
116
|
|
117
117
|
should 'be registered' do
|
118
|
-
assert(
|
119
|
-
assert_equal(Paid::Transaction,
|
118
|
+
assert(APIResource.api_subclasses.include?(Paid::Transaction))
|
119
|
+
assert_equal(Paid::Transaction, APIResource.api_subclass_fetch("transaction"))
|
120
120
|
end
|
121
121
|
|
122
122
|
|
data/test/paid/util_test.rb
CHANGED
@@ -1,50 +1,51 @@
|
|
1
1
|
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
3
|
module Paid
|
4
|
-
class UtilTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
class UtilTest < ::Test::Unit::TestCase
|
5
|
+
context '#symbolize_keys' do
|
6
|
+
should "convert keys to symbols" do
|
7
|
+
start = {
|
8
|
+
'foo' => 'bar',
|
9
|
+
'array' => [{ 'foo' => 'bar' }],
|
10
|
+
'nested' => {
|
11
|
+
1 => 2,
|
12
|
+
:symbol => 9,
|
13
|
+
'string' => nil
|
14
|
+
}
|
13
15
|
}
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
finish = {
|
17
|
+
:foo => 'bar',
|
18
|
+
:array => [{ :foo => 'bar' }],
|
19
|
+
:nested => {
|
20
|
+
1 => 2,
|
21
|
+
:symbol => 9,
|
22
|
+
:string => nil
|
23
|
+
}
|
22
24
|
}
|
23
|
-
}
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
symbolized = Util.symbolize_keys(start)
|
27
|
+
assert_equal(finish, symbolized)
|
28
|
+
end
|
27
29
|
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
31
|
+
context '#sorta_deep_clone' do
|
32
|
+
# Super hand wavy test.. but it works for now so whatever.
|
33
|
+
should 'clone well enough that we dont accidentally alter json' do
|
34
|
+
start = { :a => "abc", :b => [ { :c => "c-1" }, { :c => "c-2" } ] }
|
35
|
+
cloned = Util.sorta_deep_clone(start)
|
32
36
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
should 'query_array should convert { :a => { :b => { :c => "cvalue" } } } to ["a[b][c]=cvalue"]' do
|
37
|
-
start = { :a => { :b => { :c => "cvalue" } } }
|
38
|
-
finish = ["a[b][c]=cvalue"]
|
37
|
+
cloned[:a] = "123"
|
38
|
+
cloned[:b] << { :c => "c-3" }
|
39
|
+
cloned[:b][0][:c] = "c-one"
|
39
40
|
|
40
|
-
|
41
|
+
assert_equal({ :a => "abc", :b => [ { :c => "c-1" }, { :c => "c-2" } ] }, start)
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
assert_equal(finish, Paid::Util.query_array(start))
|
45
|
+
context '#constantize' do
|
46
|
+
should 'convert :APIResource to the class object' do
|
47
|
+
assert_equal(APIResource, Util.constantize(:APIResource))
|
48
|
+
end
|
48
49
|
end
|
49
50
|
end
|
50
51
|
end
|
data/test/test_data.rb
CHANGED
@@ -14,7 +14,6 @@ module Paid
|
|
14
14
|
|
15
15
|
def test_mock_resource
|
16
16
|
{
|
17
|
-
:id => 'test_mock_resource_id',
|
18
17
|
:object => 'mock_resource',
|
19
18
|
:name => 'test mr name',
|
20
19
|
:nested => {
|
@@ -22,8 +21,14 @@ module Paid
|
|
22
21
|
:object => 'nested_resource',
|
23
22
|
:price => 500
|
24
23
|
},
|
24
|
+
:nested_alt_id => 'nested_alt_id',
|
25
|
+
:nested_with => {
|
26
|
+
:id => 'nested_with_id',
|
27
|
+
:price => 500
|
28
|
+
},
|
25
29
|
:thash => { :some_key => "some value" },
|
26
|
-
:tarray => ["abc", "xyz"]
|
30
|
+
:tarray => ["abc", "xyz"],
|
31
|
+
:id => 'test_mock_resource_id'
|
27
32
|
}
|
28
33
|
end
|
29
34
|
|
@@ -34,6 +39,8 @@ module Paid
|
|
34
39
|
}
|
35
40
|
end
|
36
41
|
|
42
|
+
# Resources
|
43
|
+
|
37
44
|
def test_account
|
38
45
|
{
|
39
46
|
:id => 'account_id',
|