Back to Repositories

Testing Screenshot Capture and File Management in Capybara

This test suite validates Capybara’s screenshot functionality, focusing on the save_and_open_screenshot feature. It ensures proper screenshot capture and file handling across different scenarios, including custom directory paths and error handling.

Test Coverage Overview

The test suite comprehensively covers Capybara’s screenshot capabilities with specific focus on:
  • Default directory screenshot saving and opening
  • Custom directory path handling
  • Error scenarios when Launchy gem is unavailable
  • File naming conventions and path validation

Implementation Analysis

The testing approach utilizes RSpec’s mocking capabilities to isolate screenshot functionality:
  • Mock implementations for driver.save_screenshot and Launchy.open
  • Path matching using regex patterns for flexibility
  • Context-specific test organization for error scenarios
  • Behavior verification through expect statements

Technical Details

Key technical components include:
  • RSpec testing framework integration
  • Launchy gem for file opening functionality
  • Capybara::SpecHelper for test setup
  • Mock objects for driver and file operations
  • Temporary directory handling for file storage

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Isolation of external dependencies through mocking
  • Clear test case organization and naming
  • Comprehensive error scenario coverage
  • Proper setup and teardown management
  • Consistent verification patterns

teamcapybara/capybara

lib/capybara/spec/session/save_and_open_screenshot_spec.rb

            
# frozen_string_literal: true

require 'launchy'

Capybara::SpecHelper.spec '#save_and_open_screenshot' do
  before do
    @session.visit '/'
  end

  it 'opens file from the default directory', requires: [:screenshot] do
    expected_file_regex = /capybara-\d+\.png/
    allow(@session.driver).to receive(:save_screenshot)
    allow(Launchy).to receive(:open)

    @session.save_and_open_screenshot

    expect(@session.driver).to have_received(:save_screenshot)
      .with(expected_file_regex, any_args)
    expect(Launchy).to have_received(:open).with(expected_file_regex)
  end

  it 'opens file from the provided directory', requires: [:screenshot] do
    custom_path = 'screenshots/1.png'
    allow(@session.driver).to receive(:save_screenshot)
    allow(Launchy).to receive(:open)

    @session.save_and_open_screenshot(custom_path)

    expect(@session.driver).to have_received(:save_screenshot)
      .with(/#{custom_path}$/, any_args)
    expect(Launchy).to have_received(:open).with(/#{custom_path}$/)
  end

  context 'when launchy cannot be required' do
    it 'prints out a correct warning message', requires: [:screenshot] do
      file_path = File.join(Dir.tmpdir, 'test.png')
      allow(@session).to receive(:warn)
      allow(@session).to receive(:require).with('launchy').and_raise(LoadError)
      @session.save_and_open_screenshot(file_path)
      expect(@session).to have_received(:warn).with("File saved to #{file_path}.\nPlease install the launchy gem to open the file automatically.")
    end
  end
end