pisoni 1.23.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|