pisoni 1.23.1
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 +7 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +16 -0
- data/LICENSE +202 -0
- data/Makefile +73 -0
- data/NOTICE +15 -0
- data/README.md +47 -0
- data/Rakefile +27 -0
- data/lib/3scale/core/alert_limit.rb +32 -0
- data/lib/3scale/core/api_client/attributes.rb +56 -0
- data/lib/3scale/core/api_client/collection.rb +19 -0
- data/lib/3scale/core/api_client/operations.rb +233 -0
- data/lib/3scale/core/api_client/resource.rb +52 -0
- data/lib/3scale/core/api_client/support.rb +55 -0
- data/lib/3scale/core/api_client.rb +5 -0
- data/lib/3scale/core/application.rb +67 -0
- data/lib/3scale/core/application_key.rb +34 -0
- data/lib/3scale/core/application_referrer_filter.rb +33 -0
- data/lib/3scale/core/errors.rb +130 -0
- data/lib/3scale/core/event.rb +26 -0
- data/lib/3scale/core/logger.rb +12 -0
- data/lib/3scale/core/metric.rb +32 -0
- data/lib/3scale/core/service.rb +82 -0
- data/lib/3scale/core/service_error.rb +34 -0
- data/lib/3scale/core/service_token.rb +39 -0
- data/lib/3scale/core/transaction.rb +26 -0
- data/lib/3scale/core/usage_limit.rb +40 -0
- data/lib/3scale/core/user.rb +47 -0
- data/lib/3scale/core/utilization.rb +28 -0
- data/lib/3scale/core/version.rb +5 -0
- data/lib/3scale/core.rb +63 -0
- data/lib/3scale_core.rb +1 -0
- data/lib/pisoni.rb +5 -0
- data/pisoni.gemspec +43 -0
- data/spec/alert_limit_spec.rb +72 -0
- data/spec/application_key_spec.rb +97 -0
- data/spec/application_referrer_filter_spec.rb +57 -0
- data/spec/application_spec.rb +188 -0
- data/spec/event_spec.rb +82 -0
- data/spec/metric_spec.rb +115 -0
- data/spec/private_endpoints/event.rb +9 -0
- data/spec/private_endpoints/service_error.rb +10 -0
- data/spec/private_endpoints/transaction.rb +16 -0
- data/spec/service_error_spec.rb +128 -0
- data/spec/service_spec.rb +159 -0
- data/spec/service_token_spec.rb +121 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/transaction_spec.rb +71 -0
- data/spec/usagelimit_spec.rb +52 -0
- data/spec/user_spec.rb +164 -0
- data/spec/utilization_spec.rb +113 -0
- metadata +182 -0
@@ -0,0 +1,159 @@
|
|
1
|
+
require_relative './spec_helper'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module Core
|
5
|
+
describe Service do
|
6
|
+
let(:default_service_id) { 7001 }
|
7
|
+
let(:non_default_service_id) { default_service_id.succ }
|
8
|
+
let(:non_existent_service_id) { non_default_service_id.succ }
|
9
|
+
let(:default_provider_key) { 'foo' }
|
10
|
+
let(:other_provider_key) { 'bazinga' }
|
11
|
+
let(:another_provider_key) { 'bar' }
|
12
|
+
let(:non_existent_provider_key) { 'bunga' }
|
13
|
+
|
14
|
+
before do
|
15
|
+
# We create a new service for our provider as the default, then
|
16
|
+
# delete the service id we'll be using as the default service and
|
17
|
+
# then create it -- this way we're sure we don't reuse anything from
|
18
|
+
# previous runs.
|
19
|
+
service = Service.save! provider_key: default_provider_key,
|
20
|
+
id: non_default_service_id,
|
21
|
+
default_service: true
|
22
|
+
Service.load_by_id(service.id)
|
23
|
+
Service.delete_by_id!(default_service_id) rescue nil
|
24
|
+
|
25
|
+
service = Service.save! provider_key: default_provider_key,
|
26
|
+
id: default_service_id,
|
27
|
+
referrer_filters_required: true,
|
28
|
+
backend_version: 'oauth',
|
29
|
+
default_user_plan_id: 15,
|
30
|
+
default_user_plan_name: 'test name',
|
31
|
+
default_service: true
|
32
|
+
raise unless service.default_service
|
33
|
+
|
34
|
+
Service.delete_by_id!(non_default_service_id)
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '.load_by_id' do
|
38
|
+
describe 'with an existing service' do
|
39
|
+
it 'returns a Service object' do
|
40
|
+
Service.load_by_id(default_service_id).class.must_equal Service
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'parses data from received JSON' do
|
44
|
+
service = Service.load_by_id(default_service_id)
|
45
|
+
|
46
|
+
service.wont_be_nil
|
47
|
+
service.provider_key.must_equal default_provider_key
|
48
|
+
service.id.must_equal default_service_id.to_s
|
49
|
+
service.referrer_filters_required?.must_equal true
|
50
|
+
service.user_registration_required?.must_equal true
|
51
|
+
service.backend_version.must_equal 'oauth'
|
52
|
+
service.default_user_plan_id.must_equal '15'
|
53
|
+
service.default_user_plan_name.must_equal 'test name'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'with a missing service' do
|
58
|
+
it 'returns nil' do
|
59
|
+
Service.load_by_id(non_existent_service_id).must_be_nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '.delete_by_id!' do
|
65
|
+
before do
|
66
|
+
Service.save! provider_key: default_provider_key,
|
67
|
+
id: default_service_id,
|
68
|
+
default_service: true
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns true if deleting a non-default service' do
|
72
|
+
Service.save! provider_key: default_provider_key,
|
73
|
+
id: non_default_service_id
|
74
|
+
Service.delete_by_id!(non_default_service_id).must_equal true
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'raises an exception when deleting a default service' do
|
78
|
+
lambda do
|
79
|
+
Service.delete_by_id! default_service_id
|
80
|
+
end.must_raise ServiceIsDefaultService
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '.save!' do
|
85
|
+
before do
|
86
|
+
@service_params = {
|
87
|
+
provider_key: default_provider_key,
|
88
|
+
id: non_default_service_id
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'returns service object' do
|
93
|
+
service = Service.save!(@service_params)
|
94
|
+
|
95
|
+
service.wont_be_nil
|
96
|
+
service.class.must_equal Service
|
97
|
+
service.id.must_equal non_default_service_id
|
98
|
+
service.provider_key.must_equal default_provider_key
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'raises an exception when missing a default user plan' do
|
102
|
+
@service_params.merge! user_registration_required: false
|
103
|
+
|
104
|
+
lambda do
|
105
|
+
Service.save!(@service_params)
|
106
|
+
end.must_raise ServiceRequiresDefaultUserPlan
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '.make_default' do
|
111
|
+
it 'returns the updated service' do
|
112
|
+
service = Service.save!(id: non_default_service_id,
|
113
|
+
provider_key: default_provider_key)
|
114
|
+
Service.make_default(service.id).class.must_equal Service
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '.change_provider_key!' do
|
119
|
+
def with_changed_provider_key(from, to)
|
120
|
+
val = Service.change_provider_key!(from, to)
|
121
|
+
yield val
|
122
|
+
# change it back
|
123
|
+
Service.change_provider_key!(to, from)
|
124
|
+
end
|
125
|
+
|
126
|
+
before do
|
127
|
+
Service.save! provider_key: default_provider_key,
|
128
|
+
id: default_service_id
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'returns true' do
|
132
|
+
with_changed_provider_key default_provider_key, other_provider_key do |val|
|
133
|
+
val.must_equal true
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'raises an exception when the key to change doesn\'t exist' do
|
138
|
+
lambda do
|
139
|
+
with_changed_provider_key(non_existent_provider_key, 'baz') { }
|
140
|
+
end.must_raise ProviderKeyNotFound
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'raises an exception when the new key already exists' do
|
144
|
+
Service.save! provider_key: another_provider_key, id: non_default_service_id
|
145
|
+
|
146
|
+
lambda do
|
147
|
+
with_changed_provider_key(default_provider_key, another_provider_key) { }
|
148
|
+
end.must_raise ProviderKeyExists
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'raises an exception when the keys are invalid' do
|
152
|
+
lambda do
|
153
|
+
with_changed_provider_key(default_provider_key, '') { }
|
154
|
+
end.must_raise InvalidProviderKeys
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require_relative './spec_helper'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module Core
|
5
|
+
describe ServiceToken do
|
6
|
+
|
7
|
+
let(:service_id) { '12345' }
|
8
|
+
let(:token) { 'abcd' }
|
9
|
+
let(:save_service_token_params) do
|
10
|
+
{
|
11
|
+
ab: { service_id: '1' },
|
12
|
+
cd: { service_id: '2' },
|
13
|
+
ef: { service_id: '3' }
|
14
|
+
}
|
15
|
+
end
|
16
|
+
let(:delete_service_token_params) do
|
17
|
+
save_service_token_params.map do |token, params|
|
18
|
+
{ service_id: params[:service_id], service_token: token }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.save' do
|
23
|
+
|
24
|
+
describe 'when saving one token' do
|
25
|
+
before do
|
26
|
+
ServiceToken.delete([{ service_id: service_id, service_token: token }])
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'saves a service token' do
|
30
|
+
assert ServiceToken.save!(token => { service_id: service_id })
|
31
|
+
|
32
|
+
result = ServiceToken.delete([{ service_id: service_id, service_token: token }])
|
33
|
+
|
34
|
+
assert_equal result, 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'when saving more tokens at once' do
|
39
|
+
before do
|
40
|
+
ServiceToken.delete(delete_service_token_params)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'saves service tokens' do
|
44
|
+
assert ServiceToken.save!(save_service_token_params)
|
45
|
+
|
46
|
+
result = ServiceToken.delete(delete_service_token_params)
|
47
|
+
|
48
|
+
assert_equal result, save_service_token_params.size
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'when the parameters are blank' do
|
53
|
+
it 'does not save a service token' do
|
54
|
+
assert_raises ServiceTokenMissingParameter do
|
55
|
+
ServiceToken.save!({})
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'when the service ID is nil' do
|
61
|
+
it 'does not save a service token' do
|
62
|
+
assert_raises ServiceTokenRequiresServiceId do
|
63
|
+
ServiceToken.save!(token => { service_id: nil })
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'when the service ID parameter does not exist' do
|
69
|
+
it 'does not save a service token' do
|
70
|
+
assert_raises ServiceTokenRequiresServiceId do
|
71
|
+
ServiceToken.save!(token => { id: service_id })
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'when the token parameter does not exist' do
|
77
|
+
it 'does not save a service token' do
|
78
|
+
assert_raises ServiceTokenRequiresToken do
|
79
|
+
ServiceToken.save!('' => { service_id: service_id })
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '.delete' do
|
86
|
+
|
87
|
+
describe 'when deleting one token' do
|
88
|
+
before do
|
89
|
+
ServiceToken.save!(token => { service_id: service_id })
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'deletes a service token' do
|
93
|
+
result = ServiceToken.delete([{ service_id: service_id, service_token: token }])
|
94
|
+
|
95
|
+
assert_equal result, 1
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe 'when deleting more tokens at once' do
|
100
|
+
before do
|
101
|
+
ServiceToken.save!(save_service_token_params)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'deletes service tokens' do
|
105
|
+
result = ServiceToken.delete(delete_service_token_params)
|
106
|
+
|
107
|
+
assert_equal result, delete_service_token_params.size
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe 'when deleting non existing token' do
|
112
|
+
it 'returns zero count' do
|
113
|
+
result = ServiceToken.delete([{ service_id: '1', service_token: 'a' }])
|
114
|
+
|
115
|
+
assert_equal result, 0
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
if ENV['COVERAGE'] && !ENV['COVERAGE'].empty?
|
2
|
+
require 'codeclimate-test-reporter'
|
3
|
+
SimpleCov.start do
|
4
|
+
formatter ENV['CODECLIMATE_REPO_TOKEN'] ?
|
5
|
+
CodeClimate::TestReporter::Formatter :
|
6
|
+
SimpleCov::Formatter::HTMLFormatter
|
7
|
+
add_filter '/spec/'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
12
|
+
|
13
|
+
require 'minitest/autorun'
|
14
|
+
require 'bundler/setup'
|
15
|
+
Bundler.require(:default, :development, :test)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative './spec_helper'
|
2
|
+
require_relative './private_endpoints/transaction'
|
3
|
+
|
4
|
+
module ThreeScale
|
5
|
+
module Core
|
6
|
+
describe Transaction do
|
7
|
+
before do
|
8
|
+
Service.delete_by_id!(service_id)
|
9
|
+
Service.save!(provider_key: 'foo', id: service_id)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.load_all' do
|
13
|
+
let(:service_id) { '7575' }
|
14
|
+
let(:non_existing_service_id) { service_id.to_i.succ.to_s }
|
15
|
+
|
16
|
+
before do
|
17
|
+
Transaction.delete_all(service_id)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'when there are transactions' do
|
21
|
+
let(:first_transaction_time) { Time.new(2015, 1, 1) }
|
22
|
+
let(:second_transaction_time) { Time.new(2015, 1, 2) }
|
23
|
+
let(:test_transactions) do
|
24
|
+
transactions = []
|
25
|
+
transactions << { application_id: 'first_test_application',
|
26
|
+
usage: 'first_usage',
|
27
|
+
timestamp: first_transaction_time.to_s }
|
28
|
+
transactions << { application_id: 'second_test_application',
|
29
|
+
usage: 'second_usage',
|
30
|
+
timestamp: second_transaction_time.to_s }
|
31
|
+
end
|
32
|
+
|
33
|
+
before do
|
34
|
+
Transaction.save(service_id, test_transactions)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns a collection with the transactions' do
|
38
|
+
transactions = Transaction.load_all(service_id)
|
39
|
+
|
40
|
+
transactions.total.must_equal test_transactions.size
|
41
|
+
transactions.size.must_equal test_transactions.size
|
42
|
+
|
43
|
+
latest_transaction = transactions[0]
|
44
|
+
latest_transaction.application_id.must_equal test_transactions[1][:application_id]
|
45
|
+
latest_transaction.usage.must_equal test_transactions[1][:usage]
|
46
|
+
latest_transaction.timestamp.must_equal second_transaction_time
|
47
|
+
|
48
|
+
previous_transaction = transactions[1]
|
49
|
+
previous_transaction.application_id.must_equal test_transactions[0][:application_id]
|
50
|
+
previous_transaction.usage.must_equal test_transactions[0][:usage]
|
51
|
+
previous_transaction.timestamp.must_equal first_transaction_time
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'when there are no transactions' do
|
56
|
+
it 'returns an empty collection' do
|
57
|
+
transactions = Transaction.load_all(service_id)
|
58
|
+
transactions.must_be_empty
|
59
|
+
transactions.total.must_equal 0
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe 'with an invalid service ID' do
|
64
|
+
it 'returns nil' do
|
65
|
+
Transaction.load_all(non_existing_service_id).must_be_nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative './spec_helper'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module Core
|
5
|
+
describe UsageLimit do
|
6
|
+
before do
|
7
|
+
@sample_period_limits = { eternity: 10_000_000, year: 2_000_000, month: 700_000,
|
8
|
+
week: 300_000, hour: 5_000, minute: 200 }
|
9
|
+
@sample_period_limits.each do |p, l|
|
10
|
+
UsageLimit.save(service_id: '2001', plan_id: '3001',
|
11
|
+
metric_id: '4001', p => l)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'saves a UsageLimit' do
|
16
|
+
daylimit = 50
|
17
|
+
|
18
|
+
UsageLimit.save(service_id: '2001', plan_id: '3001', metric_id: '4002', day: daylimit)
|
19
|
+
UsageLimit.load_value('2001', '3001', '4002', :day).must_equal daylimit
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'correctly loads all periods of a UsageLimit' do
|
23
|
+
@sample_period_limits.keys.map do |p|
|
24
|
+
[p, UsageLimit.load_value('2001', '3001', '4001', p)]
|
25
|
+
end.to_h.must_equal @sample_period_limits
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns zero for a period without limit' do
|
29
|
+
period = (UsageLimit::PERIODS - @sample_period_limits.keys).sample
|
30
|
+
UsageLimit.load_value('2001', '3001', '4001', period).must_be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'deletes a given period from a sample usage limit' do
|
34
|
+
UsageLimit.delete('2001', '3001', '4001', :week)
|
35
|
+
|
36
|
+
UsageLimit.load_value('2001', '3001', '4001', :week).must_be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'raises if multiple periods are specified on .save' do
|
40
|
+
proc do
|
41
|
+
UsageLimit.save(service_id: '2001', plan_id: '3001', metric_id: '4002', day: 5, week: 10)
|
42
|
+
end.must_raise UsageLimitInvalidPeriods
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'raises if no periods are specified on .save' do
|
46
|
+
proc do
|
47
|
+
UsageLimit.save(service_id: '2001', plan_id: '3001', metric_id: '4002')
|
48
|
+
end.must_raise UsageLimitInvalidPeriods
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/spec/user_spec.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
require_relative './spec_helper'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module Core
|
5
|
+
describe User do
|
6
|
+
def nothing_raised
|
7
|
+
yield
|
8
|
+
true
|
9
|
+
rescue => e
|
10
|
+
e
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:service_id) { 2001 }
|
14
|
+
let(:nonexistent_service_id) { service_id.succ }
|
15
|
+
let(:provider_key) { 'provider_for_user_spec' }
|
16
|
+
let(:username) { 'pancho' }
|
17
|
+
let(:nonexistent_username) { 'rodolfo' }
|
18
|
+
let(:state) { :active }
|
19
|
+
let(:plan_id) { 6789 }
|
20
|
+
let(:plan_name) { 'plan_for_panchos' }
|
21
|
+
|
22
|
+
before do
|
23
|
+
Service.save! provider_key: provider_key,
|
24
|
+
id: service_id, default_service: true
|
25
|
+
|
26
|
+
Service.delete_by_id! nonexistent_service_id rescue nil
|
27
|
+
User.delete! service_id, nonexistent_username
|
28
|
+
@user = User.save! service_id: service_id, username: username, state: state,
|
29
|
+
plan_id: plan_id, plan_name: plan_name
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '.load' do
|
33
|
+
it 'returns a User object' do
|
34
|
+
User.load(service_id, username).class.must_equal User
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'parses data from received JSON' do
|
38
|
+
user = User.load(service_id, username)
|
39
|
+
|
40
|
+
user.wont_be_nil
|
41
|
+
user.service_id.must_equal service_id.to_s
|
42
|
+
user.state.must_equal state.to_s
|
43
|
+
user.plan_id.must_equal plan_id.to_s
|
44
|
+
user.plan_name.must_equal plan_name
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'raises when the service id is missing or empty' do
|
48
|
+
['', nil].each do |service_id|
|
49
|
+
lambda do
|
50
|
+
User.load service_id, username
|
51
|
+
end.must_raise UserRequiresServiceId
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'raises when the user name is missing or empty' do
|
56
|
+
['', nil].each do |user_name|
|
57
|
+
lambda do
|
58
|
+
User.load service_id, user_name
|
59
|
+
end.must_raise UserRequiresUsername
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'returns nil when a non-existent service id is used' do
|
64
|
+
User.load(nonexistent_service_id, username).must_be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'returns nil when a non-existent user name is used' do
|
68
|
+
User.load(service_id, nonexistent_username).must_be_nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '.save!' do
|
73
|
+
before do
|
74
|
+
User.delete! service_id, nonexistent_username
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'returns a User object' do
|
78
|
+
@user.wont_be_nil
|
79
|
+
@user.class.must_equal User
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns an object with the saved attributes' do
|
83
|
+
@user.wont_be_nil
|
84
|
+
@user.service_id.must_equal service_id.to_s
|
85
|
+
@user.username.must_equal username
|
86
|
+
@user.state.must_equal state.to_s
|
87
|
+
@user.plan_id.must_equal plan_id
|
88
|
+
@user.plan_name.must_equal plan_name
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'raises when the service id is missing or empty' do
|
92
|
+
['', nil].each do |service_id|
|
93
|
+
lambda do
|
94
|
+
User.save! service_id: service_id, username: username, plan_id: plan_id,
|
95
|
+
plan_name: plan_name
|
96
|
+
end.must_raise UserRequiresServiceId
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'raises when the user name is missing or empty' do
|
101
|
+
['', nil].each do |user_name|
|
102
|
+
lambda do
|
103
|
+
User.save! service_id: service_id, username: user_name, plan_id: plan_id,
|
104
|
+
plan_name: plan_name
|
105
|
+
end.must_raise UserRequiresUsername
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'raises when a non-existent service id is used' do
|
110
|
+
lambda do
|
111
|
+
User.save! service_id: nonexistent_service_id, username: username,
|
112
|
+
plan_id: plan_id, plan_name: plan_name
|
113
|
+
end.must_raise UserRequiresValidServiceId
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'raises when plan_id is nil' do
|
117
|
+
lambda do
|
118
|
+
User.save! service_id: service_id, username: username,
|
119
|
+
plan_id: nil, plan_name: plan_name
|
120
|
+
end.must_raise UserRequiresDefinedPlan
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'raises when plan_name is nil' do
|
124
|
+
lambda do
|
125
|
+
User.save! service_id: service_id, username: username,
|
126
|
+
plan_id: plan_id, plan_name: nil
|
127
|
+
end.must_raise UserRequiresDefinedPlan
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'returns a new user when a non-existent user name is used' do
|
131
|
+
nothing_raised do
|
132
|
+
User.save! service_id: service_id, username: nonexistent_username,
|
133
|
+
plan_id: plan_id, plan_name: plan_name
|
134
|
+
end.must_equal true
|
135
|
+
|
136
|
+
user = User.load service_id, nonexistent_username
|
137
|
+
|
138
|
+
user.wont_be_nil
|
139
|
+
user.service_id.must_equal service_id.to_s
|
140
|
+
user.username.must_equal nonexistent_username
|
141
|
+
user.state.must_equal state.to_s
|
142
|
+
user.plan_id.must_equal plan_id.to_s
|
143
|
+
user.plan_name.must_equal plan_name
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe '.delete!' do
|
148
|
+
before do
|
149
|
+
User.save! service_id: service_id, username: username, state: state,
|
150
|
+
plan_id: plan_id, plan_name: plan_name
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'deletes the user' do
|
154
|
+
nothing_raised do
|
155
|
+
User.delete! service_id, username
|
156
|
+
end.must_equal true
|
157
|
+
|
158
|
+
User.save! service_id: service_id, username: username, state: state,
|
159
|
+
plan_id: plan_id, plan_name: plan_name
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require_relative './spec_helper'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module Core
|
5
|
+
describe Utilization do
|
6
|
+
let(:service_id) { '1001' }
|
7
|
+
let(:non_existing_service_id) { service_id.to_i.succ.to_s }
|
8
|
+
let(:provider_key) { 'foo' }
|
9
|
+
|
10
|
+
let(:app_id) { '2001' }
|
11
|
+
let(:non_existing_app_id) { app_id.to_i.succ.to_s }
|
12
|
+
|
13
|
+
let(:plan) { { id: '3001', name: 'test_plan' } }
|
14
|
+
|
15
|
+
let(:metric) { { service_id: service_id, id: '4001', name: 'hits' } }
|
16
|
+
|
17
|
+
let(:app) do
|
18
|
+
{ service_id: service_id,
|
19
|
+
id: app_id,
|
20
|
+
state: :active,
|
21
|
+
plan_id: plan[:id],
|
22
|
+
plan_name: plan[:name] }
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:usage_limits) do
|
26
|
+
[{ service_id: service_id,
|
27
|
+
plan_id: plan[:id],
|
28
|
+
metric_id: metric[:id],
|
29
|
+
day: 100 },
|
30
|
+
{ service_id: service_id,
|
31
|
+
plan_id: plan[:id],
|
32
|
+
metric_id: metric[:id],
|
33
|
+
month: 200 }]
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '.load' do
|
37
|
+
before do
|
38
|
+
Service.delete_by_id!(service_id)
|
39
|
+
Service.save!(provider_key: provider_key, id: service_id)
|
40
|
+
|
41
|
+
Application.delete(service_id, app_id)
|
42
|
+
Application.save(app)
|
43
|
+
|
44
|
+
Metric.delete(service_id, metric[:id])
|
45
|
+
Metric.save(metric)
|
46
|
+
|
47
|
+
UsageLimit::PERIODS.each do |period|
|
48
|
+
usage_limits.each do |limit|
|
49
|
+
UsageLimit.delete(limit[:service_id],
|
50
|
+
limit[:plan_id],
|
51
|
+
limit[:metric_id],
|
52
|
+
period)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
usage_limits.each { |limit| UsageLimit.save(limit) }
|
56
|
+
|
57
|
+
Transaction.delete_all(service_id)
|
58
|
+
end
|
59
|
+
|
60
|
+
# This is a basic test that only checks the structure of the response.
|
61
|
+
# The reason is that we do not have an endpoint in backend that allows
|
62
|
+
# us to save utilization transactions. We could have added one, but we
|
63
|
+
# decided it was not worth it because of two reasons:
|
64
|
+
# 1) The method to add transactions manually in backend would have been
|
65
|
+
# a bit complex because script/test_external does not run any workers,
|
66
|
+
# and transactions are saved creating tasks executed by workers.
|
67
|
+
# 2) There is no way in backend to delete utilization transactions, so
|
68
|
+
# even if we added a method to save them, we would not be able to know
|
69
|
+
# how many are saved in the system to perform a proper test.
|
70
|
+
describe 'with app that has daily and monthly limits for a metric' do
|
71
|
+
subject { Utilization.load(service_id, app_id) }
|
72
|
+
|
73
|
+
it 'has the correct number of reports' do
|
74
|
+
# We could think that subject.size should equal usage_limits.size.
|
75
|
+
# However, we could have other limits previously saved in the
|
76
|
+
# backend. Therefore, we can only be sure that the size is equal or
|
77
|
+
# greater than usage_limits.size
|
78
|
+
subject.size.must_be :>=, usage_limits.size
|
79
|
+
subject.total.must_be :>=, usage_limits.size
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'has reports with all their attributes set' do
|
83
|
+
subject.each do |report|
|
84
|
+
Utilization.attributes.each do |utilization_attr|
|
85
|
+
report.send(utilization_attr).wont_be_nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'has reports with fields that have the correct type' do
|
91
|
+
example_report = subject.first
|
92
|
+
example_report.period.must_be_kind_of String
|
93
|
+
example_report.metric_name.must_be_kind_of String
|
94
|
+
example_report.max_value.must_be_kind_of Numeric
|
95
|
+
example_report.current_value.must_be_kind_of Numeric
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe 'with an invalid service ID' do
|
100
|
+
it 'returns nil' do
|
101
|
+
Utilization.load(non_existing_service_id, app_id).must_be_nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe 'with an invalid application ID' do
|
106
|
+
it 'returns nil' do
|
107
|
+
Utilization.load(service_id, non_existing_app_id).must_be_nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|