shushu 0.1.16 → 1.0.0rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/helpers/http_helpers.rb +0 -6
- data/lib/models/{b_event.rb → billable_event.rb} +4 -9
- data/lib/models/rate_code.rb +20 -0
- data/lib/models/report.rb +28 -46
- data/lib/models/{res_own.rb → resource_ownership.rb} +0 -0
- data/lib/shushu.rb +17 -43
- data/lib/totalable.rb +7 -0
- data/readme.md +10 -184
- data/test/models/billable_event_test.rb +41 -0
- data/test/models/{r_code_test.rb → rate_code_test.rb} +10 -7
- data/test/reports_test.rb +19 -0
- metadata +15 -41
- data/lib/models/account.rb +0 -13
- data/lib/models/acct_own.rb +0 -25
- data/lib/models/billable_unit.rb +0 -35
- data/lib/models/line_item.rb +0 -19
- data/lib/models/p_method.rb +0 -20
- data/lib/models/r_code.rb +0 -23
- data/lib/models/rev_rep.rb +0 -13
- data/lib/models/unit_group.rb +0 -59
- data/lib/presenters/base_presenter.rb +0 -25
- data/lib/presenters/line_item_presenter.rb +0 -49
- data/lib/presenters/report_presenter.rb +0 -23
- data/lib/presenters/unit_group_presenter.rb +0 -63
- data/lib/presenters/unit_presenter.rb +0 -34
- data/lib/services/line_item_builder.rb +0 -17
- data/test/models/b_event_test.rb +0 -27
- data/test/models/billable_unit_test.rb +0 -8
- data/test/models/line_item_test.rb +0 -10
- data/test/models/p_method_test.rb +0 -29
- data/test/models/rev_rep_test.rb +0 -12
- data/test/models/unit_group_test.rb +0 -17
- data/test/presenters/line_item_presenter_test.rb +0 -36
- data/test/presenters/report_presenter_test.rb +0 -22
- data/test/services/line_item_builder_test.rb +0 -30
data/lib/helpers/http_helpers.rb
CHANGED
@@ -1,30 +1,25 @@
|
|
1
1
|
module Shushu
|
2
|
-
|
3
|
-
extend self
|
2
|
+
class BillableEvent < Client
|
4
3
|
|
5
4
|
OPEN = "open"
|
6
5
|
CLOSE = "close"
|
7
6
|
|
8
|
-
def all
|
9
|
-
Shushu.handle_req {RestClient.get([Shushu.url, "/billable_events"].join, Shushu.headers)}
|
10
|
-
end
|
11
|
-
|
12
7
|
def open(args)
|
13
8
|
hid = args.delete(:hid) || args.delete("hid")
|
14
9
|
entity_id = args.delete(:entity_id) || args.delete("entity_id")
|
15
10
|
args[:state] = OPEN
|
16
|
-
|
11
|
+
handle_req {RestClient.put(events_url(hid, entity_id), args, headers)}
|
17
12
|
end
|
18
13
|
|
19
14
|
def close(args)
|
20
15
|
hid = args.delete(:hid) || args.delete("hid")
|
21
16
|
entity_id = args.delete(:entity_id) || args.delete("entity_id")
|
22
17
|
args[:state] = CLOSE
|
23
|
-
|
18
|
+
handle_req {RestClient.put(events_url(hid, entity_id), args, headers)}
|
24
19
|
end
|
25
20
|
|
26
21
|
def events_url(hid, entity_id)
|
27
|
-
[
|
22
|
+
[url, "/resources/#{hid}/billable_events/#{entity_id}"].join
|
28
23
|
end
|
29
24
|
|
30
25
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Shushu
|
2
|
+
class RateCode < Client
|
3
|
+
def create(args)
|
4
|
+
if args[:slug].nil?
|
5
|
+
handle_req do
|
6
|
+
RestClient.post(rate_codes_url, args, headers)
|
7
|
+
end
|
8
|
+
else
|
9
|
+
handle_req do
|
10
|
+
url = [rate_codes_url, args.delete(:slug)].join("/")
|
11
|
+
RestClient.put(url, args, headers)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def rate_codes_url
|
17
|
+
[url, "/rate_codes"].join
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/models/report.rb
CHANGED
@@ -1,68 +1,50 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
1
3
|
module Shushu
|
2
|
-
class Report
|
4
|
+
class Report < Client
|
3
5
|
attr_accessor(
|
4
6
|
:from,
|
5
7
|
:to,
|
6
|
-
:billable_units
|
8
|
+
:billable_units,
|
9
|
+
:report
|
7
10
|
)
|
8
11
|
|
9
|
-
def fetch
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
:
|
14
|
-
|
15
|
-
|
12
|
+
def fetch(report_url, from, to)
|
13
|
+
@report = handle_req do
|
14
|
+
response_found = false
|
15
|
+
while !response_found
|
16
|
+
response = RestClient::Resource.new(report_url).get({:params => {
|
17
|
+
:from => from.utc.to_s,
|
18
|
+
:to => to.utc.to_s
|
19
|
+
}})
|
20
|
+
|
21
|
+
if response.code == 202
|
22
|
+
sleep 0.5
|
23
|
+
else
|
24
|
+
response_found = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
response
|
16
28
|
end
|
29
|
+
self
|
17
30
|
end
|
18
31
|
|
19
32
|
def billable_units
|
20
|
-
@billable_units ||= report["billable_units"].map
|
33
|
+
@billable_units ||= report["billable_units"].map do |unit_hash|
|
34
|
+
OpenStruct.new(unit_hash).tap { |o| o.extend Totalable }
|
35
|
+
end
|
21
36
|
end
|
22
37
|
|
23
38
|
def total
|
24
39
|
report["total"]
|
25
40
|
end
|
26
|
-
|
27
|
-
def report
|
28
|
-
@report ||= fetch
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class UsageReport < Report
|
33
|
-
attr_accessor :account_id
|
34
|
-
|
35
|
-
def initialize(account_id, from, to)
|
36
|
-
@account_id, @from, @to = account_id, from, to
|
37
|
-
end
|
38
|
-
|
39
|
-
def resource
|
40
|
-
"/accounts/#{@account_id}/usage_reports"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class Invoice < Report
|
45
|
-
attr_accessor :payment_method_id
|
46
|
-
|
47
|
-
def initialize(payment_method_id, from, to)
|
48
|
-
@payment_method_id, @from, @to = payment_method_id, from, to
|
49
|
-
end
|
50
|
-
|
51
|
-
def resource
|
52
|
-
"/payment_methods/#{payment_method_id}/invoices"
|
53
|
-
end
|
54
41
|
end
|
55
42
|
|
56
43
|
class RateCodeReport < Report
|
57
|
-
attr_accessor :
|
58
|
-
|
59
|
-
def initialize(rate_code_slug, from, to)
|
60
|
-
@rate_code_slug, @from, @to = rate_code_slug, from, to
|
61
|
-
end
|
44
|
+
attr_accessor :slug
|
62
45
|
|
63
|
-
def
|
64
|
-
"/rate_codes/#{
|
46
|
+
def fetch(slug, from, to)
|
47
|
+
super(self.url + "/rate_codes/#{slug}", from, to)
|
65
48
|
end
|
66
49
|
end
|
67
|
-
|
68
50
|
end
|
File without changes
|
data/lib/shushu.rb
CHANGED
@@ -11,60 +11,34 @@ module Inflector
|
|
11
11
|
end
|
12
12
|
|
13
13
|
module Shushu
|
14
|
-
extend self
|
15
|
-
extend HttpHelpers
|
16
|
-
|
17
14
|
ShushuException = Class.new(StandardError)
|
18
15
|
|
19
|
-
def url
|
20
|
-
Client.url
|
21
|
-
end
|
22
|
-
|
23
|
-
def url=(url)
|
24
|
-
Client.url = url
|
25
|
-
end
|
26
|
-
|
27
16
|
class Client
|
28
|
-
|
29
|
-
@@url = url
|
30
|
-
end
|
17
|
+
include HttpHelpers
|
31
18
|
|
32
|
-
|
33
|
-
if defined?(@@url)
|
34
|
-
@@url
|
35
|
-
else
|
36
|
-
ENV["SHUSHU_URL"]
|
37
|
-
end
|
38
|
-
end
|
19
|
+
attr_accessor :url
|
39
20
|
|
40
|
-
def initialize(url)
|
41
|
-
|
21
|
+
def initialize(url = ENV["SHUSHU_URL"])
|
22
|
+
@url = url
|
42
23
|
end
|
43
24
|
|
44
|
-
def
|
45
|
-
|
25
|
+
def method_missing(method, *args, &block)
|
26
|
+
begin
|
27
|
+
klass = method.to_s.gsub(/s$/,'')
|
28
|
+
Shushu.const_get(Inflector.camelize(klass)).new(@url)
|
29
|
+
rescue NameError => e
|
30
|
+
raise NameError, "'#{method}' not a local variable, method, or Shushu classname"
|
31
|
+
end
|
46
32
|
end
|
47
33
|
end
|
48
34
|
end
|
49
35
|
|
36
|
+
# for ease of typing
|
37
|
+
ShuShu = Shushu
|
50
38
|
|
51
|
-
require "
|
52
|
-
require "models/
|
39
|
+
require "totalable"
|
40
|
+
require "models/billable_event"
|
41
|
+
require "models/resource_ownership"
|
42
|
+
require "models/rate_code"
|
53
43
|
require "models/report"
|
54
|
-
require "models/unit_group"
|
55
|
-
require "models/line_item"
|
56
|
-
require "models/b_event"
|
57
|
-
require "models/res_own"
|
58
|
-
require "models/r_code"
|
59
|
-
require "models/rev_rep"
|
60
44
|
require "models/heart_beat"
|
61
|
-
require "models/p_method"
|
62
|
-
require "models/acct_own"
|
63
|
-
|
64
|
-
require "services/line_item_builder"
|
65
|
-
|
66
|
-
require "presenters/base_presenter"
|
67
|
-
require "presenters/unit_group_presenter"
|
68
|
-
require "presenters/unit_presenter"
|
69
|
-
require "presenters/line_item_presenter"
|
70
|
-
require "presenters/report_presenter"
|
data/lib/totalable.rb
ADDED
data/readme.md
CHANGED
@@ -13,109 +13,13 @@ $ export SHUSHU_URL=https://123:secret@shushu.heroku.com
|
|
13
13
|
|
14
14
|
## Usage
|
15
15
|
|
16
|
-
|
17
|
-
approach will rely on the credentials in `SHUSHU_URL`.
|
16
|
+
Instantiate a client to interact with the Shushu API.
|
18
17
|
|
19
|
-
|
20
|
-
Shushu::BEvent.open({})
|
21
|
-
```
|
22
|
-
|
23
|
-
The second approach allows for credentials other than the ones stored in the
|
24
|
-
`SHUSHU_URL`.
|
18
|
+
`Client::new` defaults to using `ENV['SHUHSU_URL']` if one is not provided.
|
25
19
|
|
26
20
|
```ruby
|
27
21
|
shushu = Shushu::Client.new("https://other_provider_id:other_provider_token@shushu.heroku.com")
|
28
|
-
shushu
|
29
|
-
```
|
30
|
-
|
31
|
-
### PaymentMethod
|
32
|
-
|
33
|
-
This API deals primarily with credit cards. PaymentMethods can be created
|
34
|
-
indipendintly of Accounts. You will need a payment_method to generate an
|
35
|
-
invoice.
|
36
|
-
|
37
|
-
Reference: [PaymentMethod API](https://github.com/heroku/shushud/blob/master/doc/payment_methods_api.md)
|
38
|
-
|
39
|
-
Create a new payment method with encrypted values:
|
40
|
-
|
41
|
-
```ruby
|
42
|
-
PMethod.create(
|
43
|
-
:card_num => "some encrypted value",
|
44
|
-
:card_exp_year => "2012",
|
45
|
-
:card_exp_month => "12"
|
46
|
-
)
|
47
|
-
#=> {:id => "12345", :card_token => "abc123", :card_type => "visa", :card_last4 => "1111"}
|
48
|
-
```
|
49
|
-
|
50
|
-
Update a payment_method with a new credit card:
|
51
|
-
|
52
|
-
```ruby
|
53
|
-
PMethod.update(
|
54
|
-
:id => "001",
|
55
|
-
:card_num => "some encrypted value",
|
56
|
-
:card_exp_year => "2012",
|
57
|
-
:card_exp_month => "12"
|
58
|
-
)
|
59
|
-
#=> {:id => "001", :card_token => "abc123", :card_type => "visa", :card_last4 => "1111"}
|
60
|
-
```
|
61
|
-
|
62
|
-
Create a new payment_method with a token. Note, this endpoint is
|
63
|
-
idempotent with respect to the id and token.
|
64
|
-
|
65
|
-
```ruby
|
66
|
-
PMethod.update(:id => "my-custom-id", :card_token => "abc123")
|
67
|
-
#=> {:id => "my-custom-id", :card_token => "abc123"}
|
68
|
-
```
|
69
|
-
|
70
|
-
To mark a payment_method in such a way that credit card processing will be
|
71
|
-
disabled:
|
72
|
-
|
73
|
-
```ruby
|
74
|
-
PMethod.update(:id => "001", :non_receivable => true)
|
75
|
-
#=> {:id => "001", :non_receivable => true}
|
76
|
-
```
|
77
|
-
|
78
|
-
### Account
|
79
|
-
|
80
|
-
This API deals with accounts which is a primitive for grouping resources. You
|
81
|
-
will need an account to generate a usage report.
|
82
|
-
|
83
|
-
```ruby
|
84
|
-
Shushu::Account.create
|
85
|
-
#=> {:id => "001"}
|
86
|
-
```
|
87
|
-
|
88
|
-
### AccountOwnership
|
89
|
-
|
90
|
-
Use this API when you want to setup associations between Shushu accounts and
|
91
|
-
Shushu payment_methods.
|
92
|
-
|
93
|
-
Reference: [AccountOwnerships API](https://github.com/heroku/shushud/blob/master/doc/account_ownership_api.md)
|
94
|
-
|
95
|
-
To associate an account with a payment_method:
|
96
|
-
|
97
|
-
```ruby
|
98
|
-
Shushu::AcctOwn.act(
|
99
|
-
:account_id => vault_account_id,
|
100
|
-
:payment_method_id => payment_method_id,
|
101
|
-
:entity_id => entity_id,
|
102
|
-
:time => time
|
103
|
-
)
|
104
|
-
#=> {"payment_method_id"=>"123", "account_id"=>"1", "entity_id"=>"entity123"}
|
105
|
-
```
|
106
|
-
|
107
|
-
If you need to move one account to another payment_method, you will need to
|
108
|
-
deactivate the previous relationship and activate a new one. To deactivate
|
109
|
-
call this method:
|
110
|
-
|
111
|
-
```ruby
|
112
|
-
Shushu::AcctOwn.deact(
|
113
|
-
:account_id => vault_account_id,
|
114
|
-
:payment_method_id => payment_method_id,
|
115
|
-
:entity_id => entity_id,
|
116
|
-
:time => time
|
117
|
-
)
|
118
|
-
#=> {"payment_method_id"=>"123", "account_id"=>"1", "entity_id"=>"entity123"}
|
22
|
+
shushu.billable_events.open({})
|
119
23
|
```
|
120
24
|
|
121
25
|
### RateCode
|
@@ -126,7 +30,7 @@ RateCode. You can provide your own slug or a UUID will be generated for you. If
|
|
126
30
|
Reference: [RateCode API](https://github.com/heroku/shushud/blob/master/doc/rate_code_api.md)
|
127
31
|
|
128
32
|
```ruby
|
129
|
-
|
33
|
+
client.rate_codes.create(
|
130
34
|
:slug => some_record.uuid,
|
131
35
|
:rate => 5,
|
132
36
|
:group => "addon",
|
@@ -148,7 +52,7 @@ Let Shushu generate a UUID for the slug.
|
|
148
52
|
Remember to save the slug somewhere so that you can present it with billable_events.
|
149
53
|
|
150
54
|
```ruby
|
151
|
-
|
55
|
+
client.rate_codes.create(
|
152
56
|
:rate => 5,
|
153
57
|
:group => "addon",
|
154
58
|
:period => "month",
|
@@ -176,7 +80,7 @@ When the app is created or it is joining a new account, activate the the
|
|
176
80
|
resource_ownership record.
|
177
81
|
|
178
82
|
```ruby
|
179
|
-
|
83
|
+
client.resource_ownerships.act(
|
180
84
|
:resource_id => resource_id,
|
181
85
|
:entity_id => entity_id,
|
182
86
|
:account_id => vault_account_id,
|
@@ -189,7 +93,7 @@ When an app is destroyed, or the app is moving to a new account_id,
|
|
189
93
|
deactivate the resource_ownership record.
|
190
94
|
|
191
95
|
```ruby
|
192
|
-
|
96
|
+
client.resource_ownerships.deact(
|
193
97
|
:resource_id => resource_id,
|
194
98
|
:entity_id => entity_id,
|
195
99
|
:account_id => vault_account_id,
|
@@ -210,7 +114,7 @@ Reference: [BillableEvent API](https://github.com/heroku/shushud/blob/master/doc
|
|
210
114
|
Open an event when you would like to start billing.
|
211
115
|
|
212
116
|
```ruby
|
213
|
-
|
117
|
+
client.billable_events.open(
|
214
118
|
:entity_id => entity_id,
|
215
119
|
:hid => hid,
|
216
120
|
:time => time,
|
@@ -224,7 +128,7 @@ Shushu::BEvent.open(
|
|
224
128
|
Don't forget to close it.
|
225
129
|
|
226
130
|
```ruby
|
227
|
-
|
131
|
+
client.billable_events.close(
|
228
132
|
:entity_id => entity_id,
|
229
133
|
:hid => hid,
|
230
134
|
:rate_code => rate_code,
|
@@ -232,88 +136,10 @@ Shushu::BEvent.close(
|
|
232
136
|
)
|
233
137
|
```
|
234
138
|
|
235
|
-
### Invoice
|
236
|
-
|
237
|
-
```ruby
|
238
|
-
invoice = Shushu::Invoice.new(payment_method_id, from, to)
|
239
|
-
invoice.billable_units
|
240
|
-
```
|
241
|
-
### UsageReport
|
242
|
-
|
243
|
-
```ruby
|
244
|
-
report = Shushu::UsageReport.new(account_id, from, to)
|
245
|
-
report.billable_units
|
246
|
-
```
|
247
|
-
|
248
139
|
### RateCodeReport
|
249
140
|
|
250
141
|
```ruby
|
251
|
-
report =
|
142
|
+
report = client.rate_code_reports.fetch(rate_code_slug, from, to)
|
252
143
|
report.total
|
253
144
|
report.billable_units
|
254
145
|
```
|
255
|
-
|
256
|
-
|
257
|
-
### Report Generation
|
258
|
-
|
259
|
-
Invoices and UsageReports can be used for report generation. Basically, the
|
260
|
-
report generation code expects a collection of BillableUnits. BillableUnits are
|
261
|
-
returned from both the Invoice API and the UsageReport API. However, the details
|
262
|
-
of the billable_units may be different with respect to the type of the report.
|
263
|
-
|
264
|
-
#### Presenters
|
265
|
-
|
266
|
-
Clients of this library will want to generate some sort of view for the reports, the
|
267
|
-
presenter objects were created to aid with that effort. You should only need to
|
268
|
-
use the presenters while building views. Each view wraps a simple model object.
|
269
|
-
All of the models and presenters are derived from the billable_unit which is
|
270
|
-
retreived from the remote API.
|
271
|
-
|
272
|
-
Report --> LineItem --> UnitGroup --> Billable Unit
|
273
|
-
|
274
|
-
#### ReportPresenter
|
275
|
-
|
276
|
-
The report presenter is how you will kick off the process of generating a
|
277
|
-
report. You hand it a report object, either a UsageReport or and Invoice, and
|
278
|
-
using the reports billable_units, it will build the line_items and a set of
|
279
|
-
line_item_presenters for the line_items.
|
280
|
-
|
281
|
-
#### LineItemBuilder
|
282
|
-
|
283
|
-
The ReportPresenter will create a set of line_items based upon the
|
284
|
-
billable_units in the report. The default is to group things by HID. Thus there
|
285
|
-
will be a line_item for each distinct HID in the set of billable_units. The
|
286
|
-
builder will also give a collection of unit_groups to the line_item. By default,
|
287
|
-
the unit_groups will be partitioned by the product_group. (i.e. dyno, addon)
|
288
|
-
|
289
|
-
You can customize the LineItemBuilder by creating a new class that responds to
|
290
|
-
build and passing it to the ReportPresenter.
|
291
|
-
|
292
|
-
```ruby
|
293
|
-
ReportPresenter.new(report, CustomLineItemBuilder)
|
294
|
-
```
|
295
|
-
|
296
|
-
#### LineItemPresenter
|
297
|
-
|
298
|
-
The LineItemPresenter is responsible for handling the total and names of the
|
299
|
-
line_items. It also manages the set of unit_groups. Since the default
|
300
|
-
LineItemBuilder partitioned unit_groups based upon product_group, you can ask
|
301
|
-
the LineItemPresenter for infomation about subsets of unit_groups. For instance:
|
302
|
-
|
303
|
-
```ruby
|
304
|
-
line_item_presenter.unit_group_presenters("dyno")
|
305
|
-
line_item_presenter.unit_group_total("dyno")
|
306
|
-
line_item_presenter.unit_group_qty("dyno")
|
307
|
-
```
|
308
|
-
#### UnitGroupPresenter
|
309
|
-
|
310
|
-
UnitGroups are collections of billable_units that are partitioned by
|
311
|
-
product_name. So if there exists a set of billable_units that all have
|
312
|
-
product_group = "dyno" and product_name= "worker", then this presenter
|
313
|
-
will give you information about that group.
|
314
|
-
|
315
|
-
|
316
|
-
#### UnitPresenter
|
317
|
-
|
318
|
-
Finally, the UnitPresenter wraps a billable_unit and exposes methods to show
|
319
|
-
totals, quantities and other meta-data.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class BillableEventTest < ShushuTest
|
4
|
+
def setup
|
5
|
+
@client = Shushu::Client.new "http://example.com"
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_open
|
10
|
+
api_resp_body = Shushu::HttpHelpers.enc_json(our_params)
|
11
|
+
FakeWeb.register_uri(:put,
|
12
|
+
"http://example.com/resources/app123/billable_events/1",
|
13
|
+
:body => api_resp_body
|
14
|
+
)
|
15
|
+
event = @client.billable_events.open(our_params)
|
16
|
+
assert_equal(1, event["entity_id"])
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_close
|
20
|
+
api_resp_body = Shushu::HttpHelpers.enc_json(our_params)
|
21
|
+
FakeWeb.register_uri(:put,
|
22
|
+
"http://example.com/resources/app123/billable_events/1",
|
23
|
+
:body => api_resp_body
|
24
|
+
)
|
25
|
+
event = @client.billable_events.close(our_params)
|
26
|
+
assert_equal(1, event["entity_id"])
|
27
|
+
end
|
28
|
+
|
29
|
+
def our_params
|
30
|
+
{
|
31
|
+
:hid => "app123",
|
32
|
+
:entity_id => 1,
|
33
|
+
:rate_code => "RT01",
|
34
|
+
:time => Time.utc(2012,1).to_s,
|
35
|
+
:product_name => "web",
|
36
|
+
:description => "some command",
|
37
|
+
:qty => 1
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -1,6 +1,12 @@
|
|
1
1
|
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
3
|
class RCodeTest < ShushuTest
|
4
|
+
def setup
|
5
|
+
@url = "http://provider:password@shushu.heroku.com"
|
6
|
+
@client = Shushu::Client.new(@url)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
4
10
|
def test_create_without_slug
|
5
11
|
our_params = {
|
6
12
|
:rate => 5,
|
@@ -10,12 +16,11 @@ class RCodeTest < ShushuTest
|
|
10
16
|
api_resp_body = Shushu::HttpHelpers.enc_json(
|
11
17
|
our_params.merge(:slug => "AO01")
|
12
18
|
)
|
13
|
-
Shushu.url = "http://provider:password@shushu.heroku.com"
|
14
19
|
FakeWeb.register_uri(:post,
|
15
|
-
(
|
20
|
+
(@url + "/rate_codes"),
|
16
21
|
:body => api_resp_body
|
17
22
|
)
|
18
|
-
rate_code =
|
23
|
+
rate_code = @client.rate_codes.create(our_params)
|
19
24
|
assert_equal("AO01", rate_code["slug"])
|
20
25
|
end
|
21
26
|
|
@@ -30,14 +35,12 @@ class RCodeTest < ShushuTest
|
|
30
35
|
api_resp_body = Shushu::HttpHelpers.enc_json(
|
31
36
|
our_params.merge(:slug => slug)
|
32
37
|
)
|
33
|
-
Shushu.url = "http://provider:password@shushu.heroku.com"
|
34
38
|
FakeWeb.register_uri(:put,
|
35
|
-
(
|
39
|
+
(@url + "/rate_codes/#{slug}"),
|
36
40
|
:body => api_resp_body
|
37
41
|
)
|
38
|
-
rate_code =
|
42
|
+
rate_code = @client.rate_codes.create(our_params)
|
39
43
|
assert_equal(slug, rate_code["slug"])
|
40
|
-
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class RateCodeReportTest < ShushuTest
|
4
|
+
def setup
|
5
|
+
@url = "http://provider:password@shushu.heroku.com"
|
6
|
+
@client = Shushu::Client.new(@url)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_rate_code_report
|
11
|
+
FakeWeb.register_uri(:get,
|
12
|
+
Regexp.new(Regexp.escape(@url + "/rate_codes/GUID")),
|
13
|
+
:body => Shushu::HttpHelpers.enc_json({:billable_units => [{"rate" => 10, "qty" => 5}]})
|
14
|
+
)
|
15
|
+
|
16
|
+
report = @client.rate_code_reports.fetch("GUID", Time.mktime(2011,1,1), Time.mktime(2011,2,1))
|
17
|
+
assert_equal 50, report.billable_units.first.total
|
18
|
+
end
|
19
|
+
end
|