leifcr-capybara-screenshot 1.0.14

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +13 -0
  5. data/Appraisals +19 -0
  6. data/CHANGELOG.md +256 -0
  7. data/Gemfile +9 -0
  8. data/LICENSE +19 -0
  9. data/README.md +315 -0
  10. data/Rakefile +40 -0
  11. data/capybara-screenshot.gemspec +39 -0
  12. data/gemfiles/cucumber.1.3.gemfile +11 -0
  13. data/gemfiles/cucumber.2.4.gemfile +11 -0
  14. data/gemfiles/latest.gemfile +10 -0
  15. data/gemfiles/rspec.3.0.gemfile +11 -0
  16. data/gemfiles/spinach.0.8.gemfile +11 -0
  17. data/lib/capybara-screenshot/callbacks.rb +44 -0
  18. data/lib/capybara-screenshot/capybara.rb +26 -0
  19. data/lib/capybara-screenshot/cucumber.rb +28 -0
  20. data/lib/capybara-screenshot/helpers.rb +28 -0
  21. data/lib/capybara-screenshot/minitest.rb +36 -0
  22. data/lib/capybara-screenshot/pruner.rb +48 -0
  23. data/lib/capybara-screenshot/rspec/base_reporter.rb +21 -0
  24. data/lib/capybara-screenshot/rspec/html_embed_reporter.rb +25 -0
  25. data/lib/capybara-screenshot/rspec/html_link_reporter.rb +37 -0
  26. data/lib/capybara-screenshot/rspec/json_reporter.rb +19 -0
  27. data/lib/capybara-screenshot/rspec/text_reporter.rb +39 -0
  28. data/lib/capybara-screenshot/rspec/textmate_link_reporter.rb +19 -0
  29. data/lib/capybara-screenshot/rspec.rb +95 -0
  30. data/lib/capybara-screenshot/s3_saver.rb +64 -0
  31. data/lib/capybara-screenshot/saver.rb +131 -0
  32. data/lib/capybara-screenshot/spinach.rb +26 -0
  33. data/lib/capybara-screenshot/testunit.rb +39 -0
  34. data/lib/capybara-screenshot/version.rb +5 -0
  35. data/lib/capybara-screenshot.rb +217 -0
  36. data/spec/cucumber/cucumber_spec.rb +89 -0
  37. data/spec/cucumber/step_definitions/step_definitions.rb +18 -0
  38. data/spec/cucumber/support/env.rb +17 -0
  39. data/spec/feature/minitest_spec.rb +79 -0
  40. data/spec/feature/testunit_spec.rb +77 -0
  41. data/spec/rspec/rspec_spec.rb +158 -0
  42. data/spec/spec_helper.rb +34 -0
  43. data/spec/spinach/spinach_spec.rb +60 -0
  44. data/spec/spinach/support/spinach_failure.rb +41 -0
  45. data/spec/support/aruba.rb +2 -0
  46. data/spec/support/common_setup.rb +67 -0
  47. data/spec/support/html_reporter_context.rb +28 -0
  48. data/spec/support/test_app.rb +13 -0
  49. data/spec/unit/base_reporter_spec.rb +25 -0
  50. data/spec/unit/capybara-screenshot_rspec_spec.rb +48 -0
  51. data/spec/unit/capybara-screenshot_spec.rb +121 -0
  52. data/spec/unit/capybara_spec.rb +50 -0
  53. data/spec/unit/pruner_spec.rb +108 -0
  54. data/spec/unit/rspec_reporters/html_embed_reporter_spec.rb +18 -0
  55. data/spec/unit/rspec_reporters/html_link_reporter_spec.rb +27 -0
  56. data/spec/unit/rspec_reporters/text_reporter_spec.rb +98 -0
  57. data/spec/unit/rspec_reporters/textmate_link_reporter_spec.rb +39 -0
  58. data/spec/unit/s3_saver_spec.rb +132 -0
  59. data/spec/unit/saver_spec.rb +366 -0
  60. metadata +264 -0
@@ -0,0 +1,132 @@
1
+ require 'spec_helper'
2
+ require 'capybara-screenshot/s3_saver'
3
+
4
+ describe Capybara::Screenshot::S3Saver do
5
+ let(:saver) { double('saver') }
6
+ let(:bucket_name) { double('bucket_name') }
7
+ let(:s3_client) { double('s3_client') }
8
+
9
+ let(:s3_saver) { Capybara::Screenshot::S3Saver.new(saver, s3_client, bucket_name) }
10
+
11
+ describe '.new_with_configuration' do
12
+ let(:access_key_id) { double('access_key_id') }
13
+ let(:secret_access_key) { double('secret_access_key') }
14
+ let(:s3_client_credentials_using_defaults) {
15
+ {
16
+ access_key_id: access_key_id,
17
+ secret_access_key: secret_access_key
18
+ }
19
+ }
20
+
21
+ let(:region) { double('region') }
22
+ let(:s3_client_credentials) {
23
+ s3_client_credentials_using_defaults.merge(region: region)
24
+ }
25
+
26
+ it 'destructures the configuration into its components' do
27
+ allow(Aws::S3::Client).to receive(:new).and_return(s3_client)
28
+ allow(Capybara::Screenshot::S3Saver).to receive(:new)
29
+
30
+ Capybara::Screenshot::S3Saver.new_with_configuration(saver, {
31
+ s3_client_credentials: s3_client_credentials,
32
+ bucket_name: bucket_name
33
+ })
34
+
35
+ expect(Aws::S3::Client).to have_received(:new).with(s3_client_credentials)
36
+ expect(Capybara::Screenshot::S3Saver).to have_received(:new).with(saver, s3_client, bucket_name)
37
+ end
38
+
39
+ it 'defaults the region to us-east-1' do
40
+ default_region = 'us-east-1'
41
+
42
+ allow(Aws::S3::Client).to receive(:new).and_return(s3_client)
43
+ allow(Capybara::Screenshot::S3Saver).to receive(:new)
44
+
45
+ Capybara::Screenshot::S3Saver.new_with_configuration(saver, {
46
+ s3_client_credentials: s3_client_credentials_using_defaults,
47
+ bucket_name: bucket_name
48
+ })
49
+
50
+ expect(Aws::S3::Client).to have_received(:new).with(
51
+ s3_client_credentials.merge(region: default_region)
52
+ )
53
+
54
+ expect(Capybara::Screenshot::S3Saver).to have_received(:new).with(saver, s3_client, bucket_name)
55
+ end
56
+ end
57
+
58
+ describe '#save' do
59
+ before do
60
+ allow(saver).to receive(:html_saved?).and_return(false)
61
+ allow(saver).to receive(:screenshot_saved?).and_return(false)
62
+ allow(saver).to receive(:save)
63
+ end
64
+
65
+ it 'calls save on the underlying saver' do
66
+ expect(saver).to receive(:save)
67
+
68
+ s3_saver.save
69
+ end
70
+
71
+ it 'uploads the html' do
72
+ html_path = '/foo/bar.html'
73
+ expect(saver).to receive(:html_path).and_return(html_path)
74
+ expect(saver).to receive(:html_saved?).and_return(true)
75
+
76
+ html_file = double('html_file')
77
+
78
+ expect(File).to receive(:open).with(html_path).and_yield(html_file)
79
+
80
+ expect(s3_client).to receive(:put_object).with(
81
+ bucket: bucket_name,
82
+ key: 'bar.html',
83
+ body: html_file
84
+ )
85
+
86
+ s3_saver.save
87
+ end
88
+
89
+ it 'uploads the screenshot' do
90
+ screenshot_path = '/baz/bim.jpg'
91
+ expect(saver).to receive(:screenshot_path).and_return(screenshot_path)
92
+ expect(saver).to receive(:screenshot_saved?).and_return(true)
93
+
94
+ screenshot_file = double('screenshot_file')
95
+
96
+ expect(File).to receive(:open).with(screenshot_path).and_yield(screenshot_file)
97
+
98
+ expect(s3_client).to receive(:put_object).with(
99
+ bucket: bucket_name,
100
+ key: 'bim.jpg',
101
+ body: screenshot_file
102
+ )
103
+
104
+ s3_saver.save
105
+ end
106
+ end
107
+
108
+ # Needed because we cannot depend on Verifying Doubles
109
+ # in older RSpec versions
110
+ describe 'an actual saver' do
111
+ it 'implements the methods needed by the s3 saver' do
112
+ instance_methods = Capybara::Screenshot::Saver.instance_methods
113
+
114
+ expect(instance_methods).to include(:save)
115
+ expect(instance_methods).to include(:html_saved?)
116
+ expect(instance_methods).to include(:html_path)
117
+ expect(instance_methods).to include(:screenshot_saved?)
118
+ expect(instance_methods).to include(:screenshot_path)
119
+ end
120
+ end
121
+
122
+ describe 'any other method' do
123
+ it 'transparently passes through to the saver' do
124
+ allow(saver).to receive(:foo_bar)
125
+
126
+ args = double('args')
127
+ s3_saver.foo_bar(*args)
128
+
129
+ expect(saver).to have_received(:foo_bar).with(*args)
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,366 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capybara::Screenshot::Saver do
4
+ before(:all) do
5
+ @original_drivers = Capybara::Screenshot.registered_drivers
6
+ Capybara::Screenshot.registered_drivers[:default] = lambda {|driver, path| driver.render(path) }
7
+ end
8
+
9
+ after(:all) do
10
+ Capybara::Screenshot.registered_drivers = @original_drivers
11
+ end
12
+
13
+ before do
14
+ allow(Capybara::Screenshot).to receive(:capybara_root).and_return(capybara_root)
15
+ Timecop.freeze(Time.local(2012, 6, 7, 8, 9, 10, 0))
16
+ end
17
+
18
+ let(:capybara_root) { '/tmp' }
19
+ let(:timestamp) { '2012-06-07-08-09-10.000' }
20
+ let(:file_basename) { "screenshot_#{timestamp}" }
21
+ let(:screenshot_path) { "#{capybara_root}/#{file_basename}.png" }
22
+
23
+ let(:driver_mock) { double('Capybara driver').as_null_object }
24
+ let(:page_mock) {
25
+ double('Capybara session page', :body => 'body', :driver => driver_mock).as_null_object.tap do |m|
26
+ allow(m).to receive(:current_path).and_return('/')
27
+ end
28
+ }
29
+ let(:capybara_mock) {
30
+ double(Capybara).as_null_object.tap do |m|
31
+ allow(m).to receive(:current_driver).and_return(:default)
32
+ end
33
+ }
34
+
35
+ let(:saver) { Capybara::Screenshot::Saver.new(capybara_mock, page_mock) }
36
+
37
+ context 'html filename with Capybara Version 1' do
38
+ before do
39
+ stub_const("Capybara::VERSION", '1')
40
+ end
41
+
42
+ it 'has a default format of "screenshot_Y-M-D-H-M-S.ms.html"' do
43
+ expect(capybara_mock).to receive(:save_page).with('body', File.join(capybara_root, "#{file_basename}.html"))
44
+
45
+ saver.save
46
+ end
47
+
48
+ it 'uses name argument as prefix' do
49
+ saver = Capybara::Screenshot::Saver.new(capybara_mock, page_mock, true, 'custom-prefix')
50
+
51
+ expect(capybara_mock).to receive(:save_page).with('body', File.join(capybara_root, "custom-prefix_#{timestamp}.html"))
52
+
53
+ saver.save
54
+ end
55
+ end
56
+
57
+ context 'html filename with Capybara Version 2' do
58
+ before do
59
+ stub_const("Capybara::VERSION", '2')
60
+ end
61
+
62
+ it 'has a default format of "screenshot_Y-M-D-H-M-S.ms.html"' do
63
+ expect(capybara_mock).to receive(:save_page).with(File.join(capybara_root, "#{file_basename}.html"))
64
+
65
+ saver.save
66
+ end
67
+
68
+ it 'uses name argument as prefix' do
69
+ saver = Capybara::Screenshot::Saver.new(capybara_mock, page_mock, true, 'custom-prefix')
70
+
71
+ expect(capybara_mock).to receive(:save_page).with(File.join(capybara_root, "custom-prefix_#{timestamp}.html"))
72
+
73
+ saver.save
74
+ end
75
+ end
76
+
77
+ context 'screenshot image path' do
78
+ it 'is in capybara root output' do
79
+ expect(driver_mock).to receive(:render).with(/^#{capybara_root}\//)
80
+
81
+ saver.save
82
+ end
83
+
84
+ it 'has a default filename format of "screenshot_Y-M-D-H-M-S.ms.png"' do
85
+ expect(driver_mock).to receive(:render).with(/#{file_basename}\.png$/)
86
+
87
+ saver.save
88
+ end
89
+
90
+ it "does not append timestamp if append_timestamp is false " do
91
+ default_config = Capybara::Screenshot.append_timestamp
92
+ Capybara::Screenshot.append_timestamp = false
93
+ expect(driver_mock).to receive(:render).with(/screenshot.png$/)
94
+
95
+ saver.save
96
+ Capybara::Screenshot.append_timestamp = default_config
97
+ end
98
+
99
+ it 'uses filename prefix argument as basename prefix' do
100
+ saver = Capybara::Screenshot::Saver.new(capybara_mock, page_mock, true, 'custom-prefix')
101
+ expect(driver_mock).to receive(:render).with(/#{capybara_root}\/custom-prefix_#{timestamp}\.png$/)
102
+
103
+ saver.save
104
+ end
105
+ end
106
+
107
+ it 'does not save html if false passed as html argument' do
108
+ saver = Capybara::Screenshot::Saver.new(capybara_mock, page_mock, false)
109
+ expect(capybara_mock).to_not receive(:save_page)
110
+
111
+ saver.save
112
+ expect(saver).to_not be_html_saved
113
+ end
114
+
115
+ it 'does not save if current_path is empty' do
116
+ allow(page_mock).to receive(:current_path).and_return(nil)
117
+ expect(capybara_mock).to_not receive(:save_page)
118
+ expect(driver_mock).to_not receive(:render)
119
+
120
+ saver.save
121
+ expect(saver).to_not be_screenshot_saved
122
+ expect(saver).to_not be_html_saved
123
+ end
124
+
125
+ context 'when saving a screenshot fails' do
126
+ it 'still restores the original value of Capybara.save_and_open_page_path' do
127
+ Capybara::Screenshot.capybara_tmp_path = 'tmp/bananas'
128
+
129
+ expect(capybara_mock).to receive(:save_page).and_raise
130
+
131
+ expect {
132
+ saver.save
133
+ }.to raise_error(RuntimeError)
134
+
135
+ if Capybara.respond_to?(:save_path)
136
+ expect(Capybara.save_path).to eq('tmp/bananas')
137
+ else
138
+ expect(Capybara.save_and_open_page_path).to eq('tmp/bananas')
139
+ end
140
+ end
141
+ end
142
+
143
+ describe '#output_screenshot_path' do
144
+ let(:saver) { Capybara::Screenshot::Saver.new(capybara_mock, page_mock) }
145
+
146
+ before do
147
+ allow(saver).to receive(:html_path) { 'page.html' }
148
+ allow(saver).to receive(:screenshot_path) { 'screenshot.png' }
149
+ end
150
+
151
+ it 'outputs the path for the HTML screenshot' do
152
+ allow(saver).to receive(:html_saved?).and_return(true)
153
+ expect(saver).to receive(:output).with("HTML screenshot: page.html")
154
+ saver.output_screenshot_path
155
+ end
156
+
157
+ it 'outputs the path for the Image screenshot' do
158
+ allow(saver).to receive(:screenshot_saved?).and_return(true)
159
+ expect(saver).to receive(:output).with("Image screenshot: screenshot.png")
160
+ saver.output_screenshot_path
161
+ end
162
+ end
163
+
164
+ describe 'callbacks' do
165
+ let(:saver) { Capybara::Screenshot::Saver.new(capybara_mock, page_mock) }
166
+
167
+ before do
168
+ allow(saver).to receive(:html_path) { 'page.html' }
169
+ allow(saver).to receive(:screenshot_path) { 'screenshot.png' }
170
+ end
171
+
172
+ before :all do
173
+ Capybara::Screenshot.after_save_html do |path|
174
+ puts "after_save_html ran with #{path}"
175
+ end
176
+ Capybara::Screenshot.after_save_screenshot do |path|
177
+ puts "after_save_screenshot ran with #{path}"
178
+ end
179
+ end
180
+
181
+ after :all do
182
+ Capybara::Screenshot::Saver.instance_eval { @callbacks = nil }
183
+ end
184
+
185
+ it 'runs after_save_html callbacks' do
186
+ expect do
187
+ saver.save
188
+ end.to output(/after_save_html ran with page\.html/).to_stdout
189
+ end
190
+
191
+ it 'runs after_save_screenshot callbacks' do
192
+ expect do
193
+ saver.save
194
+ end.to output(/after_save_screenshot ran with screenshot\.png/).to_stdout
195
+ end
196
+ end
197
+
198
+ describe "with selenium driver" do
199
+ before do
200
+ allow(capybara_mock).to receive(:current_driver).and_return(:selenium)
201
+ end
202
+
203
+ it 'saves via browser' do
204
+ browser_mock = double('browser')
205
+ expect(driver_mock).to receive(:browser).and_return(browser_mock)
206
+ expect(browser_mock).to receive(:save_screenshot).with(screenshot_path)
207
+
208
+ saver.save
209
+ expect(saver).to be_screenshot_saved
210
+ end
211
+ end
212
+
213
+ describe "with poltergeist driver" do
214
+ before do
215
+ allow(capybara_mock).to receive(:current_driver).and_return(:poltergeist)
216
+ end
217
+
218
+ it 'saves driver render with :full => true' do
219
+ expect(driver_mock).to receive(:render).with(screenshot_path, {:full => true})
220
+
221
+ saver.save
222
+ expect(saver).to be_screenshot_saved
223
+ end
224
+ end
225
+
226
+ describe "with poltergeist_billy driver" do
227
+ before do
228
+ allow(capybara_mock).to receive(:current_driver).and_return(:poltergeist_billy)
229
+ end
230
+
231
+ it 'saves driver render with :full => true' do
232
+ expect(driver_mock).to receive(:render).with(screenshot_path, {:full => true})
233
+
234
+ saver.save
235
+ expect(saver).to be_screenshot_saved
236
+ end
237
+ end
238
+
239
+ describe "with webkit driver" do
240
+ before do
241
+ allow(capybara_mock).to receive(:current_driver).and_return(:webkit)
242
+ end
243
+
244
+ context 'has render method' do
245
+ before do
246
+ allow(driver_mock).to receive(:respond_to?).with(:'save_screenshot').and_return(false)
247
+ end
248
+
249
+ it 'saves driver render' do
250
+ expect(driver_mock).to receive(:render).with(screenshot_path)
251
+
252
+ saver.save
253
+ expect(saver).to be_screenshot_saved
254
+ end
255
+ end
256
+
257
+ context 'has save_screenshot method' do
258
+ let(:webkit_options){ {width: 800, height: 600} }
259
+
260
+ before do
261
+ allow(driver_mock).to receive(:respond_to?).with(:'save_screenshot').and_return(true)
262
+ end
263
+
264
+ it 'saves driver render' do
265
+ expect(driver_mock).to receive(:save_screenshot).with(screenshot_path, {})
266
+
267
+ saver.save
268
+ expect(saver).to be_screenshot_saved
269
+ end
270
+
271
+ it 'passes webkit_options to driver' do
272
+ allow(Capybara::Screenshot).to receive(:webkit_options).and_return( webkit_options )
273
+ expect(driver_mock).to receive(:save_screenshot).with(screenshot_path, webkit_options)
274
+
275
+ saver.save
276
+ expect(saver).to be_screenshot_saved
277
+ end
278
+ end
279
+ end
280
+
281
+ describe "with webkit debug driver" do
282
+ before do
283
+ allow(capybara_mock).to receive(:current_driver).and_return(:webkit_debug)
284
+ end
285
+
286
+ context 'has render method' do
287
+ before do
288
+ allow(driver_mock).to receive(:respond_to?).with(:'save_screenshot').and_return(false)
289
+ end
290
+
291
+ it 'saves driver render' do
292
+ expect(driver_mock).to receive(:render).with(screenshot_path)
293
+
294
+ saver.save
295
+ expect(saver).to be_screenshot_saved
296
+ end
297
+ end
298
+
299
+ context 'has save_screenshot method' do
300
+ let(:webkit_options){ {width: 800, height: 600} }
301
+
302
+ before do
303
+ allow(driver_mock).to receive(:respond_to?).with(:'save_screenshot').and_return(true)
304
+ end
305
+
306
+ it 'saves driver render' do
307
+ expect(driver_mock).to receive(:save_screenshot).with(screenshot_path, {})
308
+
309
+ saver.save
310
+ expect(saver).to be_screenshot_saved
311
+ end
312
+
313
+ it 'passes webkit_options to driver' do
314
+ allow(Capybara::Screenshot).to receive(:webkit_options).and_return( webkit_options )
315
+ expect(driver_mock).to receive(:save_screenshot).with(screenshot_path, webkit_options)
316
+
317
+ saver.save
318
+ expect(saver).to be_screenshot_saved
319
+ end
320
+ end
321
+ end
322
+
323
+ describe "with unknown driver" do
324
+ before do
325
+ allow(capybara_mock).to receive(:current_driver).and_return(:unknown)
326
+ allow(saver).to receive(:warn).and_return(nil)
327
+ end
328
+
329
+ it 'saves driver render' do
330
+ expect(driver_mock).to receive(:render).with(screenshot_path)
331
+
332
+ saver.save
333
+ expect(saver).to be_screenshot_saved
334
+ end
335
+
336
+ it 'outputs warning about unknown results' do
337
+ # Not pure mock testing
338
+ expect(saver).to receive(:warn).with(/screenshot driver for 'unknown'.*unknown results/).and_return(nil)
339
+
340
+ saver.save
341
+ expect(saver).to be_screenshot_saved
342
+ end
343
+
344
+ describe "with rack_test driver" do
345
+ before do
346
+ allow(capybara_mock).to receive(:current_driver).and_return(:rack_test)
347
+ end
348
+
349
+ it 'indicates that a screenshot could not be saved' do
350
+ saver.save
351
+ expect(saver).to_not be_screenshot_saved
352
+ end
353
+ end
354
+
355
+ describe "with mechanize driver" do
356
+ before do
357
+ allow(capybara_mock).to receive(:current_driver).and_return(:mechanize)
358
+ end
359
+
360
+ it 'indicates that a screenshot could not be saved' do
361
+ saver.save
362
+ expect(saver).to_not be_screenshot_saved
363
+ end
364
+ end
365
+ end
366
+ end