Skip to content

put_connect_params doesn't persist through navigation #4005

@randycoulman

Description

@randycoulman

Environment

  • Elixir version (elixir -v): 1.18.4
  • Phoenix version (mix deps): 1.17.21
  • Phoenix LiveView version (mix deps): 1.0.11
  • Operating system: MacOS 15.6.1
  • Browsers you attempted to reproduce this bug on (the more the merrier): Brave
  • Does the problem persist after removing "assets/node_modules" and trying again? Yes/no: Yes

Actual behavior

In my ConnCase, I'm using Phoenix.LiveViewTest.put_connect_params/2 to set a value similar to what my app.js does when running my full application. I then attempt to use Phoenix.LiveView.get_connect_params/1 to read that value in an on_mount hook that is used by most of my LiveViews.

This works fine for the first LiveView I visit in my test. However, if I think perform an action that navigates (usually live navigation, but not always) to another LiveView, my connect_params are no longer present.

When I run the application in the browser, everything works fine. It's just during the tests that it's a problem.

Expected behavior

I expect that my tests will work the same way as the real application does in the browser, where the connect_params are available to all of the LiveViews I visit during the test.

Notes

I've done some digging here, and the root cause is that Phoenix.ConnTest.recycle/1 (or Phoenix.ConnTest.ensure_recycled/1) is called from several places during the navigation, and that function doesn't preserve the conn.private[:live_view_connect_params] (or anything else in conn.private for that matter.

I'm not sure of the correct fix here. Phoenix shouldn't really know about a :private being set by LiveView, and it probably shouldn't blindly preserve everything in conn.private when recycling.

It might be possible to add a LiveView-specific version of recycle that preserves the connect params across a call to the original recycle. That would likely require other libraries to be updated. For example, PhoenixTest also calls the original version of recycle, so it wouldn't use the LiveView-specific version of recycle without an update.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions