Current section

Files

Jump to
absinthe_extra lib absinthe extra case assertion.ex
Raw

lib/absinthe/extra/case/assertion.ex

defmodule Absinthe.Extra.Case.Assertion do
@moduledoc false
use ExUnit.CaseTemplate
import Phoenix.ConnTest
@path Application.compile_env(:absinthe_extra, :path)
@endpoint Application.compile_env(:absinthe_extra, :endpoint)
@spec graphql_error(Plug.Conn.t(), query :: String.t()) :: map
def graphql_error(conn, query, opts \\ []) do
conn = run_query(conn, query, opts)
response = json_response(conn, 200)
%{errors: response["errors"], data: response["data"]}
end
@spec graphql_success(Plug.Conn.t(), query :: String.t()) :: map
def graphql_success(conn, query, opts \\ []) do
conn = run_query(conn, query, opts)
response = json_response(conn, 200)
assert response["errors"] == nil
# support only one query
response["data"] |> Enum.at(0) |> (fn {_, v} -> v end).() |> key_to_atom()
end
@spec graphql_success(Plug.Conn.t(), query :: String.t()) :: map
def graphql_node_success(conn, query) do
data = graphql_success(conn, query)
unpaginate_fields(data)
end
@spec unpaginate_fields(map) :: [any]
def unpaginate_fields(connection) do
assert %{edges: edges} = connection
edges
|> Enum.map(fn edge ->
assert %{node: node} = edge
node
end)
end
defp run_query(conn, query, opts) do
path = Keyword.get(opts, :path, @path)
body = Keyword.get(opts, :extra_body, %{})
post(conn, path, Map.merge(%{"query" => query}, body))
end
defp key_to_atom(values) when is_list(values),
do: Enum.map(values, &key_to_atom/1)
defp key_to_atom(values) when is_map(values) do
values |> Enum.map(&key_to_atom/1) |> Enum.into(%{})
end
defp key_to_atom({key, value}) when is_map(value) or is_list(value) do
key = String.to_existing_atom(key)
value = key_to_atom(value)
{key, value}
end
defp key_to_atom({key, value}) do
key = String.to_existing_atom(key)
{key, value}
end
defp key_to_atom(field), do: field
end