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,217 @@
1
+ module Capybara
2
+ module Screenshot
3
+ class << self
4
+ attr_accessor :autosave_on_failure
5
+ attr_accessor :registered_drivers
6
+ attr_accessor :filename_prefix_formatters
7
+ attr_accessor :append_timestamp
8
+ attr_accessor :append_random
9
+ attr_accessor :webkit_options
10
+ attr_writer :final_session_name
11
+ attr_accessor :prune_strategy
12
+ attr_accessor :s3_configuration
13
+ attr_accessor :alternative_root
14
+ end
15
+
16
+ self.autosave_on_failure = true
17
+ self.registered_drivers = {}
18
+ self.filename_prefix_formatters = {}
19
+ self.append_timestamp = true
20
+ self.append_random = false
21
+ self.webkit_options = {}
22
+ self.prune_strategy = :keep_all
23
+ self.s3_configuration = {}
24
+ self.alternative_root = ''
25
+
26
+ def self.append_screenshot_path=(value)
27
+ $stderr.puts "WARNING: Capybara::Screenshot.append_screenshot_path is deprecated. " +
28
+ "Please use Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples instead."
29
+ RSpec.add_link_to_screenshot_for_failed_examples = value
30
+ end
31
+
32
+ def self.screenshot_and_save_page
33
+ saver = new_saver(Capybara, Capybara.page)
34
+ if saver.save
35
+ {:html => saver.html_path, :image => saver.screenshot_path}
36
+ end
37
+ end
38
+
39
+ def self.screenshot_and_open_image
40
+ require "launchy"
41
+
42
+ saver = new_saver(Capybara, Capybara.page, false)
43
+ if saver.save
44
+ Launchy.open saver.screenshot_path
45
+ {:html => nil, :image => saver.screenshot_path}
46
+ end
47
+ end
48
+
49
+ class << self
50
+ alias screen_shot_and_save_page screenshot_and_save_page
51
+ alias screen_shot_and_open_image screenshot_and_open_image
52
+ end
53
+
54
+ def self.filename_prefix_for(test_type, test)
55
+ filename_prefix_formatters.fetch(test_type) { |key|
56
+ filename_prefix_formatters[:default]
57
+ }.call(test)
58
+ end
59
+
60
+ def self.capybara_alt_root
61
+ @capybara_root ||= if !alternative_root.blank?
62
+ alternative_root
63
+ elsif defined?(::Rails) && ::Rails.root.present?
64
+ ::Rails.root.join capybara_tmp_path
65
+ elsif defined?(Padrino)
66
+ File.expand_path(capybara_tmp_path, Padrino.root)
67
+ elsif defined?(Sinatra)
68
+ File.join(Sinatra::Application.root, capybara_tmp_path)
69
+ else
70
+ capybara_tmp_path
71
+ end.to_s
72
+ end
73
+
74
+ def self.capybara_root
75
+ @capybara_root ||= if defined?(::Rails) && ::Rails.root.present?
76
+ ::Rails.root.join capybara_tmp_path
77
+ elsif defined?(Padrino)
78
+ File.expand_path(capybara_tmp_path, Padrino.root)
79
+ elsif defined?(Sinatra)
80
+ File.join(Sinatra::Application.root, capybara_tmp_path)
81
+ else
82
+ capybara_tmp_path
83
+ end.to_s
84
+ end
85
+
86
+ def self.register_driver(driver, &block)
87
+ self.registered_drivers[driver] = block
88
+ end
89
+
90
+ def self.register_filename_prefix_formatter(test_type, &block)
91
+ self.filename_prefix_formatters[test_type] = block
92
+ end
93
+
94
+ def self.final_session_name
95
+ @final_session_name || Capybara.session_name || :default
96
+ end
97
+
98
+ # Prune screenshots based on prune_strategy
99
+ # Will run only once unless force:true
100
+ def self.prune(options = {})
101
+ reset_prune_history if options[:force]
102
+ Capybara::Screenshot::Pruner.new(Capybara::Screenshot.prune_strategy).prune_old_screenshots unless @pruned_previous_screenshots
103
+ @pruned_previous_screenshots = true
104
+ end
105
+
106
+ # Reset prune history allowing further prunining on next failure
107
+ def self.reset_prune_history
108
+ @pruned_previous_screenshots = nil
109
+ end
110
+
111
+ def self.new_saver(*args)
112
+ saver = Saver.new(*args)
113
+
114
+ unless s3_configuration.empty?
115
+ require 'capybara-screenshot/s3_saver'
116
+ saver = S3Saver.new_with_configuration(saver, s3_configuration)
117
+ end
118
+
119
+ return saver
120
+ end
121
+
122
+ def self.after_save_html &block
123
+ Saver.after_save_html &block
124
+ end
125
+
126
+ def self.after_save_screenshot &block
127
+ Saver.after_save_screenshot &block
128
+ end
129
+
130
+ private
131
+
132
+ # If the path isn't set, default to the current directory
133
+ def self.capybara_tmp_path
134
+ # `#save_and_open_page_path` is deprecated
135
+ # https://github.com/jnicklas/capybara/blob/48ab1ede946dec2250a2d1d8cbb3313f25096456/History.md#L37
136
+ if Capybara.respond_to?(:save_path)
137
+ Capybara.save_path
138
+ else
139
+ Capybara.save_and_open_page_path
140
+ end || '.'
141
+ end
142
+
143
+ # Configure the path unless '.'
144
+ def self.capybara_tmp_path=(path)
145
+ return if path == '.'
146
+
147
+ # `#save_and_open_page_path` is deprecated
148
+ # https://github.com/jnicklas/capybara/blob/48ab1ede946dec2250a2d1d8cbb3313f25096456/History.md#L37
149
+ if Capybara.respond_to?(:save_path)
150
+ Capybara.save_path = path
151
+ else
152
+ Capybara.save_and_open_page_path = path
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ # Register driver renderers.
159
+ # The block should return `:not_supported` if a screenshot could not be saved.
160
+ Capybara::Screenshot.class_eval do
161
+ register_driver(:default) do |driver, path|
162
+ driver.render(path)
163
+ end
164
+
165
+ register_driver(:rack_test) do |driver, path|
166
+ :not_supported
167
+ end
168
+
169
+ register_driver(:mechanize) do |driver, path|
170
+ :not_supported
171
+ end
172
+
173
+ register_driver(:selenium) do |driver, path|
174
+ driver.browser.save_screenshot(path)
175
+ end
176
+
177
+ register_driver(:poltergeist) do |driver, path|
178
+ driver.render(path, :full => true)
179
+ end
180
+
181
+ register_driver(:poltergeist_billy) do |driver, path|
182
+ driver.render(path, :full => true)
183
+ end
184
+
185
+ webkit_block = proc do |driver, path|
186
+ if driver.respond_to?(:save_screenshot)
187
+ driver.save_screenshot(path, webkit_options)
188
+ else
189
+ driver.render(path)
190
+ end
191
+ end
192
+
193
+ register_driver :webkit, &webkit_block
194
+ register_driver :webkit_debug, &webkit_block
195
+
196
+ register_driver(:terminus) do |driver, path|
197
+ if driver.respond_to?(:save_screenshot)
198
+ driver.save_screenshot(path)
199
+ else
200
+ :not_supported
201
+ end
202
+ end
203
+ end
204
+
205
+ # Register filename prefix formatters
206
+ Capybara::Screenshot.class_eval do
207
+ register_filename_prefix_formatter(:default) do |test|
208
+ 'screenshot'
209
+ end
210
+ end
211
+
212
+ require 'capybara/dsl'
213
+ require 'capybara/util/save_and_open_page' if Capybara::VERSION.match(/^\d+/)[0] == '1' # no longer needed in Capybara version 2
214
+
215
+ require 'capybara-screenshot/saver'
216
+ require 'capybara-screenshot/capybara'
217
+ require 'capybara-screenshot/pruner'
@@ -0,0 +1,89 @@
1
+ require "spec_helper"
2
+
3
+ describe "Using Capybara::Screenshot with Cucumber" do
4
+ include CommonSetup
5
+
6
+ let(:cmd) { 'cucumber' }
7
+
8
+ def run_failing_case(failure_message, code)
9
+ run_case code
10
+ expect(last_command_started.output).to match(failure_message)
11
+ end
12
+
13
+ def run_case(code, options = {})
14
+ write_file('features/support/env.rb', <<-RUBY)
15
+ #{ensure_load_paths_valid}
16
+ require 'cucumber/support/env.rb'
17
+ #{setup_test_app}
18
+ RUBY
19
+
20
+ write_file('features/step_definitions/step_definitions.rb', <<-RUBY)
21
+ %w(lib spec).each do |include_folder|
22
+ $LOAD_PATH.unshift(File.join('#{gem_root}', include_folder))
23
+ end
24
+ require 'cucumber/step_definitions/step_definitions.rb'
25
+ RUBY
26
+
27
+ write_file('features/cucumber.feature', code)
28
+
29
+ run_simple_with_retry cmd, false
30
+
31
+ expect(last_command_started.output).to_not match(/failed|failure/i) if options[:assert_all_passed]
32
+ end
33
+
34
+ it 'saves a screenshot on failure' do
35
+ run_failing_case %q{Unable to find link or button "you'll never find me"}, <<-CUCUMBER
36
+ Feature: Failure
37
+ Scenario: Failure
38
+ Given I visit "/"
39
+ And I click on a missing link
40
+ CUCUMBER
41
+ expect('tmp/my_screenshot.html').to have_file_content('This is the root page')
42
+ end
43
+
44
+ it 'saves a screenshot on an error' do
45
+ run_failing_case %q{you can't handle me}, <<-CUCUMBER
46
+ Feature: Failure
47
+ Scenario: Failure
48
+ Given I visit "/"
49
+ And I trigger an unhandled exception
50
+ CUCUMBER
51
+ expect('tmp/my_screenshot.html').to have_file_content('This is the root page')
52
+ end
53
+
54
+ it 'saves a screenshot for the correct session for failures using_session' do
55
+ run_failing_case(%q{Unable to find link or button "you'll never find me"}, <<-CUCUMBER)
56
+ Feature: Failure
57
+ Scenario: Failure in different session
58
+ Given I visit "/"
59
+ And I click on a missing link on a different page in a different session
60
+ CUCUMBER
61
+ expect('tmp/my_screenshot.html').to have_file_content('This is a different page')
62
+ end
63
+
64
+ context 'pruning' do
65
+ before do
66
+ create_screenshot_for_pruning
67
+ configure_prune_strategy :last_run
68
+ end
69
+
70
+ it 'on failure it prunes previous screenshots when strategy is set' do
71
+ run_failing_case %q{Unable to find link or button "you'll never find me"}, <<-CUCUMBER
72
+ Feature: Prune
73
+ Scenario: Screenshots are pruned if strategy is set
74
+ Given I visit "/"
75
+ And I click on a missing link
76
+ CUCUMBER
77
+ assert_screenshot_pruned
78
+ end
79
+
80
+ it 'on success it never prunes' do
81
+ run_case <<-CUCUMBER, assert_all_passed: true
82
+ Feature: Prune
83
+ Scenario: Screenshots are pruned if strategy is set
84
+ Given I visit "/"
85
+ CUCUMBER
86
+ assert_screenshot_not_pruned
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,18 @@
1
+ When(/^I click on a missing link$/) do
2
+ click_on "you'll never find me"
3
+ end
4
+
5
+ When(/^I click on a missing link on a different page in a different session$/) do
6
+ using_session :different_session do
7
+ visit '/different_page'
8
+ click_on "you'll never find me"
9
+ end
10
+ end
11
+
12
+ When(/^I visit "([^"]*)"$/) do |path|
13
+ visit path
14
+ end
15
+
16
+ Then(/^I trigger an unhandled exception/) do
17
+ raise "you can't handle me"
18
+ end
@@ -0,0 +1,17 @@
1
+ require 'capybara/cucumber'
2
+ require 'capybara-screenshot'
3
+ require 'capybara-screenshot/cucumber'
4
+ require 'aruba/cucumber'
5
+ require 'aruba/config/jruby'
6
+
7
+ Capybara::Screenshot.register_filename_prefix_formatter(:cucumber) do |fault|
8
+ 'my_screenshot'
9
+ end
10
+
11
+ Before do
12
+ @aruba_timeout_seconds = 60
13
+ end if RUBY_PLATFORM == 'java'
14
+
15
+ After('@restore-capybara-default-session') do
16
+ Capybara.session_name = nil
17
+ end
@@ -0,0 +1,79 @@
1
+ require "spec_helper"
2
+
3
+ describe "Using Capybara::Screenshot with MiniTest" do
4
+ include CommonSetup
5
+
6
+ def run_failing_case(code)
7
+ write_file('test_failure.rb', <<-RUBY)
8
+ #{ensure_load_paths_valid}
9
+ require 'minitest/autorun'
10
+ require 'capybara'
11
+ require 'capybara-screenshot'
12
+ require 'capybara-screenshot/minitest'
13
+
14
+ #{setup_test_app}
15
+ Capybara::Screenshot.register_filename_prefix_formatter(:minitest) do |test_case|
16
+ test_name = test_case.respond_to?(:name) ? test_case.name : test_case.__name__
17
+ raise "expected fault" unless test_name.include? 'test_failure'
18
+ 'my_screenshot'
19
+ end
20
+
21
+ #{code}
22
+ RUBY
23
+
24
+ cmd = 'bundle exec ruby test_failure.rb'
25
+ run_simple_with_retry cmd, false
26
+ expect(last_command_started.output).to include %q{Unable to find link or button "you'll never find me"}
27
+ end
28
+
29
+ it 'saves a screenshot on failure' do
30
+ run_failing_case <<-RUBY
31
+ class TestFailure < MiniTest::Unit::TestCase
32
+ include Capybara::DSL
33
+
34
+ def test_failure
35
+ visit '/'
36
+ assert(page.body.include?('This is the root page'))
37
+ click_on "you'll never find me"
38
+ end
39
+ end
40
+ RUBY
41
+ expect('tmp/my_screenshot.html').to have_file_content('This is the root page')
42
+ end
43
+
44
+ it 'saves a screenshot for the correct session for failures using_session' do
45
+ run_failing_case <<-RUBY
46
+ class TestFailure < Minitest::Unit::TestCase
47
+ include Capybara::DSL
48
+
49
+ def test_failure
50
+ visit '/'
51
+ assert(page.body.include?('This is the root page'))
52
+ using_session :different_session do
53
+ visit '/different_page'
54
+ assert(page.body.include?('This is a different page'))
55
+ click_on "you'll never find me"
56
+ end
57
+ end
58
+ end
59
+ RUBY
60
+ expect('tmp/my_screenshot.html').to have_file_content('This is a different page')
61
+ end
62
+
63
+ it 'prunes screenshots on failure' do
64
+ create_screenshot_for_pruning
65
+ configure_prune_strategy :last_run
66
+ run_failing_case <<-RUBY
67
+ class TestFailure < Minitest::Unit::TestCase
68
+ include Capybara::DSL
69
+
70
+ def test_failure
71
+ visit '/'
72
+ assert(page.body.include?('This is the root page'))
73
+ click_on "you'll never find me"
74
+ end
75
+ end
76
+ RUBY
77
+ assert_screenshot_pruned
78
+ end
79
+ end
@@ -0,0 +1,77 @@
1
+ require "spec_helper"
2
+
3
+ describe "Using Capybara::Screenshot with Test::Unit" do
4
+ include CommonSetup
5
+
6
+ def run_failing_case(code, integration_path = '.')
7
+ write_file("#{integration_path}/test_failure.rb", <<-RUBY)
8
+ #{ensure_load_paths_valid}
9
+ require 'test/unit'
10
+ require 'capybara'
11
+ require 'capybara/rspec'
12
+ require 'capybara-screenshot'
13
+ require 'capybara-screenshot/testunit'
14
+
15
+ #{setup_test_app}
16
+ Capybara::Screenshot.register_filename_prefix_formatter(:testunit) do | fault |
17
+ raise "expected fault" unless fault.exception.message.include? %q{Unable to find link or button "you'll never find me"}
18
+ 'my_screenshot'
19
+ end
20
+
21
+ class TestFailure < Test::Unit::TestCase
22
+ include Capybara::DSL
23
+
24
+ def test_failure
25
+ #{code}
26
+ end
27
+ end
28
+ RUBY
29
+
30
+ cmd = "bundle exec ruby #{integration_path}/test_failure.rb"
31
+ run_simple_with_retry cmd, false
32
+ expect(last_command_started.output).to include %q{Unable to find link or button "you'll never find me"}
33
+ end
34
+
35
+ it "saves a screenshot on failure for any test in path 'test/integration'" do
36
+ run_failing_case <<-RUBY, 'test/integration'
37
+ visit '/'
38
+ assert(page.body.include?('This is the root page'))
39
+ click_on "you'll never find me"
40
+ RUBY
41
+ expect('tmp/my_screenshot.html').to have_file_content('This is the root page')
42
+ end
43
+
44
+ it "does not generate a screenshot for tests that are not in 'test/integration'" do
45
+ run_failing_case <<-RUBY, 'test/something-else'
46
+ visit '/'
47
+ assert(page.body.include?('This is the root page'))
48
+ click_on "you'll never find me"
49
+ RUBY
50
+
51
+ expect('tmp/my_screenshot.html').to_not be_an_existing_file
52
+ end
53
+
54
+ it 'saves a screenshot for the correct session for failures using_session' do
55
+ run_failing_case <<-RUBY, 'test/integration'
56
+ visit '/'
57
+ assert(page.body.include?('This is the root page'))
58
+ using_session :different_session do
59
+ visit '/different_page'
60
+ assert(page.body.include?('This is a different page'))
61
+ click_on "you'll never find me"
62
+ end
63
+ RUBY
64
+ expect('tmp/my_screenshot.html').to have_file_content('This is a different page')
65
+ end
66
+
67
+ it 'prunes screenshots on failure' do
68
+ create_screenshot_for_pruning
69
+ configure_prune_strategy :last_run
70
+ run_failing_case <<-RUBY, 'test/integration'
71
+ visit '/'
72
+ assert(page.body.include?('This is the root page'))
73
+ click_on "you'll never find me"
74
+ RUBY
75
+ assert_screenshot_pruned
76
+ end
77
+ end