defmodule ToweropsWeb.UserSessionHTMLTest do
  use ToweropsWeb.ConnCase, async: true

  import Phoenix.Component, only: [to_form: 1]
  import Phoenix.Template, only: [render_to_string: 4]

  alias Towerops.Accounts.User

  describe "new.html" do
    test "renders login form" do
      form = to_form(%{"email" => "", "password" => ""})

      html =
        render_to_string(ToweropsWeb.UserSessionHTML, "new", "html",
          flash: %{},
          current_scope: nil,
          form: form
        )

      assert html =~ "Log in"
      assert html =~ "Sign up"
      assert html =~ "Send me a login link instead"
      # Password login is now the default (no longer separated by "or use password")
      assert html =~ "Password"
    end

    test "renders reauthentication message when current_scope is present" do
      form = to_form(%{"email" => "user@example.com", "password" => ""})

      html =
        render_to_string(ToweropsWeb.UserSessionHTML, "new", "html",
          flash: %{},
          current_scope: :elevated,
          form: form
        )

      assert html =~ "You need to reauthenticate to perform sensitive actions"
      refute html =~ "Don't have an account?"
    end
  end

  describe "confirm.html" do
    test "renders confirmation form for unconfirmed user" do
      user = %User{email: "test@example.com", confirmed_at: nil}
      form = to_form(%{"token" => "some-token"})

      html =
        render_to_string(ToweropsWeb.UserSessionHTML, "confirm", "html",
          flash: %{},
          current_scope: nil,
          user: user,
          form: form
        )

      assert html =~ "Welcome test@example.com"
      assert html =~ "Confirm and stay logged in"
      assert html =~ "Confirm and log in only this time"
      assert html =~ "If you prefer passwords, you can enable them"
    end

    test "renders login form for confirmed user" do
      user = %User{email: "test@example.com", confirmed_at: DateTime.utc_now()}
      form = to_form(%{"token" => "some-token"})

      html =
        render_to_string(ToweropsWeb.UserSessionHTML, "confirm", "html",
          flash: %{},
          current_scope: nil,
          user: user,
          form: form
        )

      assert html =~ "Welcome test@example.com"
      assert html =~ "Log in and stay logged in"
      assert html =~ "Log in only this time"
      refute html =~ "Confirm"
    end

    test "renders simplified login for confirmed user with current_scope" do
      user = %User{email: "test@example.com", confirmed_at: DateTime.utc_now()}
      form = to_form(%{"token" => "some-token"})

      html =
        render_to_string(ToweropsWeb.UserSessionHTML, "confirm", "html",
          flash: %{},
          current_scope: :elevated,
          user: user,
          form: form
        )

      assert html =~ "Welcome test@example.com"
      assert html =~ "Log in"
      # Should not show "stay logged in" options when reauthenticating
      refute html =~ "Log in and stay logged in"
    end
  end
end
