yoyodunno
yoyodunno

Reputation: 767

Test file download with Capybara and Cucumber

I am trying to test a download using Capybara and Cucumber.

The test steps look like:

When(/^I export to CSV$/) do
  export_button = find("div.results-table input[type=\"submit\"]")

  export_button.click
end

Then(/^I should be prompted to download the CSV$/) do
  Capybara.current_driver = :webkit #switch driver so we can see the response_headers
  page.response_headers['Content-Disposition'].should include("filename=\"transactions\"")
end

I had to add the capybara webkit driver in the middle of the test so that I can use the response_headers, but the response_headers seem to return an empty object. I am using the default driver before that because I need to click the button, but I wonder if switching drivers like this is why I am not getting anything in the response_header?

Upvotes: 2

Views: 2712

Answers (1)

Sarabjit Singh
Sarabjit Singh

Reputation: 790

I have done it in my recent project as shown below

Given Download folder for export is empty
And   Joe clicks "Download Csv" button
Then  The contents of the downloaded csv should be:
|TEAM_ID | TEAM_EXTERNAL_ID | TYPE | REG_OPTION      | TEAM_REG_BRACKET | RACE_NAME  | WAVE      | BIB | BRACKET | STATUS    | TEAM_NAME | TEAM_TYPE | ATHLETE_COUNT | MIN_MEMBERS  | MAX_MEMBERS | TEAM_MEMBERS |
|    8   |                  | TEAM | 10k Aggregate   | N/A              | 10k        | Universal | 208 | Overall | DNF       | Team 08   | Aggregate |0              |              |             |              |

And the capybara for this cucumber will be like

Given(/^Download folder for export is empty$/) do
  FileUtils.rm_rf('/home/vagrant/Downloads/')
end

And(/^(\S*) clicks "([^"]*)" button$/) do |user, arg|
  button = find_button(arg)
  button.click
end

And /^The contents of the downloaded csv should be:$/ do |table|
  for i in 0..5
      if(Dir.glob('/home/vagrant/Downloads/*.csv'))
        break;
      end
      sleep(1); // if not found wait one second before continue looping
  end

  if(Dir.glob('/home/vagrant/Downloads/*.csv'))
    Dir['/home/vagrant/Downloads/*'].each do |file_name|
      arr = CSV.read(file_name, :col_sep => "\t", :row_sep => "\r\n", encoding: "UTF-16:UTF-8")
      table.raw[0...table.raw.length].each_with_index do |row, row_index|
        row.each_with_index do |value, index|
          if arr[row_index][index] == nil
            arr[row_index][index] = ""
          end
          if index == 1
          else
            puts "#{index}" + 'Value in table = ' + "#{value} + 'Value in file' + #{arr[row_index][index]}"
            value.should eq arr[row_index][index]
          end
        end
      end
    end
  else
    puts "/home/vagrant/Downloads/*.csv file not found!"
  end
end

Hope this resolves you problem for downloading CSV and verifying its contents too :)

Upvotes: 0

Related Questions