capybara-screenshot 0.3.19 → 0.3.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTRkNjU5NmE5NGZkNDAyYjkxNjBkZjYyYTNjYjU2YzA4YTg4MTZlOQ==
4
+ ZWU2OWY4YzU2ZjQyYjIwNWM0MGEzOTA3Mjg4YjFiMTY5NTA1NTdhYQ==
5
5
  data.tar.gz: !binary |-
6
- YzgzZGY1YTVhMGE0MDUzNWM4ODIwZWQ3Mzc4ZDU4ZDhkMzhmYWNjMA==
6
+ NmU0ZjcwMTYyMzlmOGYwYzYyODI1YmZlNjg1OGExMmI3ZTM0NDgyYw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ODEyN2Q0YTEwZTI0YjVmOWM5ZDkxMmUyNTVhYjgwNjMwYzhkZGUzMDk0MmJh
10
- MDk1OWI2ZTAwOTJkNjRlYjc2NTJlYzY2ZjEyNzllODkyNzc5MzJkNmEwZjg5
11
- MTJkOTQ0M2E3NjhlNzgyNjNiMmU2MGY5Y2VkYjgzYTQyOGRkMDg=
9
+ NTRiMDIxYmQ1NzkwNTIzM2RkOGMzNzE0MDJiMGE1OGM3MTk3ZDc1YmNiZDYx
10
+ ZTVhNDI0MjM0OGQ0YWQ0YTIyOWQ4M2Y5MWJmMGVjYmRmODZkMTYxOWIxNjQ5
11
+ MzRlZDI5NDIwMmI3NzE0ZDU5ZTE5NGI0ZmEyNTZlNmFlZjE4NzU=
12
12
  data.tar.gz: !binary |-
13
- NDFiMzc5MzAzYWEyMzQxMzkzYzQ1NTk2NGQ1ZDdkMmRkZTA4Nzg1OGMwODE5
14
- ODg0NjFiYThjOTQ0MGZlN2Q3NzZkYzEyNTA0OWU0MjhiMTc0Yzg4Mjk4Njc0
15
- ZjJkYTQ0MTFlY2ZmNTYwOGM5M2FkNzZjZmY5OTBhZWMwMjhjMzQ=
13
+ YzhhMjc5MTQ1MGNlNjU4YWE2ZmZjNzNiNDAwM2I3M2I2ZDM3MTk5ODk3ZjVh
14
+ YTM3NjE5Yjk1MDBlMDM3Yjk3ODYyY2E5NTk0NDAxMTQ1N2RkNmIzMDZiMmU3
15
+ NGY5ZjI2ZmVlYzA1MzczN2E4ZDkyMjAzYjZhYzk1MzYzNmVjOGY=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ 11 July 2014 - 0.3.19 -> 0.3.20
2
+ -----------
3
+
4
+ * Added reporters to improve screenshot info in RSpec output
5
+ * Added support for Webkit options such as width and height
6
+
7
+ Thanks to https://github.com/multiplegeorges and https://github.com/noniq
8
+
1
9
  2 April 2014 - 0.3.18 -> 0.3.19
2
10
  -----------
3
11
 
data/README.md CHANGED
@@ -32,6 +32,7 @@ For **Cucumber**, in env.rb or a support file, please add:
32
32
  For **RSpec**, in spec_helper.rb or a support file, after the require for 'capybara/rspec', please add:
33
33
 
34
34
  # you should require 'capybara/rspec' first
35
+ require 'capybara-screenshot'
35
36
  require 'capybara-screenshot/rspec'
36
37
 
37
38
  For **Minitest**, typically in 'test/test_helper.rb', please add:
@@ -75,6 +76,10 @@ The gem supports the default rendering method for Capybara to generate the scree
75
76
  There are also some specific driver configurations for Selenium, Webkit, and Poltergeist. See [the definitions here](https://github.com/mattheworiordan/capybara-screenshot/blob/master/lib/capybara-screenshot.rb). The Rack::Test driver, Rails' default, does not allow
76
77
  rendering, so it has a driver definition as a noop.
77
78
 
79
+ Capybara-webkit defaults to a screenshot size of 1000px by 10px. To specify a custom size, use the following option:
80
+
81
+ Capybara::Screenshot.webkit_options = {width: 1024, height: 768}
82
+
78
83
  If a driver is not found the default rendering will be used. If this doesn't work with your driver, then you can
79
84
  add another driver configuration like so
80
85
 
@@ -106,14 +111,19 @@ By default screenshots are saved to the current working directory. If you want t
106
111
  Capybara.save_and_open_page_path = "/file/path"
107
112
 
108
113
 
109
- Screenshot path in RSpec metadata
110
- ---------------------------------
114
+ Information about screenshots in RSpec output
115
+ ---------------------------------------------
116
+
117
+ By default, capybara-screenshot extend RSpec’s formatters to include a link to the screenshot and/or saved html page for each failed spec. If you want to disable this feature completely (eg. to avoid problems with CI tools), use:
118
+
119
+ Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples = false
120
+
121
+ It’s also possible to directly embed the screenshot image in the output if you’re using RSpec’s HtmlFormatter:
122
+
123
+ Capybara::Screenshot::RSpec::REPORTERS["RSpec::Core::Formatters::HtmlFormatter"] = Capybara::Screenshot::RSpec::HtmlEmbedReporter
111
124
 
112
- By default capybara-screenshot will append the screenshot path to a failing spec's full_description which effectively
113
- changes the name of the spec and breaks trend reporting using tools like CI Reporter. You can turn off the default behavior
114
- with the following invocation
125
+ If you want to further customize the information added to RSpec’s output, just implement your own reporter class and customize `Capybara::Screenshot::RSpec::REPORTERS` accordingly. See [rspec.rb](lib/capybara-screenshot/rspec.rb) for more info.
115
126
 
116
- Capybara::Screenshot.append_screenshot_path = false
117
127
 
118
128
  Example application
119
129
  -------------------
@@ -4,15 +4,21 @@ module Capybara
4
4
  attr_accessor :autosave_on_failure
5
5
  attr_accessor :registered_drivers
6
6
  attr_accessor :filename_prefix_formatters
7
- attr_accessor :append_screenshot_path
8
7
  attr_accessor :append_timestamp
8
+ attr_accessor :webkit_options
9
9
  end
10
10
 
11
11
  self.autosave_on_failure = true
12
12
  self.registered_drivers = {}
13
13
  self.filename_prefix_formatters = {}
14
- self.append_screenshot_path = true
15
14
  self.append_timestamp = true
15
+ self.webkit_options = {}
16
+
17
+ def self.append_screenshot_path=(value)
18
+ $stderr.puts "WARNING: Capybara::Screenshot.append_screenshot_path is deprecated. " +
19
+ "Please use Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples instead."
20
+ RSpec.add_link_to_screenshot_for_failed_examples = value
21
+ end
16
22
 
17
23
  def self.screenshot_and_save_page
18
24
  saver = Saver.new(Capybara, Capybara.page)
@@ -91,7 +97,7 @@ Capybara::Screenshot.class_eval do
91
97
 
92
98
  register_driver(:webkit) do |driver, path|
93
99
  if driver.respond_to?(:save_screenshot)
94
- driver.save_screenshot(path)
100
+ driver.save_screenshot(path, webkit_options)
95
101
  else
96
102
  driver.render(path)
97
103
  end
@@ -1,21 +1,81 @@
1
+ require "capybara-screenshot/rspec/text_reporter"
2
+ require "capybara-screenshot/rspec/html_link_reporter"
3
+ require "capybara-screenshot/rspec/html_embed_reporter"
4
+ require "capybara-screenshot/rspec/textmate_link_reporter"
5
+
6
+ module Capybara
7
+ module Screenshot
8
+ module RSpec
9
+
10
+ # Reporters extend RSpec formatters to display information about screenshots for failed
11
+ # examples.
12
+ #
13
+ # Technically, a reporter is a module that gets injected into a RSpec formatter class.
14
+ # It uses method aliasing to extend some (usually just one) of the formatter's methods.
15
+ #
16
+ # Implementing a custom reporter is as simple as creating a module and setting up the
17
+ # appropriate aliases. Use `BaseReporter.enhance_with_screenshot` if you don't want
18
+ # to set up the aliases manually:
19
+ #
20
+ # module MyReporter
21
+ # extend Capybara::Screenshot::RSpec::BaseReporter
22
+ #
23
+ # # Will replace the formatter's original `dump_failure_info` method with
24
+ # # `dump_failure_info_with_screenshot` from this module:
25
+ # enhance_with_screenshot :dump_failure_info
26
+ #
27
+ # def dump_failure_info_with_screenshot(example)
28
+ # dump_failure_info_without_screenshot(example) # call original implementation
29
+ # ... # your additions here
30
+ # end
31
+ # end
32
+ #
33
+ # Finally customize `Capybara::Screenshot::RSpec::FORMATTERS` to make sure your reporter
34
+ # gets injected into the appropriate formatter.
35
+
36
+ REPORTERS = {
37
+ "RSpec::Core::Formatters::ProgressFormatter" => Capybara::Screenshot::RSpec::TextReporter,
38
+ "RSpec::Core::Formatters::HtmlFormatter" => Capybara::Screenshot::RSpec::HtmlLinkReporter,
39
+ "RSpec::Core::Formatters::TextMateFormatter" => Capybara::Screenshot::RSpec::TextMateLinkReporter, # RSpec 2
40
+ "RSpec::Mate::Formatters::TextMateFormatter" => Capybara::Screenshot::RSpec::TextMateLinkReporter # RSpec 3
41
+ }
42
+
43
+ class << self
44
+ attr_accessor :add_link_to_screenshot_for_failed_examples
45
+
46
+ def after_failed_example(example)
47
+ if Capybara.page.respond_to?(:save_page) # Capybara DSL method has been included for a feature we can snapshot
48
+ if Capybara.page.current_url != '' && Capybara::Screenshot.autosave_on_failure && example.exception
49
+ filename_prefix = Capybara::Screenshot.filename_prefix_for(:rspec, example)
50
+ saver = Capybara::Screenshot::Saver.new(Capybara, Capybara.page, true, filename_prefix)
51
+ saver.save
52
+
53
+ example.metadata[:screenshot] = {}
54
+ example.metadata[:screenshot][:html] = saver.html_path if saver.html_saved?
55
+ example.metadata[:screenshot][:image] = saver.screenshot_path if saver.screenshot_saved?
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ self.add_link_to_screenshot_for_failed_examples = true
62
+ end
63
+ end
64
+ end
65
+
1
66
  RSpec.configure do |config|
2
- # use the before hook to add an after hook that runs last
3
67
  config.after do |example_from_block_arg|
4
-
5
68
  # RSpec 3 no longer defines `example`, but passes the example as block argument instead
6
69
  example = config.respond_to?(:expose_current_running_example_as) ? example_from_block_arg : self.example
7
70
 
8
- if Capybara.page.respond_to?(:save_page) # Capybara DSL method has been included for a feature we can snapshot
9
- if Capybara.page.current_url != '' && Capybara::Screenshot.autosave_on_failure && example.exception
10
- filename_prefix = Capybara::Screenshot.filename_prefix_for(:rspec, example)
11
-
12
- saver = Capybara::Screenshot::Saver.new(Capybara, Capybara.page, true, filename_prefix)
13
- saver.save
71
+ Capybara::Screenshot::RSpec.after_failed_example(example)
72
+ end
14
73
 
15
- if Capybara::Screenshot.append_screenshot_path
16
- example.metadata[:full_description] += "\n Screenshot: #{saver.screenshot_path}" if saver.screenshot_saved?
17
- example.metadata[:full_description] += "\n HTML page: #{saver.html_path}" if saver.html_saved?
18
- end
74
+ config.before(:suite) do
75
+ if Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples
76
+ RSpec.configuration.formatters.each do |formatter|
77
+ next unless (reporter_module = Capybara::Screenshot::RSpec::REPORTERS[formatter.class.to_s])
78
+ formatter.singleton_class.send :include, reporter_module
19
79
  end
20
80
  end
21
81
  end
@@ -0,0 +1,21 @@
1
+ module Capybara
2
+ module Screenshot
3
+ module RSpec
4
+ module BaseReporter
5
+
6
+ # Automatically set up method aliases (very much like ActiveSupport's `alias_method_chain`)
7
+ # when the module gets included.
8
+ def enhance_with_screenshot(method)
9
+ with_method, without_method = "#{method}_with_screenshot", "#{method}_without_screenshot"
10
+ define_singleton_method :included do |mod|
11
+ if mod.method_defined?(method) || mod.private_method_defined?(method)
12
+ mod.send :alias_method, without_method, method
13
+ mod.send :alias_method, method, with_method
14
+ end
15
+ end
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ require 'capybara-screenshot/rspec/base_reporter'
2
+ require 'base64'
3
+
4
+ module Capybara
5
+ module Screenshot
6
+ module RSpec
7
+ module HtmlEmbedReporter
8
+ extend BaseReporter
9
+ enhance_with_screenshot :extra_failure_content
10
+
11
+ def extra_failure_content_with_screenshot(exception)
12
+ result = extra_failure_content_without_screenshot(exception)
13
+ example = @failed_examples.last
14
+ # Ignores saved html file, only saved image will be embedded (if present)
15
+ if (screenshot = example.metadata[:screenshot]) && screenshot[:image]
16
+ image = File.binread(screenshot[:image])
17
+ encoded_img = Base64.encode64(image)
18
+ result += "<img src='data:image/png;base64,#{encoded_img}' style='display: block'>"
19
+ end
20
+ result
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ require 'capybara-screenshot/rspec/base_reporter'
2
+ require 'cgi'
3
+ require 'uri'
4
+
5
+ module Capybara
6
+ module Screenshot
7
+ module RSpec
8
+ module HtmlLinkReporter
9
+ extend BaseReporter
10
+ enhance_with_screenshot :extra_failure_content
11
+
12
+ def extra_failure_content_with_screenshot(exception)
13
+ result = extra_failure_content_without_screenshot(exception)
14
+ example = @failed_examples.last
15
+ if (screenshot = example.metadata[:screenshot])
16
+ result << "<p>Saved files: "
17
+ result << link_to_screenshot("HTML page", screenshot[:html]) if screenshot[:html]
18
+ result << link_to_screenshot("Screenshot", screenshot[:image]) if screenshot[:image]
19
+ result << "</p>"
20
+ end
21
+ result
22
+ end
23
+
24
+ def link_to_screenshot(title, path)
25
+ url = URI.escape("file://#{path}")
26
+ title = CGI.escape_html(title)
27
+ attributes = attributes_for_screenshot_link(url).map { |name, val| %{#{name}="#{CGI.escape_html(val)}"} }.join(" ")
28
+ "<a #{attributes}>#{title}</a>"
29
+ end
30
+
31
+ def attributes_for_screenshot_link(url)
32
+ {"href" => url, "style" => "margin-right: 10px; font-weight: bold"}
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ require 'capybara-screenshot/rspec/base_reporter'
2
+
3
+ module Capybara
4
+ module Screenshot
5
+ module RSpec
6
+ module TextReporter
7
+ extend BaseReporter
8
+ enhance_with_screenshot :dump_failure_info
9
+
10
+ def dump_failure_info_with_screenshot(example)
11
+ dump_failure_info_without_screenshot(example)
12
+ return unless (screenshot = example.metadata[:screenshot])
13
+
14
+ colorize = lambda { |str| respond_to?(:failure_color, true) ? failure_color(str) : red(str) }
15
+ output.puts(long_padding + colorize["HTML page: #{screenshot[:html]}"]) if screenshot[:html]
16
+ output.puts(long_padding + colorize["Screenshot: #{screenshot[:image]}"]) if screenshot[:image]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'capybara-screenshot/rspec/base_reporter'
2
+ require 'capybara-screenshot/rspec/html_link_reporter'
3
+ require 'shellwords'
4
+
5
+ module Capybara
6
+ module Screenshot
7
+ module RSpec
8
+ module TextMateLinkReporter
9
+ extend BaseReporter
10
+ include HtmlLinkReporter
11
+ enhance_with_screenshot :extra_failure_content
12
+
13
+ def attributes_for_screenshot_link(url)
14
+ super.merge("onclick" => "TextMate.system('open #{Shellwords.escape(url)}'); return false;")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Screenshot
3
- VERSION = "0.3.19"
3
+ VERSION = "0.3.20"
4
4
  end
5
5
  end
@@ -166,12 +166,22 @@ describe Capybara::Screenshot::Saver do
166
166
  end
167
167
 
168
168
  context 'has save_screenshot method' do
169
+ let(:webkit_options){ {width: 800, height: 600} }
170
+
169
171
  before do
170
172
  driver_mock.stub(:respond_to?).with(:'save_screenshot').and_return(true)
171
173
  end
172
174
 
173
175
  it 'should save driver render' do
174
- driver_mock.should_receive(:save_screenshot).with(screenshot_path)
176
+ driver_mock.should_receive(:save_screenshot).with(screenshot_path, {})
177
+
178
+ saver.save
179
+ saver.screenshot_saved?.should be_true
180
+ end
181
+
182
+ it 'should pass webkit_options to driver' do
183
+ Capybara::Screenshot.stub(:webkit_options).and_return( webkit_options )
184
+ driver_mock.should_receive(:save_screenshot).with(screenshot_path, webkit_options)
175
185
 
176
186
  saver.save
177
187
  saver.screenshot_saved?.should be_true
@@ -40,4 +40,21 @@ describe Capybara::Screenshot do
40
40
  Capybara::Screenshot.filename_prefix_for(:foo, double('test')).should eq 'screenshot'
41
41
  end
42
42
  end
43
+
44
+ describe '.append_screenshot_path' do
45
+ it 'prints a deprecation message and delegates to RSpec.add_link_to_screenshot_for_failed_examples' do
46
+ begin
47
+ original_stderr = $stderr
48
+ $stderr = StringIO.new
49
+ expect {
50
+ Capybara::Screenshot.append_screenshot_path = false
51
+ }.to change {
52
+ Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples
53
+ }.from(true).to(false)
54
+ $stderr.string.should include("append_screenshot_path is deprecated")
55
+ ensure
56
+ $stderr = original_stderr
57
+ end
58
+ end
59
+ end
43
60
  end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capybara::Screenshot::RSpec::BaseReporter do
4
+ describe '#enhance_with_screenshot' do
5
+ it 'makes the original method available under an alias and replaces it with the enhanced method' do
6
+ reporter_module = Module.new do
7
+ extend Capybara::Screenshot::RSpec::BaseReporter
8
+ enhance_with_screenshot :foo
9
+ def foo_with_screenshot
10
+ [foo_without_screenshot, :enhanced]
11
+ end
12
+ end
13
+
14
+ klass = Class.new do
15
+ def foo
16
+ :original
17
+ end
18
+ end
19
+
20
+ klass.new.foo.should == :original
21
+ klass.send :include, reporter_module
22
+ klass.new.foo.should == [:original, :enhanced]
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capybara::Screenshot::RSpec::HtmlEmbedReporter do
4
+ include_context 'html reporter'
5
+
6
+ context 'when an image was saved' do
7
+ before do
8
+ set_example double("example", metadata: {screenshot: {image: "path/to/image"}})
9
+ end
10
+
11
+ it 'embeds the image base64 encoded into the content' do
12
+ File.should_receive(:binread).with("path/to/image").and_return("image data")
13
+ encoded_image_data = Base64.encode64('image data')
14
+ content_without_styles = @reporter.extra_failure_content(nil).gsub(/ ?style='.*?' ?/, "")
15
+ content_without_styles.should == "original content<img src='data:image/png;base64,#{encoded_image_data}'>"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capybara::Screenshot::RSpec::HtmlLinkReporter do
4
+ include_context 'html reporter'
5
+
6
+ context 'when a html file was saved' do
7
+ before do
8
+ set_example double("example", metadata: {screenshot: {html: "path/to/a html file"}})
9
+ end
10
+
11
+ it 'appends a link to the html to the original content' do
12
+ content_without_styles = @reporter.extra_failure_content(nil).gsub(/ ?style=".*?" ?/, "")
13
+ content_without_styles.should == %{original content<p>Saved files: <a href="file://path/to/a%20html%20file">HTML page</a></p>}
14
+ end
15
+ end
16
+
17
+ context 'when a html file and an image were saved' do
18
+ before do
19
+ set_example double("example", metadata: {screenshot: {html: "path/to/html", image: "path/to/an image"}})
20
+ end
21
+
22
+ it 'appends links to both files to the original content' do
23
+ content_without_styles = @reporter.extra_failure_content(nil).gsub(/ ?style=".*?" ?/, "")
24
+ content_without_styles.should == %{original content<p>Saved files: <a href="file://path/to/html">HTML page</a><a href="file://path/to/an%20image">Screenshot</a></p>}
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capybara::Screenshot::RSpec::TextReporter do
4
+ before do
5
+ # Mocking `RSpec::Core::Formatters::ProgressFormatter`, but only implementing the methods that
6
+ # are actually used in `TextReporter#dump_failure_info_with_screenshot`.
7
+ @reporter_class = Class.new do
8
+ attr_reader :output
9
+
10
+ def initialize
11
+ @output = StringIO.new
12
+ end
13
+
14
+ protected
15
+
16
+ def long_padding
17
+ " "
18
+ end
19
+
20
+ def failure_color(str)
21
+ "colorized(#{str})"
22
+ end
23
+
24
+ private
25
+
26
+ def dump_failure_info(example)
27
+ output.puts "original failure info"
28
+ end
29
+ end
30
+
31
+ @reporter = @reporter_class.new
32
+ @reporter.singleton_class.send :include, described_class
33
+ end
34
+
35
+ context 'when there is no screenshot' do
36
+ let(:example) { double("example", metadata: {}) }
37
+
38
+ it 'doesnt change the original output of the reporter' do
39
+ @reporter.dump_failure_info(example)
40
+ @reporter.output.string.should == "original failure info\n"
41
+ end
42
+ end
43
+
44
+ context 'when a html file was saved' do
45
+ let(:example) { double("example", metadata: {screenshot: {html: "path/to/html"}}) }
46
+
47
+ it 'appends the html file path to the original output' do
48
+ @reporter.dump_failure_info(example)
49
+ @reporter.output.string.should == "original failure info\n colorized(HTML page: path/to/html)\n"
50
+ end
51
+ end
52
+
53
+ context 'when a html file and an image were saved' do
54
+ let(:example) { double("example", metadata: {screenshot: {html: "path/to/html", image: "path/to/image"}}) }
55
+
56
+ it 'appends the image path to the original output' do
57
+ @reporter.dump_failure_info(example)
58
+ @reporter.output.string.should == "original failure info\n colorized(HTML page: path/to/html)\n colorized(Screenshot: path/to/image)\n"
59
+ end
60
+ end
61
+
62
+
63
+ it 'works with older RSpec formatters where `#red` is used instead of `#failure_color`' do
64
+ old_reporter_class = Class.new(@reporter_class) do
65
+ undef_method :failure_color
66
+ def red(str)
67
+ "red(#{str})"
68
+ end
69
+ end
70
+ old_reporter = old_reporter_class.new
71
+ old_reporter.singleton_class.send :include, described_class
72
+ example = double("example", metadata: {screenshot: {html: "path/to/html"}})
73
+ old_reporter.dump_failure_info(example)
74
+ old_reporter.output.string.should == "original failure info\n red(HTML page: path/to/html)\n"
75
+ end
76
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capybara::Screenshot::RSpec::TextMateLinkReporter do
4
+ include_context 'html reporter'
5
+
6
+ context 'when a html file was saved' do
7
+ before do
8
+ set_example double("example", metadata: {screenshot: {html: "path/to/a html file"}})
9
+ end
10
+
11
+ it 'appends a link to the html to the original content' do
12
+ content_without_styles = @reporter.extra_failure_content(nil).gsub(/ ?style=".*?"/, "")
13
+ # Single quotes are handled differently by CGI.escape_html in Ruby 1.9 / Ruby 2, so to be
14
+ # compatible with both versions we can't hard code the final escaped string.
15
+ expected_onclick_handler = CGI.escape_html("TextMate.system('open file://path/to/a\\%20html\\%20file'); return false;")
16
+ content_without_styles.should == %{original content<p>} +
17
+ %{Saved files: <a href="file://path/to/a%20html%20file" onclick="#{expected_onclick_handler}">HTML page</a></p>}
18
+ end
19
+ end
20
+
21
+ context 'when a html file and an image were saved' do
22
+ before do
23
+ set_example double("example", metadata: {screenshot: {html: "path/to/html", image: "path/to/an image"}})
24
+ end
25
+
26
+ it 'appends links to both files to the original content' do
27
+ content_without_styles = @reporter.extra_failure_content(nil).gsub(/ ?style=".*?"/, "")
28
+ # Single quotes are handled differently by CGI.escape_html in Ruby 1.9 / Ruby 2, so to be
29
+ # compatible with both versions we can't hard code the final escaped string.
30
+ expected_onclick_handler_1 = CGI.escape_html("TextMate.system('open file://path/to/html'); return false;")
31
+ expected_onclick_handler_2 = CGI.escape_html("TextMate.system('open file://path/to/an\\%20image'); return false;")
32
+ content_without_styles.should == %{original content<p>} +
33
+ %{Saved files: <a href="file://path/to/html" onclick="#{expected_onclick_handler_1}">HTML page</a>} +
34
+ %{<a href="file://path/to/an%20image" onclick="#{expected_onclick_handler_2}">Screenshot</a></p>}
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capybara::Screenshot::RSpec do
4
+ describe '.after_failed_example' do
5
+ context 'for a failed example in a feature that can be snapshotted' do
6
+ before do
7
+ Capybara.page.stub(save_page: nil, current_url: "http://test.local")
8
+ Capybara::Screenshot::Saver.stub(new: mock_saver)
9
+ end
10
+ let(:example) { double("example", exception: Exception.new, metadata: {}) }
11
+ let(:mock_saver) { Capybara::Screenshot::Saver.new(Capybara, Capybara.page).tap { |saver| saver.stub(:save) } }
12
+
13
+ it 'instantiates a saver and calls `save` on it' do
14
+ mock_saver.should_receive(:save)
15
+ described_class.after_failed_example(example)
16
+ end
17
+
18
+ it 'extends the metadata with an empty hash for screenshot metadata' do
19
+ described_class.after_failed_example(example)
20
+ example.metadata.should have_key(:screenshot)
21
+ example.metadata[:screenshot].should == {}
22
+ end
23
+
24
+ context 'when a html file gets saved' do
25
+ before { mock_saver.stub(:html_saved? => true) }
26
+
27
+ it 'adds the html file path to the screenshot metadata' do
28
+ described_class.after_failed_example(example)
29
+ example.metadata[:screenshot][:html].should start_with("./screenshot")
30
+ end
31
+ end
32
+
33
+ context 'when an image gets saved' do
34
+ before { mock_saver.stub(:screenshot_saved? => true) }
35
+
36
+ it 'adds the image path to the screenshot metadata' do
37
+ described_class.after_failed_example(example)
38
+ example.metadata[:screenshot][:image].should start_with("./screenshot")
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,8 @@ require 'capybara-screenshot'
10
10
  require 'capybara-screenshot/rspec'
11
11
  require 'timecop'
12
12
 
13
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
14
+
13
15
  RSpec.configure do |config|
14
16
  config.treat_symbols_as_metadata_keys_with_true_values = true
15
17
  config.run_all_when_everything_filtered = true
@@ -0,0 +1,28 @@
1
+ shared_context 'html reporter' do
2
+ def set_example(example)
3
+ @reporter.instance_variable_set :@failed_examples, [example]
4
+ end
5
+
6
+ before do
7
+ # Mocking `RSpec::Core::Formatters::HtmlFormatter`, but only implementing the things that
8
+ # are actually used in `HtmlLinkReporter#extra_failure_content_with_screenshot`.
9
+ @reporter_class = Class.new do
10
+ def extra_failure_content(exception)
11
+ "original content"
12
+ end
13
+ end
14
+
15
+ @reporter = @reporter_class.new
16
+ @reporter.singleton_class.send :include, described_class
17
+ end
18
+
19
+ context 'when there is no screenshot' do
20
+ before do
21
+ set_example double("example", metadata: {})
22
+ end
23
+
24
+ it 'doesnt change the original content of the reporter' do
25
+ @reporter.extra_failure_content(nil).should == "original content"
26
+ end
27
+ end
28
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-screenshot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.19
4
+ version: 0.3.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew O'Riordan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-02 00:00:00.000000000 Z
11
+ date: 2014-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -94,6 +94,11 @@ files:
94
94
  - lib/capybara-screenshot/cucumber.rb
95
95
  - lib/capybara-screenshot/minitest.rb
96
96
  - lib/capybara-screenshot/rspec.rb
97
+ - lib/capybara-screenshot/rspec/base_reporter.rb
98
+ - lib/capybara-screenshot/rspec/html_embed_reporter.rb
99
+ - lib/capybara-screenshot/rspec/html_link_reporter.rb
100
+ - lib/capybara-screenshot/rspec/text_reporter.rb
101
+ - lib/capybara-screenshot/rspec/textmate_link_reporter.rb
97
102
  - lib/capybara-screenshot/saver.rb
98
103
  - lib/capybara-screenshot/spinach.rb
99
104
  - lib/capybara-screenshot/testunit.rb
@@ -101,7 +106,14 @@ files:
101
106
  - spec/capybara-screenshot/capybara_spec.rb
102
107
  - spec/capybara-screenshot/saver_spec.rb
103
108
  - spec/capybara-screenshot_spec.rb
109
+ - spec/rspec/base_reporter_spec.rb
110
+ - spec/rspec/html_embed_reporter_spec.rb
111
+ - spec/rspec/html_link_reporter_spec.rb
112
+ - spec/rspec/text_reporter_spec.rb
113
+ - spec/rspec/textmate_link_reporter_spec.rb
114
+ - spec/rspec_spec.rb
104
115
  - spec/spec_helper.rb
116
+ - spec/support/html_reporter_context.rb
105
117
  homepage: http://github.com/mattheworiordan/capybara-screenshot
106
118
  licenses:
107
119
  - MIT
@@ -131,4 +143,11 @@ test_files:
131
143
  - spec/capybara-screenshot/capybara_spec.rb
132
144
  - spec/capybara-screenshot/saver_spec.rb
133
145
  - spec/capybara-screenshot_spec.rb
146
+ - spec/rspec/base_reporter_spec.rb
147
+ - spec/rspec/html_embed_reporter_spec.rb
148
+ - spec/rspec/html_link_reporter_spec.rb
149
+ - spec/rspec/text_reporter_spec.rb
150
+ - spec/rspec/textmate_link_reporter_spec.rb
151
+ - spec/rspec_spec.rb
134
152
  - spec/spec_helper.rb
153
+ - spec/support/html_reporter_context.rb