paid 0.0.8 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 614d4c58acc67641a1e7bfbda9eccd0236b4113b
4
- data.tar.gz: 794f70851a0c85480cb9ee45a622cf9f056fe04d
3
+ metadata.gz: c131f42824035c881ba3eaf3896d2a8e79aa9a26
4
+ data.tar.gz: c2b902c2b3d7e0fba75c67b71ec3cff06db9fc98
5
5
  SHA512:
6
- metadata.gz: 6d5b35e417e89252742f10d705c647b6184284f4677675a8ab27f3909d2822e4f92e82767c9d4ecf8c0972cdab3b649e47fdae1ba5c684b45373ad74d670d0b9
7
- data.tar.gz: 6e2d8fe2782449bdface40585cdacbb8f5ee678261a96300a48466feb9ab83089e1d06b62aba5ad6f93af426c6e2eef8e9002d0b60a6cad9f33e955860b65ac5
6
+ metadata.gz: 97115b5ea5004e528b213f9fc9800d5adfebe63d6ff7c0ed95f98f06a04d4acc0523067a285707521a6ce19ef365ec38768aed459cfa6da6e37afe61a72dd339
7
+ data.tar.gz: b1b15a66a2e5c093635e35d790bc9c801ad03143f595e1d86c512a26f7e88885a6adbeb69731fd1ca5ee5fa630c90f013549ec1d2b3e8398a1cf1f1bed29258c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- paid (0.0.8)
4
+ paid (0.1.0)
5
5
  json (~> 1.8.1)
6
6
  mime-types (>= 1.25, < 3.0)
7
7
  rest-client (~> 1.4)
data/lib/paid.rb CHANGED
@@ -28,6 +28,8 @@ require 'paid/invoice'
28
28
  require 'paid/transaction'
29
29
  require 'paid/event'
30
30
  require 'paid/alias'
31
+ require 'paid/plan'
32
+ require 'paid/subscription'
31
33
 
32
34
  # Errors
33
35
  require 'paid/errors/paid_error'
@@ -4,33 +4,33 @@ module Paid
4
4
  def save(opts={})
5
5
  values = serialize_params(self).merge(opts)
6
6
 
7
- if @values[:metadata]
8
- values[:metadata] = serialize_metadata
7
+ if @values[:properties]
8
+ values[:properties] = serialize_properties
9
9
  end
10
10
 
11
11
  if values.length > 0
12
12
  values.delete(:id)
13
13
 
14
- response, api_key = Paid.request(:put, api_url, @api_key, values)
14
+ response, api_key = Paid.request(:post, api_url, @api_key, values)
15
15
  refresh_from(response, api_key)
16
16
  end
17
17
  self
18
18
  end
19
19
 
20
- def serialize_metadata
21
- if @unsaved_values.include?(:metadata)
22
- # the metadata object has been reassigned
23
- # i.e. as object.metadata = {key => val}
24
- metadata_update = @values[:metadata] # new hash
25
- new_keys = metadata_update.keys.map(&:to_sym)
20
+ def serialize_properties
21
+ if @unsaved_values.include?(:properties)
22
+ # the properties object has been reassigned
23
+ # i.e. as object.properties = {key => val}
24
+ properties_update = @values[:properties] # new hash
25
+ new_keys = properties_update.keys.map(&:to_sym)
26
26
  # remove keys at the server, but not known locally
27
- keys_to_unset = @previous_metadata.keys - new_keys
28
- keys_to_unset.each {|key| metadata_update[key] = ''}
27
+ keys_to_unset = @previous_properties.keys - new_keys
28
+ keys_to_unset.each {|key| properties_update[key] = ''}
29
29
 
30
- metadata_update
30
+ properties_update
31
31
  else
32
- # metadata is a PaidObject, and can be serialized normally
33
- serialize_params(@values[:metadata])
32
+ # properties is a PaidObject, and can be serialized normally
33
+ serialize_params(@values[:properties])
34
34
  end
35
35
  end
36
36
 
@@ -45,7 +45,7 @@ module Paid
45
45
  def refresh_from(values, api_key, partial=false)
46
46
  @api_key = api_key
47
47
 
48
- @previous_metadata = values[:metadata]
48
+ @previous_properties = values[:properties]
49
49
  removed = partial ? Set.new : Set.new(@values.keys - values.keys)
50
50
  added = Set.new(values.keys - @values.keys)
51
51
 
data/lib/paid/plan.rb ADDED
@@ -0,0 +1,6 @@
1
+ module Paid
2
+ class Plan < APIResource
3
+ include Paid::APIOperations::List
4
+ include Paid::APIOperations::Create
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ module Paid
2
+ class Subscription < APIResource
3
+ include Paid::APIOperations::List
4
+ include Paid::APIOperations::Create
5
+
6
+ def cancel(params={}, opts={})
7
+ api_key, headers = Util.parse_opts(opts)
8
+ response, api_key = Paid.request(
9
+ :post, cancel_url, api_key || @api_key, params, headers)
10
+ refresh_from(response, api_key)
11
+ end
12
+
13
+ private
14
+
15
+ def cancel_url
16
+ api_url + '/cancel'
17
+ end
18
+ end
19
+ end
data/lib/paid/util.rb CHANGED
@@ -25,7 +25,9 @@ module Paid
25
25
  'customer' => Customer,
26
26
  'event' => Event,
27
27
  'invoice' => Invoice,
28
- 'alias' => Alias
28
+ 'alias' => Alias,
29
+ 'plan' => Plan,
30
+ 'subscription' => Subscription
29
31
  }
30
32
  end
31
33
 
data/lib/paid/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Paid
2
- VERSION = "0.0.8"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,29 +1,22 @@
1
1
  require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Paid
4
+ # AliasTest
4
5
  class AliasTest < Test::Unit::TestCase
5
- should "aliases should not be deletable" do
6
+ should 'aliases should not be deletable' do
6
7
  assert_raises NoMethodError do
7
- @mock.expects(:get).once.returns(test_response(test_customer))
8
- c = Paid::Alias.retrieve("test_alias")
8
+ # Expect twice because Paid::Alias.retrieve returns a customer object
9
+ @mock.expects(:get).twice.returns(test_response(test_customer))
10
+ c = Paid::Alias.retrieve('test_alias')
9
11
  c.delete
10
12
  end
11
13
  end
12
14
 
13
- should "execute should return a new, fully executed alias when passed correct parameters" do
14
- @mock.expects(:post).with do |url, api_key, params|
15
- url == "#{Paid.api_base}/v0/aliases" && api_key.nil? && CGI.parse(params) == {
16
- 'name' => ['test-alias'],
17
- 'customer' => ['c_test_customer']
18
- }
19
- end.once.returns(test_response(test_alias))
20
-
21
- a = Paid::Alias.create({
22
- :name => 'test-alias',
23
- :customer => 'c_test_customer'
24
- })
25
-
26
- assert a.name == 'test-alias'
15
+ should 'retrieve should retrieve alias' do
16
+ # Expect twice because Paid::Alias.retrieve returns a customer object
17
+ @mock.expects(:get).twice.returns(test_response(test_alias))
18
+ i = Paid::Alias.retrieve('in_test_alias')
19
+ assert_equal 'al_test_alias', i.id
27
20
  end
28
21
  end
29
22
  end
@@ -3,64 +3,62 @@ require File.expand_path('../../test_helper', __FILE__)
3
3
 
4
4
  module Paid
5
5
  class ApiResourceTest < Test::Unit::TestCase
6
- should "creating a new APIResource should not fetch over the network" do
6
+ should 'creating a new APIResource should not fetch over the network' do
7
7
  @mock.expects(:get).never
8
- Paid::Customer.new("someid")
8
+ Paid::Customer.new('someid')
9
9
  end
10
10
 
11
- should "creating a new APIResource from a hash should not fetch over the network" do
11
+ should 'creating a new APIResource from a hash should not fetch over the network' do
12
12
  @mock.expects(:get).never
13
- Paid::Customer.construct_from({
14
- :id => "somecustomer",
15
- :object => "customer",
16
- :email => 'someone@example.com',
17
- :name => 'Some Business',
18
- :account_id => 'acct_1234'
19
- })
13
+ Paid::Customer.construct_from(id: 'somecustomer',
14
+ object: 'customer',
15
+ email: 'someone@example.com',
16
+ name: 'Some Business',
17
+ account_id: 'acct_1234')
20
18
  end
21
19
 
22
- should "setting an attribute should not cause a network request" do
20
+ should 'setting an attribute should not cause a network request' do
23
21
  @mock.expects(:get).never
24
22
  @mock.expects(:post).never
25
- c = Paid::Customer.new("test_customer");
23
+ c = Paid::Customer.new('test_customer')
26
24
  c.name = 'Another Name'
27
25
  end
28
26
 
29
- should "accessing id should not issue a fetch" do
27
+ should 'accessing id should not issue a fetch' do
30
28
  @mock.expects(:get).never
31
- c = Paid::Customer.new("test_customer")
29
+ c = Paid::Customer.new('test_customer')
32
30
  c.id
33
31
  end
34
32
 
35
- should "not specifying api credentials should raise an exception" do
33
+ should 'not specifying api credentials should raise an exception' do
36
34
  Paid.api_key = nil
37
35
  assert_raises Paid::AuthenticationError do
38
- Paid::Customer.new("test_customer").refresh
36
+ Paid::Customer.new('test_customer').refresh
39
37
  end
40
38
  end
41
39
 
42
- should "specifying api credentials containing whitespace should raise an exception" do
43
- Paid.api_key = "key "
40
+ should 'specifying api credentials containing whitespace should raise an exception' do
41
+ Paid.api_key = 'key '
44
42
  assert_raises Paid::AuthenticationError do
45
- Paid::Customer.new("test_customer").refresh
43
+ Paid::Customer.new('test_customer').refresh
46
44
  end
47
45
  end
48
46
 
49
- should "specifying invalid api credentials should raise an exception" do
50
- Paid.api_key = "invalid"
47
+ should 'specifying invalid api credentials should raise an exception' do
48
+ Paid.api_key = 'invalid'
51
49
  response = test_response(test_invalid_api_key_error, 401)
52
50
  assert_raises Paid::AuthenticationError do
53
51
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 401))
54
- Paid::Customer.retrieve("failing_customer")
52
+ Paid::Customer.retrieve('failing_customer')
55
53
  end
56
54
  end
57
55
 
58
- should "AuthenticationErrors should have an http status, http body, and JSON body" do
59
- Paid.api_key = "invalid"
56
+ should 'AuthenticationErrors should have an http status, http body, and JSON body' do
57
+ Paid.api_key = 'invalid'
60
58
  response = test_response(test_invalid_api_key_error, 401)
61
59
  begin
62
60
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 401))
63
- Paid::Customer.retrieve("failing_customer")
61
+ Paid::Customer.retrieve('failing_customer')
64
62
  rescue Paid::AuthenticationError => e
65
63
  assert_equal(401, e.http_status)
66
64
  assert_equal(true, !!e.http_body)
@@ -69,75 +67,75 @@ module Paid
69
67
  end
70
68
  end
71
69
 
72
- should "send paid account as header when set" do
73
- paid_account = "acct_0000"
70
+ should 'send paid account as header when set' do
71
+ paid_account = 'acct_0000'
74
72
  Paid.expects(:execute_request).with do |opts|
75
73
  opts[:headers][:paid_account] == paid_account
76
74
  end.returns(test_response(test_transaction))
77
75
 
78
- Paid::Transaction.create({:amount => 100},
79
- {:paid_account => paid_account, :api_key => 'sk_test_local'})
76
+ Paid::Transaction.create({ amount: 100 },
77
+ paid_account: paid_account, api_key: 'sk_test_local')
80
78
  end
81
79
 
82
- should "not send paid account as header when not set" do
80
+ should 'not send paid account as header when not set' do
83
81
  Paid.expects(:execute_request).with do |opts|
84
82
  opts[:headers][:paid_account].nil?
85
83
  end.returns(test_response(test_transaction))
86
84
 
87
85
  Paid::Transaction.create(
88
86
  {
89
- :amount => 200,
90
- :description => 'This is a description.',
91
- :customer => 'somecustomer'
87
+ amount: 200,
88
+ description: 'This is a description.',
89
+ customer: 'somecustomer'
92
90
 
93
91
  },
94
92
  'sk_test_local'
95
93
  )
96
94
  end
97
95
 
98
- context "when specifying per-object credentials" do
99
- context "with no global API key set" do
100
- should "use the per-object credential when creating" do
96
+ context 'when specifying per-object credentials' do
97
+ context 'with no global API key set' do
98
+ should 'use the per-object credential when creating' do
101
99
  Paid.expects(:execute_request).with do |opts|
102
100
  opts[:headers][:authorization] == 'Bearer sk_test_local'
103
101
  end.returns(test_response(test_transaction))
104
102
 
105
103
  Paid::Transaction.create(
106
104
  {
107
- :amount => 200,
108
- :description => 'This is a description.',
109
- :customer => 'somecustomer'
105
+ amount: 200,
106
+ description: 'This is a description.',
107
+ customer: 'somecustomer'
110
108
  },
111
109
  'sk_test_local'
112
110
  )
113
111
  end
114
112
  end
115
113
 
116
- context "with a global API key set" do
114
+ context 'with a global API key set' do
117
115
  setup do
118
- Paid.api_key = "global"
116
+ Paid.api_key = 'global'
119
117
  end
120
118
 
121
119
  teardown do
122
120
  Paid.api_key = nil
123
121
  end
124
122
 
125
- should "use the per-object credential when creating" do
123
+ should 'use the per-object credential when creating' do
126
124
  Paid.expects(:execute_request).with do |opts|
127
125
  opts[:headers][:authorization] == 'Bearer local'
128
126
  end.returns(test_response(test_transaction))
129
127
 
130
128
  Paid::Transaction.create(
131
129
  {
132
- :amount => 200,
133
- :description => 'This is a description.',
134
- :customer => 'somecustomer'
130
+ amount: 200,
131
+ description: 'This is a description.',
132
+ customer: 'somecustomer'
135
133
  },
136
134
  'local'
137
135
  )
138
136
  end
139
137
 
140
- should "use the per-object credential when retrieving and making other calls" do
138
+ should 'use the per-object credential when retrieving and making other calls' do
141
139
  Paid.expects(:execute_request).with do |opts|
142
140
  opts[:url] == "#{Paid.api_base}/v0/transactions/tr_test_transaction" &&
143
141
  opts[:headers][:authorization] == 'Bearer local'
@@ -148,154 +146,154 @@ module Paid
148
146
  end
149
147
  end
150
148
 
151
- context "with valid credentials" do
152
- should "send along the idempotency-key header" do
149
+ context 'with valid credentials' do
150
+ should 'send along the idempotency-key header' do
153
151
  Paid.expects(:execute_request).with do |opts|
154
152
  opts[:headers][:idempotency_key] == 'bar'
155
153
  end.returns(test_response(test_transaction))
156
154
 
157
155
  Paid::Transaction.create(
158
156
  {
159
- :amount => 200,
160
- :description => 'This is a description.',
161
- :customer => 'somecustomer'
162
- },
163
- {
164
- :idempotency_key => 'bar',
165
- :api_key => 'local',
166
- }
157
+ amount: 200,
158
+ description: 'This is a description.',
159
+ customer: 'somecustomer'
160
+ },
161
+ idempotency_key: 'bar',
162
+ api_key: 'local'
167
163
  )
168
164
  end
169
165
 
170
- should "urlencode values in GET params" do
166
+ should 'urlencode values in GET params' do
171
167
  response = test_response(test_transaction_array)
172
168
  @mock.expects(:get).with("#{Paid.api_base}/v0/transactions?customer=test%20customer", nil, nil).returns(response)
173
- transactions = Paid::Transaction.all(:customer => 'test customer').data
174
- assert transactions.kind_of? Array
169
+ transactions = Paid::Transaction.all(customer: 'test customer').data
170
+ assert transactions.is_a? Array
175
171
  end
176
172
 
177
- should "a 400 should give an InvalidRequestError with http status, body, and JSON body" do
173
+ should 'a 400 should give an InvalidRequestError with http status, body, and JSON body' do
178
174
  response = test_response(test_missing_id_error, 400)
179
175
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
180
176
  begin
181
- Paid::Customer.retrieve("foo")
177
+ Paid::Customer.retrieve('foo')
182
178
  rescue Paid::InvalidRequestError => e
183
179
  assert_equal(400, e.http_status)
184
180
  assert_equal(true, !!e.http_body)
185
- assert_equal(true, e.json_body.kind_of?(Hash))
181
+ assert_equal(true, e.json_body.is_a?(Hash))
186
182
  end
187
183
  end
188
184
 
189
- should "a 401 should give an AuthenticationError with http status, body, and JSON body" do
185
+ should 'a 401 should give an AuthenticationError with http status, body, and JSON body' do
190
186
  response = test_response(test_missing_id_error, 401)
191
187
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
192
188
  begin
193
- Paid::Customer.retrieve("foo")
189
+ Paid::Customer.retrieve('foo')
194
190
  rescue Paid::AuthenticationError => e
195
191
  assert_equal(401, e.http_status)
196
192
  assert_equal(true, !!e.http_body)
197
- assert_equal(true, e.json_body.kind_of?(Hash))
193
+ assert_equal(true, e.json_body.is_a?(Hash))
198
194
  end
199
195
  end
200
196
 
201
- should "a 404 should give an InvalidRequestError with http status, body, and JSON body" do
197
+ should 'a 404 should give an InvalidRequestError with http status, body, and JSON body' do
202
198
  response = test_response(test_missing_id_error, 404)
203
199
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
204
200
  begin
205
- Paid::Customer.retrieve("foo")
201
+ Paid::Customer.retrieve('foo')
206
202
  rescue Paid::InvalidRequestError => e
207
203
  assert_equal(404, e.http_status)
208
204
  assert_equal(true, !!e.http_body)
209
- assert_equal(true, e.json_body.kind_of?(Hash))
205
+ assert_equal(true, e.json_body.is_a?(Hash))
210
206
  end
211
207
  end
212
208
 
213
- should "setting a nil value for a param should exclude that param from the request" do
214
- @mock.expects(:get).with do |url, api_key, params|
209
+ should 'setting a nil value for a param should exclude that param from the request' do
210
+ @mock.expects(:get).with do |url, _api_key, _params|
215
211
  uri = URI(url)
216
212
  query = CGI.parse(uri.query)
217
213
  (url =~ %r{^#{Paid.api_base}/v0/transactions?} &&
218
- query.keys.sort == ['offset', 'sad'])
219
- end.returns(test_response({ :count => 1, :data => [test_transaction] }))
220
- Paid::Transaction.all(:count => nil, :offset => 5, :sad => false)
214
+ query.keys.sort == %w(offset sad))
215
+ end.returns(test_response(count: 1, data: [test_transaction]))
216
+ Paid::Transaction.all(count: nil, offset: 5, sad: false)
221
217
 
222
218
  @mock.expects(:post).with do |url, api_key, params|
223
219
  url == "#{Paid.api_base}/v0/transactions" &&
224
220
  api_key.nil? &&
225
221
  CGI.parse(params) == { 'amount' => ['100'] }
226
- end.returns(test_response({ :count => 1, :data => [test_transaction] }))
227
- Paid::Transaction.create(:amount => 100)
222
+ end.returns(test_response(count: 1, data: [test_transaction]))
223
+ Paid::Transaction.create(amount: 100)
228
224
  end
229
225
 
230
- should "requesting with a unicode ID should result in a request" do
226
+ should 'requesting with a unicode ID should result in a request' do
231
227
  response = test_response(test_missing_id_error, 404)
232
228
  @mock.expects(:get).once.with("#{Paid.api_base}/v0/customers/%E2%98%83", nil, nil).raises(RestClient::ExceptionWithResponse.new(response, 404))
233
- c = Paid::Customer.new("")
229
+ c = Paid::Customer.new('')
234
230
  assert_raises(Paid::InvalidRequestError) { c.refresh }
235
231
  end
236
232
 
237
- should "requesting with no ID should result in an InvalidRequestError with no request" do
233
+ should 'requesting with no ID should result in an InvalidRequestError with no request' do
238
234
  c = Paid::Customer.new
239
235
  assert_raises(Paid::InvalidRequestError) { c.refresh }
240
236
  end
241
237
 
242
- should "making a GET request with parameters should have a query string and no body" do
243
- params = { :limit => 1 }
238
+ should 'making a GET request with parameters should have a query string and no body' do
239
+ params = { limit: 1 }
244
240
  @mock.expects(:get).once.with("#{Paid.api_base}/v0/transactions?limit=1", nil, nil).returns(test_response([test_transaction]))
245
241
  Paid::Transaction.all(params)
246
242
  end
247
243
 
248
- should "making a POST request with parameters should have a body and no query string" do
249
- params = { :amount => 100, :alias => 'test_alias' }
250
- @mock.expects(:post).once.with do |url, get, post|
251
- get.nil? && CGI.parse(post) == {'amount' => ['100'], 'alias' => ['test_alias']}
244
+ should 'making a POST request with parameters should have a body and no query string' do
245
+ params = { amount: 100, alias: 'test_alias' }
246
+ @mock.expects(:post).once.with do |_url, get, post|
247
+ get.nil? && CGI.parse(post) == { 'amount' => ['100'], 'alias' => ['test_alias'] }
252
248
  end.returns(test_response(test_transaction))
253
249
  Paid::Transaction.create(params)
254
250
  end
255
251
 
256
- should "loading an object should issue a GET request" do
252
+ should 'loading an object should issue a GET request' do
257
253
  @mock.expects(:get).once.returns(test_response(test_customer))
258
- c = Paid::Customer.new("test_customer")
254
+ c = Paid::Customer.new('test_customer')
259
255
  c.refresh
260
256
  end
261
257
 
262
- should "using array accessors should be the same as the method interface" do
258
+ should 'using array accessors should be the same as the method interface' do
263
259
  @mock.expects(:get).once.returns(test_response(test_customer))
264
- c = Paid::Customer.new("test_customer")
260
+ c = Paid::Customer.new('test_customer')
265
261
  c.refresh
266
262
  assert_equal c.created, c[:created]
267
263
  assert_equal c.created, c['created']
268
- c['created'] = 12345
269
- assert_equal c.created, 12345
264
+ c['created'] = 12_345
265
+ assert_equal c.created, 12_345
270
266
  end
271
267
 
272
- should "accessing a property other than id or parent on an unfetched object should fetch it" do
268
+ should 'accessing a property other than id or parent on an unfetched object should fetch it' do
273
269
  @mock.expects(:get).once.returns(test_response(test_customer))
274
- c = Paid::Customer.new("test_customer")
270
+ c = Paid::Customer.new('test_customer')
275
271
  c.transactions
276
272
  end
277
273
 
278
- should "updating an object should issue a POST request with only the changed properties" do
274
+ should 'updating an object should issue a POST request with only the changed properties' do
279
275
  @mock.expects(:post).with do |url, api_key, params|
280
- url == "#{Paid.api_base}/v0/customers/c_test_customer" && api_key.nil? && CGI.parse(params) == {'description' => ['another_mn']}
276
+ url == "#{Paid.api_base}/v0/customers/cus_test_customer" &&
277
+ api_key.nil? &&
278
+ CGI.parse(params) == { 'description' => ['another_mn'] }
281
279
  end.once.returns(test_response(test_customer))
282
280
  c = Paid::Customer.construct_from(test_customer)
283
- c.description = "another_mn"
281
+ c.description = 'another_mn'
284
282
  c.save
285
283
  end
286
284
 
287
- should "updating should merge in returned properties" do
285
+ should 'updating should merge in returned properties' do
288
286
  @mock.expects(:post).once.returns(test_response(test_customer))
289
- c = Paid::Customer.new("c_test_customer")
290
- c.description = "another_mn"
287
+ c = Paid::Customer.new('cus_test_customer')
288
+ c.description = 'another_mn'
291
289
  c.save
292
290
  # assert_equal false, c.livemode
293
291
  end
294
292
 
295
- should "deleting should send no props and result in an object that has no props other deleted" do
293
+ should 'deleting should send no props and result in an object that has no props other deleted' do
296
294
  @mock.expects(:get).never
297
295
  @mock.expects(:post).never
298
- @mock.expects(:delete).with("#{Paid.api_base}/v0/customers/c_test_customer", nil, nil).once.returns(test_response({ "id" => "test_customer", "deleted" => true }))
296
+ @mock.expects(:delete).with("#{Paid.api_base}/v0/customers/cus_test_customer", nil, nil).once.returns(test_response('id' => 'test_customer', 'deleted' => true))
299
297
 
300
298
  c = Paid::Customer.construct_from(test_customer)
301
299
  c.delete
@@ -306,51 +304,50 @@ module Paid
306
304
  end
307
305
  end
308
306
 
309
- should "loading an object with properties that have specific types should instantiate those classes" do
307
+ should 'loading an object with properties that have specific types should instantiate those classes' do
310
308
  @mock.expects(:get).once.returns(test_response(test_transaction))
311
- t = Paid::Transaction.retrieve("test_transaction")
312
- assert t.kind_of?(Paid::PaidObject) && t.object == 'transaction'
309
+ t = Paid::Transaction.retrieve('test_transaction')
310
+ assert t.is_a?(Paid::PaidObject) && t.object == 'transaction'
313
311
  end
314
312
 
315
- should "loading all of an APIResource should return an array of recursively instantiated objects" do
313
+ should 'loading all of an APIResource should return an array of recursively instantiated objects' do
316
314
  @mock.expects(:get).once.returns(test_response(test_transaction_array))
317
315
  t = Paid::Transaction.all.data
318
- assert t.kind_of? Array
319
- assert t[0].kind_of? Paid::Transaction
320
- assert t[0].kind_of?(Paid::PaidObject) && t[0].object == 'transaction'
316
+ assert t.is_a? Array
317
+ assert t[0].is_a? Paid::Transaction
318
+ assert t[0].is_a?(Paid::PaidObject) && t[0].object == 'transaction'
321
319
  end
322
320
 
323
- context "error checking" do
324
-
325
- should "404s should raise an InvalidRequestError" do
321
+ context 'error checking' do
322
+ should '404s should raise an InvalidRequestError' do
326
323
  response = test_response(test_missing_id_error, 404)
327
324
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 404))
328
325
 
329
326
  rescued = false
330
327
  begin
331
- Paid::Customer.new("test_customer").refresh
332
- assert false #shouldn't get here either
328
+ Paid::Customer.new('test_customer').refresh
329
+ assert false # shouldn't get here either
333
330
  rescue Paid::InvalidRequestError => e # we don't use assert_raises because we want to examine e
334
331
  rescued = true
335
- assert e.kind_of? Paid::InvalidRequestError
336
- assert_equal "id", e.param
337
- assert_equal "Missing id", e.message
332
+ assert e.is_a? Paid::InvalidRequestError
333
+ assert_equal 'id', e.param
334
+ assert_equal 'Missing id', e.message
338
335
  end
339
336
 
340
337
  assert_equal true, rescued
341
338
  end
342
339
 
343
- should "5XXs should raise an APIError" do
340
+ should '5XXs should raise an APIError' do
344
341
  response = test_response(test_api_error, 500)
345
342
  @mock.expects(:get).once.raises(RestClient::ExceptionWithResponse.new(response, 500))
346
343
 
347
344
  rescued = false
348
345
  begin
349
- Paid::Customer.new("test_customer").refresh
350
- assert false #shouldn't get here either
346
+ Paid::Customer.new('test_customer').refresh
347
+ assert false # shouldn't get here either
351
348
  rescue Paid::APIError => e # we don't use assert_raises because we want to examine e
352
349
  rescued = true
353
- assert e.kind_of? Paid::APIError
350
+ assert e.is_a? Paid::APIError
354
351
  end
355
352
 
356
353
  assert_equal true, rescued
@@ -29,7 +29,7 @@ module Paid
29
29
  should "create should return a new customer" do
30
30
  @mock.expects(:post).once.returns(test_response(test_customer))
31
31
  c = Paid::Customer.create
32
- assert_equal "c_test_customer", c.id
32
+ assert_equal "cus_test_customer", c.id
33
33
  end
34
34
 
35
35
  should "be able to generate invoice" do
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Paid
4
+ class PlanTest < Test::Unit::TestCase
5
+ should "retrieve should retrieve plans" do
6
+ @mock.expects(:get).once.returns(test_response(test_plan))
7
+ i = Paid::Plan.retrieve('in_test_plan')
8
+ assert_equal 'pl_test_plan', i.id
9
+ end
10
+
11
+ should "create should create a new plan" do
12
+ @mock.expects(:post).once.returns(test_response(test_plan))
13
+ i = Paid::Plan.create
14
+ assert_equal "pl_test_plan", i.id
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,103 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Paid
4
+ class PropertiesTest < Test::Unit::TestCase
5
+ setup do
6
+ @properties_supported = {
7
+ transaction: {
8
+ new: Paid::Transaction.method(:new),
9
+ test: method(:test_transaction),
10
+ url: "/v0/transactions/#{test_transaction[:id]}"
11
+ },
12
+ customer: {
13
+ new: Paid::Customer.method(:new),
14
+ test: method(:test_customer),
15
+ url: "/v0/customers/#{test_customer[:id]}"
16
+ }
17
+ }
18
+
19
+ @base_url = 'https://api.paidapi.com'
20
+ end
21
+
22
+ should 'not touch properties' do
23
+ update_actions = ->(obj) { obj.description = 'test' }
24
+ check_properties({ properties: { 'initial' => 'true' } },
25
+ 'description=test',
26
+ update_actions)
27
+ end
28
+
29
+ should 'update properties as a whole' do
30
+ update_actions = ->(obj) { obj.properties = { 'uuid' => '6735' } }
31
+ check_properties({ properties: {} },
32
+ 'properties[uuid]=6735',
33
+ update_actions)
34
+
35
+ if is_greater_than_ruby_1_9?
36
+ check_properties({ properties: { initial: 'true' } },
37
+ 'properties[uuid]=6735&properties[initial]=',
38
+ update_actions)
39
+ end
40
+ end
41
+
42
+ should 'update properties keys individually' do
43
+ update_actions = ->(obj) { obj.properties['txn_id'] = '134a13' }
44
+ check_properties({ properties: { 'initial' => 'true' } },
45
+ 'properties[txn_id]=134a13',
46
+ update_actions)
47
+ end
48
+
49
+ should 'clear properties as a whole' do
50
+ update_actions = ->(obj) { obj.properties = nil }
51
+ check_properties({ properties: { 'initial' => 'true' } },
52
+ 'properties=',
53
+ update_actions)
54
+ end
55
+
56
+ should 'clear properties keys individually' do
57
+ update_actions = ->(obj) { obj.properties['initial'] = nil }
58
+ check_properties({ properties: { 'initial' => 'true' } },
59
+ 'properties[initial]=',
60
+ update_actions)
61
+ end
62
+
63
+ should 'handle combinations of whole and partial properties updates' do
64
+ if is_greater_than_ruby_1_9?
65
+ update_actions = lambda do |obj|
66
+ obj.properties = { 'type' => 'summer' }
67
+ obj.properties['uuid'] = '6735'
68
+ end
69
+ params = { properties: { 'type' => 'summer', 'uuid' => '6735' } }
70
+ curl_args = Paid.uri_encode(params)
71
+ check_properties({ properties: { 'type' => 'christmas' } },
72
+ curl_args,
73
+ update_actions)
74
+ end
75
+ end
76
+
77
+ def check_properties(initial_params, curl_args, properties_update)
78
+ @properties_supported.each do |_name, methods|
79
+ neu = methods[:new]
80
+ test = methods[:test]
81
+ url = @base_url + methods[:url]
82
+
83
+ initial_test_obj = test.call(initial_params)
84
+ @mock.expects(:get).once.returns(test_response(initial_test_obj))
85
+
86
+ final_test_obj = test.call
87
+ @mock.expects(:post).once
88
+ .returns(test_response(final_test_obj))
89
+ .with(url, nil, curl_args)
90
+
91
+ obj = neu.call('test')
92
+ obj.refresh
93
+ properties_update.call(obj)
94
+ obj.save
95
+ end
96
+ end
97
+
98
+ def is_greater_than_ruby_1_9?
99
+ version = RUBY_VERSION.dup # clone preserves frozen state
100
+ Gem::Version.new(version) >= Gem::Version.new('1.9')
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ module Paid
4
+ # SubscriptionTest
5
+ class SubscriptionTest < Test::Unit::TestCase
6
+ should 'retrieve should retrieve subscriptions' do
7
+ @mock.expects(:get).once.returns(test_response(test_subscription))
8
+ i = Paid::Subscription.retrieve('in_test_subscription')
9
+ assert_equal 'sub_test_subscription', i.id
10
+ end
11
+
12
+ should 'create should create a new subscription' do
13
+ @mock.expects(:post).once.returns(test_response(test_subscription))
14
+ i = Paid::Subscription.create
15
+ assert_equal 'sub_test_subscription', i.id
16
+ end
17
+
18
+ should 'subscriptions should be cancellable' do
19
+ @mock.expects(:get).never
20
+ @mock.expects(:post).once.returns(
21
+ test_response(
22
+ id: 'sub_test_subscription',
23
+ cancelled_at: 123_456_789
24
+ )
25
+ )
26
+ s = Paid::Subscription.new('test_subscription')
27
+ s.cancel
28
+ assert !s.cancelled_at.nil?
29
+ end
30
+ end
31
+ end
@@ -2,54 +2,52 @@ require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Paid
4
4
  class TransactionTest < Test::Unit::TestCase
5
- should "transactions should be listable" do
5
+ should 'transactions should be listable' do
6
6
  @mock.expects(:get).once.returns(test_response(test_transaction_array))
7
7
  c = Paid::Transaction.all
8
- assert c.data.kind_of? Array
8
+ assert c.data.is_a? Array
9
9
  c.each do |transaction|
10
- assert transaction.kind_of?(Paid::Transaction)
10
+ assert transaction.is_a?(Paid::Transaction)
11
11
  end
12
12
  end
13
13
 
14
- should "transactions should not be deletable" do
14
+ should 'transactions should not be deletable' do
15
15
  assert_raises NoMethodError do
16
16
  @mock.expects(:get).once.returns(test_response(test_transaction))
17
- c = Paid::Transaction.retrieve("test_transaction")
17
+ c = Paid::Transaction.retrieve('test_transaction')
18
18
  c.delete
19
19
  end
20
20
  end
21
21
 
22
- should "transactions should be updateable" do
22
+ should 'transactions should be updateable' do
23
23
  @mock.expects(:get).once.returns(test_response(test_transaction))
24
24
  @mock.expects(:post).once.returns(test_response(test_transaction))
25
- c = Paid::Transaction.new("test_transaction")
25
+ c = Paid::Transaction.new('test_transaction')
26
26
  c.refresh
27
- c.mnemonic = "New transaction description"
27
+ c.mnemonic = 'New transaction description'
28
28
  c.save
29
29
  end
30
30
 
31
- should "execute should return a new, fully executed transaction when passed correct parameters" do
31
+ should 'execute should return a new, fully executed transaction when passed correct parameters' do
32
32
  @mock.expects(:post).with do |url, api_key, params|
33
33
  url == "#{Paid.api_base}/v0/transactions" && api_key.nil? && CGI.parse(params) == {
34
- 'amount' => ['100'],
35
- 'description' => ['a description'],
36
- 'customer' => ['c_test_customer']
34
+ 'amount' => ['100'],
35
+ 'description' => ['a description'],
36
+ 'customer' => ['cus_test_customer']
37
37
  }
38
38
  end.once.returns(test_response(test_transaction))
39
39
 
40
- c = Paid::Transaction.create({
41
- :amount => 100,
42
- :description => 'a description',
43
- :customer => 'c_test_customer'
44
- })
40
+ c = Paid::Transaction.create(amount: 100,
41
+ description: 'a description',
42
+ customer: 'cus_test_customer')
45
43
 
46
44
  assert !c.paid
47
45
  end
48
46
 
49
- should "transactions should be able to be marked as paid" do
47
+ should 'transactions should be able to be marked as paid' do
50
48
  @mock.expects(:get).never
51
- @mock.expects(:post).once.returns(test_response({:id => "tr_test_transaction", :paid => true}))
52
- t = Paid::Invoice.new("test_transaction")
49
+ @mock.expects(:post).once.returns(test_response(id: 'tr_test_transaction', paid: true))
50
+ t = Paid::Invoice.new('test_transaction')
53
51
  t.mark_as_paid
54
52
  assert t.paid
55
53
  end
data/test/test_data.rb CHANGED
@@ -17,7 +17,7 @@ module Paid
17
17
  :object => "alias",
18
18
  :id => id,
19
19
  :name => 'test-alias',
20
- :customer => 'c_test_customer'
20
+ :customer => 'cus_test_customer'
21
21
  }.merge(params)
22
22
  end
23
23
 
@@ -30,7 +30,7 @@ module Paid
30
30
  end
31
31
 
32
32
  def test_customer(params={})
33
- id = params[:id] || 'c_test_customer'
33
+ id = params[:id] || 'cus_test_customer'
34
34
  {
35
35
  :transactions => [],
36
36
  :object => "customer",
@@ -56,7 +56,7 @@ module Paid
56
56
  :object => "transaction",
57
57
  :description => 'a description',
58
58
  :created => 1304114826,
59
- :customer => 'c_test_customer'
59
+ :customer => 'cus_test_customer'
60
60
  }.merge(params)
61
61
  end
62
62
 
@@ -89,7 +89,7 @@ module Paid
89
89
  next_chase_on: nil,
90
90
  terms: 30,
91
91
  due_date: nil,
92
- customer: "c_test_customer",
92
+ customer: "cus_test_customer",
93
93
  issued_at: nil
94
94
  }
95
95
  end
@@ -120,5 +120,46 @@ module Paid
120
120
  }
121
121
  }
122
122
  end
123
+
124
+ def test_plan(params={})
125
+ {
126
+ :amount => 100,
127
+ :id => 'pl_test_plan',
128
+ :object => 'plan',
129
+ :name => 'test-name',
130
+ :description => 'a description',
131
+ :interval => 'month',
132
+ :interval_count => 3
133
+ }.merge(params)
134
+ end
135
+
136
+ def test_plans_array(params={})
137
+ {
138
+ :data => [test_plan, test_plan, test_plan],
139
+ :object => 'list',
140
+ :url => '/v0/plans'
141
+ }
142
+ end
143
+
144
+ def test_subscription(params={})
145
+ {
146
+ :amount => 100,
147
+ :id => 'sub_test_subscription',
148
+ :customer => 'cus_test_customer',
149
+ :cancelled_at => nil,
150
+ :ended_at => nil,
151
+ :started_at => 123_456_789,
152
+ :start_on => nil,
153
+ :plan => 'pl_test_plan'
154
+ }.merge(params)
155
+ end
156
+
157
+ def test_subscriptions_array(params={})
158
+ {
159
+ :data => [test_subscription, test_subscription, test_subscription],
160
+ :object => 'list',
161
+ :url => '/v0/subscriptions'
162
+ }
163
+ end
123
164
  end
124
165
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Jackson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-25 00:00:00.000000000 Z
11
+ date: 2015-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -148,7 +148,9 @@ files:
148
148
  - lib/paid/invoice.rb
149
149
  - lib/paid/list_object.rb
150
150
  - lib/paid/paid_object.rb
151
+ - lib/paid/plan.rb
151
152
  - lib/paid/singleton_api_resource.rb
153
+ - lib/paid/subscription.rb
152
154
  - lib/paid/transaction.rb
153
155
  - lib/paid/util.rb
154
156
  - lib/paid/version.rb
@@ -161,8 +163,10 @@ files:
161
163
  - test/paid/customer_test.rb
162
164
  - test/paid/invoice_test.rb
163
165
  - test/paid/list_object_test.rb
164
- - test/paid/metadata_test.rb
165
166
  - test/paid/paid_object_test.rb
167
+ - test/paid/plan_test.rb
168
+ - test/paid/properties_test.rb
169
+ - test/paid/subscription_test.rb
166
170
  - test/paid/transaction_test.rb
167
171
  - test/paid/util_test.rb
168
172
  - test/test_data.rb
@@ -199,8 +203,10 @@ test_files:
199
203
  - test/paid/customer_test.rb
200
204
  - test/paid/invoice_test.rb
201
205
  - test/paid/list_object_test.rb
202
- - test/paid/metadata_test.rb
203
206
  - test/paid/paid_object_test.rb
207
+ - test/paid/plan_test.rb
208
+ - test/paid/properties_test.rb
209
+ - test/paid/subscription_test.rb
204
210
  - test/paid/transaction_test.rb
205
211
  - test/paid/util_test.rb
206
212
  - test/test_data.rb
@@ -1,104 +0,0 @@
1
- require File.expand_path('../../test_helper', __FILE__)
2
-
3
- module Paid
4
- class MetadataTest < Test::Unit::TestCase
5
- setup do
6
- @metadata_supported = {
7
- :transaction => {
8
- :new => Paid::Transaction.method(:new),
9
- :test => method(:test_transaction),
10
- :url => "/v0/transactions/#{test_transaction()[:id]}"
11
- },
12
- :customer => {
13
- :new => Paid::Customer.method(:new),
14
- :test => method(:test_customer),
15
- :url => "/v0/customers/#{test_customer()[:id]}"
16
- }
17
- }
18
-
19
- @base_url = 'https://api.paidapi.com'
20
- end
21
-
22
- should "not touch metadata" do
23
- update_actions = lambda {|obj| obj.description = 'test'}
24
- check_metadata({:metadata => {'initial' => 'true'}},
25
- 'description=test',
26
- update_actions)
27
- end
28
-
29
-
30
- should "update metadata as a whole" do
31
- update_actions = lambda {|obj| obj.metadata = {'uuid' => '6735'}}
32
- check_metadata({:metadata => {}},
33
- 'metadata[uuid]=6735',
34
- update_actions)
35
-
36
- if is_greater_than_ruby_1_9?
37
- check_metadata({:metadata => {:initial => 'true'}},
38
- 'metadata[uuid]=6735&metadata[initial]=',
39
- update_actions)
40
- end
41
- end
42
-
43
- should "update metadata keys individually" do
44
- update_actions = lambda {|obj| obj.metadata['txn_id'] = '134a13'}
45
- check_metadata({:metadata => {'initial' => 'true'}},
46
- 'metadata[txn_id]=134a13',
47
- update_actions)
48
- end
49
-
50
- should "clear metadata as a whole" do
51
- update_actions = lambda {|obj| obj.metadata = nil}
52
- check_metadata({:metadata => {'initial' => 'true'}},
53
- 'metadata=',
54
- update_actions)
55
- end
56
-
57
- should "clear metadata keys individually" do
58
- update_actions = lambda {|obj| obj.metadata['initial'] = nil}
59
- check_metadata({:metadata => {'initial' => 'true'}},
60
- 'metadata[initial]=',
61
- update_actions)
62
- end
63
-
64
- should "handle combinations of whole and partial metadata updates" do
65
- if is_greater_than_ruby_1_9?
66
- update_actions = lambda do |obj|
67
- obj.metadata = {'type' => 'summer'}
68
- obj.metadata['uuid'] = '6735'
69
- end
70
- params = {:metadata => {'type' => 'summer', 'uuid' => '6735'}}
71
- curl_args = Paid.uri_encode(params)
72
- check_metadata({:metadata => {'type' => 'christmas'}},
73
- curl_args,
74
- update_actions)
75
- end
76
- end
77
-
78
- def check_metadata (initial_params, curl_args, metadata_update)
79
- @metadata_supported.each do |name, methods|
80
- neu = methods[:new]
81
- test = methods[:test]
82
- url = @base_url + methods[:url]
83
-
84
- initial_test_obj = test.call(initial_params)
85
- @mock.expects(:get).once.returns(test_response(initial_test_obj))
86
-
87
- final_test_obj = test.call()
88
- @mock.expects(:post).once.
89
- returns(test_response(final_test_obj)).
90
- with(url, nil, curl_args)
91
-
92
- obj = neu.call("test")
93
- obj.refresh()
94
- metadata_update.call(obj)
95
- obj.save
96
- end
97
- end
98
-
99
- def is_greater_than_ruby_1_9?
100
- version = RUBY_VERSION.dup # clone preserves frozen state
101
- Gem::Version.new(version) >= Gem::Version.new('1.9')
102
- end
103
- end
104
- end