active_record_doctor 1.7.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +287 -43
  3. data/lib/active_record_doctor/config/default.rb +59 -0
  4. data/lib/active_record_doctor/config/loader.rb +137 -0
  5. data/lib/active_record_doctor/config.rb +14 -0
  6. data/lib/active_record_doctor/detectors/base.rb +155 -0
  7. data/lib/active_record_doctor/detectors/extraneous_indexes.rb +114 -0
  8. data/lib/active_record_doctor/detectors/incorrect_boolean_presence_validation.rb +49 -0
  9. data/lib/active_record_doctor/detectors/incorrect_dependent_option.rb +107 -0
  10. data/lib/active_record_doctor/detectors/mismatched_foreign_key_type.rb +45 -0
  11. data/lib/active_record_doctor/detectors/missing_foreign_keys.rb +60 -0
  12. data/lib/active_record_doctor/detectors/missing_non_null_constraint.rb +72 -0
  13. data/lib/active_record_doctor/{tasks → detectors}/missing_presence_validation.rb +35 -21
  14. data/lib/active_record_doctor/detectors/missing_unique_indexes.rb +71 -0
  15. data/lib/active_record_doctor/detectors/short_primary_key_type.rb +41 -0
  16. data/lib/active_record_doctor/detectors/undefined_table_references.rb +33 -0
  17. data/lib/active_record_doctor/detectors/unindexed_deleted_at.rb +55 -0
  18. data/lib/active_record_doctor/detectors/unindexed_foreign_keys.rb +59 -0
  19. data/lib/active_record_doctor/detectors.rb +21 -0
  20. data/lib/active_record_doctor/errors.rb +226 -0
  21. data/lib/active_record_doctor/help.rb +39 -0
  22. data/lib/active_record_doctor/printers.rb +3 -1
  23. data/lib/active_record_doctor/railtie.rb +2 -0
  24. data/lib/active_record_doctor/rake/task.rb +78 -0
  25. data/lib/active_record_doctor/runner.rb +41 -0
  26. data/lib/active_record_doctor/version.rb +3 -1
  27. data/lib/active_record_doctor.rb +24 -2
  28. data/lib/generators/active_record_doctor/add_indexes/add_indexes_generator.rb +46 -29
  29. data/lib/tasks/active_record_doctor.rake +21 -29
  30. data/test/active_record_doctor/config/loader_test.rb +120 -0
  31. data/test/active_record_doctor/config_test.rb +116 -0
  32. data/test/active_record_doctor/detectors/extraneous_indexes_test.rb +190 -0
  33. data/test/active_record_doctor/detectors/incorrect_boolean_presence_validation_test.rb +79 -0
  34. data/test/active_record_doctor/detectors/incorrect_dependent_option_test.rb +295 -0
  35. data/test/active_record_doctor/detectors/mismatched_foreign_key_type_test.rb +82 -0
  36. data/test/active_record_doctor/detectors/missing_foreign_keys_test.rb +70 -0
  37. data/test/active_record_doctor/detectors/missing_non_null_constraint_test.rb +216 -0
  38. data/test/active_record_doctor/detectors/missing_presence_validation_test.rb +168 -0
  39. data/test/active_record_doctor/detectors/missing_unique_indexes_test.rb +163 -0
  40. data/test/active_record_doctor/detectors/short_primary_key_type_test.rb +64 -0
  41. data/test/active_record_doctor/detectors/undefined_table_references_test.rb +57 -0
  42. data/test/active_record_doctor/detectors/unindexed_deleted_at_test.rb +171 -0
  43. data/test/active_record_doctor/detectors/unindexed_foreign_keys_test.rb +78 -0
  44. data/test/active_record_doctor/runner_test.rb +42 -0
  45. data/test/generators/active_record_doctor/add_indexes/add_indexes_generator_test.rb +131 -0
  46. data/test/model_factory.rb +128 -0
  47. data/test/setup.rb +116 -0
  48. metadata +103 -154
  49. data/Rakefile +0 -28
  50. data/lib/active_record_doctor/printers/io_printer.rb +0 -105
  51. data/lib/active_record_doctor/tasks/base.rb +0 -78
  52. data/lib/active_record_doctor/tasks/extraneous_indexes.rb +0 -82
  53. data/lib/active_record_doctor/tasks/incorrect_boolean_presence_validation.rb +0 -33
  54. data/lib/active_record_doctor/tasks/missing_foreign_keys.rb +0 -46
  55. data/lib/active_record_doctor/tasks/missing_non_null_constraint.rb +0 -52
  56. data/lib/active_record_doctor/tasks/missing_unique_indexes.rb +0 -56
  57. data/lib/active_record_doctor/tasks/undefined_table_references.rb +0 -33
  58. data/lib/active_record_doctor/tasks/unindexed_deleted_at.rb +0 -19
  59. data/lib/active_record_doctor/tasks/unindexed_foreign_keys.rb +0 -43
  60. data/lib/active_record_doctor/tasks.rb +0 -7
  61. data/test/active_record_doctor/printers/io_printer_test.rb +0 -20
  62. data/test/active_record_doctor/tasks/extraneous_indexes_test.rb +0 -81
  63. data/test/active_record_doctor/tasks/incorrect_boolean_presence_validation_test.rb +0 -33
  64. data/test/active_record_doctor/tasks/missing_foreign_keys_test.rb +0 -27
  65. data/test/active_record_doctor/tasks/missing_non_null_constraint_test.rb +0 -108
  66. data/test/active_record_doctor/tasks/missing_presence_validation_test.rb +0 -110
  67. data/test/active_record_doctor/tasks/missing_unique_indexes_test.rb +0 -95
  68. data/test/active_record_doctor/tasks/undefined_table_references_test.rb +0 -51
  69. data/test/active_record_doctor/tasks/unindexed_deleted_at_test.rb +0 -34
  70. data/test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb +0 -27
  71. data/test/dummy/README.rdoc +0 -28
  72. data/test/dummy/Rakefile +0 -6
  73. data/test/dummy/app/assets/config/manifest.js +0 -1
  74. data/test/dummy/app/assets/javascripts/application.js +0 -13
  75. data/test/dummy/app/assets/stylesheets/application.css +0 -15
  76. data/test/dummy/app/controllers/application_controller.rb +0 -5
  77. data/test/dummy/app/helpers/application_helper.rb +0 -2
  78. data/test/dummy/app/models/application_record.rb +0 -3
  79. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  80. data/test/dummy/bin/bundle +0 -3
  81. data/test/dummy/bin/rails +0 -4
  82. data/test/dummy/bin/rake +0 -4
  83. data/test/dummy/bin/setup +0 -29
  84. data/test/dummy/config/application.rb +0 -23
  85. data/test/dummy/config/boot.rb +0 -5
  86. data/test/dummy/config/database.yml +0 -19
  87. data/test/dummy/config/database.yml.travis +0 -5
  88. data/test/dummy/config/environment.rb +0 -5
  89. data/test/dummy/config/environments/development.rb +0 -41
  90. data/test/dummy/config/environments/production.rb +0 -79
  91. data/test/dummy/config/environments/test.rb +0 -47
  92. data/test/dummy/config/initializers/assets.rb +0 -11
  93. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  94. data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  95. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  96. data/test/dummy/config/initializers/inflections.rb +0 -16
  97. data/test/dummy/config/initializers/mime_types.rb +0 -4
  98. data/test/dummy/config/initializers/session_store.rb +0 -3
  99. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  100. data/test/dummy/config/locales/en.yml +0 -23
  101. data/test/dummy/config/routes.rb +0 -56
  102. data/test/dummy/config/secrets.yml +0 -22
  103. data/test/dummy/config.ru +0 -4
  104. data/test/dummy/db/migrate/base_migration.rb +0 -5
  105. data/test/dummy/db/schema.rb +0 -19
  106. data/test/dummy/log/development.log +0 -111
  107. data/test/dummy/log/test.log +0 -79424
  108. data/test/dummy/public/404.html +0 -67
  109. data/test/dummy/public/422.html +0 -67
  110. data/test/dummy/public/500.html +0 -66
  111. data/test/dummy/public/favicon.ico +0 -0
  112. data/test/support/assertions.rb +0 -11
  113. data/test/support/temping.rb +0 -25
  114. data/test/test_helper.rb +0 -17
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ActiveRecordDoctor::Detectors::IncorrectBooleanPresenceValidationTest < Minitest::Test
4
+ def test_presence_true_is_reported_on_boolean_only
5
+ create_table(:users) do |t|
6
+ t.string :email, null: false
7
+ t.boolean :active, null: false
8
+ end.create_model do
9
+ # email is a non-boolean column whose presence CAN be validated in the
10
+ # usual way. We include it in the test model to ensure the detector reports
11
+ # only boolean columns.
12
+ validates :email, :active, presence: true
13
+ end
14
+
15
+ assert_problems(<<~OUTPUT)
16
+ replace the `presence` validator on ModelFactory::Models::User.active with `inclusion` - `presence` can't be used on booleans
17
+ OUTPUT
18
+ end
19
+
20
+ def test_inclusion_is_not_reported
21
+ create_table(:users) do |t|
22
+ t.boolean :active, null: false
23
+ end.create_model do
24
+ validates :active, inclusion: { in: [true, false] }
25
+ end
26
+
27
+ refute_problems
28
+ end
29
+
30
+ def test_models_with_non_existent_tables_are_skipped
31
+ create_model(:User)
32
+
33
+ refute_problems
34
+ end
35
+
36
+ def test_config_ignore_models
37
+ create_table(:users) do |t|
38
+ t.string :email, null: false
39
+ end.create_model
40
+
41
+ config_file(<<-CONFIG)
42
+ ActiveRecordDoctor.configure do |config|
43
+ config.detector :incorrect_boolean_presence_validation,
44
+ ignore_models: ["ModelFactory.User"]
45
+ end
46
+ CONFIG
47
+
48
+ refute_problems
49
+ end
50
+
51
+ def test_global_ignore_models
52
+ create_table(:users) do |t|
53
+ t.string :email, null: false
54
+ end.create_model
55
+
56
+ config_file(<<-CONFIG)
57
+ ActiveRecordDoctor.configure do |config|
58
+ config.global :ignore_models, ["ModelFactory.User"]
59
+ end
60
+ CONFIG
61
+
62
+ refute_problems
63
+ end
64
+
65
+ def test_config_ignore_attributes
66
+ create_table(:users) do |t|
67
+ t.string :email, null: false
68
+ end.create_model
69
+
70
+ config_file(<<-CONFIG)
71
+ ActiveRecordDoctor.configure do |config|
72
+ config.detector :incorrect_boolean_presence_validation,
73
+ ignore_attributes: ["ModelFactory.User.email"]
74
+ end
75
+ CONFIG
76
+
77
+ refute_problems
78
+ end
79
+ end
@@ -0,0 +1,295 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ActiveRecordDoctor::Detectors::IncorrectDependentOptionTest < Minitest::Test
4
+ def test_invoking_no_callbacks_suggests_delete_all
5
+ create_table(:companies) do
6
+ end.create_model do
7
+ has_many :users, dependent: :destroy
8
+ end
9
+
10
+ create_table(:users) do |t|
11
+ t.references :companies
12
+ end.create_model do
13
+ belongs_to :company
14
+ end
15
+
16
+ assert_problems(<<~OUTPUT)
17
+ use `dependent: :delete_all` or similar on ModelFactory::Models::Company.users - associated models have no validations and can be deleted in bulk
18
+ OUTPUT
19
+ end
20
+
21
+ def test_invoking_callbacks_does_not_suggest_delete_all
22
+ create_table(:companies) do
23
+ end.create_model do
24
+ has_many :users, dependent: :destroy
25
+ end
26
+
27
+ create_table(:users) do |t|
28
+ t.references :companies
29
+ end.create_model do
30
+ belongs_to :company
31
+
32
+ before_destroy :log
33
+
34
+ def log
35
+ end
36
+ end
37
+
38
+ refute_problems
39
+ end
40
+
41
+ def test_skipping_callbacks_suggests_destroy
42
+ create_table(:companies) do
43
+ end.create_model do
44
+ has_many :users, dependent: :delete_all
45
+ end
46
+
47
+ create_table(:users) do |t|
48
+ t.references :companies
49
+ end.create_model do
50
+ belongs_to :company
51
+
52
+ before_destroy :log
53
+
54
+ def log
55
+ end
56
+ end
57
+
58
+ assert_problems(<<~OUTPUT)
59
+ use `dependent: :destroy` or similar on ModelFactory::Models::Company.users - the associated model has callbacks that are currently skipped
60
+ OUTPUT
61
+ end
62
+
63
+ def test_invoking_callbacks_does_not_suggest_destroy
64
+ create_table(:companies) do
65
+ end.create_model do
66
+ has_many :users, dependent: :destroy
67
+ end
68
+
69
+ create_table(:users) do |t|
70
+ t.references :companies
71
+ end.create_model do
72
+ belongs_to :company
73
+
74
+ before_destroy :log
75
+
76
+ def log
77
+ end
78
+ end
79
+
80
+ refute_problems
81
+ end
82
+
83
+ def test_works_on_has_one
84
+ create_table(:companies) do
85
+ end.create_model do
86
+ has_one :owner, class_name: "ModelFactory::Models::User", dependent: :destroy
87
+ end
88
+
89
+ create_table(:users) do |t|
90
+ t.references :companies
91
+ end.create_model do
92
+ belongs_to :company
93
+ end
94
+
95
+ assert_problems(<<~OUTPUT)
96
+ use `dependent: :delete` or similar on ModelFactory::Models::Company.owner - the associated model has no callbacks and can be deleted without loading
97
+ OUTPUT
98
+ end
99
+
100
+ def test_works_on_belongs_to
101
+ create_table(:companies) do
102
+ end.create_model do
103
+ has_many :users
104
+ end
105
+
106
+ create_table(:users) do |t|
107
+ t.references :company
108
+ end.create_model do
109
+ belongs_to :company, dependent: :destroy
110
+ end
111
+
112
+ assert_problems(<<~OUTPUT)
113
+ use `dependent: :delete` or similar on ModelFactory::Models::User.company - the associated model has no callbacks and can be deleted without loading
114
+ OUTPUT
115
+ end
116
+
117
+ def test_no_foreign_key_on_second_level_association
118
+ create_table(:companies) do
119
+ end.create_model do
120
+ has_many :users
121
+ has_many :projects
122
+ end
123
+
124
+ create_table(:users) do |t|
125
+ t.references :company
126
+ end.create_model do
127
+ belongs_to :company, dependent: :destroy
128
+ end
129
+
130
+ create_table(:projects) do |t|
131
+ t.references :company
132
+ end.create_model do
133
+ belongs_to :company
134
+ end
135
+
136
+ assert_problems(<<~OUTPUT)
137
+ use `dependent: :delete` or similar on ModelFactory::Models::User.company - the associated model has no callbacks and can be deleted without loading
138
+ OUTPUT
139
+ end
140
+
141
+ def test_nullify_foreign_key_on_second_level_association
142
+ create_table(:companies) do
143
+ end.create_model do
144
+ has_many :users
145
+ has_many :projects
146
+ end
147
+
148
+ create_table(:users) do |t|
149
+ t.references :company
150
+ end.create_model do
151
+ belongs_to :company, dependent: :destroy
152
+ end
153
+
154
+ create_table(:projects) do |t|
155
+ t.references :company, foreign_key: { on_delete: :nullify }
156
+ end.create_model do
157
+ belongs_to :company
158
+ end
159
+
160
+ assert_problems(<<~OUTPUT)
161
+ use `dependent: :delete` or similar on ModelFactory::Models::User.company - the associated model has no callbacks and can be deleted without loading
162
+ OUTPUT
163
+ end
164
+
165
+ def test_cascade_foreign_key_and_callbacks_on_second_level_association
166
+ create_table(:companies) do
167
+ end.create_model do
168
+ has_many :users
169
+ has_many :projects
170
+ end
171
+
172
+ create_table(:users) do |t|
173
+ t.references :company
174
+ end.create_model do
175
+ belongs_to :company, dependent: :delete
176
+ end
177
+
178
+ create_table(:projects) do |t|
179
+ t.references :company, foreign_key: { on_delete: :cascade }
180
+ end.create_model do
181
+ belongs_to :company
182
+
183
+ before_destroy :log
184
+
185
+ def log
186
+ end
187
+ end
188
+
189
+ assert_problems(<<~OUTPUT)
190
+ use `dependent: :destroy` or similar on ModelFactory::Models::User.company - the associated model has callbacks that are currently skipped
191
+ OUTPUT
192
+ end
193
+
194
+ def test_cascade_foreign_key_and_no_callbacks_on_second_level_association
195
+ create_table(:companies) do
196
+ end.create_model do
197
+ has_many :users
198
+ has_many :projects
199
+ end
200
+
201
+ create_table(:users) do |t|
202
+ t.references :company
203
+ end.create_model do
204
+ belongs_to :company, dependent: :delete
205
+ end
206
+
207
+ create_table(:projects) do |t|
208
+ t.references :company, foreign_key: { on_delete: :cascade }
209
+ end.create_model do
210
+ belongs_to :company
211
+ end
212
+
213
+ refute_problems
214
+ end
215
+
216
+ def test_no_dependent_suggests_nothing
217
+ create_table(:companies) do
218
+ end.create_model do
219
+ has_many :users
220
+ end
221
+
222
+ create_table(:users) do |t|
223
+ t.references :companies
224
+ end.create_model do
225
+ belongs_to :company
226
+ end
227
+
228
+ refute_problems
229
+ end
230
+
231
+ def test_config_ignore_models
232
+ create_table(:companies) do
233
+ end.create_model do
234
+ has_many :users, dependent: :destroy
235
+ end
236
+
237
+ create_table(:users) do |t|
238
+ t.references :companies
239
+ end.create_model do
240
+ belongs_to :company
241
+ end
242
+
243
+ config_file(<<-CONFIG)
244
+ ActiveRecordDoctor.configure do |config|
245
+ config.detector :incorrect_dependent_option,
246
+ ignore_models: ["ModelFactory::Models::Company"]
247
+ end
248
+ CONFIG
249
+
250
+ refute_problems
251
+ end
252
+
253
+ def test_global_ignore_models
254
+ create_table(:companies) do
255
+ end.create_model do
256
+ has_many :users, dependent: :destroy
257
+ end
258
+
259
+ create_table(:users) do |t|
260
+ t.references :companies
261
+ end.create_model do
262
+ belongs_to :company
263
+ end
264
+
265
+ config_file(<<-CONFIG)
266
+ ActiveRecordDoctor.configure do |config|
267
+ config.global :ignore_models, ["ModelFactory::Models::Company"]
268
+ end
269
+ CONFIG
270
+
271
+ refute_problems
272
+ end
273
+
274
+ def test_config_ignore_associations
275
+ create_table(:companies) do
276
+ end.create_model do
277
+ has_many :users, dependent: :destroy
278
+ end
279
+
280
+ create_table(:users) do |t|
281
+ t.references :companies
282
+ end.create_model do
283
+ belongs_to :company
284
+ end
285
+
286
+ config_file(<<-CONFIG)
287
+ ActiveRecordDoctor.configure do |config|
288
+ config.detector :incorrect_dependent_option,
289
+ ignore_associations: ["ModelFactory::Models::Company.users"]
290
+ end
291
+ CONFIG
292
+
293
+ refute_problems
294
+ end
295
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ActiveRecordDoctor::Detectors::MismatchedForeignKeyTypeTest < Minitest::Test
4
+ def test_mismatched_foreign_key_type_is_reported
5
+ # MySQL does not allow foreign keys to have different type than paired primary keys
6
+ return if mysql?
7
+
8
+ create_table(:companies, id: :bigint)
9
+ create_table(:users) do |t|
10
+ t.references :company, foreign_key: true, type: :integer
11
+ end
12
+
13
+ assert_problems(<<~OUTPUT)
14
+ users.company_id references a column of different type - foreign keys should be of the same type as the referenced column
15
+ OUTPUT
16
+ end
17
+
18
+ def test_matched_foreign_key_type_is_not_reported
19
+ create_table(:companies)
20
+ create_table(:users) do |t|
21
+ t.references :company, foreign_key: true
22
+ end
23
+
24
+ refute_problems
25
+ end
26
+
27
+ def test_config_ignore_tables
28
+ # MySQL does not allow foreign keys to have different type than paired primary keys
29
+ return if mysql?
30
+
31
+ create_table(:companies, id: :bigint)
32
+ create_table(:users) do |t|
33
+ t.references :company, foreign_key: true, type: :integer
34
+ end
35
+
36
+ config_file(<<-CONFIG)
37
+ ActiveRecordDoctor.configure do |config|
38
+ config.detector :mismatched_foreign_key_type,
39
+ ignore_tables: ["users"]
40
+ end
41
+ CONFIG
42
+
43
+ refute_problems
44
+ end
45
+
46
+ def test_global_ignore_tables
47
+ # MySQL does not allow foreign keys to have different type than paired primary keys
48
+ return if mysql?
49
+
50
+ create_table(:companies, id: :bigint)
51
+ create_table(:users) do |t|
52
+ t.references :company, foreign_key: true, type: :integer
53
+ end
54
+
55
+ config_file(<<-CONFIG)
56
+ ActiveRecordDoctor.configure do |config|
57
+ config.global :ignore_tables, ["users"]
58
+ end
59
+ CONFIG
60
+
61
+ refute_problems
62
+ end
63
+
64
+ def test_config_ignore_columns
65
+ # MySQL does not allow foreign keys to have different type than paired primary keys
66
+ return if mysql?
67
+
68
+ create_table(:companies, id: :bigint)
69
+ create_table(:users) do |t|
70
+ t.references :company, foreign_key: true, type: :integer
71
+ end
72
+
73
+ config_file(<<-CONFIG)
74
+ ActiveRecordDoctor.configure do |config|
75
+ config.detector :mismatched_foreign_key_type,
76
+ ignore_columns: ["users.company_id"]
77
+ end
78
+ CONFIG
79
+
80
+ refute_problems
81
+ end
82
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ActiveRecordDoctor::Detectors::MissingForeignKeysTest < Minitest::Test
4
+ def test_missing_foreign_key_is_reported
5
+ create_table(:companies)
6
+ create_table(:users) do |t|
7
+ t.references :company, foreign_key: false
8
+ end
9
+
10
+ assert_problems(<<~OUTPUT)
11
+ create a foreign key on users.company_id - looks like an association without a foreign key constraint
12
+ OUTPUT
13
+ end
14
+
15
+ def test_present_foreign_key_is_not_reported
16
+ create_table(:companies)
17
+ create_table(:users) do |t|
18
+ t.references :company, foreign_key: true
19
+ end
20
+
21
+ refute_problems
22
+ end
23
+
24
+ def test_config_ignore_models
25
+ create_table(:companies)
26
+ create_table(:users) do |t|
27
+ t.references :company, foreign_key: false
28
+ end
29
+
30
+ config_file(<<-CONFIG)
31
+ ActiveRecordDoctor.configure do |config|
32
+ config.detector :missing_foreign_keys,
33
+ ignore_tables: ["users"]
34
+ end
35
+ CONFIG
36
+
37
+ refute_problems
38
+ end
39
+
40
+ def test_global_ignore_models
41
+ create_table(:companies)
42
+ create_table(:users) do |t|
43
+ t.references :company, foreign_key: false
44
+ end
45
+
46
+ config_file(<<-CONFIG)
47
+ ActiveRecordDoctor.configure do |config|
48
+ config.global :ignore_tables, ["users"]
49
+ end
50
+ CONFIG
51
+
52
+ refute_problems
53
+ end
54
+
55
+ def test_config_ignore_columns
56
+ create_table(:companies)
57
+ create_table(:users) do |t|
58
+ t.references :company, foreign_key: false
59
+ end
60
+
61
+ config_file(<<-CONFIG)
62
+ ActiveRecordDoctor.configure do |config|
63
+ config.detector :missing_foreign_keys,
64
+ ignore_columns: ["users.company_id"]
65
+ end
66
+ CONFIG
67
+
68
+ refute_problems
69
+ end
70
+ end