3scale_client 2.7.0 → 2.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +12 -3
- data/3scale_client.gemspec +3 -0
- data/Appraisals +3 -0
- data/CHANGELOG.md +15 -0
- data/README.md +17 -6
- data/VERSION +1 -1
- data/gemfiles/rack_1.gemfile +7 -0
- data/lib/3scale/client.rb +73 -34
- data/lib/3scale/client/http_client.rb +9 -7
- data/lib/3scale/client/version.rb +1 -1
- data/test/client_test.rb +189 -22
- data/test/remote_test.rb +2 -2
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 881aa442d660c091dadbbd20b2446d506343cf38
|
4
|
+
data.tar.gz: 0a8d027ad84fda9f5f24a486124d2a003c3aa5ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2c751900a737e62312b0fd9dd530a6ac45a494eb46bf95e51fa8daed741f275a2e5c789b1b6477f79306490f9670d3c4f8ece97e21fdb28d9d0d23dcbfba26f
|
7
|
+
data.tar.gz: 99fbf6a2bf089e96ba7df746e56a53b5543fe76b237eee230c151a5ca16327931d4b346632e47801a54b0f4898f413866515395a7c9d0d7f5939c60b39b0144f
|
data/.travis.yml
CHANGED
@@ -2,17 +2,26 @@ language: ruby
|
|
2
2
|
cache: bundler
|
3
3
|
sudo: false
|
4
4
|
rvm:
|
5
|
-
- 1.9.3
|
6
5
|
- 2.0.0
|
7
6
|
- 2.1
|
8
7
|
- 2.2
|
9
8
|
- 2.3.0
|
10
9
|
- jruby
|
10
|
+
gemfile:
|
11
|
+
- Gemfile
|
12
|
+
- gemfiles/rack_1.gemfile
|
11
13
|
matrix:
|
12
|
-
|
14
|
+
exclude:
|
15
|
+
- rvm: 2.0.0
|
16
|
+
gemfile: Gemfile
|
17
|
+
- rvm: 2.1
|
18
|
+
gemfile: Gemfile
|
19
|
+
- rvm: 2.2
|
20
|
+
gemfile: Gemfile
|
13
21
|
- rvm: jruby
|
14
|
-
|
22
|
+
gemfile: Gemfile
|
15
23
|
env:
|
16
24
|
global:
|
17
25
|
- TEST_3SCALE_APP_IDS=4d4b20b9 TEST_3SCALE_APP_KEYS=ecce202ecc2eb8dc7a499c34a34d5987
|
18
26
|
- secure: VSElS0KvnufcZKStV7kj6xHFEiWvQkpxk1IEuhKq5JqywniN/6ScaNUFxbBKrOUrqhzXIRUCteBP2wvYRjlNhLFZSnYskzh7dLkOp/WV+WK6KjrdflTiF6UTxW4pBSsg6YDJ/wWJlmwsPVty1pRvOE3ru6uco+dTWCCLn4BvWqc=
|
27
|
+
- JRUBY_OPTS="--2.0"
|
data/3scale_client.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 2.0'
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
24
|
spec.add_development_dependency "rake"
|
23
25
|
spec.add_development_dependency "rdoc"
|
@@ -26,5 +28,6 @@ Gem::Specification.new do |spec|
|
|
26
28
|
spec.add_development_dependency "net-http-persistent"
|
27
29
|
spec.add_development_dependency 'minitest'
|
28
30
|
spec.add_development_dependency 'rack'
|
31
|
+
spec.add_development_dependency 'appraisal'
|
29
32
|
spec.add_dependency 'nokogiri'
|
30
33
|
end
|
data/Appraisals
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,21 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [2.8.0] - 2016-09-06
|
5
|
+
This version drops support for Ruby versions < 2.0.
|
6
|
+
|
7
|
+
### Added
|
8
|
+
- Added support for reporting to services other than the default one.
|
9
|
+
`ThreeScale::Client#report` now accepts an optional `service_id`.
|
10
|
+
There has been a change in the params that the method accepts. This
|
11
|
+
change is backwards compatible but a deprecation warning is shown
|
12
|
+
when calling the method using the old params.
|
13
|
+
- The two authorize calls `ThreeScale::Client#Authorize` and
|
14
|
+
`ThreeScale::Client#oauth_authorize` now accept an optional predicted
|
15
|
+
usage parameter.
|
16
|
+
- It is now possible to specify a port different that the default
|
17
|
+
one for the API service management endpoint.
|
18
|
+
|
4
19
|
## [2.7.0] - 2016-08-26
|
5
20
|
### Added
|
6
21
|
- Added support for 'user_key' authentication mode in 'report' method
|
data/README.md
CHANGED
@@ -197,19 +197,30 @@ response.redirect_url
|
|
197
197
|
|
198
198
|
### Report
|
199
199
|
|
200
|
-
To report usage, use the +report+ method. You can report multiple
|
200
|
+
To report usage, use the +report+ method. You can report multiple transactions at the same time:
|
201
201
|
|
202
202
|
```ruby
|
203
|
-
response = client.report(
|
204
|
-
|
203
|
+
response = client.report(
|
204
|
+
:transactions => [{:app_id => "first app id", :usage => {'hits' => 1}},
|
205
|
+
{:app_id => "second app id", :usage => {'hits' => 1}}])
|
206
|
+
```
|
207
|
+
|
208
|
+
To specify a service other than the default one:
|
209
|
+
```ruby
|
210
|
+
response = client.report(
|
211
|
+
:transactions => [{:app_id => "first app id", :usage => {'hits' => 1}},
|
212
|
+
{:app_id => "second app id", :usage => {'hits' => 1}}],
|
213
|
+
:service_id => 'service_123')
|
205
214
|
```
|
206
215
|
|
207
216
|
The :app_id and :usage parameters are required. Additionaly, you can specify a timestamp
|
208
|
-
of transaction:
|
217
|
+
of a transaction:
|
209
218
|
|
210
219
|
```ruby
|
211
|
-
response = client.report(
|
212
|
-
|
220
|
+
response = client.report(
|
221
|
+
:transactions => [{:app_id => "app id",
|
222
|
+
:usage => {'hits' => 1},
|
223
|
+
:timestamp => Time.local(2010, 4, 28, 12, 36)}])
|
213
224
|
```
|
214
225
|
|
215
226
|
The timestamp can be either a Time object (from ruby's standard library) or something that
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.8.0
|
data/lib/3scale/client.rb
CHANGED
@@ -41,6 +41,12 @@ module ThreeScale
|
|
41
41
|
class Client
|
42
42
|
DEFAULT_HOST = 'su1.3scale.net'
|
43
43
|
|
44
|
+
DEPRECATION_MSG_OLD_REPORT = 'warning: def report(*transactions) is '\
|
45
|
+
'deprecated. In next versions, the signature of the report method is '\
|
46
|
+
'going to be: '\
|
47
|
+
'def report(transactions: [], service_id: nil).'.freeze
|
48
|
+
private_constant :DEPRECATION_MSG_OLD_REPORT
|
49
|
+
|
44
50
|
def initialize(options)
|
45
51
|
if options[:provider_key].nil? || options[:provider_key] =~ /^\s*$/
|
46
52
|
raise ArgumentError, 'missing :provider_key'
|
@@ -69,12 +75,7 @@ module ThreeScale
|
|
69
75
|
end
|
70
76
|
|
71
77
|
options_usage ||= {:hits => 1}
|
72
|
-
|
73
|
-
options_usage.each_pair do |metric, value|
|
74
|
-
escaped_metric = CGI.escape "[usage][#{metric}]"
|
75
|
-
usage << "#{escaped_metric}=#{CGI.escape(value.to_s)}"
|
76
|
-
end
|
77
|
-
path += "&#{usage.join('&')}"
|
78
|
+
path += "&#{usage_query_params(options_usage)}"
|
78
79
|
|
79
80
|
if options_log
|
80
81
|
log = []
|
@@ -101,21 +102,23 @@ module ThreeScale
|
|
101
102
|
#
|
102
103
|
# == Parameters
|
103
104
|
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
#
|
112
|
-
#
|
113
|
-
#
|
114
|
-
#
|
115
|
-
#
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
105
|
+
# Hash with two fields:
|
106
|
+
#
|
107
|
+
# transactions:: It is required. It is an enumerable. Each element is a hash with the fields:
|
108
|
+
# app_id: ID of the application to report the transaction for. This parameter is
|
109
|
+
# required.
|
110
|
+
# usage: Hash of usage values. The keys are metric names and values are
|
111
|
+
# corresponding numeric values. Example: {'hits' => 1, 'transfer' => 1024}.
|
112
|
+
# This parameter is required.
|
113
|
+
# timestamp: Timestamp of the transaction. This can be either a object of the
|
114
|
+
# ruby's Time class, or a string in the "YYYY-MM-DD HH:MM:SS" format
|
115
|
+
# (if the time is in the UTC), or a string in
|
116
|
+
# the "YYYY-MM-DD HH:MM:SS ZZZZZ" format, where the ZZZZZ is the time offset
|
117
|
+
# from the UTC. For example, "US Pacific Time" has offset -0800, "Tokyo"
|
118
|
+
# has offset +0900. This parameter is optional, and if not provided, equals
|
119
|
+
# to the current time.
|
120
|
+
# service_id:: ID of the service. It is optional. When not specified, the transactions
|
121
|
+
# are reported to the default service.
|
119
122
|
#
|
120
123
|
# == Return
|
121
124
|
#
|
@@ -127,20 +130,39 @@ module ThreeScale
|
|
127
130
|
#
|
128
131
|
# == Examples
|
129
132
|
#
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
133
|
+
# Report two transactions of two applications. Using the default service.
|
134
|
+
# client.report(transactions: [{:app_id => 'foo', :usage => {'hits' => 1}},
|
135
|
+
# {:app_id => 'bar', :usage => {'hits' => 1}}])
|
136
|
+
#
|
137
|
+
# Report one transaction with timestamp. Using the default service.
|
138
|
+
# client.report(transactions: [{:app_id => 'foo',
|
139
|
+
# :timestamp => Time.local(2010, 4, 27, 15, 14),
|
140
|
+
# :usage => {'hits' => 1}])
|
141
|
+
#
|
142
|
+
# Report a transaction specifying the service.
|
143
|
+
# client.report(transactions: [{:app_id => 'foo', :usage => {'hits' => 1}}],
|
144
|
+
# service_id: 'a_service_id')
|
133
145
|
#
|
134
|
-
#
|
135
|
-
# client.report({:app_id => 'foo',
|
136
|
-
# :timestamp => Time.local(2010, 4, 27, 15, 14),
|
137
|
-
# :usage => {'hits' => 1})
|
146
|
+
# == Note
|
138
147
|
#
|
139
|
-
|
140
|
-
|
148
|
+
# The signature of this method is a bit complicated because we decided to
|
149
|
+
# keep backwards compatibility with a previous version of the method:
|
150
|
+
# def report(*transactions)
|
151
|
+
def report(*reports, transactions: [], service_id: nil, **rest)
|
152
|
+
if (!transactions || transactions.empty?) && rest.empty?
|
153
|
+
raise ArgumentError, 'no transactions to report'
|
154
|
+
end
|
155
|
+
|
156
|
+
transactions = transactions.concat(reports)
|
157
|
+
|
158
|
+
unless rest.empty?
|
159
|
+
warn(DEPRECATION_MSG_OLD_REPORT)
|
160
|
+
transactions.concat([rest])
|
161
|
+
end
|
141
162
|
|
142
163
|
payload = encode_transactions(transactions)
|
143
164
|
payload['provider_key'] = CGI.escape(provider_key)
|
165
|
+
payload['service_id'] = CGI.escape(service_id.to_s) if service_id
|
144
166
|
|
145
167
|
http_response = @http.post('/transactions.xml', payload)
|
146
168
|
|
@@ -164,6 +186,9 @@ module ThreeScale
|
|
164
186
|
# app_key:: secret key assigned to the application. Required only if application has
|
165
187
|
# a key defined.
|
166
188
|
# service_id:: id of the service (required if you have more than one service)
|
189
|
+
# usage:: predicted usage. It is optional. It is a hash where the keys are metrics
|
190
|
+
# and the values their predicted usage.
|
191
|
+
# Example: {'hits' => 1, 'my_metric' => 100}
|
167
192
|
#
|
168
193
|
# == Return
|
169
194
|
#
|
@@ -207,6 +232,9 @@ module ThreeScale
|
|
207
232
|
#
|
208
233
|
# app_id:: id of the application to authorize. This is required.
|
209
234
|
# service_id:: id of the service (required if you have more than one service)
|
235
|
+
# usage:: predicted usage. It is optional. It is a hash where the keys are metrics
|
236
|
+
# and the values their predicted usage.
|
237
|
+
# Example: {'hits' => 1, 'my_metric' => 100}
|
210
238
|
#
|
211
239
|
# == Return
|
212
240
|
#
|
@@ -247,14 +275,14 @@ module ThreeScale
|
|
247
275
|
|
248
276
|
private
|
249
277
|
|
250
|
-
OAUTH_PARAMS = [:app_id, :app_key, :service_id, :redirect_url]
|
251
|
-
ALL_PARAMS = [:user_key, :app_id, :app_key, :service_id, :redirect_url]
|
278
|
+
OAUTH_PARAMS = [:app_id, :app_key, :service_id, :redirect_url, :usage]
|
279
|
+
ALL_PARAMS = [:user_key, :app_id, :app_key, :service_id, :redirect_url, :usage]
|
252
280
|
REPORT_PARAMS = [:user_key, :app_id, :service_id, :timestamp]
|
253
281
|
|
254
282
|
def options_to_params(options, allowed_keys)
|
255
283
|
params = { :provider_key => provider_key }
|
256
284
|
|
257
|
-
allowed_keys.each do |key|
|
285
|
+
(allowed_keys - [:usage]).each do |key|
|
258
286
|
params[key] = options[key] if options.has_key?(key)
|
259
287
|
end
|
260
288
|
|
@@ -262,7 +290,14 @@ module ThreeScale
|
|
262
290
|
"#{key}=#{CGI.escape(value.to_s)}"
|
263
291
|
end
|
264
292
|
|
265
|
-
'?' + tuples.join('&')
|
293
|
+
res = '?' + tuples.join('&')
|
294
|
+
|
295
|
+
# Usage is a hash. The format is a bit different
|
296
|
+
if allowed_keys.include?(:usage) && options.has_key?(:usage)
|
297
|
+
res << "&#{usage_query_params(options[:usage])}"
|
298
|
+
end
|
299
|
+
|
300
|
+
res
|
266
301
|
end
|
267
302
|
|
268
303
|
def encode_transactions(transactions)
|
@@ -285,6 +320,10 @@ module ThreeScale
|
|
285
320
|
result
|
286
321
|
end
|
287
322
|
|
323
|
+
def usage_query_params(usage)
|
324
|
+
URI.encode_www_form(usage.map { |metric, value| ["[usage][#{metric}]", value ] })
|
325
|
+
end
|
326
|
+
|
288
327
|
def append_value(result, index, names, value)
|
289
328
|
result["transactions[#{index}][#{names.join('][')}]"] = value if value
|
290
329
|
end
|
@@ -18,11 +18,12 @@ module ThreeScale
|
|
18
18
|
@secure = !!options[:secure]
|
19
19
|
@host = options.fetch(:host)
|
20
20
|
@persistent = options[:persistent]
|
21
|
+
@port = options[:port] || (@secure ? 443 : 80)
|
21
22
|
|
22
23
|
backend_class = @persistent ? self.class.persistent_backend : NetHttp or raise PersistenceNotAvailable
|
23
24
|
backend_class.prepare
|
24
25
|
|
25
|
-
@http = backend_class.new(@host)
|
26
|
+
@http = backend_class.new(@host, @port)
|
26
27
|
@http.ssl! if @secure
|
27
28
|
end
|
28
29
|
|
@@ -33,8 +34,9 @@ module ThreeScale
|
|
33
34
|
def self.prepare
|
34
35
|
end
|
35
36
|
|
36
|
-
def initialize(host)
|
37
|
+
def initialize(host, port)
|
37
38
|
@host = host
|
39
|
+
@port = port
|
38
40
|
end
|
39
41
|
|
40
42
|
def get_request(path)
|
@@ -65,7 +67,7 @@ module ThreeScale
|
|
65
67
|
require 'net/http/persistent'
|
66
68
|
end
|
67
69
|
|
68
|
-
def initialize(host)
|
70
|
+
def initialize(host, port)
|
69
71
|
super
|
70
72
|
@http = ::Net::HTTP::Persistent.new
|
71
73
|
@protocol = 'http'
|
@@ -87,7 +89,7 @@ module ThreeScale
|
|
87
89
|
end
|
88
90
|
|
89
91
|
def full_uri(path)
|
90
|
-
URI.join "#{@protocol}://#{@host}", path
|
92
|
+
URI.join "#{@protocol}://#{@host}:#{@port}", path
|
91
93
|
end
|
92
94
|
end
|
93
95
|
|
@@ -95,13 +97,13 @@ module ThreeScale
|
|
95
97
|
extend Forwardable
|
96
98
|
def_delegators :@http, :use_ssl?, :active?
|
97
99
|
|
98
|
-
def initialize(host)
|
100
|
+
def initialize(host, port)
|
99
101
|
super
|
100
|
-
@http = Net::HTTP.new(@host,
|
102
|
+
@http = Net::HTTP.new(@host, port)
|
101
103
|
end
|
102
104
|
|
103
105
|
def ssl!
|
104
|
-
@http = Net::HTTP.new(@host,
|
106
|
+
@http = Net::HTTP.new(@host, @port)
|
105
107
|
@http.use_ssl = true
|
106
108
|
end
|
107
109
|
|
data/test/client_test.rb
CHANGED
@@ -212,6 +212,51 @@ class ThreeScale::ClientTest < MiniTest::Test
|
|
212
212
|
end
|
213
213
|
end
|
214
214
|
|
215
|
+
def test_authorize_with_usage_within_limits
|
216
|
+
url = "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd"\
|
217
|
+
"&app_id=foo&%5Busage%5D%5Bmetric1%5D=1&%5Busage%5D%5Bmetric2%5D=2"
|
218
|
+
|
219
|
+
body = '<status>
|
220
|
+
<authorized>true</authorized>
|
221
|
+
<plan>Ultimate</plan>
|
222
|
+
</status>'
|
223
|
+
|
224
|
+
FakeWeb.register_uri(:get, url, :status => ['200', 'OK'], :body => body)
|
225
|
+
|
226
|
+
response = @client.authorize(:app_id => 'foo',
|
227
|
+
:usage => { 'metric1' => 1, 'metric2' => 2 })
|
228
|
+
|
229
|
+
assert response.success?
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_authorize_with_usage_and_limits_exceeded
|
233
|
+
url = "http://#{@host}/transactions/authorize.xml?provider_key=1234abcd"\
|
234
|
+
"&app_id=foo&%5Busage%5D%5Bhits%5D=1"
|
235
|
+
|
236
|
+
body = '<status>
|
237
|
+
<authorized>false</authorized>
|
238
|
+
<reason>usage limits are exceeded</reason>
|
239
|
+
|
240
|
+
<plan>Ultimate</plan>
|
241
|
+
|
242
|
+
<usage_reports>
|
243
|
+
<usage_report metric="hits" period="day" exceeded="true">
|
244
|
+
<period_start>2010-04-26 00:00:00 +0000</period_start>
|
245
|
+
<period_end>2010-04-27 00:00:00 +0000</period_end>
|
246
|
+
<current_value>10</current_value>
|
247
|
+
<max_value>5</max_value>
|
248
|
+
</usage_report>
|
249
|
+
</usage_reports>
|
250
|
+
</status>'
|
251
|
+
|
252
|
+
FakeWeb.register_uri(:get, url, :status => ['409'], :body => body)
|
253
|
+
|
254
|
+
response = @client.authorize(:app_id => 'foo', :usage => { 'hits' => 1 })
|
255
|
+
|
256
|
+
assert !response.success?
|
257
|
+
assert_equal 'usage limits are exceeded', response.error_message
|
258
|
+
end
|
259
|
+
|
215
260
|
def test_successful_oauth_authorize
|
216
261
|
body = '<status>
|
217
262
|
<authorized>true</authorized>
|
@@ -317,19 +362,74 @@ class ThreeScale::ClientTest < MiniTest::Test
|
|
317
362
|
end
|
318
363
|
end
|
319
364
|
|
365
|
+
def test_oauth_authorize_with_usage_within_limits
|
366
|
+
url = "http://#{@host}/transactions/oauth_authorize.xml"\
|
367
|
+
"?provider_key=1234abcd&app_id=foo&%5Busage%5D%5Bmetric1%5D=1"\
|
368
|
+
"&%5Busage%5D%5Bmetric2%5D=2"
|
369
|
+
|
370
|
+
body = '<status>
|
371
|
+
<authorized>true</authorized>
|
372
|
+
<plan>Ultimate</plan>
|
373
|
+
</status>'
|
374
|
+
|
375
|
+
FakeWeb.register_uri(:get, url, :status => ['200', 'OK'], :body => body)
|
376
|
+
|
377
|
+
response = @client.oauth_authorize(
|
378
|
+
:app_id => 'foo', :usage => { 'metric1' => 1, 'metric2' => 2 })
|
379
|
+
|
380
|
+
assert response.success?
|
381
|
+
end
|
382
|
+
|
383
|
+
def test_oauth_authorize_with_usage_and_limits_exceeded
|
384
|
+
url = "http://#{@host}/transactions/oauth_authorize.xml"\
|
385
|
+
"?provider_key=1234abcd&app_id=foo&%5Busage%5D%5Bhits%5D=1"
|
386
|
+
|
387
|
+
body = '<status>
|
388
|
+
<authorized>false</authorized>
|
389
|
+
<reason>usage limits are exceeded</reason>
|
390
|
+
|
391
|
+
<plan>Ultimate</plan>
|
392
|
+
|
393
|
+
<usage_reports>
|
394
|
+
<usage_report metric="hits" period="day" exceeded="true">
|
395
|
+
<period_start>2010-04-26 00:00:00 +0000</period_start>
|
396
|
+
<period_end>2010-04-27 00:00:00 +0000</period_end>
|
397
|
+
<current_value>10</current_value>
|
398
|
+
<max_value>5</max_value>
|
399
|
+
</usage_report>
|
400
|
+
</usage_reports>
|
401
|
+
</status>'
|
402
|
+
|
403
|
+
FakeWeb.register_uri(:get, url, :status => ['409'], :body => body)
|
404
|
+
|
405
|
+
response = @client.oauth_authorize(:app_id => 'foo',
|
406
|
+
:usage => { 'hits' => 1 })
|
407
|
+
|
408
|
+
assert !response.success?
|
409
|
+
assert_equal 'usage limits are exceeded', response.error_message
|
410
|
+
end
|
411
|
+
|
320
412
|
def test_report_raises_an_exception_if_no_transactions_given
|
321
413
|
assert_raises ArgumentError do
|
322
414
|
@client.report
|
323
415
|
end
|
416
|
+
|
417
|
+
[nil, []].each do |invalid_transactions|
|
418
|
+
assert_raises ArgumentError do
|
419
|
+
@client.report(transactions: invalid_transactions)
|
420
|
+
end
|
421
|
+
end
|
324
422
|
end
|
325
423
|
|
326
424
|
def test_successful_report
|
327
425
|
FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml",
|
328
426
|
:status => ['200', 'OK'])
|
329
427
|
|
330
|
-
|
331
|
-
|
332
|
-
|
428
|
+
transactions = [{ :app_id => 'foo',
|
429
|
+
:timestamp => Time.local(2010, 4, 27, 15, 00),
|
430
|
+
:usage => {'hits' => 1 } }]
|
431
|
+
|
432
|
+
response = @client.report(transactions: transactions)
|
333
433
|
|
334
434
|
assert response.success?
|
335
435
|
end
|
@@ -351,19 +451,20 @@ class ThreeScale::ClientTest < MiniTest::Test
|
|
351
451
|
FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml",
|
352
452
|
:status => ['200', 'OK'])
|
353
453
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
454
|
+
transactions = [{ :app_id => 'foo',
|
455
|
+
:usage => { 'hits' => 1 },
|
456
|
+
:timestamp => '2010-04-27 15:42:17 0200',
|
457
|
+
:log => {
|
458
|
+
'request' => 'foo',
|
459
|
+
'response' => 'bar',
|
460
|
+
'code' => 200
|
461
|
+
}
|
462
|
+
},
|
463
|
+
{ :app_id => 'bar',
|
464
|
+
:usage => { 'hits' => 1 },
|
465
|
+
:timestamp => Time.local(2010, 4, 27, 15, 00) }]
|
466
|
+
|
467
|
+
@client.report(transactions: transactions)
|
367
468
|
|
368
469
|
request = FakeWeb.last_request
|
369
470
|
|
@@ -381,12 +482,74 @@ class ThreeScale::ClientTest < MiniTest::Test
|
|
381
482
|
FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml",
|
382
483
|
:status => ['200', 'OK'])
|
383
484
|
|
384
|
-
|
385
|
-
|
386
|
-
|
485
|
+
transactions = [{ :user_key => 'foo',
|
486
|
+
:usage => { 'hits' => 1 },
|
487
|
+
:timestamp => '2016-07-18 15:42:17 0200' }]
|
488
|
+
|
489
|
+
@client.report(transactions: transactions)
|
490
|
+
|
491
|
+
request = FakeWeb.last_request
|
492
|
+
|
493
|
+
assert_equal URI.encode_www_form(payload), request.body
|
494
|
+
end
|
495
|
+
|
496
|
+
def test_report_with_service_id
|
497
|
+
FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml",
|
498
|
+
:status => ['200', 'OK'])
|
499
|
+
|
500
|
+
transactions = [{ :app_id => 'an_app_id',
|
501
|
+
:usage => { 'hits' => 1 },
|
502
|
+
:timestamp => '2016-07-18 15:42:17 0200' }]
|
503
|
+
|
504
|
+
@client.report(transactions: transactions, service_id: 'a_service_id')
|
505
|
+
|
506
|
+
request = FakeWeb.last_request
|
507
|
+
|
508
|
+
payload = {
|
509
|
+
'transactions[0][app_id]' => 'an_app_id',
|
510
|
+
'transactions[0][timestamp]' => '2016-07-18 15:42:17 0200',
|
511
|
+
'transactions[0][usage][hits]' => '1',
|
512
|
+
'provider_key' => '1234abcd',
|
513
|
+
'service_id' => 'a_service_id'
|
514
|
+
}
|
515
|
+
|
516
|
+
assert_equal URI.encode_www_form(payload), request.body
|
517
|
+
end
|
518
|
+
|
519
|
+
# We changed the signature of the report method but we keep the compatibility
|
520
|
+
# with the old one: def report(*transactions).This tests only checks that
|
521
|
+
# backwards compatibility.
|
522
|
+
def test_report_compatibility_with_old_report_format
|
523
|
+
FakeWeb.register_uri(:post, "http://#{@host}/transactions.xml",
|
524
|
+
:status => ['200', 'OK'])
|
525
|
+
|
526
|
+
transactions = [{ :app_id => 'app_id_1',
|
527
|
+
:usage => { 'hits' => 1 },
|
528
|
+
:timestamp => '2016-07-18 15:42:17 0200' },
|
529
|
+
{ :app_id => 'app_id_2',
|
530
|
+
:usage => { 'hits' => 2 },
|
531
|
+
:timestamp => '2016-07-19 15:42:17 0200' },
|
532
|
+
{ :app_id => 'app_id_3',
|
533
|
+
:usage => { 'hits' => 3 },
|
534
|
+
:timestamp => '2016-07-20 15:42:17 0200' }]
|
535
|
+
|
536
|
+
@client.report(*transactions)
|
387
537
|
|
388
538
|
request = FakeWeb.last_request
|
389
539
|
|
540
|
+
payload = {
|
541
|
+
'transactions[0][app_id]' => 'app_id_1',
|
542
|
+
'transactions[0][timestamp]' => '2016-07-18 15:42:17 0200',
|
543
|
+
'transactions[0][usage][hits]' => '1',
|
544
|
+
'transactions[1][app_id]' => 'app_id_2',
|
545
|
+
'transactions[1][timestamp]' => '2016-07-19 15:42:17 0200',
|
546
|
+
'transactions[1][usage][hits]' => '2',
|
547
|
+
'transactions[2][app_id]' => 'app_id_3',
|
548
|
+
'transactions[2][timestamp]' => '2016-07-20 15:42:17 0200',
|
549
|
+
'transactions[2][usage][hits]' => '3',
|
550
|
+
'provider_key' => '1234abcd'
|
551
|
+
}
|
552
|
+
|
390
553
|
assert_equal URI.encode_www_form(payload), request.body
|
391
554
|
end
|
392
555
|
|
@@ -398,7 +561,8 @@ class ThreeScale::ClientTest < MiniTest::Test
|
|
398
561
|
:body => error_body)
|
399
562
|
|
400
563
|
client = ThreeScale::Client.new(:provider_key => 'foo')
|
401
|
-
|
564
|
+
transactions = [{ :app_id => 'abc', :usage => { 'hits' => 1 } }]
|
565
|
+
response = client.report(transactions: transactions)
|
402
566
|
|
403
567
|
assert !response.success?
|
404
568
|
assert_equal 'provider_key_invalid', response.error_code
|
@@ -410,8 +574,10 @@ class ThreeScale::ClientTest < MiniTest::Test
|
|
410
574
|
:status => ['500', 'Internal Server Error'],
|
411
575
|
:body => 'OMG! WTF!')
|
412
576
|
|
577
|
+
transactions = [{ :app_id => 'foo', :usage => { 'hits' => 1 } }]
|
578
|
+
|
413
579
|
assert_raises ThreeScale::ServerError do
|
414
|
-
@client.report(
|
580
|
+
@client.report(transactions: transactions)
|
415
581
|
end
|
416
582
|
end
|
417
583
|
|
@@ -439,7 +605,8 @@ class ThreeScale::ClientTest < MiniTest::Test
|
|
439
605
|
:status => ['200', 'OK'],
|
440
606
|
:body => success_body)
|
441
607
|
client = ThreeScale::Client.new(:provider_key => 'foo')
|
442
|
-
|
608
|
+
transactions = [{ :app_id => 'abc', :usage => { 'hits' => 1 } }]
|
609
|
+
client.report(transactions: transactions)
|
443
610
|
|
444
611
|
request = FakeWeb.last_request
|
445
612
|
assert_equal "plugin-ruby-v#{version}", request["X-3scale-User-Agent"]
|
data/test/remote_test.rb
CHANGED
@@ -87,7 +87,7 @@ if ENV['TEST_3SCALE_PROVIDER_KEY'] &&
|
|
87
87
|
:log => {:request => "a/a", :response => "b/b", :code => 200 }}
|
88
88
|
end
|
89
89
|
|
90
|
-
response = @client.report(
|
90
|
+
response = @client.report(transactions: transactions)
|
91
91
|
assert response.success?
|
92
92
|
end
|
93
93
|
|
@@ -97,7 +97,7 @@ if ENV['TEST_3SCALE_PROVIDER_KEY'] &&
|
|
97
97
|
end
|
98
98
|
|
99
99
|
client = ThreeScale::Client.new(:provider_key => 'invalid-key')
|
100
|
-
response = client.report(
|
100
|
+
response = client.report(transactions: transactions)
|
101
101
|
assert !response.success?
|
102
102
|
assert_equal 'provider_key_invalid', response.error_code
|
103
103
|
assert_equal 'provider key "invalid-key" is invalid', response.error_message
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: 3scale_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michal Cichra
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2016-
|
15
|
+
date: 2016-09-06 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: bundler
|
@@ -126,6 +126,20 @@ dependencies:
|
|
126
126
|
- - ">="
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: '0'
|
129
|
+
- !ruby/object:Gem::Dependency
|
130
|
+
name: appraisal
|
131
|
+
requirement: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
type: :development
|
137
|
+
prerelease: false
|
138
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
129
143
|
- !ruby/object:Gem::Dependency
|
130
144
|
name: nokogiri
|
131
145
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,12 +166,14 @@ files:
|
|
152
166
|
- ".gitignore"
|
153
167
|
- ".travis.yml"
|
154
168
|
- 3scale_client.gemspec
|
169
|
+
- Appraisals
|
155
170
|
- CHANGELOG.md
|
156
171
|
- Gemfile
|
157
172
|
- LICENCE
|
158
173
|
- README.md
|
159
174
|
- Rakefile
|
160
175
|
- VERSION
|
176
|
+
- gemfiles/rack_1.gemfile
|
161
177
|
- lib/3scale/authorize_response.rb
|
162
178
|
- lib/3scale/client.rb
|
163
179
|
- lib/3scale/client/http_client.rb
|
@@ -182,7 +198,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
198
|
requirements:
|
183
199
|
- - ">="
|
184
200
|
- !ruby/object:Gem::Version
|
185
|
-
version: '0'
|
201
|
+
version: '2.0'
|
186
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
203
|
requirements:
|
188
204
|
- - ">="
|
@@ -190,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
206
|
version: '0'
|
191
207
|
requirements: []
|
192
208
|
rubyforge_project:
|
193
|
-
rubygems_version: 2.6.
|
209
|
+
rubygems_version: 2.6.6
|
194
210
|
signing_key:
|
195
211
|
specification_version: 4
|
196
212
|
summary: Client for 3scale Web Service Management System API
|