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