defmodule Mobilizon.GraphQL.AbsintheHelpers do
  @moduledoc """
  Absinthe helpers for tests
  """

  import Phoenix.ConnTest

  alias Plug.Conn

  @endpoint Mobilizon.Web.Endpoint

  def query_skeleton(query, query_name) do
    %{
      "operationName" => "#{query_name}",
      "query" => "query #{query_name} #{query}",
      "variables" => "{}"
    }
  end

  def mutation_skeleton(query) do
    %{
      "operationName" => "",
      "query" => "#{query}",
      "variables" => ""
    }
  end

  @spec graphql_query(Conn.t(), Keyword.t()) :: map | no_return
  def graphql_query(conn, options) do
    conn
    |> post(
      "/api",
      build_query(
        options[:query],
        Keyword.get(options, :variables, %{}),
        Keyword.get(options, :uploads, %{})
      )
    )
    |> json_response(200)
  end

  defp build_query(query, variables, uploads) do
    Map.merge(
      %{
        "query" => query,
        "variables" => variables
      },
      uploads
    )
  end
end
