pisoni 1.23.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +9 -0
  3. data/Gemfile +16 -0
  4. data/LICENSE +202 -0
  5. data/Makefile +73 -0
  6. data/NOTICE +15 -0
  7. data/README.md +47 -0
  8. data/Rakefile +27 -0
  9. data/lib/3scale/core/alert_limit.rb +32 -0
  10. data/lib/3scale/core/api_client/attributes.rb +56 -0
  11. data/lib/3scale/core/api_client/collection.rb +19 -0
  12. data/lib/3scale/core/api_client/operations.rb +233 -0
  13. data/lib/3scale/core/api_client/resource.rb +52 -0
  14. data/lib/3scale/core/api_client/support.rb +55 -0
  15. data/lib/3scale/core/api_client.rb +5 -0
  16. data/lib/3scale/core/application.rb +67 -0
  17. data/lib/3scale/core/application_key.rb +34 -0
  18. data/lib/3scale/core/application_referrer_filter.rb +33 -0
  19. data/lib/3scale/core/errors.rb +130 -0
  20. data/lib/3scale/core/event.rb +26 -0
  21. data/lib/3scale/core/logger.rb +12 -0
  22. data/lib/3scale/core/metric.rb +32 -0
  23. data/lib/3scale/core/service.rb +82 -0
  24. data/lib/3scale/core/service_error.rb +34 -0
  25. data/lib/3scale/core/service_token.rb +39 -0
  26. data/lib/3scale/core/transaction.rb +26 -0
  27. data/lib/3scale/core/usage_limit.rb +40 -0
  28. data/lib/3scale/core/user.rb +47 -0
  29. data/lib/3scale/core/utilization.rb +28 -0
  30. data/lib/3scale/core/version.rb +5 -0
  31. data/lib/3scale/core.rb +63 -0
  32. data/lib/3scale_core.rb +1 -0
  33. data/lib/pisoni.rb +5 -0
  34. data/pisoni.gemspec +43 -0
  35. data/spec/alert_limit_spec.rb +72 -0
  36. data/spec/application_key_spec.rb +97 -0
  37. data/spec/application_referrer_filter_spec.rb +57 -0
  38. data/spec/application_spec.rb +188 -0
  39. data/spec/event_spec.rb +82 -0
  40. data/spec/metric_spec.rb +115 -0
  41. data/spec/private_endpoints/event.rb +9 -0
  42. data/spec/private_endpoints/service_error.rb +10 -0
  43. data/spec/private_endpoints/transaction.rb +16 -0
  44. data/spec/service_error_spec.rb +128 -0
  45. data/spec/service_spec.rb +159 -0
  46. data/spec/service_token_spec.rb +121 -0
  47. data/spec/spec_helper.rb +15 -0
  48. data/spec/transaction_spec.rb +71 -0
  49. data/spec/usagelimit_spec.rb +52 -0
  50. data/spec/user_spec.rb +164 -0
  51. data/spec/utilization_spec.rb +113 -0
  52. 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
@@ -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