rails_best_practices 1.18.1 → 1.19.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG.md +4 -1
  4. data/Gemfile +3 -3
  5. data/README.md +1 -1
  6. data/Rakefile +1 -4
  7. data/lib/rails_best_practices/analyzer.rb +3 -3
  8. data/lib/rails_best_practices/core/routes.rb +1 -1
  9. data/lib/rails_best_practices/lexicals/remove_tab_check.rb +2 -2
  10. data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +2 -2
  11. data/lib/rails_best_practices/prepares/route_prepare.rb +5 -0
  12. data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +2 -2
  13. data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +2 -2
  14. data/lib/rails_best_practices/reviews/check_save_return_value_review.rb +2 -2
  15. data/lib/rails_best_practices/reviews/default_scope_is_evil_review.rb +2 -2
  16. data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +2 -2
  17. data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +2 -2
  18. data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +2 -2
  19. data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +2 -2
  20. data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +2 -2
  21. data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +2 -2
  22. data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +2 -2
  23. data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +2 -2
  24. data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +2 -2
  25. data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +2 -2
  26. data/lib/rails_best_practices/reviews/not_rescue_exception_review.rb +2 -2
  27. data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +3 -12
  28. data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +2 -2
  29. data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +2 -47
  30. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +2 -2
  31. data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +2 -2
  32. data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +2 -2
  33. data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -2
  34. data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +15 -6
  35. data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +2 -2
  36. data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +2 -2
  37. data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -2
  38. data/lib/rails_best_practices/reviews/use_model_association_review.rb +2 -2
  39. data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +3 -18
  40. data/lib/rails_best_practices/reviews/use_observer_review.rb +2 -13
  41. data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +2 -2
  42. data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +2 -2
  43. data/lib/rails_best_practices/reviews/use_scope_access_review.rb +2 -2
  44. data/lib/rails_best_practices/reviews/use_turbo_sprockets_rails3_review.rb +2 -2
  45. data/lib/rails_best_practices/version.rb +1 -1
  46. data/rails_best_practices.gemspec +2 -2
  47. data/spec/rails_best_practices/analyzer_spec.rb +1 -1
  48. data/spec/rails_best_practices/prepares/route_prepare_spec.rb +338 -586
  49. data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +59 -140
  50. data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +26 -69
  51. data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +44 -153
  52. data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +2 -2
  53. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +21 -0
  54. data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +160 -272
  55. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +76 -209
  56. data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +43 -110
  57. data/spec/rails_best_practices/reviews/use_turbo_sprockets_rails3_review_spec.rb +4 -4
  58. metadata +5 -23
  59. data/.rubocop.yml +0 -1
  60. data/.rubocop_todo.yml +0 -382
  61. data/install_supported_rubies.sh +0 -10
  62. data/rake_rubies.sh +0 -9
@@ -11,142 +11,10 @@ module RailsBestPractices
11
11
  allow(Dir).to receive(:entries).with("./app/views/project_mailer").and_return(entry_files)
12
12
  end
13
13
 
14
- context "rails2" do
15
- before do
16
- content = <<-EOF
14
+ before do
15
+ content = <<-EOF
17
16
  GEM
18
- remote: http://rubygems.org
19
- specs:
20
- rails (2.3.14)
21
- actionmailer (= 2.3.14)
22
- actionpack (= 2.3.14)
23
- activerecord (= 2.3.14)
24
- activeresource (= 2.3.14)
25
- activesupport (= 2.3.14)
26
- bundler (~> 1.0)
27
- railties (= 2.3.14)
28
- EOF
29
- runner.prepare('Gemfile.lock', content)
30
- end
31
-
32
- context "project_mailer" do
33
- let(:content) {
34
- <<-EOF
35
- class ProjectMailer < ActionMailer::Base
36
- def send_email(email)
37
- receiver email.receiver
38
- from email.from
39
- recipients email.recipients
40
- sent_on Time.now
41
- body email: email
42
- end
43
- end
44
- EOF
45
- }
46
-
47
- context "erb" do
48
- it "should use mulipart/alternative as content_type of email" do
49
- mock_email_files(["send_email.text.html.erb"])
50
- runner.review('app/mailers/project_mailer.rb', content)
51
- expect(runner.errors.size).to eq(1)
52
- expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
53
- end
54
-
55
- it "should not use multiple/alternative as content_type of email when only plain text" do
56
- mock_email_files(["send_email.text.plain.erb"])
57
- runner.review('app/mailers/project_mailer.rb', content)
58
- expect(runner.errors.size).to eq(0)
59
- end
60
-
61
- it "should not use multipart/alternative as content_type of email" do
62
- mock_email_files(["send_email.text.plain.erb", "send_email.text.html.erb"])
63
- runner.review('app/mailers/project_mailer.rb', content)
64
- expect(runner.errors.size).to eq(0)
65
- end
66
- end
67
-
68
- context "haml" do
69
- it "should use mulipart/alternative as content_type of email" do
70
- mock_email_files(["send_email.text.html.haml"])
71
- runner.review('app/mailers/project_mailer.rb', content)
72
- expect(runner.errors.size).to eq(1)
73
- expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
74
- end
75
-
76
- it "should not use multiple/alternative as content_type of email when only plain text" do
77
- mock_email_files(["send_email.text.plain.haml"])
78
- runner.review('app/mailers/project_mailer.rb', content)
79
- expect(runner.errors.size).to eq(0)
80
- end
81
-
82
- it "should not use multipart/alternative as content_type of email" do
83
- mock_email_files(["send_email.text.plain.haml", "send_email.text.html.haml"])
84
- runner.review('app/mailers/project_mailer.rb', content)
85
- expect(runner.errors.size).to eq(0)
86
- end
87
- end
88
-
89
- context "slim" do
90
- it "should use mulipart/alternative as content_type of email" do
91
- mock_email_files(["send_email.text.html.slim"])
92
- runner.review('app/mailers/project_mailer.rb', content)
93
- expect(runner.errors.size).to eq(1)
94
- expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
95
- end
96
-
97
- it "should not use multiple/alternative as content_type of email when only plain text" do
98
- mock_email_files(["send_email.text.plain.slim"])
99
- runner.review('app/mailers/project_mailer.rb', content)
100
- expect(runner.errors.size).to eq(0)
101
- end
102
-
103
- it "should not use multipart/alternative as content_type of email" do
104
- mock_email_files(["send_email.text.plain.slim", "send_email.text.html.slim"])
105
- runner.review('app/mailers/project_mailer.rb', content)
106
- expect(runner.errors.size).to eq(0)
107
- end
108
- end
109
-
110
- context "rhtml" do
111
- it "should use mulipart/alternative as content_type of email" do
112
- mock_email_files(["send_email.text.html.rhtml"])
113
- runner.review('app/mailers/project_mailer.rb', content)
114
- expect(runner.errors.size).to eq(1)
115
- expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
116
- end
117
-
118
- it "should not use multiple/alternative as content_type of email when only plain text" do
119
- mock_email_files(["send_email.text.plain.rhtml"])
120
- runner.review('app/mailers/project_mailer.rb', content)
121
- expect(runner.errors.size).to eq(0)
122
- end
123
-
124
- it "should not use multipart/alternative as content_type of email" do
125
- mock_email_files(["send_email.text.plain.rhtml", "send_email.text.html.rhtml"])
126
- runner.review('app/mailers/project_mailer.rb', content)
127
- expect(runner.errors.size).to eq(0)
128
- end
129
- end
130
- end
131
-
132
- it "should not use mulipart/alternative as content_type of email for non deliver method" do
133
- content =<<-EOF
134
- class ProjectMailer < ActionMailer::Base
135
- def no_deliver
136
- end
137
- end
138
- EOF
139
- mock_email_files([])
140
- runner.review('app/mailers/project_mailer.rb', content)
141
- expect(runner.errors.size).to eq(0)
142
- end
143
- end
144
-
145
- context "rails3" do
146
- before do
147
- content = <<-EOF
148
- GEM
149
- remote: http://rubygems.org
17
+ remote: https://rubygems.org
150
18
  specs:
151
19
  rails (3.2.13)
152
20
  actionmailer (= 3.2.13)
@@ -156,98 +24,97 @@ GEM
156
24
  activesupport (= 3.2.13)
157
25
  bundler (~> 1.0)
158
26
  railties (= 3.2.13)
159
- EOF
160
- runner.prepare('Gemfile.lock', content)
161
- end
162
-
163
- context "project_mailer" do
164
- let(:content) {
165
- <<-EOF
166
- class ProjectMailer < ActionMailer::Base
167
- def send_email(email)
168
- receiver email.receiver
169
- from email.from
170
- recipients email.recipients
171
- sent_on Time.now
172
- body email: email
173
- end
174
- end
175
- EOF
176
- }
177
-
178
- context "erb" do
179
- it "should use mulipart/alternative as content_type of email" do
180
- mock_email_files(["send_email.html.erb"])
181
- runner.review('app/mailers/project_mailer.rb', content)
182
- expect(runner.errors.size).to eq(1)
183
- expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
184
- end
27
+ EOF
28
+ runner.prepare('Gemfile.lock', content)
29
+ end
185
30
 
186
- it "should not use multiple/alternative as content_type of email when only plain text" do
187
- mock_email_files(["send_email.text.erb"])
188
- runner.review('app/mailers/project_mailer.rb', content)
189
- expect(runner.errors.size).to eq(0)
31
+ context "project_mailer" do
32
+ let(:content) {
33
+ <<-EOF
34
+ class ProjectMailer < ActionMailer::Base
35
+ def send_email(email)
36
+ receiver email.receiver
37
+ from email.from
38
+ recipients email.recipients
39
+ sent_on Time.now
40
+ body email: email
190
41
  end
42
+ end
43
+ EOF
44
+ }
191
45
 
192
- it "should not use multipart/alternative as content_type of email" do
193
- mock_email_files(["send_email.text.erb", "send_email.html.erb"])
194
- runner.review('app/mailers/project_mailer.rb', content)
195
- expect(runner.errors.size).to eq(0)
196
- end
46
+ context "erb" do
47
+ it "should use mulipart/alternative as content_type of email" do
48
+ mock_email_files(["send_email.html.erb"])
49
+ runner.review('app/mailers/project_mailer.rb', content)
50
+ expect(runner.errors.size).to eq(1)
51
+ expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
197
52
  end
198
53
 
199
- context "haml" do
200
- it "should use mulipart/alternative as content_type of email" do
201
- mock_email_files(["send_email.html.haml"])
202
- runner.review('app/mailers/project_mailer.rb', content)
203
- expect(runner.errors.size).to eq(1)
204
- expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
205
- end
54
+ it "should not use multiple/alternative as content_type of email when only plain text" do
55
+ mock_email_files(["send_email.text.erb"])
56
+ runner.review('app/mailers/project_mailer.rb', content)
57
+ expect(runner.errors.size).to eq(0)
58
+ end
206
59
 
207
- it "should not use multiple/alternative as content_type of email when only plain text" do
208
- mock_email_files(["send_email.text.haml"])
209
- runner.review('app/mailers/project_mailer.rb', content)
210
- expect(runner.errors.size).to eq(0)
211
- end
60
+ it "should not use multipart/alternative as content_type of email" do
61
+ mock_email_files(["send_email.text.erb", "send_email.html.erb"])
62
+ runner.review('app/mailers/project_mailer.rb', content)
63
+ expect(runner.errors.size).to eq(0)
64
+ end
65
+ end
212
66
 
213
- it "should not use multipart/alternative as content_type of email" do
214
- mock_email_files(["send_email.html.haml", "send_email.text.haml"])
215
- runner.review('app/mailers/project_mailer.rb', content)
216
- expect(runner.errors.size).to eq(0)
217
- end
67
+ context "haml" do
68
+ it "should use mulipart/alternative as content_type of email" do
69
+ mock_email_files(["send_email.html.haml"])
70
+ runner.review('app/mailers/project_mailer.rb', content)
71
+ expect(runner.errors.size).to eq(1)
72
+ expect(runner.errors[0].to_s).to eq("app/mailers/project_mailer.rb:2 - use multipart/alternative as content_type of email")
73
+ end
218
74
 
219
- it "should not use multipart/alternative as content_type of email with text locale" do
220
- mock_email_files(["send_email.html.haml", "send_email.de.text.haml"])
221
- runner.review('app/mailers/project_mailer.rb', content)
222
- expect(runner.errors.size).to eq(0)
223
- end
75
+ it "should not use multiple/alternative as content_type of email when only plain text" do
76
+ mock_email_files(["send_email.text.haml"])
77
+ runner.review('app/mailers/project_mailer.rb', content)
78
+ expect(runner.errors.size).to eq(0)
79
+ end
224
80
 
225
- it "should not use multipart/alternative as content_type of email with html locale" do
226
- mock_email_files(["send_email.de.html.haml", "send_email.text.haml"])
227
- runner.review('app/mailers/project_mailer.rb', content)
228
- expect(runner.errors.size).to eq(0)
229
- end
81
+ it "should not use multipart/alternative as content_type of email" do
82
+ mock_email_files(["send_email.html.haml", "send_email.text.haml"])
83
+ runner.review('app/mailers/project_mailer.rb', content)
84
+ expect(runner.errors.size).to eq(0)
230
85
  end
231
86
 
232
- context "haml/erb mix" do
233
- it "should not suggest using multipart/alternative when mixing html.haml and text.erb" do
234
- mock_email_files(["send_email.html.haml", "send_email.text.erb"])
235
- runner.review('app/mailers/project_mailer.rb', content)
236
- expect(runner.errors.size).to eq(0)
87
+ it "should not use multipart/alternative as content_type of email with text locale" do
88
+ mock_email_files(["send_email.html.haml", "send_email.de.text.haml"])
89
+ runner.review('app/mailers/project_mailer.rb', content)
90
+ expect(runner.errors.size).to eq(0)
91
+ end
237
92
 
238
- mock_email_files(["send_email.html.erb", "send_email.text.haml"])
239
- runner.review('app/mailers/project_mailer.rb', content)
240
- expect(runner.errors.size).to eq(0)
241
- end
93
+ it "should not use multipart/alternative as content_type of email with html locale" do
94
+ mock_email_files(["send_email.de.html.haml", "send_email.text.haml"])
95
+ runner.review('app/mailers/project_mailer.rb', content)
96
+ expect(runner.errors.size).to eq(0)
242
97
  end
98
+ end
243
99
 
244
- it "should not check ignored files" do
245
- runner = Core::Runner.new(reviews: UseMultipartAlternativeAsContentTypeOfEmailReview.new(ignored_files: /project_mailer/))
246
- mock_email_files(["send_email.html.haml"])
100
+ context "haml/erb mix" do
101
+ it "should not suggest using multipart/alternative when mixing html.haml and text.erb" do
102
+ mock_email_files(["send_email.html.haml", "send_email.text.erb"])
103
+ runner.review('app/mailers/project_mailer.rb', content)
104
+ expect(runner.errors.size).to eq(0)
105
+
106
+ mock_email_files(["send_email.html.erb", "send_email.text.haml"])
247
107
  runner.review('app/mailers/project_mailer.rb', content)
248
108
  expect(runner.errors.size).to eq(0)
249
109
  end
250
110
  end
111
+
112
+ it "should not check ignored files" do
113
+ runner = Core::Runner.new(reviews: UseMultipartAlternativeAsContentTypeOfEmailReview.new(ignored_files: /project_mailer/))
114
+ mock_email_files(["send_email.html.haml"])
115
+ runner.review('app/mailers/project_mailer.rb', content)
116
+ expect(runner.errors.size).to eq(0)
117
+ end
251
118
  end
252
119
  end
253
120
  end
@@ -13,134 +13,67 @@ module RailsBestPractices
13
13
  runner.prepare('app/models/project_mailer.rb', content)
14
14
  end
15
15
 
16
- describe "rails2" do
17
- it "should use observer" do
18
- content =<<-EOF
19
- class Project < ActiveRecord::Base
20
- after_create :send_create_notification
21
-
22
- private
23
- def send_create_notification
24
- self.members.each do |member|
25
- ProjectMailer.deliver_notification(self, member)
26
- end
27
- end
28
- end
29
- EOF
30
- runner.review('app/models/project.rb', content)
31
- expect(runner.errors.size).to eq(1)
32
- expect(runner.errors[0].to_s).to eq("app/models/project.rb:5 - use observer")
33
- end
16
+ it "should use observer" do
17
+ content =<<-EOF
18
+ class Project < ActiveRecord::Base
19
+ after_create :send_create_notification
34
20
 
35
- it "should not use observer without callback" do
36
- content =<<-EOF
37
- class Project < ActiveRecord::Base
38
- private
39
- def send_create_notification
40
- self.members.each do |member|
41
- ProjectMailer.deliver_notification(self, member)
42
- end
21
+ private
22
+ def send_create_notification
23
+ self.members.each do |member|
24
+ ProjectMailer.notification(self, member).deliver
43
25
  end
44
26
  end
45
- EOF
46
- runner.review('app/models/project.rb', content)
47
- expect(runner.errors.size).to eq(0)
48
27
  end
28
+ EOF
29
+ runner.review('app/models/project.rb', content)
30
+ expect(runner.errors.size).to eq(1)
31
+ expect(runner.errors[0].to_s).to eq("app/models/project.rb:5 - use observer")
32
+ end
49
33
 
50
- it "should use observer with two after_create" do
51
- content =<<-EOF
52
- class Project < ActiveRecord::Base
53
- after_create :send_create_notification, :update_author
54
-
55
- private
56
- def send_create_notification
57
- self.members.each do |member|
58
- ProjectMailer.deliver_notification(self, member)
59
- end
60
- end
61
-
62
- def update_author
34
+ it "should not use observer without callback" do
35
+ content =<<-EOF
36
+ class Project < ActiveRecord::Base
37
+ private
38
+ def send_create_notification
39
+ self.members.each do |member|
40
+ ProjectMailer.notification(self, member).deliver
63
41
  end
64
42
  end
65
- EOF
66
- runner.review('app/models/project.rb', content)
67
- expect(runner.errors.size).to eq(1)
68
- expect(runner.errors[0].to_s).to eq("app/models/project.rb:5 - use observer")
69
- end
70
-
71
- it "should not raise when initiate an object in callback" do
72
- content =<<-EOF
73
- class Project < ActiveRecord::Base
74
- after_create ProjectMailer.new
75
- end
76
- EOF
77
- expect { runner.review('app/models/project.rb', content) }.not_to raise_error
78
43
  end
44
+ EOF
45
+ runner.review('app/models/project.rb', content)
46
+ expect(runner.errors.size).to eq(0)
79
47
  end
80
48
 
81
- describe "rails3" do
82
- it "should use observer" do
83
- content =<<-EOF
84
- class Project < ActiveRecord::Base
85
- after_create :send_create_notification
49
+ it "should use observer with two after_create" do
50
+ content =<<-EOF
51
+ class Project < ActiveRecord::Base
52
+ after_create :send_create_notification, :update_author
86
53
 
87
- private
88
- def send_create_notification
89
- self.members.each do |member|
90
- ProjectMailer.notification(self, member).deliver
91
- end
54
+ private
55
+ def send_create_notification
56
+ self.members.each do |member|
57
+ ProjectMailer.notification(self, member).deliver
92
58
  end
93
59
  end
94
- EOF
95
- runner.review('app/models/project.rb', content)
96
- expect(runner.errors.size).to eq(1)
97
- expect(runner.errors[0].to_s).to eq("app/models/project.rb:5 - use observer")
98
- end
99
60
 
100
- it "should not use observer without callback" do
101
- content =<<-EOF
102
- class Project < ActiveRecord::Base
103
- private
104
- def send_create_notification
105
- self.members.each do |member|
106
- ProjectMailer.notification(self, member).deliver
107
- end
108
- end
61
+ def update_author
109
62
  end
110
- EOF
111
- runner.review('app/models/project.rb', content)
112
- expect(runner.errors.size).to eq(0)
113
- end
114
-
115
- it "should use observer with two after_create" do
116
- content =<<-EOF
117
- class Project < ActiveRecord::Base
118
- after_create :send_create_notification, :update_author
119
-
120
- private
121
- def send_create_notification
122
- self.members.each do |member|
123
- ProjectMailer.notification(self, member).deliver
124
- end
125
- end
126
-
127
- def update_author
128
- end
129
- end
130
- EOF
131
- runner.review('app/models/project.rb', content)
132
- expect(runner.errors.size).to eq(1)
133
- expect(runner.errors[0].to_s).to eq("app/models/project.rb:5 - use observer")
134
63
  end
64
+ EOF
65
+ runner.review('app/models/project.rb', content)
66
+ expect(runner.errors.size).to eq(1)
67
+ expect(runner.errors[0].to_s).to eq("app/models/project.rb:5 - use observer")
68
+ end
135
69
 
136
- it "should not raise when initiate an object in callback" do
137
- content =<<-EOF
138
- class Project < ActiveRecord::Base
139
- after_create ProjectMailer.new
140
- end
141
- EOF
142
- expect { runner.review('app/models/project.rb', content) }.not_to raise_error
70
+ it "should not raise when initiate an object in callback" do
71
+ content =<<-EOF
72
+ class Project < ActiveRecord::Base
73
+ after_create ProjectMailer.new
143
74
  end
75
+ EOF
76
+ expect { runner.review('app/models/project.rb', content) }.not_to raise_error
144
77
  end
145
78
  end
146
79
  end