Search code examples
ruby-on-railstddtestunitminitestrack-test

How to check if response is a file?


How do I test if the response of a controller action in Rails is a file? (rack-test or capybara)

Should I use unit tests to do it?

The scenario is simple: I have to test if the exported users from the database are the same contained in the generated .csv from an action.


Solution

  • You don't need rack-test or Capybara to do this. The default test infrastructure is all you need. Simply check that the Content-Type is CSV:

    test "returns a CSV file" do
      get :index, format: :csv
      assert_response :success
      assert_equal "text/csv", response.content_type
    end
    

    If you want to take it one step further, you can parse the returned CSV to make sure it is valid and test the values returned:

    test "returns a valid CSV file and data" do
      get :index, format: :csv
      assert_response :success
      assert_equal "text/csv", response.content_type
    
      csv = CSV.parse response.body # Let raise if invalid CSV
      assert csv
      assert_equal 6, csv.size
      assert_equal "Joe Smith", csv[3][4]
    end