hey_doctor 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +97 -0
  4. data/Rakefile +10 -0
  5. data/app/services/hey_doctor/check_application_health_service.rb +29 -0
  6. data/app/services/hey_doctor/check_database_health_service.rb +43 -0
  7. data/app/services/hey_doctor/check_redis_health_service.rb +31 -0
  8. data/lib/hey_doctor.rb +22 -0
  9. data/lib/hey_doctor/engine.rb +10 -0
  10. data/lib/hey_doctor/version.rb +5 -0
  11. data/lib/tasks/hey_doctor_tasks.rake +5 -0
  12. data/spec/dummy/Rakefile +6 -0
  13. data/spec/dummy/app/assets/config/manifest.js +1 -0
  14. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  15. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  16. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  17. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  18. data/spec/dummy/app/controllers/home_controller.rb +5 -0
  19. data/spec/dummy/app/javascript/packs/application.js +15 -0
  20. data/spec/dummy/app/jobs/application_job.rb +7 -0
  21. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  22. data/spec/dummy/app/models/application_record.rb +3 -0
  23. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  24. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  25. data/spec/dummy/bin/rails +4 -0
  26. data/spec/dummy/bin/rake +4 -0
  27. data/spec/dummy/bin/setup +33 -0
  28. data/spec/dummy/config.ru +11 -0
  29. data/spec/dummy/config/application.rb +42 -0
  30. data/spec/dummy/config/boot.rb +5 -0
  31. data/spec/dummy/config/cable.yml +10 -0
  32. data/spec/dummy/config/database.yml +21 -0
  33. data/spec/dummy/config/environment.rb +5 -0
  34. data/spec/dummy/config/environments/development.rb +66 -0
  35. data/spec/dummy/config/environments/production.rb +113 -0
  36. data/spec/dummy/config/environments/test.rb +59 -0
  37. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  38. data/spec/dummy/config/initializers/backtrace_silencers.rb +8 -0
  39. data/spec/dummy/config/initializers/cors.rb +16 -0
  40. data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  41. data/spec/dummy/config/initializers/inflections.rb +16 -0
  42. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  43. data/spec/dummy/config/initializers/redis.rb +1 -0
  44. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  45. data/spec/dummy/config/locales/en.yml +33 -0
  46. data/spec/dummy/config/puma.rb +43 -0
  47. data/spec/dummy/config/routes.rb +3 -0
  48. data/spec/dummy/config/storage.yml +34 -0
  49. data/spec/dummy/db/schema.rb +18 -0
  50. data/spec/dummy/log/development.log +1693 -0
  51. data/spec/dummy/log/test.log +1258 -0
  52. data/spec/dummy/tmp/development_secret.txt +1 -0
  53. data/spec/dummy/tmp/pids/server.pid +1 -0
  54. data/spec/lib/hey_doctor/hey_doctor_spec.rb +42 -0
  55. data/spec/rails_helper.rb +27 -0
  56. data/spec/requests/health_check_spec.rb +28 -0
  57. data/spec/services/hey_doctor/check_application_health_service_spec.rb +46 -0
  58. data/spec/services/hey_doctor/check_database_health_service_spec.rb +91 -0
  59. data/spec/services/hey_doctor/check_redis_health_service_spec.rb +56 -0
  60. data/spec/spec_helper.rb +25 -0
  61. metadata +240 -0
@@ -0,0 +1 @@
1
+ 6c551440807532181e3e1a6bdfb56b4ef8baadbd7e5b3d24cc76fe479bc2a64b9fec206c9cae0a8f3b1e2de825e495322c1ccd215cec04058f0477b7436a95a3
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe '.Rack HealthCheck endpoint' do
6
+ let(:expected_response) do
7
+ {
8
+ app: {
9
+ message: 'foo',
10
+ success: true
11
+ },
12
+ database: {
13
+ message: 'foo',
14
+ success: true
15
+ },
16
+ redis: {
17
+ message: 'foo',
18
+ success: true
19
+ }
20
+ }.to_json
21
+ end
22
+
23
+ let(:env) { { 'REQUEST_METHOD' => 'GET', 'PATH_INFO' => '/_ah/health' } }
24
+
25
+ before do
26
+ allow(HeyDoctor::CheckApplicationHealthService).to receive(:call)
27
+ .and_return({ message: 'foo', success: true })
28
+
29
+ allow(HeyDoctor::CheckDatabaseHealthService).to receive(:call)
30
+ .and_return({ message: 'foo', success: true })
31
+
32
+ allow(HeyDoctor::CheckRedisHealthService).to receive(:call)
33
+ .and_return({ message: 'foo', success: true })
34
+ end
35
+
36
+ it 'build the json response' do
37
+ response = HeyDoctor::Rack::HealthCheck.new.call(env)
38
+ body = response[2].first
39
+
40
+ expect(body).to eq(expected_response)
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ ENV['RAILS_ENV'] ||= 'test'
5
+
6
+ require File.expand_path('dummy/config/environment.rb', __dir__)
7
+
8
+ if Rails.env.production?
9
+ abort('The Rails environment is running in production mode!')
10
+ end
11
+ require 'rspec/rails'
12
+ # Add additional requires below this line. Rails is not loaded until this point!
13
+
14
+ begin
15
+ ActiveRecord::Migration.maintain_test_schema!
16
+ rescue ActiveRecord::PendingMigrationError => e
17
+ puts e.to_s.strip
18
+ exit 1
19
+ end
20
+
21
+ RSpec.configure do |config|
22
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
23
+
24
+ config.use_transactional_fixtures = true
25
+ config.infer_spec_type_from_file_location!
26
+ config.filter_rails_from_backtrace!
27
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe 'Health Check endpoint', type: :request do
6
+ let(:expected_response) do
7
+ {
8
+ app: {
9
+ message: 'Application is running',
10
+ success: true
11
+ },
12
+ database: {
13
+ message: 'Database is connected',
14
+ success: true
15
+ },
16
+ redis: {
17
+ message: 'Redis is connected',
18
+ success: true
19
+ }
20
+ }.to_json
21
+ end
22
+
23
+ before { get '/_ah/health' }
24
+
25
+ xit 'builds the response' do
26
+ expect(response.body).to eq(expected_response)
27
+ end
28
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+ require 'net/http'
5
+
6
+ RSpec.describe HeyDoctor::CheckApplicationHealthService do
7
+ describe '.call' do
8
+ let(:http) { double }
9
+
10
+ before do
11
+ allow(Net::HTTP).to receive(:start).and_yield(http)
12
+
13
+ allow(http).to receive(:head).and_return(response_double)
14
+ end
15
+
16
+ context 'When app is running' do
17
+ let(:expected_response) do
18
+ {
19
+ message: 'Application is running',
20
+ success: true
21
+ }
22
+ end
23
+
24
+ let(:response_double) { double(Net::HTTP, code: '200') }
25
+
26
+ it 'respond with success' do
27
+ expect(described_class.call).to eq(expected_response)
28
+ end
29
+ end
30
+
31
+ context 'When app is down' do
32
+ let(:expected_response) do
33
+ {
34
+ message: 'Application down, call the firefighters',
35
+ success: false
36
+ }
37
+ end
38
+
39
+ let(:response_double) { double(Net::HTTP, code: '500') }
40
+
41
+ it 'respond with success' do
42
+ expect(described_class.call).to eq(expected_response)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe HeyDoctor::CheckDatabaseHealthService do
6
+ describe '.call' do
7
+ context 'when it is connected' do
8
+ let(:expected_response) do
9
+ {
10
+ message: 'Database is connected',
11
+ success: true
12
+ }
13
+ end
14
+
15
+ it 'respond with success' do
16
+ expect(described_class.call).to eq(expected_response)
17
+ end
18
+ end
19
+
20
+ context 'when it is not connected' do
21
+ let(:expected_response) do
22
+ {
23
+ message: 'Error connecting to database',
24
+ success: false
25
+ }
26
+ end
27
+
28
+ before do
29
+ allow(ActiveRecord::Base).to receive(:connection)
30
+ .and_raise(ActiveRecord::StatementInvalid)
31
+ end
32
+
33
+ it 'respond with success' do
34
+ expect(described_class.call).to eq(expected_response)
35
+ end
36
+ end
37
+
38
+ context 'When migration is Pending' do
39
+ let(:expected_response) do
40
+ {
41
+ message: 'Pending migrations detected',
42
+ success: true
43
+ }
44
+ end
45
+
46
+ before do
47
+ allow(described_class).to receive(:connected?).and_return(true).twice
48
+ allow(described_class).to receive(:needs_migration?).and_return(true)
49
+ end
50
+
51
+ it 'respond with success' do
52
+ expect(described_class.call).to eq(expected_response)
53
+ end
54
+ end
55
+ end
56
+
57
+ describe '.connected?' do
58
+ context 'when it is connected' do
59
+ it 'respond with success' do
60
+ expect(described_class.send(:connected?)).to eq(true)
61
+ end
62
+ end
63
+
64
+ context 'when it is not connected' do
65
+ before do
66
+ allow(ActiveRecord::Base).to receive(:connection)
67
+ .and_raise(ActiveRecord::StatementInvalid)
68
+ end
69
+
70
+ it 'respond with success' do
71
+ expect(described_class.send(:connected?)).to eq(false)
72
+ end
73
+ end
74
+ end
75
+
76
+ describe 'needs_migration?' do
77
+ context 'when migration is Pending' do
78
+ before do
79
+ allow(described_class).to receive(:connected?).and_return(true).twice
80
+
81
+ allow(ActiveRecord::Base).to receive_message_chain(
82
+ :connection, :migration_context, :needs_migration?
83
+ ).and_return(true)
84
+ end
85
+
86
+ it 'respond with success' do
87
+ expect(described_class.send(:needs_migration?)).to eq(true)
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe HeyDoctor::CheckRedisHealthService do
6
+ describe '.call' do
7
+ context 'when it is connected' do
8
+ let(:expected_response) do
9
+ {
10
+ message: 'Redis is connected',
11
+ success: true
12
+ }
13
+ end
14
+
15
+ it 'respond with success' do
16
+ expect(described_class.call).to eq(expected_response)
17
+ end
18
+ end
19
+
20
+ context 'when it is not connected' do
21
+ let(:expected_response) do
22
+ {
23
+ message: 'Error connecting to redis',
24
+ success: false
25
+ }
26
+ end
27
+
28
+ before do
29
+ allow(Redis.current).to receive(:get).and_raise(NameError)
30
+ end
31
+
32
+ it 'respond with success' do
33
+ expect(described_class.call).to eq(expected_response)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe '.connected?' do
39
+ context 'when it is connected' do
40
+ it 'respond with success' do
41
+ expect(described_class.send(:connected?)).to eq(true)
42
+ end
43
+ end
44
+
45
+ context 'when it is not connected' do
46
+ before do
47
+ allow(Redis.current).to receive(:get)
48
+ .and_raise(Redis::CannotConnectError)
49
+ end
50
+
51
+ it 'respond with success' do
52
+ expect(described_class.send(:connected?)).to eq(false)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+ require 'rack/test'
5
+
6
+ SimpleCov.start 'rails' do
7
+ add_filter '/bin'
8
+ add_filter '/coverage'
9
+ add_filter '/db'
10
+ add_filter '/lib/hey_doctor/version.rb'
11
+ end
12
+
13
+ SimpleCov.minimum_coverage 95
14
+
15
+ RSpec.configure do |config|
16
+ config.expect_with :rspec do |expectations|
17
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
18
+ end
19
+
20
+ config.mock_with :rspec do |mocks|
21
+ mocks.verify_partial_doubles = true
22
+ end
23
+
24
+ config.shared_context_metadata_behavior = :apply_to_host_groups
25
+ end
metadata ADDED
@@ -0,0 +1,240 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hey_doctor
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Matheus Acosta
8
+ - Erick Nascimento
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-01-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: dotenv-rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: redis
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec-rails
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubocop-rails
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rails
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 4.2.10
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 4.2.10
98
+ description: It mounts a middleware endpoint to check the stack health.
99
+ email:
100
+ - matheus.martins@deliverycenter.com
101
+ - erick.nascimento@deliverycenter.com
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - MIT-LICENSE
107
+ - README.md
108
+ - Rakefile
109
+ - app/services/hey_doctor/check_application_health_service.rb
110
+ - app/services/hey_doctor/check_database_health_service.rb
111
+ - app/services/hey_doctor/check_redis_health_service.rb
112
+ - lib/hey_doctor.rb
113
+ - lib/hey_doctor/engine.rb
114
+ - lib/hey_doctor/version.rb
115
+ - lib/tasks/hey_doctor_tasks.rake
116
+ - spec/dummy/Rakefile
117
+ - spec/dummy/app/assets/config/manifest.js
118
+ - spec/dummy/app/assets/stylesheets/application.css
119
+ - spec/dummy/app/channels/application_cable/channel.rb
120
+ - spec/dummy/app/channels/application_cable/connection.rb
121
+ - spec/dummy/app/controllers/application_controller.rb
122
+ - spec/dummy/app/controllers/home_controller.rb
123
+ - spec/dummy/app/javascript/packs/application.js
124
+ - spec/dummy/app/jobs/application_job.rb
125
+ - spec/dummy/app/mailers/application_mailer.rb
126
+ - spec/dummy/app/models/application_record.rb
127
+ - spec/dummy/app/views/layouts/mailer.html.erb
128
+ - spec/dummy/app/views/layouts/mailer.text.erb
129
+ - spec/dummy/bin/rails
130
+ - spec/dummy/bin/rake
131
+ - spec/dummy/bin/setup
132
+ - spec/dummy/config.ru
133
+ - spec/dummy/config/application.rb
134
+ - spec/dummy/config/boot.rb
135
+ - spec/dummy/config/cable.yml
136
+ - spec/dummy/config/database.yml
137
+ - spec/dummy/config/environment.rb
138
+ - spec/dummy/config/environments/development.rb
139
+ - spec/dummy/config/environments/production.rb
140
+ - spec/dummy/config/environments/test.rb
141
+ - spec/dummy/config/initializers/application_controller_renderer.rb
142
+ - spec/dummy/config/initializers/backtrace_silencers.rb
143
+ - spec/dummy/config/initializers/cors.rb
144
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
145
+ - spec/dummy/config/initializers/inflections.rb
146
+ - spec/dummy/config/initializers/mime_types.rb
147
+ - spec/dummy/config/initializers/redis.rb
148
+ - spec/dummy/config/initializers/wrap_parameters.rb
149
+ - spec/dummy/config/locales/en.yml
150
+ - spec/dummy/config/puma.rb
151
+ - spec/dummy/config/routes.rb
152
+ - spec/dummy/config/storage.yml
153
+ - spec/dummy/db/schema.rb
154
+ - spec/dummy/log/development.log
155
+ - spec/dummy/log/test.log
156
+ - spec/dummy/tmp/development_secret.txt
157
+ - spec/dummy/tmp/pids/server.pid
158
+ - spec/lib/hey_doctor/hey_doctor_spec.rb
159
+ - spec/rails_helper.rb
160
+ - spec/requests/health_check_spec.rb
161
+ - spec/services/hey_doctor/check_application_health_service_spec.rb
162
+ - spec/services/hey_doctor/check_database_health_service_spec.rb
163
+ - spec/services/hey_doctor/check_redis_health_service_spec.rb
164
+ - spec/spec_helper.rb
165
+ homepage: https://github.com/deliverycenter/hey_doctor
166
+ licenses:
167
+ - MIT
168
+ metadata:
169
+ homepage_uri: https://github.com/deliverycenter/hey_doctor
170
+ source_code_uri: https://github.com/deliverycenter/hey_doctor
171
+ changelog_uri: https://github.com/deliverycenter/hey_doctor
172
+ post_install_message:
173
+ rdoc_options: []
174
+ require_paths:
175
+ - lib
176
+ required_ruby_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: 2.5.3
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ requirements: []
187
+ rubygems_version: 3.0.3
188
+ signing_key:
189
+ specification_version: 4
190
+ summary: A health check gem implementation in ruby.
191
+ test_files:
192
+ - spec/dummy/Rakefile
193
+ - spec/dummy/app/assets/config/manifest.js
194
+ - spec/dummy/app/assets/stylesheets/application.css
195
+ - spec/dummy/app/channels/application_cable/channel.rb
196
+ - spec/dummy/app/channels/application_cable/connection.rb
197
+ - spec/dummy/app/controllers/application_controller.rb
198
+ - spec/dummy/app/controllers/home_controller.rb
199
+ - spec/dummy/app/javascript/packs/application.js
200
+ - spec/dummy/app/jobs/application_job.rb
201
+ - spec/dummy/app/mailers/application_mailer.rb
202
+ - spec/dummy/app/models/application_record.rb
203
+ - spec/dummy/app/views/layouts/mailer.html.erb
204
+ - spec/dummy/app/views/layouts/mailer.text.erb
205
+ - spec/dummy/bin/rails
206
+ - spec/dummy/bin/rake
207
+ - spec/dummy/bin/setup
208
+ - spec/dummy/config/application.rb
209
+ - spec/dummy/config/boot.rb
210
+ - spec/dummy/config/cable.yml
211
+ - spec/dummy/config/database.yml
212
+ - spec/dummy/config/environment.rb
213
+ - spec/dummy/config/environments/development.rb
214
+ - spec/dummy/config/environments/production.rb
215
+ - spec/dummy/config/environments/test.rb
216
+ - spec/dummy/config/initializers/application_controller_renderer.rb
217
+ - spec/dummy/config/initializers/backtrace_silencers.rb
218
+ - spec/dummy/config/initializers/cors.rb
219
+ - spec/dummy/config/initializers/filter_parameter_logging.rb
220
+ - spec/dummy/config/initializers/inflections.rb
221
+ - spec/dummy/config/initializers/mime_types.rb
222
+ - spec/dummy/config/initializers/redis.rb
223
+ - spec/dummy/config/initializers/wrap_parameters.rb
224
+ - spec/dummy/config/locales/en.yml
225
+ - spec/dummy/config/puma.rb
226
+ - spec/dummy/config/routes.rb
227
+ - spec/dummy/config/storage.yml
228
+ - spec/dummy/config.ru
229
+ - spec/dummy/db/schema.rb
230
+ - spec/dummy/log/development.log
231
+ - spec/dummy/log/test.log
232
+ - spec/dummy/tmp/development_secret.txt
233
+ - spec/dummy/tmp/pids/server.pid
234
+ - spec/lib/hey_doctor/hey_doctor_spec.rb
235
+ - spec/rails_helper.rb
236
+ - spec/requests/health_check_spec.rb
237
+ - spec/services/hey_doctor/check_application_health_service_spec.rb
238
+ - spec/services/hey_doctor/check_database_health_service_spec.rb
239
+ - spec/services/hey_doctor/check_redis_health_service_spec.rb
240
+ - spec/spec_helper.rb