letter_opener 1.0.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,13 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe LetterOpener::DeliveryMethod do
4
- let(:location) { File.expand_path('../../../tmp/letter_opener', __FILE__) }
4
+ let(:location) { File.expand_path('../../../tmp/letter_opener', __FILE__) }
5
+
6
+ let(:plain_file) { Dir["#{location}/*/plain.html"].first }
7
+ let(:plain) { CGI.unescape_html(File.read(plain_file)) }
5
8
 
6
9
  before do
7
- Launchy.stub(:open)
10
+ allow(Launchy).to receive(:open)
8
11
  FileUtils.rm_rf(location)
9
12
  context = self
10
13
 
@@ -14,58 +17,97 @@ describe LetterOpener::DeliveryMethod do
14
17
  end
15
18
 
16
19
  it 'raises an exception if no location passed' do
17
- lambda { LetterOpener::DeliveryMethod.new }.should raise_exception(LetterOpener::DeliveryMethod::InvalidOption)
18
- lambda { LetterOpener::DeliveryMethod.new(location: "foo") }.should_not raise_exception
20
+ expect { LetterOpener::DeliveryMethod.new }.to raise_exception(LetterOpener::DeliveryMethod::InvalidOption)
21
+ expect { LetterOpener::DeliveryMethod.new(location: "foo") }.to_not raise_exception
19
22
  end
20
23
 
21
- context 'content' do
22
- let(:plain_file) { Dir["#{location}/*/plain.html"].first }
23
- let(:plain) { File.read(plain_file) }
24
+ context 'integration' do
25
+ before do
26
+ expect(Launchy).to receive(:open).and_call_original
27
+ ENV['LAUNCHY_DRY_RUN'] = 'true'
28
+ end
29
+
30
+ context 'normal location path' do
31
+ it 'opens email' do
32
+ expect($stdout).to receive(:puts)
33
+ expect {
34
+ Mail.deliver do
35
+ to 'Bar bar@example.com'
36
+ from 'Foo foo@example.com'
37
+ body 'World! http://example.com'
38
+ end
39
+ }.not_to raise_error
40
+ end
41
+ end
42
+
43
+ context 'with spaces in location path' do
44
+ let(:location) { File.expand_path('../../../tmp/letter_opener with space', __FILE__) }
45
+
46
+ it 'opens email' do
47
+ expect($stdout).to receive(:puts)
48
+ expect {
49
+ Mail.deliver do
50
+ to 'Bar bar@example.com'
51
+ from 'Foo foo@example.com'
52
+ body 'World! http://example.com'
53
+ end
54
+ }.not_to raise_error
55
+ end
56
+ end
57
+ end
24
58
 
59
+ context 'content' do
25
60
  context 'plain' do
26
61
  before do
27
- Launchy.should_receive(:open)
62
+ expect(Launchy).to receive(:open)
28
63
 
29
64
  Mail.deliver do
30
- from 'Foo foo@example.com'
31
- reply_to 'No Reply no-reply@example.com'
32
- to 'Bar bar@example.com'
65
+ from 'Foo <foo@example.com>'
66
+ sender 'Baz <baz@example.com>'
67
+ reply_to 'No Reply <no-reply@example.com>'
68
+ to 'Bar <bar@example.com>'
69
+ cc 'Qux <qux@example.com>'
70
+ bcc 'Qux <qux@example.com>'
33
71
  subject 'Hello'
34
72
  body 'World! http://example.com'
35
73
  end
36
74
  end
37
75
 
38
76
  it 'creates plain html document' do
39
- File.exist?(plain_file).should be_true
77
+ expect(File.exist?(plain_file)).to be_truthy
40
78
  end
41
79
 
42
80
  it 'saves From field' do
43
- plain.should include("Foo foo@example.com")
81
+ expect(plain).to include("Foo <foo@example.com>")
82
+ end
83
+
84
+ it 'saves Sender field' do
85
+ expect(plain).to include("Baz <baz@example.com>")
44
86
  end
45
87
 
46
88
  it 'saves Reply-to field' do
47
- plain.should include("No Reply no-reply@example.com")
89
+ expect(plain).to include("No Reply <no-reply@example.com>")
48
90
  end
49
91
 
50
92
  it 'saves To field' do
51
- plain.should include("Bar bar@example.com")
93
+ expect(plain).to include("Bar <bar@example.com>")
52
94
  end
53
95
 
54
96
  it 'saves Subject field' do
55
- plain.should include("Hello")
97
+ expect(plain).to include("Hello")
56
98
  end
57
99
 
58
100
  it 'saves Body with autolink' do
59
- plain.should include('World! <a href="http://example.com">http://example.com</a>')
101
+ expect(plain).to include('World! <a href="http://example.com">http://example.com</a>')
60
102
  end
61
103
  end
62
104
 
63
105
  context 'multipart' do
64
106
  let(:rich_file) { Dir["#{location}/*/rich.html"].first }
65
- let(:rich) { File.read(rich_file) }
107
+ let(:rich) { CGI.unescape_html(File.read(rich_file)) }
66
108
 
67
109
  before do
68
- Launchy.should_receive(:open)
110
+ expect(Launchy).to receive(:open)
69
111
 
70
112
  Mail.deliver do
71
113
  from 'foo@example.com'
@@ -82,41 +124,43 @@ describe LetterOpener::DeliveryMethod do
82
124
  end
83
125
 
84
126
  it 'creates plain html document' do
85
- File.exist?(plain_file).should be_true
127
+ expect(File.exist?(plain_file)).to be_truthy
86
128
  end
87
129
 
88
130
  it 'creates rich html document' do
89
- File.exist?(rich_file).should be_true
131
+ expect(File.exist?(rich_file)).to be_truthy
90
132
  end
91
133
 
92
134
  it 'shows link to rich html version' do
93
- plain.should include("View HTML version")
135
+ expect(plain).to include("View HTML version")
94
136
  end
95
137
 
96
138
  it 'saves text part' do
97
- plain.should include("This is &lt;plain&gt; text")
139
+ expect(plain).to include("This is <plain> text")
98
140
  end
99
141
 
100
142
  it 'saves html part' do
101
- rich.should include("<h1>This is HTML</h1>")
143
+ expect(rich).to include("<h1>This is HTML</h1>")
102
144
  end
103
145
 
104
146
  it 'saves escaped Subject field' do
105
- plain.should include("Many parts with &lt;html&gt;")
147
+ expect(plain).to include("Many parts with <html>")
148
+ end
149
+
150
+ it 'shows subject as title' do
151
+ expect(rich).to include("<title>Many parts with <html></title>")
106
152
  end
107
153
  end
108
154
  end
109
155
 
110
156
  context 'document with spaces in name' do
111
157
  let(:location) { File.expand_path('../../../tmp/letter_opener with space', __FILE__) }
112
- let(:file) { Dir["#{location}/*/plain.html"].first }
113
- let(:plain) { File.read(file) }
114
158
 
115
159
  before do
116
- Launchy.should_receive(:open)
160
+ expect(Launchy).to receive(:open)
117
161
 
118
162
  Mail.deliver do
119
- from 'Foo foo@example.com'
163
+ from 'Foo <foo@example.com>'
120
164
  to 'bar@example.com'
121
165
  subject 'Hello'
122
166
  body 'World!'
@@ -124,20 +168,17 @@ describe LetterOpener::DeliveryMethod do
124
168
  end
125
169
 
126
170
  it 'creates plain html document' do
127
- File.exist?(file)
171
+ File.exist?(plain_file)
128
172
  end
129
173
 
130
174
  it 'saves From filed' do
131
- plain.should include("Foo foo@example.com")
175
+ expect(plain).to include("Foo <foo@example.com>")
132
176
  end
133
177
  end
134
178
 
135
179
  context 'using deliver! method' do
136
- let(:plain_file) { Dir["#{location}/*/plain.html"].first }
137
- let(:plain) { File.read(plain_file) }
138
-
139
180
  before do
140
- Launchy.should_receive(:open)
181
+ expect(Launchy).to receive(:open)
141
182
  Mail.new do
142
183
  from 'foo@example.com'
143
184
  to 'bar@example.com'
@@ -147,23 +188,23 @@ describe LetterOpener::DeliveryMethod do
147
188
  end
148
189
 
149
190
  it 'creates plain html document' do
150
- File.exist?(plain_file).should be_true
191
+ expect(File.exist?(plain_file)).to be_truthy
151
192
  end
152
193
 
153
194
  it 'saves From field' do
154
- plain.should include("foo@example.com")
195
+ expect(plain).to include("foo@example.com")
155
196
  end
156
197
 
157
198
  it 'saves To field' do
158
- plain.should include("bar@example.com")
199
+ expect(plain).to include("bar@example.com")
159
200
  end
160
201
 
161
202
  it 'saves Subject field' do
162
- plain.should include("Hello")
203
+ expect(plain).to include("Hello")
163
204
  end
164
205
 
165
206
  it 'saves Body field' do
166
- plain.should include("World!")
207
+ expect(plain).to include("World!")
167
208
  end
168
209
  end
169
210
 
@@ -182,12 +223,12 @@ describe LetterOpener::DeliveryMethod do
182
223
 
183
224
  it 'creates attachments dir with attachment' do
184
225
  attachment = Dir["#{location}/*/attachments/#{File.basename(__FILE__)}"].first
185
- File.exists?(attachment).should be_true
226
+ expect(File.exist?(attachment)).to be_truthy
186
227
  end
187
228
 
188
229
  it 'saves attachment name' do
189
230
  plain = File.read(Dir["#{location}/*/plain.html"].first)
190
- plain.should include(File.basename(__FILE__))
231
+ expect(plain).to include(File.basename(__FILE__))
191
232
  end
192
233
  end
193
234
 
@@ -210,14 +251,126 @@ describe LetterOpener::DeliveryMethod do
210
251
 
211
252
  it 'creates attachments dir with attachment' do
212
253
  attachment = Dir["#{location}/*/attachments/#{File.basename(__FILE__)}"].first
213
- File.exists?(attachment).should be_true
254
+ expect(File.exist?(attachment)).to be_truthy
214
255
  end
215
256
 
216
257
  it 'replaces inline attachment urls' do
217
258
  text = File.read(Dir["#{location}/*/rich.html"].first)
218
- mail.parts[0].body.should include(url)
219
- text.should_not include(url)
220
- text.should include("attachments/#{File.basename(__FILE__)}")
259
+ expect(mail.parts[0].body).to include(url)
260
+ expect(text).to_not include(url)
261
+ expect(text).to include("attachments/#{File.basename(__FILE__)}")
262
+ end
263
+ end
264
+
265
+ context 'attachments with non-word characters in the filename' do
266
+ before do
267
+ Mail.deliver do
268
+ from 'foo@example.com'
269
+ to 'bar@example.com'
270
+ subject 'With attachments'
271
+ text_part do
272
+ body 'This is <plain> text'
273
+ end
274
+ attachments['non word:chars/used,01-02.txt'] = File.read(__FILE__)
275
+
276
+ url = attachments[0].url
277
+ html_part do
278
+ content_type 'text/html; charset=UTF-8'
279
+ body "This is an image: <img src='#{url}'>"
280
+ end
281
+ end
282
+ end
283
+
284
+ it 'creates attachments dir with attachment' do
285
+ attachment = Dir["#{location}/*/attachments/non_word_chars_used_01-02.txt"].first
286
+ expect(File.exist?(attachment)).to be_truthy
287
+ end
288
+
289
+ it 'saves attachment name' do
290
+ plain = File.read(Dir["#{location}/*/plain.html"].first)
291
+ expect(plain).to include('non_word_chars_used_01-02.txt')
292
+ end
293
+
294
+ it 'replaces inline attachment names' do
295
+ text = File.read(Dir["#{location}/*/rich.html"].first)
296
+ expect(text).to_not include('attachments/non word:chars/used,01-02.txt')
297
+ expect(text).to include('attachments/non_word_chars_used_01-02.txt')
298
+ end
299
+ end
300
+
301
+ context 'subjectless mail' do
302
+ before do
303
+ expect(Launchy).to receive(:open)
304
+
305
+ Mail.deliver do
306
+ from 'Foo foo@example.com'
307
+ reply_to 'No Reply no-reply@example.com'
308
+ to 'Bar bar@example.com'
309
+ body 'World! http://example.com'
310
+ end
311
+ end
312
+
313
+ it 'creates plain html document' do
314
+ expect(File.exist?(plain_file)).to be_truthy
315
+ end
316
+ end
317
+
318
+ context 'delivery params' do
319
+ it 'raises an exception if there is no SMTP Envelope To value' do
320
+ expect(Launchy).not_to receive(:open)
321
+
322
+ expect {
323
+ Mail.deliver do
324
+ from 'Foo foo@example.com'
325
+ reply_to 'No Reply no-reply@example.com'
326
+ body 'World! http://example.com'
327
+ end
328
+ }.to raise_exception(ArgumentError)
329
+ end
330
+
331
+ it 'does not raise an exception if there is at least one SMTP Envelope To value' do
332
+ expect(Launchy).to receive(:open)
333
+
334
+ expect {
335
+ Mail.deliver do
336
+ from 'Foo foo@example.com'
337
+ cc 'Bar bar@example.com'
338
+ reply_to 'No Reply no-reply@example.com'
339
+ body 'World! http://example.com'
340
+ end
341
+ }.not_to raise_exception
342
+ end
343
+ end
344
+
345
+ context 'light template' do
346
+ before do
347
+ expect(Launchy).to receive(:open)
348
+
349
+ LetterOpener.configure do |config|
350
+ config.message_template = :light
351
+ end
352
+
353
+ Mail.defaults do
354
+ delivery_method LetterOpener::DeliveryMethod, :location => File.expand_path('../../../tmp/letter_opener', __FILE__)
355
+ end
356
+
357
+ Mail.deliver do
358
+ subject 'Foo subject'
359
+ from 'Foo foo@example.com'
360
+ reply_to 'No Reply no-reply@example.com'
361
+ to 'Bar bar@example.com'
362
+ body 'World! http://example.com'
363
+ end
364
+ end
365
+
366
+ after do
367
+ LetterOpener.configure do |config|
368
+ config.message_template = :default
369
+ end
370
+ end
371
+
372
+ it 'creates plain html document' do
373
+ expect(File.exist?(plain_file)).to be_truthy
221
374
  end
222
375
  end
223
376
  end
@@ -1,37 +1,222 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe LetterOpener::Message do
4
5
  let(:location) { File.expand_path('../../../tmp/letter_opener', __FILE__) }
5
6
 
7
+ def mail(options={}, &blk)
8
+ Mail.new(options, &blk)
9
+ end
10
+
6
11
  describe '#reply_to' do
7
12
  it 'handles one email as a string' do
8
- message = described_class.new(location, mock(reply_to: 'test@example.com'))
9
- message.reply_to.should eq('test@example.com')
13
+ mail = mail(:reply_to => 'test@example.com')
14
+ message = described_class.new(mail, location: location)
15
+ expect(message.reply_to).to eq('test@example.com')
16
+ end
17
+
18
+ it 'handles one email with display names' do
19
+ mail = mail(:reply_to => 'test <test@example.com>')
20
+ message = described_class.new(mail, location: location)
21
+ expect(message.reply_to).to eq('test <test@example.com>')
10
22
  end
11
23
 
12
24
  it 'handles array of emails' do
13
- message = described_class.new(location, mock(reply_to: ['test1@example.com', 'test2@example.com']))
14
- message.reply_to.should eq('test1@example.com, test2@example.com')
25
+ mail = mail(:reply_to => ['test1@example.com', 'test2@example.com'])
26
+ message = described_class.new(mail, location: location)
27
+ expect(message.reply_to).to eq('test1@example.com, test2@example.com')
15
28
  end
29
+
30
+ it 'handles array of emails with display names' do
31
+ mail = mail(:reply_to => ['test1 <test1@example.com>', 'test2 <test2@example.com>'])
32
+ message = described_class.new(mail, location: location)
33
+ expect(message.reply_to).to eq('test1 <test1@example.com>, test2 <test2@example.com>')
34
+ end
35
+
16
36
  end
17
37
 
18
38
  describe '#to' do
19
39
  it 'handles one email as a string' do
20
- message = described_class.new(location, mock(to: 'test@example.com'))
21
- message.to.should eq('test@example.com')
40
+ mail = mail(:to => 'test@example.com')
41
+ message = described_class.new(mail, location: location)
42
+ expect(message.to).to eq('test@example.com')
43
+ end
44
+
45
+ it 'handles one email with display names' do
46
+ mail = mail(:to => 'test <test@example.com>')
47
+ message = described_class.new(mail, location: location)
48
+ expect(message.to).to eq('test <test@example.com>')
49
+ end
50
+
51
+ it 'handles array of emails' do
52
+ mail = mail(:to => ['test1@example.com', 'test2@example.com'])
53
+ message = described_class.new(mail, location: location)
54
+ expect(message.to).to eq('test1@example.com, test2@example.com')
55
+ end
56
+
57
+ it 'handles array of emails with display names' do
58
+ mail = mail(:to => ['test1 <test1@example.com>', 'test2 <test2@example.com>'])
59
+ message = described_class.new(mail, location: location)
60
+ expect(message.to).to eq('test1 <test1@example.com>, test2 <test2@example.com>')
61
+ end
62
+
63
+ end
64
+
65
+ describe '#cc' do
66
+ it 'handles one cc email as a string' do
67
+ mail = mail(:cc => 'test@example.com')
68
+ message = described_class.new(mail, location: location)
69
+ expect(message.cc).to eq('test@example.com')
70
+ end
71
+
72
+ it 'handles one cc email with display name' do
73
+ mail = mail(:cc => ['test <test1@example.com>', 'test2 <test2@example.com>'])
74
+ message = described_class.new(mail, location: location)
75
+ expect(message.cc).to eq('test <test1@example.com>, test2 <test2@example.com>')
76
+ end
77
+
78
+ it 'handles array of cc emails' do
79
+ mail = mail(:cc => ['test1@example.com', 'test2@example.com'])
80
+ message = described_class.new(mail, location: location)
81
+ expect(message.cc).to eq('test1@example.com, test2@example.com')
82
+ end
83
+
84
+ it 'handles array of cc emails with display names' do
85
+ mail = mail(:cc => ['test <test1@example.com>', 'test2 <test2@example.com>'])
86
+ message = described_class.new(mail, location: location)
87
+ expect(message.cc).to eq('test <test1@example.com>, test2 <test2@example.com>')
88
+ end
89
+
90
+ end
91
+
92
+ describe '#bcc' do
93
+ it 'handles one bcc email as a string' do
94
+ mail = mail(:bcc => 'test@example.com')
95
+ message = described_class.new(mail, location: location)
96
+ expect(message.bcc).to eq('test@example.com')
97
+ end
98
+
99
+ it 'handles one bcc email with display name' do
100
+ mail = mail(:bcc => ['test <test1@example.com>', 'test2 <test2@example.com>'])
101
+ message = described_class.new(mail, location: location)
102
+ expect(message.bcc).to eq('test <test1@example.com>, test2 <test2@example.com>')
103
+ end
104
+
105
+ it 'handles array of bcc emails' do
106
+ mail = mail(:bcc => ['test1@example.com', 'test2@example.com'])
107
+ message = described_class.new(mail, location: location)
108
+ expect(message.bcc).to eq('test1@example.com, test2@example.com')
109
+ end
110
+
111
+ it 'handles array of bcc emails with display names' do
112
+ mail = mail(:bcc => ['test <test1@example.com>', 'test2 <test2@example.com>'])
113
+ message = described_class.new(mail, location: location)
114
+ expect(message.bcc).to eq('test <test1@example.com>, test2 <test2@example.com>')
115
+ end
116
+
117
+ end
118
+
119
+ describe '#sender' do
120
+ it 'handles one email as a string' do
121
+ mail = mail(:sender => 'sender@example.com')
122
+ message = described_class.new(mail, location: location)
123
+ expect(message.sender).to eq('sender@example.com')
124
+ end
125
+
126
+ it 'handles one email as a string with display name' do
127
+ mail = mail(:sender => 'test <test@example.com>')
128
+ message = described_class.new(mail, location: location)
129
+ expect(message.sender).to eq('test <test@example.com>')
22
130
  end
23
131
 
24
132
  it 'handles array of emails' do
25
- message = described_class.new(location, mock(to: ['test1@example.com', 'test2@example.com']))
26
- message.to.should eq('test1@example.com, test2@example.com')
133
+ mail = mail(:sender => ['sender1@example.com', 'sender2@example.com'])
134
+ message = described_class.new(mail, location: location)
135
+ expect(message.sender).to eq('sender1@example.com, sender2@example.com')
136
+ end
137
+
138
+ it 'handles array of emails with display names' do
139
+ mail = mail(:sender => ['test <test1@example.com>', 'test2 <test2@example.com>'])
140
+ message = described_class.new(mail, location: location)
141
+ expect(message.sender).to eq('test <test1@example.com>, test2 <test2@example.com>')
27
142
  end
143
+
28
144
  end
29
145
 
30
146
  describe '#<=>' do
31
147
  it 'sorts rich type before plain type' do
32
- plain = described_class.new(location, mock(content_type: 'text/plain'))
33
- rich = described_class.new(location, mock(content_type: 'text/html'))
34
- [plain, rich].sort.should eq([rich, plain])
148
+ plain = described_class.new(double(content_type: 'text/plain'), location: location)
149
+ rich = described_class.new(double(content_type: 'text/html'), location: location)
150
+ expect([plain, rich].sort).to eq([rich, plain])
151
+ end
152
+ end
153
+
154
+ describe '#auto_link' do
155
+ let(:message){ described_class.new(mail, location: location) }
156
+
157
+ it 'does not modify unlinkable text' do
158
+ text = 'the quick brown fox jumped over the lazy dog'
159
+ expect(message.auto_link(text)).to eq(text)
160
+ end
161
+
162
+ it 'adds links for http' do
163
+ raw = "Link to http://localhost:3000/example/path path"
164
+ linked = "Link to <a href=\"http://localhost:3000/example/path\">http://localhost:3000/example/path</a> path"
165
+ expect(message.auto_link(raw)).to eq(linked)
166
+ end
167
+ end
168
+
169
+ describe '#body' do
170
+ it 'handles UTF-8 charset body correctly, with QP CTE, for a non-multipart message' do
171
+ mail = mail(:sender => 'sender@example.com') do
172
+ content_type "text/html; charset=UTF-8"
173
+ content_transfer_encoding 'quoted-printable'
174
+ body "☃"
175
+ end
176
+ message = message = described_class.new(mail, location: location)
177
+ expect(message.body.encoding.name).to eq('UTF-8')
178
+ end
179
+
180
+ it 'handles UTF-8 charset HTML part body correctly, with QP CTE, for a multipart message' do
181
+ mail = mail(:sender => 'sender@example.com') do
182
+ html_part do
183
+ content_type "text/html; charset=UTF-8"
184
+ content_transfer_encoding 'quoted-printable'
185
+ body "☃"
186
+ end
187
+ end
188
+ message = described_class.new(mail, location: location, part: mail.html_part)
189
+ expect(message.body.encoding.name).to eq('UTF-8')
190
+ end
191
+
192
+ it 'handles UTF-8 charset text part body correctly, with QP CTE, for a multipart message' do
193
+ mail = mail(:sender => 'sender@example.com') do
194
+ text_part do
195
+ content_type "text/plain; charset=UTF-8"
196
+ content_transfer_encoding 'quoted-printable'
197
+ body "☃"
198
+ end
199
+ end
200
+ message = described_class.new(mail, location: location, part: mail.text_part)
201
+ expect(message.body.encoding.name).to eq('UTF-8')
202
+ end
203
+ end
204
+
205
+ describe '.rendered_messages' do
206
+ it 'uses configured default template if options not given' do
207
+ allow(LetterOpener.configuration).to receive(:location) { location }
208
+ messages = described_class.rendered_messages(mail)
209
+ expect(messages.first.template).not_to be_nil
210
+ end
211
+
212
+ it 'fails if necessary defaults are not provided' do
213
+ allow(LetterOpener.configuration).to receive(:location) { nil }
214
+ expect { described_class.rendered_messages(mail) }.to raise_error(ArgumentError)
215
+ end
216
+
217
+ it 'fails if necessary defaults are not provided' do
218
+ allow(LetterOpener.configuration).to receive(:message_template) { nil }
219
+ expect { described_class.rendered_messages(mail) }.to raise_error(ArgumentError)
35
220
  end
36
221
  end
37
222
  end
data/spec/spec_helper.rb CHANGED
@@ -5,7 +5,5 @@ Bundler.require(:default)
5
5
  require "mail"
6
6
 
7
7
  RSpec.configure do |config|
8
- config.treat_symbols_as_metadata_keys_with_true_values = true
9
- config.filter_run :focus => true
10
8
  config.run_all_when_everything_filtered = true
11
9
  end