lib/capybara/spec/session/save_page_spec.rb



# frozen_string_literal: true

Capybara::SpecHelper.spec '#save_page' do
  let(:alternative_path) { File.join(Dir.pwd, 'save_and_open_page_tmp') }
  before do
    @old_save_path = Capybara.save_path
    Capybara.save_path = nil
    @session.visit('/foo')
  end

  after do
    Capybara.save_path = @old_save_path
    Dir.glob('capybara-*.html').each do |file|
      FileUtils.rm(file)
    end
    FileUtils.rm_rf alternative_path
  end

  it 'saves the page in the root directory' do
    @session.save_page
    path = Dir.glob('capybara-*.html').first
    expect(File.read(path)).to include('Another World')
  end

  it 'generates a sensible filename' do
    @session.save_page
    filename = Dir.glob('capybara-*.html').first
    expect(filename).to match(/^capybara-\d+\.html$/)
  end

  it 'can store files in a specified directory' do
    Capybara.save_path = alternative_path
    @session.save_page
    path = Dir.glob("#{alternative_path}/capybara-*.html").first
    expect(File.read(path)).to include('Another World')
  end

  it 'uses the given filename' do
    @session.save_page('capybara-001122.html')
    expect(File.read('capybara-001122.html')).to include('Another World')
  end

  it 'can store files in a specified directory with a given filename' do
    Capybara.save_path = alternative_path
    @session.save_page('capybara-001133.html')
    path = "#{alternative_path}/capybara-001133.html"
    expect(File.read(path)).to include('Another World')
  end

  it 'can store files in a specified directory with a given relative filename' do
    Capybara.save_path = alternative_path
    @session.save_page('tmp/capybara-001144.html')
    path = "#{alternative_path}/tmp/capybara-001144.html"
    expect(File.read(path)).to include('Another World')
  end

  it 'returns an absolute path in pwd' do
    result = @session.save_page
    path = File.expand_path(Dir.glob('capybara-*.html').first, Dir.pwd)
    expect(result).to eq(path)
  end

  it 'returns an absolute path in given directory' do
    Capybara.save_path = alternative_path
    result = @session.save_page
    path = File.expand_path(Dir.glob("#{alternative_path}/capybara-*.html").first, alternative_path)
    expect(result).to eq(path)
  end

  context 'asset_host contains a string' do
    before { Capybara.asset_host = 'http://example.com' }

    after { Capybara.asset_host = nil }

    it 'prepends base tag with value from asset_host to the head' do
      @session.visit('/with_js')
      path = @session.save_page

      result = File.read(path)
      expect(result).to include("<head><base href='http://example.com' />")
    end

    it "doesn't prepend base tag to pages when asset_host is nil" do
      Capybara.asset_host = nil
      @session.visit('/with_js')
      path = @session.save_page

      result = File.read(path)
      expect(result).to include('<html')
      expect(result).not_to include('http://example.com')
    end

    it "doesn't prepend base tag to pages which already have it" do
      @session.visit('/with_base_tag')
      path = @session.save_page

      result = File.read(path)
      expect(result).to include('<html')
      expect(result).not_to include('http://example.com')
    end

    it 'executes successfully even if the page is missing a <head>' do
      @session.visit('/with_simple_html')
      path = @session.save_page

      result = File.read(path)
      expect(result).to include('Bar')
    end
  end
end