# `Mutare.Phoenix.Body`
[🔗](https://github.com/foxbenjaminfox/mutare_phoenix/blob/v0.3.1/lib/mutare/phoenix/body.ex#L1)

`:controller_body` — blanks a rendered response body: the data argument of
`Phoenix.Controller.json/2` becomes `%{}`, and that of `text/2` and `html/2` becomes
`""`. A surviving mutant means the tests still pass with an empty response body:
the status and content type are unchanged, and no assertion detects the missing content.

    json(conn, %{id: user.id})        # → json(conn, %{})
    text(conn, "pong")                # → text(conn, "")
    conn |> html(render_page(page))   # → conn |> html("")

Each replacement is a valid empty body for its renderer: `%{}` encodes to
`{}` — a well-formed, empty JSON document — while `""` is a `text`/`html` body with
nothing in it. A body that is already that blank literal is left alone (the mutant would
change nothing).

Matches each call written directly (`Phoenix.Controller.json(conn, ...)`), aliased, or
bare-imported (`json(conn, ...)`, the form `use MyAppWeb, :controller` produces). The
`Plug.Conn`-level bodies (`send_resp/3`, `resp/3`) are `mutare_plug`'s `:resp_body`;
`render/3` is out of scope — its argument names a template, not a body.

Because the mutation is the original call with exactly the body argument substituted,
`Mutare.Transform.Overlap` treats it as covering that node: on a *literal* `text`/`html`
body the built-in `:string` leaves (`""`/`"mutare"`) are pruned automatically, so this
family replaces those mutations at the same range. A `json` map literal's *entries*
are descendants, not the body node, so built-in mutations inside the map are retained.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
