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
data/lib/paid/util.rb
CHANGED
@@ -1,46 +1,6 @@
|
|
1
1
|
module Paid
|
2
2
|
module Util
|
3
3
|
|
4
|
-
def self.query_string(params)
|
5
|
-
if params && params.any?
|
6
|
-
return query_array(params).join('&')
|
7
|
-
else
|
8
|
-
return ""
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
# Three major use cases (and nesting of them needs to be supported):
|
13
|
-
# { :a => { :b => "bvalue" } } => ["a[b]=bvalue"]
|
14
|
-
# { :a => [1, 2] } => ["a[]=1", "a[]=2"]
|
15
|
-
# { :a => "value" } => ["a=value"]
|
16
|
-
def self.query_array(params, key_prefix=nil)
|
17
|
-
ret = []
|
18
|
-
params.each do |key, value|
|
19
|
-
if params.is_a?(Array)
|
20
|
-
value = key
|
21
|
-
key = ''
|
22
|
-
end
|
23
|
-
key_suffix = escape(key)
|
24
|
-
full_key = key_prefix ? "#{key_prefix}[#{key_suffix}]" : key_suffix
|
25
|
-
|
26
|
-
if value.is_a?(Hash) || value.is_a?(Array)
|
27
|
-
# Handles the following cases:
|
28
|
-
# { :a => { :b => "bvalue" } } => ["a[b]=bvalue"]
|
29
|
-
# { :a => [1, 2] } => ["a[]=1", "a[]=2"]
|
30
|
-
ret += query_array(value, full_key)
|
31
|
-
else
|
32
|
-
# Handles the base case with just key and value:
|
33
|
-
# { :a => "value" } => ["a=value"]
|
34
|
-
ret << "#{full_key}=#{escape(value)}"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
ret
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.escape(val)
|
41
|
-
URI.escape(val.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
42
|
-
end
|
43
|
-
|
44
4
|
def self.symbolize_keys(obj)
|
45
5
|
if obj.is_a?(Hash)
|
46
6
|
ret = {}
|
@@ -73,5 +33,19 @@ module Paid
|
|
73
33
|
end
|
74
34
|
end
|
75
35
|
|
36
|
+
def self.constantize(str, prefix=false)
|
37
|
+
str = str.to_s
|
38
|
+
begin
|
39
|
+
str.split('::').reduce(Module, :const_get)
|
40
|
+
rescue NameError => e
|
41
|
+
if prefix
|
42
|
+
raise e
|
43
|
+
else
|
44
|
+
p = "#{self.name}".split("::").first
|
45
|
+
constantize("#{p}::#{str}", true)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
76
50
|
end
|
77
51
|
end
|
data/paid.gemspec
CHANGED
@@ -8,7 +8,7 @@ spec = Gem::Specification.new do |s|
|
|
8
8
|
s.description = 'Paid is the programmatic way to manage payments. See https://paidapi.com for details.'
|
9
9
|
s.homepage = 'http://docs.paidapi.com'
|
10
10
|
s.authors = ['Jon Calhoun', 'Ryan Jackson']
|
11
|
-
s.email = ['
|
11
|
+
s.email = ['jon@apibits.com', 'ryan@paidapi.com']
|
12
12
|
s.version = Paid::VERSION
|
13
13
|
s.license = 'MIT'
|
14
14
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require File.expand_path('../../test_helper', __FILE__)
|
3
3
|
|
4
4
|
module Paid
|
5
|
-
class
|
5
|
+
class APIResourceTest < ::Test::Unit::TestCase
|
6
6
|
|
7
7
|
context 'Non-network actions' do
|
8
8
|
setup do
|
@@ -12,11 +12,11 @@ module Paid
|
|
12
12
|
@mock.expects(:delete).never
|
13
13
|
end
|
14
14
|
|
15
|
-
should 'not fetch over the network when creating a new
|
15
|
+
should 'not fetch over the network when creating a new APIResource' do
|
16
16
|
MockResource.new('fake_id')
|
17
17
|
end
|
18
18
|
|
19
|
-
should 'not fetch over the network when creating a new
|
19
|
+
should 'not fetch over the network when creating a new APIResource from a hash' do
|
20
20
|
MockResource.construct(test_mock_resource)
|
21
21
|
end
|
22
22
|
|
@@ -84,7 +84,7 @@ module Paid
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
context '
|
87
|
+
context 'APIResource :default_params' do
|
88
88
|
context 'api_instance_method' do
|
89
89
|
setup do
|
90
90
|
@response = test_response(test_mock_resource_list)
|
@@ -199,7 +199,7 @@ module Paid
|
|
199
199
|
end
|
200
200
|
|
201
201
|
|
202
|
-
context '
|
202
|
+
context 'APIResource#attribute' do
|
203
203
|
should 'create a getter method' do
|
204
204
|
assert(MockResource.method_defined?(:name))
|
205
205
|
end
|
@@ -210,52 +210,66 @@ module Paid
|
|
210
210
|
|
211
211
|
should 'have no changed attributes after init' do
|
212
212
|
mr = MockResource.new(test_mock_resource)
|
213
|
-
assert(mr.
|
213
|
+
assert(mr.changed_api_attributes.empty?)
|
214
214
|
end
|
215
215
|
|
216
216
|
should 'keep track of changed attributes' do
|
217
217
|
mr = MockResource.new(test_mock_resource)
|
218
|
-
assert(mr.
|
218
|
+
assert(mr.changed_api_attributes.empty?)
|
219
219
|
mr.name = "new name"
|
220
|
-
assert_equal({:name => "new name"}, mr.
|
220
|
+
assert_equal({:name => "new name"}, mr.changed_api_attributes)
|
221
221
|
end
|
222
222
|
|
223
223
|
should 'keep track of changed arrays' do
|
224
224
|
mr = MockResource.new(test_mock_resource)
|
225
|
-
assert(mr.
|
225
|
+
assert(mr.changed_api_attributes.empty?)
|
226
226
|
mr.tarray << "new"
|
227
|
-
assert_equal({:tarray => test_mock_resource[:tarray] + ["new"]}, mr.
|
227
|
+
assert_equal({:tarray => test_mock_resource[:tarray] + ["new"]}, mr.changed_api_attributes)
|
228
228
|
end
|
229
229
|
|
230
230
|
should 'keep track of changed hashes' do
|
231
231
|
mr = MockResource.new(test_mock_resource)
|
232
|
-
assert(mr.
|
232
|
+
assert(mr.changed_api_attributes.empty?)
|
233
233
|
mr.thash[:some_key] = "new value"
|
234
|
-
assert_equal({:thash => { :some_key => "new value" }}, mr.
|
234
|
+
assert_equal({:thash => { :some_key => "new value" }}, mr.changed_api_attributes)
|
235
235
|
end
|
236
236
|
|
237
237
|
context 'constructors' do
|
238
238
|
should 'instantiate on #new' do
|
239
239
|
mr = MockResource.new(test_mock_resource)
|
240
240
|
assert(mr.nested.is_a?(NestedResource))
|
241
|
+
assert(mr.nested_alt.is_a?(NestedResource))
|
242
|
+
assert(mr.nested_with.is_a?(NestedWithParent))
|
243
|
+
assert_equal(mr.path + "/nested_path", mr.nested_with.path)
|
241
244
|
end
|
242
245
|
|
243
246
|
should 'instantiate on #construct' do
|
244
247
|
mr = MockResource.construct(test_mock_resource)
|
245
248
|
assert(mr.nested.is_a?(NestedResource))
|
249
|
+
assert(mr.nested_alt.is_a?(NestedResource))
|
250
|
+
assert(mr.nested_with.is_a?(NestedWithParent))
|
251
|
+
assert_equal(mr.path + "/nested_path", mr.nested_with.path)
|
246
252
|
end
|
247
253
|
|
248
254
|
should 'instantiate on #refresh_from' do
|
249
255
|
mr = MockResource.new('fake_id')
|
250
256
|
assert(mr.nested.nil?)
|
251
|
-
|
252
257
|
mr.refresh_from(test_mock_resource)
|
253
258
|
assert(mr.nested.is_a?(NestedResource))
|
259
|
+
assert(mr.nested_alt.is_a?(NestedResource))
|
260
|
+
assert(mr.nested_with.is_a?(NestedWithParent))
|
261
|
+
assert_equal(mr.path + "/nested_path", mr.nested_with.path)
|
262
|
+
end
|
263
|
+
|
264
|
+
should 'with default values' do
|
265
|
+
mr = MockResource.new('fake_id')
|
266
|
+
assert(mr.nested_with.is_a?(NestedWithParent))
|
267
|
+
assert_equal(mr.path + "/nested_path", mr.nested_with.path)
|
254
268
|
end
|
255
269
|
end
|
256
270
|
end
|
257
271
|
|
258
|
-
context '
|
272
|
+
context 'APIResource :constructor' do
|
259
273
|
context 'for api_class_method' do
|
260
274
|
setup do
|
261
275
|
@mock.expects(:get).once.returns(test_response(test_mock_resource))
|
@@ -313,7 +327,7 @@ module Paid
|
|
313
327
|
end
|
314
328
|
end
|
315
329
|
|
316
|
-
context '
|
330
|
+
context 'APIResource api_*_method arguments' do
|
317
331
|
should 'throw an ArgumentError if too few arguments are provided' do
|
318
332
|
assert_raises(ArgumentError) { MockResource.retrieve }
|
319
333
|
end
|
@@ -364,7 +378,7 @@ module Paid
|
|
364
378
|
end
|
365
379
|
end
|
366
380
|
|
367
|
-
context '
|
381
|
+
context 'APIResource api_instance_method paths' do
|
368
382
|
should 'use the provided argument if it is present' do
|
369
383
|
response = test_response(test_mock_resource)
|
370
384
|
@mock.expects(:get).with("#{Paid.api_base}/custom_path", anything, anything).returns(response)
|
@@ -392,7 +406,7 @@ module Paid
|
|
392
406
|
end
|
393
407
|
end
|
394
408
|
|
395
|
-
context '
|
409
|
+
context 'APIResource api_class_method paths' do
|
396
410
|
should 'use the provided argument if it is present' do
|
397
411
|
response = test_response(test_mock_resource)
|
398
412
|
@mock.expects(:get).with("#{Paid.api_base}#{MockResource.path}/fake_id", anything, anything).returns(response)
|
data/test/paid/account_test.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Paid
|
4
4
|
class AccountTest < Test::Unit::TestCase
|
5
5
|
setup do
|
6
|
-
@account_url = "#{Paid.api_base}/
|
6
|
+
@account_url = "#{Paid.api_base}/account"
|
7
7
|
end
|
8
8
|
|
9
9
|
should 'be retrievable' do
|
@@ -41,8 +41,8 @@ module Paid
|
|
41
41
|
end
|
42
42
|
|
43
43
|
should 'be registered' do
|
44
|
-
assert(
|
45
|
-
assert_equal(Paid::Account,
|
44
|
+
assert(APIResource.api_subclasses.include?(Paid::Account))
|
45
|
+
assert_equal(Paid::Account, APIResource.api_subclass_fetch("account"))
|
46
46
|
end
|
47
47
|
|
48
48
|
end
|
data/test/paid/api_list_test.rb
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
3
|
module Paid
|
4
|
-
class
|
4
|
+
class APIListTest < ::Test::Unit::TestCase
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
context '#new / #initialize' do
|
7
|
+
setup do
|
8
|
+
@fake_resource = {:data => "fake-data"}
|
9
|
+
@list = APIList.new(APIResource, [@fake_resource])
|
10
|
+
end
|
11
|
+
|
12
|
+
should 'set the klass' do
|
13
|
+
assert_equal(APIResource, @list.klass)
|
14
|
+
end
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
16
|
+
should 'convert the data to klass instances' do
|
17
|
+
assert(@list.first.is_a?(APIResource))
|
18
|
+
assert_equal(@fake_resource, @list.first.json)
|
19
|
+
end
|
14
20
|
end
|
15
21
|
|
16
22
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
module Paid
|
4
|
+
class APIMethodTest < ::Test::Unit::TestCase
|
5
|
+
setup do
|
6
|
+
@method = :get
|
7
|
+
@path = "/testing"
|
8
|
+
@params = { :param_a => "1" }
|
9
|
+
@headers = { :header_a => "a" }
|
10
|
+
@object = mock
|
11
|
+
@api_method = APIMethod.new(@method, @path, @params, @headers, @object)
|
12
|
+
end
|
13
|
+
|
14
|
+
context '#new / #initialize' do
|
15
|
+
should 'set the api_key' do
|
16
|
+
assert_equal(Paid.api_key, @api_method.api_key)
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'set the api_base' do
|
20
|
+
assert_equal(Paid.api_base, @api_method.api_base)
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'use PathBuilder with path, object, and params' do
|
24
|
+
PathBuilder.expects(:build).with(@path, @object, @params).returns(@path)
|
25
|
+
APIMethod.new(@method, @path, @params, @headers, @object)
|
26
|
+
end
|
27
|
+
|
28
|
+
should 'use ParamsBuilder with params' do
|
29
|
+
ParamsBuilder.expects(:build).with(@params).returns(@params)
|
30
|
+
APIMethod.new(@method, @path, @params, @headers, @object)
|
31
|
+
end
|
32
|
+
|
33
|
+
should 'use HeadersBuilder with headers, api_key, and nil auth_header' do
|
34
|
+
HeadersBuilder.expects(:build).with(@headers, Paid.api_key, nil).returns(@headers)
|
35
|
+
APIMethod.new(@method, @path, @params, @headers, @object)
|
36
|
+
end
|
37
|
+
|
38
|
+
should 'verify the api key exists' do
|
39
|
+
Paid.api_key = nil
|
40
|
+
assert_raises(AuthenticationError) do
|
41
|
+
APIMethod.new(@method, @path, @params, @headers, @object)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context '#execute' do
|
47
|
+
setup do
|
48
|
+
@mock_response = mock
|
49
|
+
@mock_response.stubs(:body).returns('{"status": "success"}')
|
50
|
+
@mock_response.stubs(:code).returns(200)
|
51
|
+
end
|
52
|
+
|
53
|
+
should 'call Requester.request with the set attrs' do
|
54
|
+
Requester.expects(:request).with(@method, @api_method.url, @api_method.params, @api_method.headers).returns(@mock_response)
|
55
|
+
@api_method.execute
|
56
|
+
end
|
57
|
+
|
58
|
+
should 'create an APIError if the request fails' do
|
59
|
+
Requester.expects(:request).raises(RestClient::RequestTimeout.new)
|
60
|
+
|
61
|
+
assert_raises(APIError) { @api_method.execute }
|
62
|
+
end
|
63
|
+
|
64
|
+
should 'return the response parsed as json' do
|
65
|
+
Requester.expects(:request).returns(@mock_response)
|
66
|
+
assert_equal({:status => "success"}, @api_method.execute)
|
67
|
+
end
|
68
|
+
|
69
|
+
should 'return an AuthenticationError if the status is 401' do
|
70
|
+
error = RestClient::ExceptionWithResponse.new
|
71
|
+
error.expects(:http_code).returns(401)
|
72
|
+
|
73
|
+
Requester.expects(:request).raises(error)
|
74
|
+
assert_raises(AuthenticationError) { @api_method.execute }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context '#response_json' do
|
79
|
+
setup do
|
80
|
+
@api_method.response_body = 'not-valid-json'
|
81
|
+
end
|
82
|
+
|
83
|
+
should 'throw an error if the response_body isnt valid json' do
|
84
|
+
assert_raises(APIError) { @api_method.response_json }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
data/test/paid/customer_test.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Paid
|
4
4
|
class CustomerTest < Test::Unit::TestCase
|
5
5
|
setup do
|
6
|
-
@customer_url = "#{Paid.api_base}/
|
6
|
+
@customer_url = "#{Paid.api_base}/customers"
|
7
7
|
end
|
8
8
|
|
9
9
|
context 'Customer class' do
|
@@ -16,7 +16,10 @@ module Paid
|
|
16
16
|
|
17
17
|
should 'be retrieveable by external_id' do
|
18
18
|
external_id = "external_id_for_cust"
|
19
|
-
@mock.expects(:get).once.with
|
19
|
+
@mock.expects(:get).once.with do |url, headers, params|
|
20
|
+
Regexp.new("/customers/by_external_id").match(url) &&
|
21
|
+
params[:external_id] == external_id
|
22
|
+
end.returns(test_response(test_customer))
|
20
23
|
customer = Paid::Customer.by_external_id(external_id)
|
21
24
|
assert(customer.is_a?(Paid::Customer))
|
22
25
|
end
|
@@ -54,7 +57,7 @@ module Paid
|
|
54
57
|
customer.email = "new_email@domain.com"
|
55
58
|
|
56
59
|
@mock.expects(:put).once.with do |url, headers, params|
|
57
|
-
params
|
60
|
+
!params.nil? && url == "#{@customer_url}/#{customer.id}"
|
58
61
|
end.returns(test_response(test_customer))
|
59
62
|
|
60
63
|
# This should update this instance with test_customer since it was returned
|
@@ -65,7 +68,9 @@ module Paid
|
|
65
68
|
|
66
69
|
should 'be able to generate an invoice' do
|
67
70
|
customer = Paid::Customer.new(test_customer)
|
68
|
-
@mock.expects(:post).once.with
|
71
|
+
@mock.expects(:post).once.with do |url, headers, params|
|
72
|
+
Regexp.new("/customers/#{customer.id}/generate_invoice").match(url)
|
73
|
+
end.returns(test_response(test_invoice))
|
69
74
|
|
70
75
|
invoice = customer.generate_invoice
|
71
76
|
assert(invoice.is_a?(Paid::Invoice))
|
@@ -73,7 +78,10 @@ module Paid
|
|
73
78
|
|
74
79
|
should 'be able to list invoices' do
|
75
80
|
customer = Paid::Customer.new(test_customer)
|
76
|
-
@mock.expects(:get).once.with
|
81
|
+
@mock.expects(:get).once.with do |url, headers, params|
|
82
|
+
Regexp.new("/invoices").match(url) &&
|
83
|
+
params[:customer] == customer.id
|
84
|
+
end.returns(test_response(test_invoice_list))
|
77
85
|
|
78
86
|
invoices = customer.invoices
|
79
87
|
assert(invoices.is_a?(Paid::APIList))
|
@@ -84,7 +92,10 @@ module Paid
|
|
84
92
|
|
85
93
|
should 'be able to list transactions' do
|
86
94
|
customer = Paid::Customer.new(test_customer)
|
87
|
-
@mock.expects(:get).once.with
|
95
|
+
@mock.expects(:get).once.with do |url, headers, params|
|
96
|
+
Regexp.new("/transactions").match(url) &&
|
97
|
+
params[:customer] == customer.id
|
98
|
+
end.returns(test_response(test_transaction_list))
|
88
99
|
|
89
100
|
transactions = customer.transactions
|
90
101
|
assert(transactions.is_a?(Paid::APIList))
|
@@ -97,8 +108,7 @@ module Paid
|
|
97
108
|
|
98
109
|
context 'Retrieved Paid::Customer instance' do
|
99
110
|
setup do
|
100
|
-
@
|
101
|
-
@customer = Paid::Customer.retrieve('customer_id')
|
111
|
+
@customer = Paid::Customer.new(test_customer)
|
102
112
|
end
|
103
113
|
|
104
114
|
should 'have the id attribute' do
|
@@ -184,8 +194,8 @@ module Paid
|
|
184
194
|
end
|
185
195
|
|
186
196
|
should 'be registered' do
|
187
|
-
assert(
|
188
|
-
assert_equal(Paid::Customer,
|
197
|
+
assert(APIResource.api_subclasses.include?(Paid::Customer))
|
198
|
+
assert_equal(Paid::Customer, APIResource.api_subclass_fetch("customer"))
|
189
199
|
end
|
190
200
|
|
191
201
|
end
|
data/test/paid/event_test.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../../test_helper', __FILE__)
|
|
3
3
|
module Paid
|
4
4
|
class EventTest < Test::Unit::TestCase
|
5
5
|
setup do
|
6
|
-
@event_url = "#{Paid.api_base}/
|
6
|
+
@event_url = "#{Paid.api_base}/events"
|
7
7
|
end
|
8
8
|
|
9
9
|
context 'Event class' do
|
@@ -58,7 +58,6 @@ module Paid
|
|
58
58
|
end
|
59
59
|
|
60
60
|
should 'have & convert the data attribute' do
|
61
|
-
assert(@event.data.is_a?(Paid::APIClass))
|
62
61
|
event2 = Paid::Event.new(test_event(test_invoice))
|
63
62
|
assert(event2.data.is_a?(Paid::Invoice))
|
64
63
|
end
|
@@ -66,8 +65,8 @@ module Paid
|
|
66
65
|
end
|
67
66
|
|
68
67
|
should 'be registered' do
|
69
|
-
assert(
|
70
|
-
assert_equal(Paid::Event,
|
68
|
+
assert(APIResource.api_subclasses.include?(Paid::Event))
|
69
|
+
assert_equal(Paid::Event, APIResource.api_subclass_fetch("event"))
|
71
70
|
end
|
72
71
|
|
73
72
|
end
|