I just updated my app to rails 8 with the newest version of Devise and hotwire turbo. When running tests with Capybara/Rspec I'm seeing certain form submissions fail with a 500 error from inside of Devise. This behavior seems to be only in the test environment. Here are the versions I'm using:
- Ruby [3.3.6]
- Rails [8.0.0]
- Devise [4.9.4]
The error is coming from
lib/devise.rb:496
def self.configure_warden! #:nodoc:
@@warden_configured ||= begin
warden_config.failure_app = Devise::Delegator.new
warden_config.default_scope = Devise.default_scope
warden_config.intercept_401 = false
Devise.mappings.each_value do |mapping|
binding.pry
warden_config.scope_defaults mapping.name, strategies: mapping.strategies
warden_config.serialize_into_session(mapping.name) do |record|
mapping.to.serialize_into_session(record)
end
warden_config.serialize_from_session(mapping.name) do |args|
mapping.to.serialize_from_session(*args)
end
end
@@warden_config_blocks.map { |block| block.call Devise.warden_config }
true
end
end
When mapping.to.serialize_from_session(*args)
is called I get the error "wrong number of arguments (given 10, expected 2)".
I have not been able to find a pattern between tests that pass and tests that cause this behavior except that I can see the data is different.
On a passing test args
looks like this:
[[1], "$2a$04$yPg9CBmwVeIZc3VYqdmL3O"]
But on a failing test args looks like this:
{
"id"=>27,
"email"=>"[email protected]",
"created_at"=>"2000-01-01T05:00:03.000Z",
"updated_at"=>"2000-01-01T05:00:19.000Z",
"client_id"=>18,
"role"=>"coordinator",
"authentication_token"=>"pxcFTApxeyCo1evMNd9X",
"first_name"=>"User12",
"last_name"=>"Name",
"analytics_enabled"=>false
}
What could be causing this? Looks like a hash composed of a full user record instead of just an id and token.