cucumber-screenshot 0.1.0-universal-darwin → 0.2.0-universal-darwin
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.
- data/README.rdoc +21 -11
- data/Rakefile +3 -3
- data/VERSION.yml +1 -1
- data/lib/cucumber_screenshot.rb +6 -13
- data/lib/cucumber_screenshot/extensions.rb +54 -0
- data/lib/cucumber_screenshot/world.rb +64 -0
- data/spec/cucumber_screenshot/extensions_spec.rb +30 -0
- data/spec/cucumber_screenshot/world_spec.rb +56 -0
- data/spec/spec_helper.rb +0 -2
- metadata +12 -12
- data/lib/cucumber_screenshot/formatter.rb +0 -63
- data/lib/cucumber_screenshot/webrat/session.rb +0 -53
- data/spec/cucumber_screenshot/formatter_spec.rb +0 -14
- data/spec/cucumber_screenshot/webrat/session_spec.rb +0 -30
    
        data/README.rdoc
    CHANGED
    
    | @@ -18,27 +18,37 @@ To install the latest release as a gem | |
| 18 18 |  | 
| 19 19 | 
             
            == Use
         | 
| 20 20 |  | 
| 21 | 
            -
            Add the following  | 
| 21 | 
            +
            Add the following linea to your ./features/support/env.rb file in your Rails
         | 
| 22 | 
            +
            project.
         | 
| 22 23 |  | 
| 23 24 | 
             
              require 'cucumber_screenshot'
         | 
| 25 | 
            +
              World(CucumberScreenshot::World)
         | 
| 24 26 |  | 
| 25 | 
            -
             | 
| 27 | 
            +
              # Take a screenshot if a scenario fails
         | 
| 28 | 
            +
              After do |scenario|
         | 
| 29 | 
            +
                if scenario.failed?
         | 
| 30 | 
            +
                  screenshot
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 26 33 |  | 
| 27 | 
            -
               | 
| 34 | 
            +
              # Take a screenshot for every step for scenario/features tagged @screenshot
         | 
| 35 | 
            +
              AfterStep('@screenshot') do |scenario|
         | 
| 36 | 
            +
                if screenshot_due?
         | 
| 37 | 
            +
                  screenshot
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 28 40 |  | 
| 29 | 
            -
             | 
| 41 | 
            +
            Then use the 'rake cucumber' and 'rake cucumber:wip' tasks as per usual
         | 
| 30 42 |  | 
| 31 | 
            -
             | 
| 32 | 
            -
            with subfolders for each scenario. Each subfolder will contain a screenshot of
         | 
| 33 | 
            -
            each page generated and the html source of each of those pages.
         | 
| 43 | 
            +
            Screenshots will be saved in ./features/screenshots in your project.
         | 
| 34 44 |  | 
| 35 | 
            -
             | 
| 45 | 
            +
            === Capturing a single screenshot
         | 
| 36 46 |  | 
| 37 47 | 
             
            If you want to capture a single screenshot rather than every page then add the
         | 
| 38 48 | 
             
            following step to one of your Rails application's step files
         | 
| 39 49 |  | 
| 40 | 
            -
               | 
| 41 | 
            -
                screenshot | 
| 50 | 
            +
              Then "screenshot" do
         | 
| 51 | 
            +
                screenshot
         | 
| 42 52 | 
             
              end
         | 
| 43 53 |  | 
| 44 54 | 
             
            and then add
         | 
| @@ -46,7 +56,7 @@ and then add | |
| 46 56 | 
             
              Then screenshot
         | 
| 47 57 |  | 
| 48 58 | 
             
            to your feature file in the place where you want to capture a screenshot of the
         | 
| 49 | 
            -
            page that your application  | 
| 59 | 
            +
            page that your application generated.
         | 
| 50 60 |  | 
| 51 61 | 
             
            == TODO
         | 
| 52 62 |  | 
    
        data/Rakefile
    CHANGED
    
    | @@ -7,9 +7,9 @@ begin | |
| 7 7 | 
             
                gemspec.platform     = "universal-darwin"
         | 
| 8 8 | 
             
                gemspec.requirements << "Mac OS X 10.5 or later"
         | 
| 9 9 | 
             
                gemspec.requirements << "RubyCocoa"
         | 
| 10 | 
            -
                gemspec.add_dependency('cucumber', ' | 
| 11 | 
            -
                gemspec.add_dependency('webrat', ' | 
| 12 | 
            -
                gemspec.add_dependency(' | 
| 10 | 
            +
                gemspec.add_dependency('cucumber', '= 0.4.2')
         | 
| 11 | 
            +
                gemspec.add_dependency('webrat', '= 0.5.3')
         | 
| 12 | 
            +
                gemspec.add_dependency('snapurl', '>= 0.0.3')
         | 
| 13 13 | 
             
                gemspec.email        = 'joel.chippindale@gmail.com'
         | 
| 14 14 | 
             
                gemspec.authors      = ['Joel Chippindale']
         | 
| 15 15 | 
             
              end
         | 
    
        data/VERSION.yml
    CHANGED
    
    
    
        data/lib/cucumber_screenshot.rb
    CHANGED
    
    | @@ -1,17 +1,10 @@ | |
| 1 1 | 
             
            require 'cucumber'
         | 
| 2 | 
            +
            require 'cucumber/formatter/html'
         | 
| 2 3 | 
             
            require 'webrat'
         | 
| 3 4 |  | 
| 4 | 
            -
            require 'cucumber_screenshot/ | 
| 5 | 
            -
            require 'cucumber_screenshot/ | 
| 5 | 
            +
            require 'cucumber_screenshot/world'
         | 
| 6 | 
            +
            require 'cucumber_screenshot/extensions'
         | 
| 6 7 |  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
            #
         | 
| 11 | 
            -
            # as well as
         | 
| 12 | 
            -
            #
         | 
| 13 | 
            -
            #   --format Cucumber::Format::Screenshot
         | 
| 14 | 
            -
            Cucumber::Cli::Configuration::BUILTIN_FORMATS['screenshot'] = 'CucumberScreenshot::Formatter'
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            # Make screenshot method available to steps
         | 
| 17 | 
            -
            Webrat::Methods.delegate_to_session :screenshot
         | 
| 8 | 
            +
            module CucumberScreenshot
         | 
| 9 | 
            +
              VERSION = '0.2.0'
         | 
| 10 | 
            +
            end
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            module CucumberScreenshot
         | 
| 2 | 
            +
              module Extensions
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                module StepMother
         | 
| 5 | 
            +
                  def self.included(base)
         | 
| 6 | 
            +
                    unless base.method_defined?(:embed_image)
         | 
| 7 | 
            +
                      base.send(:define_method, :embed_image) do |image_path|
         | 
| 8 | 
            +
                        @visitor.embed_image(image_path)
         | 
| 9 | 
            +
                      end
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                module TreeWalker
         | 
| 15 | 
            +
                  def self.included(base)
         | 
| 16 | 
            +
                    unless base.method_defined?(:embed_image)
         | 
| 17 | 
            +
                      base.send(:define_method, :embed_image) do |image_path|
         | 
| 18 | 
            +
                        broadcast(image_path)
         | 
| 19 | 
            +
                      end
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                module Console
         | 
| 25 | 
            +
                  def self.included(base)
         | 
| 26 | 
            +
                    unless base.method_defined?(:embed_image)
         | 
| 27 | 
            +
                      base.send(:define_method, :embed_image) do |image_path|
         | 
| 28 | 
            +
                        announce("- Image saved to #{image_path}")
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                module Html
         | 
| 35 | 
            +
                  def self.included(base)
         | 
| 36 | 
            +
                    unless base.method_defined?(:embed_image)
         | 
| 37 | 
            +
                      # TODO: needs style
         | 
| 38 | 
            +
                      # TODO: Place to right of or below step result (when captured with AfterStep)
         | 
| 39 | 
            +
                      base.send(:define_method, :embed_image) do |image_path|
         | 
| 40 | 
            +
                        builder.a('Screenshot', :class => 'announcement', :href => '#', :onclick => "img=document.getElementById('#{image_path}'); img.style.display = (img.style.display == 'none' ? 'block' : 'none');")
         | 
| 41 | 
            +
                        builder.img(:id => image_path, :src => image_path, :style => 'display: none')
         | 
| 42 | 
            +
                      end
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            Cucumber::StepMother.send(:include, CucumberScreenshot::Extensions::StepMother)
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            Cucumber::Ast::TreeWalker.send(:include, CucumberScreenshot::Extensions::TreeWalker)
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            Cucumber::Formatter::Pretty.send(:include, CucumberScreenshot::Extensions::Console)
         | 
| 54 | 
            +
            Cucumber::Formatter::Html.send(:include, CucumberScreenshot::Extensions::Html)
         | 
| @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            module CucumberScreenshot
         | 
| 2 | 
            +
              module World
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                attr_accessor :response_body_for_last_screenshot, :screenshot_index, :screenshot_directory, :current_feature_segment, :current_scenario_segment
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                def base_screenshot_directory_name
         | 
| 7 | 
            +
                  # TODO: Make this configurable
         | 
| 8 | 
            +
                  # TODO: Make this work for other frameworks e.g. sinatra
         | 
| 9 | 
            +
                  "#{RAILS_ROOT}/features/screenshots"
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def screenshot(directory_name = base_screenshot_directory_name, file_name = "screenshot-#{(Time.now.to_f * 100).to_i}")
         | 
| 13 | 
            +
                  FileUtils.mkdir_p("#{directory_name}/html")
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  html_file_name = "#{directory_name}/html/#{file_name}.html"
         | 
| 16 | 
            +
                  File.open(html_file_name, "w") do |f|
         | 
| 17 | 
            +
                    f.write rewrite_javascript_and_css_and_image_references(current_response_body)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  command = "snapurl file://#{html_file_name} --no-thumbnail --no-clip --filename #{file_name} --output-dir #{directory_name}"
         | 
| 21 | 
            +
                  `#{command}`
         | 
| 22 | 
            +
                  if $? == 0
         | 
| 23 | 
            +
                    embed_image "#{directory_name}/#{file_name}.png"
         | 
| 24 | 
            +
                    self.response_body_for_last_screenshot = current_response_body
         | 
| 25 | 
            +
                    true
         | 
| 26 | 
            +
                  else
         | 
| 27 | 
            +
                    report_error_running_screenshot_command(command)
         | 
| 28 | 
            +
                    false
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def screenshot_due?
         | 
| 33 | 
            +
                  current_response_body && current_response_body != response_body_for_last_screenshot && !webrat_session.redirect?
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def embed_image(image_path)
         | 
| 37 | 
            +
                  @__cucumber_step_mother.embed_image(image_path)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                protected
         | 
| 41 | 
            +
                  def current_response_body
         | 
| 42 | 
            +
                    webrat_session.send(:response) && webrat_session.response_body
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  def rewrite_javascript_and_css_and_image_references(response_html) # :nodoc:
         | 
| 46 | 
            +
                    doc_root = webrat_session.adapter.doc_root
         | 
| 47 | 
            +
                    return response_html unless doc_root
         | 
| 48 | 
            +
                    response_html.gsub(/"\/(javascripts|stylesheets|images)\//, '"' + doc_root + '/\1/')
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  def report_error_running_screenshot_command(command)
         | 
| 52 | 
            +
                    STDERR.puts "
         | 
| 53 | 
            +
            Unable to make screenshot, to find out what went wrong try the following from the command line
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                #{command}
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            Please remember need to have installed the gem snapurl to take screenshots
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                gem install snapurl
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            "
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
              end
         | 
| 64 | 
            +
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe CucumberScreenshot::Extensions do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              describe 'formatters' do
         | 
| 6 | 
            +
                before(:each) do
         | 
| 7 | 
            +
                  @step_mother = mock('step_mother')
         | 
| 8 | 
            +
                  @io = mock('io')
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                describe 'Pretty#embed_image' do
         | 
| 12 | 
            +
                  it 'should call announce' do
         | 
| 13 | 
            +
                    formatter = Cucumber::Formatter::Pretty.new(@step_mother, @io, {})
         | 
| 14 | 
            +
                    formatter.should_receive(:announce).with('- Image saved to /tmp/foo.png')
         | 
| 15 | 
            +
                    formatter.embed_image('/tmp/foo.png')
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                describe 'Html#embed_image' do
         | 
| 20 | 
            +
                  it 'should build link and image' do
         | 
| 21 | 
            +
                    formatter = Cucumber::Formatter::Html.new(@step_mother, @io, {})
         | 
| 22 | 
            +
                    builder = mock('builder')
         | 
| 23 | 
            +
                    formatter.stub!(:builder => builder)
         | 
| 24 | 
            +
                    builder.should_receive(:a)
         | 
| 25 | 
            +
                    builder.should_receive(:img)
         | 
| 26 | 
            +
                    formatter.embed_image('/tmp/foo.png')
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,56 @@ | |
| 1 | 
            +
            require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class TestWorld
         | 
| 4 | 
            +
              include CucumberScreenshot::World
         | 
| 5 | 
            +
            end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            describe CucumberScreenshot::World do
         | 
| 8 | 
            +
              before(:each) do
         | 
| 9 | 
            +
                @session = TestWorld.new
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              describe '#base_screenshot_directory_name' do
         | 
| 13 | 
            +
                it "add features/screenshots to rails root" do
         | 
| 14 | 
            +
                  ::RAILS_ROOT = 'tmp'
         | 
| 15 | 
            +
                  TestWorld.new.base_screenshot_directory_name.should == 'tmp/features/screenshots'
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              describe '#screenshot' do
         | 
| 20 | 
            +
                before(:each) do
         | 
| 21 | 
            +
                  FileUtils.stub!(:mkdir_p => true)
         | 
| 22 | 
            +
                  File.stub!(:open => true)
         | 
| 23 | 
            +
                  @session.stub!(:base_screenshot_directory_name => 'tmp/features/screenshots', :response_body => 'foo')
         | 
| 24 | 
            +
                  @session.stub!(:'`' => 'foo')
         | 
| 25 | 
            +
                  # While $? is not being set by the backtick stub
         | 
| 26 | 
            +
                  @session.stub!(:report_error_running_screenshot_command => true)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                it 'should call File.makedirs' do
         | 
| 30 | 
            +
                  FileUtils.should_receive(:mkdir_p).with('1/2/html').and_return(true)
         | 
| 31 | 
            +
                  @session.screenshot('1/2', 'snapshot-001')
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              describe '#embed_image' do
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              describe 'protected' do
         | 
| 40 | 
            +
                describe '#rewrite_javascript_and_css_and_image_references' do
         | 
| 41 | 
            +
                  before(:each) do
         | 
| 42 | 
            +
                    @session.stub!(:webrat_session => stub('webrat_session', :adapter => stub('rails_adapter', :doc_root => '/tmp/public')))
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  it 'should replace relative /javascripts/ references with file references' do
         | 
| 46 | 
            +
                    @session.send(:rewrite_javascript_and_css_and_image_references, '<script src="/javascripts/application.js?1255077419" type="text/javascript"></script>').
         | 
| 47 | 
            +
                      should == '<script src="/tmp/public/javascripts/application.js?1255077419" type="text/javascript"></script>'
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  it 'should replace relative /javascripts/ references with file references' do
         | 
| 51 | 
            +
                    @session.send(:rewrite_javascript_and_css_and_image_references, '<link href="/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />').
         | 
| 52 | 
            +
                      should == '<link href="/tmp/public/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />'
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: cucumber-screenshot
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: universal-darwin
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - Joel Chippindale
         | 
| @@ -9,7 +9,7 @@ autorequire: | |
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date: 2009-10- | 
| 12 | 
            +
            date: 2009-10-24 00:00:00 +01:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -18,9 +18,9 @@ dependencies: | |
| 18 18 | 
             
              version_requirement: 
         | 
| 19 19 | 
             
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 20 20 | 
             
                requirements: 
         | 
| 21 | 
            -
                - - " | 
| 21 | 
            +
                - - "="
         | 
| 22 22 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 23 | 
            -
                    version: 0. | 
| 23 | 
            +
                    version: 0.4.2
         | 
| 24 24 | 
             
                version: 
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 26 26 | 
             
              name: webrat
         | 
| @@ -28,12 +28,12 @@ dependencies: | |
| 28 28 | 
             
              version_requirement: 
         | 
| 29 29 | 
             
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 30 30 | 
             
                requirements: 
         | 
| 31 | 
            -
                - - " | 
| 31 | 
            +
                - - "="
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 33 33 | 
             
                    version: 0.5.3
         | 
| 34 34 | 
             
                version: 
         | 
| 35 35 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 36 | 
            -
              name:  | 
| 36 | 
            +
              name: snapurl
         | 
| 37 37 | 
             
              type: :runtime
         | 
| 38 38 | 
             
              version_requirement: 
         | 
| 39 39 | 
             
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| @@ -57,10 +57,10 @@ files: | |
| 57 57 | 
             
            - Rakefile
         | 
| 58 58 | 
             
            - VERSION.yml
         | 
| 59 59 | 
             
            - lib/cucumber_screenshot.rb
         | 
| 60 | 
            -
            - lib/cucumber_screenshot/ | 
| 61 | 
            -
            - lib/cucumber_screenshot/ | 
| 62 | 
            -
            - spec/cucumber_screenshot/ | 
| 63 | 
            -
            - spec/cucumber_screenshot/ | 
| 60 | 
            +
            - lib/cucumber_screenshot/extensions.rb
         | 
| 61 | 
            +
            - lib/cucumber_screenshot/world.rb
         | 
| 62 | 
            +
            - spec/cucumber_screenshot/extensions_spec.rb
         | 
| 63 | 
            +
            - spec/cucumber_screenshot/world_spec.rb
         | 
| 64 64 | 
             
            - spec/spec.opts
         | 
| 65 65 | 
             
            - spec/spec_helper.rb
         | 
| 66 66 | 
             
            has_rdoc: true
         | 
| @@ -93,6 +93,6 @@ signing_key: | |
| 93 93 | 
             
            specification_version: 3
         | 
| 94 94 | 
             
            summary: Cucumber formatter that outputs PNG screenshots of your app
         | 
| 95 95 | 
             
            test_files: 
         | 
| 96 | 
            -
            - spec/cucumber_screenshot/ | 
| 97 | 
            -
            - spec/cucumber_screenshot/ | 
| 96 | 
            +
            - spec/cucumber_screenshot/extensions_spec.rb
         | 
| 97 | 
            +
            - spec/cucumber_screenshot/world_spec.rb
         | 
| 98 98 | 
             
            - spec/spec_helper.rb
         | 
| @@ -1,63 +0,0 @@ | |
| 1 | 
            -
            module CucumberScreenshot
         | 
| 2 | 
            -
              class Formatter < Cucumber::Ast::Visitor
         | 
| 3 | 
            -
             | 
| 4 | 
            -
                attr_accessor :response_body_for_last_screenshot, :screenshot_index, :screenshot_directory, :current_feature_segment, :current_scenario_segment
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                # Currently ignores io and options arguments
         | 
| 7 | 
            -
                def initialize(step_mother, io, options)
         | 
| 8 | 
            -
                  super(step_mother)
         | 
| 9 | 
            -
                  @io = io
         | 
| 10 | 
            -
                  @options = options
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                def visit_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background)
         | 
| 14 | 
            -
                  if screenshot_due?
         | 
| 15 | 
            -
                    self.screenshot_index = screenshot_index.next
         | 
| 16 | 
            -
                    exit unless session.screenshot(screenshot_directory_name, "screenshot-#{format('%03d', screenshot_index)}")
         | 
| 17 | 
            -
                    self.response_body_for_last_screenshot = current_response_body
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
                  super
         | 
| 20 | 
            -
                end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                def visit_scenario_name(keyword, name, file_colon_line, source_indent)
         | 
| 23 | 
            -
                  puts "Scenario #{name}"
         | 
| 24 | 
            -
                  self.response_body_for_last_screenshot = nil
         | 
| 25 | 
            -
                  self.screenshot_index = 0
         | 
| 26 | 
            -
                  self.current_scenario_segment = segment_for_scenario_named(name)
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                def visit_feature(feature)
         | 
| 30 | 
            -
                  self.current_feature_segment = segment_for_feature(feature)
         | 
| 31 | 
            -
                  super
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                def visit_feature_name(name)
         | 
| 35 | 
            -
                  puts(name)
         | 
| 36 | 
            -
                end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                protected
         | 
| 39 | 
            -
                  def screenshot_directory_name
         | 
| 40 | 
            -
                    File.join(session.base_screenshot_directory_name, current_feature_segment, current_scenario_segment)
         | 
| 41 | 
            -
                  end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  def segment_for_feature(feature)
         | 
| 44 | 
            -
                    feature.file.gsub(/^features\//, '').gsub(/\.feature$/, '')
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                  def segment_for_scenario_named(name)
         | 
| 48 | 
            -
                    name.downcase.gsub(' ', '_').gsub(/(\(|\))/, '')
         | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                  def session
         | 
| 52 | 
            -
                    step_mother.current_world.webrat_session
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                  def current_response_body
         | 
| 56 | 
            -
                    session.send(:response) && session.response_body
         | 
| 57 | 
            -
                  end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                  def screenshot_due?
         | 
| 60 | 
            -
                    current_response_body && current_response_body != response_body_for_last_screenshot && !session.redirect?
         | 
| 61 | 
            -
                  end
         | 
| 62 | 
            -
              end
         | 
| 63 | 
            -
            end
         | 
| @@ -1,53 +0,0 @@ | |
| 1 | 
            -
            module CucumberScreenshot
         | 
| 2 | 
            -
              module Webrat
         | 
| 3 | 
            -
                module Session #:nodoc:
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                  def base_screenshot_directory_name
         | 
| 6 | 
            -
                    # TODO: Make this configurable
         | 
| 7 | 
            -
                    # TODO: Make this work for other frameworks e.g. sinatra
         | 
| 8 | 
            -
                    "#{RAILS_ROOT}/features/screenshots"
         | 
| 9 | 
            -
                  end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  def screenshot(directory_name = base_screenshot_directory_name, file_name = "screenshot-#{Time.now.to_i}")
         | 
| 12 | 
            -
                    File.makedirs("#{directory_name}/html")
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                    html_file_name = "#{directory_name}/html/#{file_name}.html"
         | 
| 15 | 
            -
                    File.open(html_file_name, "w") do |f|
         | 
| 16 | 
            -
                      f.write rewrite_javascript_and_css_and_image_references(response_body)
         | 
| 17 | 
            -
                    end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                    command = "snapurl file://#{html_file_name} --no-thumbnail --no-clip --filename #{file_name} --output-dir #{directory_name}"
         | 
| 20 | 
            -
                    `#{command}`
         | 
| 21 | 
            -
                    if $? == 0
         | 
| 22 | 
            -
                      puts "- Screenshot saved to #{directory_name}/#{file_name}.png\n"
         | 
| 23 | 
            -
                      true
         | 
| 24 | 
            -
                    else
         | 
| 25 | 
            -
                      report_error_running_screenshot_command(command)
         | 
| 26 | 
            -
                      false
         | 
| 27 | 
            -
                    end
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                  protected
         | 
| 31 | 
            -
                    def rewrite_javascript_and_css_and_image_references(response_html) # :nodoc:
         | 
| 32 | 
            -
                      return response_html unless doc_root
         | 
| 33 | 
            -
                      rewrite_css_and_image_references(response_html).gsub(/"\/(javascript)/, doc_root + '/\1')
         | 
| 34 | 
            -
                    end
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                    def report_error_running_screenshot_command(command)
         | 
| 37 | 
            -
                      STDERR.puts "
         | 
| 38 | 
            -
            Unable to make screenshot, to find out what went wrong try the following from the command line
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                #{command}
         | 
| 41 | 
            -
             | 
| 42 | 
            -
            Please remember need to have installed the gem mocoso-snapshoturl to take screenshots
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                gem install mocoso-snapshoturl
         | 
| 45 | 
            -
             | 
| 46 | 
            -
            "
         | 
| 47 | 
            -
                    end
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
              end
         | 
| 50 | 
            -
            end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
            Webrat::Session.send(:include, CucumberScreenshot::Webrat::Session)
         | 
| 53 | 
            -
             | 
| @@ -1,14 +0,0 @@ | |
| 1 | 
            -
            require File.dirname(__FILE__) + '/../spec_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module CucumberScreenshot
         | 
| 4 | 
            -
              describe Formatter do
         | 
| 5 | 
            -
                describe '#visit_scenario_named' do
         | 
| 6 | 
            -
                  before(:each) do
         | 
| 7 | 
            -
                    @formatter = Formatter.new(stub('step_mother'), nil, {})
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
                  it "set current_scenario_segment from scenario name" do
         | 
| 10 | 
            -
                    lambda { @formatter.visit_scenario_name(nil, 'Login (when already has an account)', 1, 2) }.should change(@formatter, :current_scenario_segment).to('login_when_already_has_an_account')
         | 
| 11 | 
            -
                  end
         | 
| 12 | 
            -
                end
         | 
| 13 | 
            -
              end
         | 
| 14 | 
            -
            end
         | 
| @@ -1,30 +0,0 @@ | |
| 1 | 
            -
            require File.dirname(__FILE__) + '/../../spec_helper'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module CucumberScreenshot
         | 
| 4 | 
            -
              module Webrat
         | 
| 5 | 
            -
                describe Session do
         | 
| 6 | 
            -
                  describe '#base_screenshot_directory_name' do
         | 
| 7 | 
            -
                    it "add features/screenshots to rails root" do
         | 
| 8 | 
            -
                      ::RAILS_ROOT = 'tmp'
         | 
| 9 | 
            -
                      ::Webrat::Session.new.base_screenshot_directory_name.should == 'tmp/features/screenshots'
         | 
| 10 | 
            -
                    end
         | 
| 11 | 
            -
                  end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                  describe '#screenshot' do
         | 
| 14 | 
            -
                    before(:each) do
         | 
| 15 | 
            -
                      @html_file = stub('html_file', :write => true)
         | 
| 16 | 
            -
                      File.stub!(:makedirs => true, :open => @html_file)
         | 
| 17 | 
            -
                      @session = ::Webrat::Session.new
         | 
| 18 | 
            -
                      @session.stub!(:base_screenshot_directory_name => 'tmp/features/screenshots', :response_body => 'foo')
         | 
| 19 | 
            -
                      @session.stub!(:` => 'foo')
         | 
| 20 | 
            -
                      @session.stub!(:report_error_running_screenshot_command => true) # While $? is not being set by the backtick stub
         | 
| 21 | 
            -
                    end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                    it 'should call File.makedirs' do
         | 
| 24 | 
            -
                      File.should_receive(:makedirs).with('1/2/html').and_return(true)
         | 
| 25 | 
            -
                      @session.screenshot('1/2', 'snapshot-001')
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
                end
         | 
| 29 | 
            -
              end
         | 
| 30 | 
            -
            end
         |