: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.