defmodule Mobilizon.Web.AuthControllerTest do
  use Mobilizon.Web.ConnCase
  alias Mobilizon.Service.Auth.Authenticator
  alias Mobilizon.Users.User

  @email "someone@somewhere.tld"

  setup do
    Application.put_env(:ueberauth, Ueberauth,
      providers: [twitter: {Ueberauth.Strategy.Twitter, []}]
    )
  end

  test "login and registration",
       %{conn: conn} do
    conn =
      conn
      |> assign(:ueberauth_auth, %Ueberauth.Auth{
        strategy: Ueberauth.Strategy.Twitter,
        extra: %Ueberauth.Auth.Extra{raw_info: %{user: %{"email" => @email}}}
      })
      |> get("/auth/twitter/callback")

    assert html_response(conn, 200) =~ "auth-access-token"

    assert %User{confirmed_at: confirmed_at, email: @email} = Authenticator.fetch_user(@email)

    refute is_nil(confirmed_at)
  end

  test "on bad provider error", %{
    conn: conn
  } do
    conn =
      conn
      |> assign(:ueberauth_failure, %{errors: [%{message: "Some error"}]})
      |> get("/auth/nothing")

    assert "/login?code=Login Provider not found&provider=nothing" =
             redirection = redirected_to(conn, 302)

    conn = get(recycle(conn), redirection)
    assert html_response(conn, 200)
  end

  test "on authentication error", %{
    conn: conn
  } do
    conn =
      conn
      |> assign(:ueberauth_failure, %{errors: [%{message: "Some error"}]})
      |> get("/auth/twitter/callback")

    assert "/login?code=Error with Login Provider&provider=twitter" =
             redirection = redirected_to(conn, 302)

    conn = get(recycle(conn), redirection)
    assert html_response(conn, 200)
  end
end