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,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