hey_doctor 1.0.0

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