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.
Environment
Actual behavior
In my
ConnCase, I'm usingPhoenix.LiveViewTest.put_connect_params/2to set a value similar to what myapp.jsdoes when running my full application. I then attempt to usePhoenix.LiveView.get_connect_params/1to read that value in anon_mounthook 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_paramsare 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(orPhoenix.ConnTest.ensure_recycled/1) is called from several places during the navigation, and that function doesn't preserve theconn.private[:live_view_connect_params](or anything else inconn.privatefor that matter.I'm not sure of the correct fix here. Phoenix shouldn't really know about a
:privatebeing set by LiveView, and it probably shouldn't blindly preserve everything inconn.privatewhen recycling.It might be possible to add a LiveView-specific version of
recyclethat preserves the connect params across a call to the originalrecycle. That would likely require other libraries to be updated. For example, PhoenixTest also calls the original version ofrecycle, so it wouldn't use the LiveView-specific version ofrecyclewithout an update.