Current section

Files

Jump to
combo_inertia lib combo inertia testing.ex
Raw

lib/combo/inertia/testing.ex

defmodule Combo.Inertia.Testing do
@moduledoc """
Helpers for testing Inertia responses.
"""
@doc """
Gets the Inertia component for given `%Plug.Conn{}`.
## Example
use MyApp.Web.ConnCase
import Combo.Inertia.Testing
describe "GET /" do
test "renders the home page", %{conn: conn} do
conn = get("/")
assert inertia_component(conn) == "Home"
end
end
"""
@spec inertia_component(Plug.Conn.t()) :: String.t() | nil
def inertia_component(conn) do
page = conn.private[:inertia_page] || %{}
page[:component]
end
@doc """
Gets the Inertia props for given `%Plug.Conn{}`.
## Example
use MyApp.Web.ConnCase
import Combo.Inertia.Testing
describe "GET /" do
test "renders the home page", %{conn: conn} do
conn = get("/")
assert %{user: %{id: 1}} = inertia_props(conn)
end
end
"""
@spec inertia_props(Plug.Conn.t()) :: map() | nil
def inertia_props(conn) do
page = conn.private[:inertia_page] || %{}
page[:props]
end
@doc """
Gets the Inertia errors for given `%Plug.Conn{}`.
If there are errors available in the current page props, they will be returned.
Otherwise, errors that have been stored in the session will be retrieved.
## Example
use MyApp.Web.ConnCase
import Combo.Inertia.Testing
describe "POST /users" do
test "fails when name empty", %{conn: conn} do
conn = post("/users", %{"name" => ""})
assert %{user: %{id: 1}} = inertia_props(conn)
assert redirected_to(conn) == ~p"/users"
assert inertia_errors(conn) == %{"name" => "can't be blank"}
end
end
"""
@spec inertia_errors(Plug.Conn.t()) :: map()
def inertia_errors(conn) do
page = conn.private[:inertia_page] || %{}
case page[:props] do
%{errors: errors} -> errors
_ -> Plug.Conn.get_session(conn, "inertia_errors", %{})
end
end
end