Euphorichuman

Euphorichuman

Testing flash message from LiveView

I’m trying to test a Phoenix phx-click event which, after being clicked, adds a flash message to the socket of a Live view: put_flash (), and also the Live view updates some of its components (This if I can check it correctly from the test). But when trying to make the assertion with the flash the test fails, because the flash is nil (Although this in practice if it shows.

My handle_event looks something like this:

def handle_event("deactivate", _params, socket) do
    ...

    socket
    |> clear_flash()
    |> put_flash(:info, "Show disabled!")
    |> (&{:noreply, &1}).()
  end

And test:

test "click deactivate button", %{slug: slug, conn: conn} do
      conn =
        conn
           |> ...
           |> get("/show/#{slug}")

      {:ok, view, html} = live(conn, "/show/#{slug}")

      assert html =~ "Active" #The button has this text (pass)
      assert render_click(view, :unsubscribe) =~ "Activate this show" #Components that update after the click (pass)
      assert get_flash(conn, :info) == "Show disabled!" #Flash message (assertion failed)
    end

Test result:

 Assertion with == failed
     code:  assert get_flash(conn, :info) == "Show disabled!"
     left:  nil
     right: "Show disabled!"

Note: The flash that I’m trying to access is in the assigns of the Phoenix.LiveView.Socket

Most Liked

endoooo

endoooo

if you explicitly call render/1 after render_click/2, you can assert if the returned HTML includes the flash message (which is great, because we avoid testing implementation details):

{:ok, view, html} = live(conn, "/show/#{slug}")

assert html =~ "Active" #The button has this text (pass)
assert render_click(view, :unsubscribe) =~ "Activate this show" #Components that update after the click (pass)
# assert get_flash(conn, :info) == "Show disabled!" #Flash message (assertion failed)
# do this instead 👇
assert render(view) =~ "Show disabled!"

I found this solution here Send event from live component to parent Live View - #6 by MMore

thenrio

thenrio

Hello @Euphorichuman,

a) I think you should have an element in the dom that shows the flash message to user?

assert has_element?(view, your_selector_here, maybe_some_text)

b) the flash is indeed in the assigns of view, not in conn
See Phoenix.LiveView.put_flash/3, Phoenix.LiveView.Utils.put_flash/3.
You may want to use :sys.get_state to peek in the state of the view?

I recommend a) over b).

Finally,

c) Phoenix.LiveViewTest — Phoenix LiveView v1.2.5 makes it easy to test a redirect, and the redirect tuple has a flash when there is one…

I understand that is not your case, but it happens the only flash test I have use that.

Where Next?

Popular in Questions Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

Other popular topics Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44139 214
New

We're in Beta

About us Mission Statement