leifcr-capybara-screenshot 1.0.14

Sign up to get free protection for your applications and to get access to all the features.
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