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.
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