defmodule WabanexWeb.SchemaTest do
  use WabanexWeb.ConnCase, async: true

  alias Wabanex.{User, Users}

  describe "users queries" do
    test "when a valid id is given returns the user", %{conn: conn} do
      params = %{name: "Joe Doe", email: "joe.doe@anywhere.com", password: "aLongEnough"}

      {:ok, %User{id: user_id}} = Users.Create.call(params)

      query = """
        query TestGetUser($id: UUID4!) {
          getUser(id: $id) {
            id
            name
            email
          }
        }
      """

      response =
        conn
        |> post("/api/graphql", %{query: query, variables: %{"id" => user_id}})
        |> json_response(:ok)

      expected_response = %{
        "data" => %{
          "getUser" => %{"id" => user_id, "name" => "Joe Doe", "email" => "joe.doe@anywhere.com"}
        }
      }

      assert expected_response == response
    end
  end

  describe "user mutations" do
    test "when all params are valid creates an user", %{conn: conn} do
      mutation = """
        mutation TestCreateUser($input: CreateUserInput!) {
          createUser(input: $input) {
            name
            email
          }
        }
      """

      input = %{
        "input" => %{
          "name" => "Joe Doe",
          "email" => "joe.doe@nowhere.com",
          "password" => "aLongEnough"
        }
      }

      response =
        conn
        |> post("/api/graphql", %{query: mutation, variables: input})
        |> json_response(:ok)

      expected_response = %{
        "data" => %{"createUser" => %{"name" => "Joe Doe", "email" => "joe.doe@nowhere.com"}}
      }

      assert expected_response == response
    end
  end
end