Search code examples
ruby-on-railscapybara

Rails system test w/ Capybara RackTest raises ActiveSupport::MessageVerifier::InvalidSignature


I have a typical Rails model form with a file attachment selector allowing multiple attachments. It works fine in development, but during a system test, raises an ActiveSupport::MessageVerifier::InvalidSignature exception.

  • Rails 7.0.2.2
  • capybara 3.36.0
  • rack-test 1.1.0

The model has_many_attached :photos.

The form is using form_with and multipart: true.

The HTML source looks correct.

In development, manually using the form with 0 or any file attachments works as expected.

In my system test, I am using the rack_test driver.

test "creating a quote request" do
  visit new_quote_request_path
  fill_in "First name", with: 'FAKE FIRST'
  # ...
  click_on "Submit"
  assert_text "Success"
end

In the controller, my canonical param-permitting method looks like:

def quote_request_params
  params.require(:quote_request).permit(:first_name, :last_name, :email,
    :phone_number, :shipping, :promo_code, :description, :item_type_id, :brand_id,
    photos: [])
end

My controller create method is typical...

def create
  @quote_request = QuoteRequest.new(quote_request_params)
  respond_to do |format|
  # ...

In the system test, the call of QuoteRequest.new(quote_request_params) raises an ActiveSupport::MessageVerifier::InvalidSignature exception.

With a breakpoint in place, I can see that the quote_request_params looks like:

#<ActionController::Parameters {"first_name"=>"FAKE FIRST",
"last_name"=>"FAKE LAST", "email"=>"fake@fake.com", 
"phone_number"=>"5415555555", "shipping"=>"1", "promo_code"=>"", 
"description"=>"Fake quote request description.", 
"item_type_id"=>"980190962", "brand_id"=>"980190962",
"photos"=>[
  "",
  "#<Capybara::RackTest::Form::NilUploadedFile:0x000000010dae35b8>"
]} permitted: true>

And it seems Capybara is doing its default behavior of attaching a 'nil file' for the multipart form.

Why is the test raising an ActiveSupport::MessageVerifier::InvalidSignature exception?


Solution

  • This is an issue with Rails 7 and rack-test. It can temporarily be solved by putting the following in config/environments/test.rb:

    config.active_storage.multiple_file_field_include_hidden = false
    

    Refer to the rack-test issue for more details.