test/openagents_web/live/computers_pairing_errors_test.exs

58e6347eeb72 · 3 KB

defmodule OpenAgentsWeb.ComputersPairingErrorsTest do
  use OpenAgentsWeb.ConnCase, async: false
  import Phoenix.LiveViewTest

  alias OpenAgents.Machines

  test "expired pairing codes produce the specific recovery message", %{conn: conn} do
    user = github_user("computers-expired-code")
    pairing = start_pairing!("expired-box")

    pairing.pairing
    |> Ecto.Changeset.change(expires_at: DateTime.add(DateTime.utc_now(), -1, :second))
    |> OpenAgents.Repo.update!()

    {:ok, view, _html} = live(as_user(conn, user), ~p"/computers")
    submit_code(view, pairing.code)

    assert has_element?(view, "#pairing-error", "That pairing code expired")
    assert has_element?(view, "#pairing-form")
  end

  test "consumed pairing codes cannot create a second computer", %{conn: conn} do
    first_owner = github_user("computers-consumed-first")
    current_user = github_user("computers-consumed-current")
    pairing = start_pairing!("single-use-box")
    assert {:ok, _machine} = Machines.approve_pairing(first_owner, pairing.code)

    {:ok, view, _html} = live(as_user(conn, current_user), ~p"/computers")
    submit_code(view, pairing.code)

    assert has_element?(view, "#pairing-error", "That pairing code was already used")
    refute has_element?(view, "#computers-list .computer-card")
    assert Machines.list_machines(current_user.id) == []
  end

  test "a full account receives the capacity outcome and keeps all eight rows", %{conn: conn} do
    user = github_user("computers-capacity-message")

    machines =
      for index <- 1..8 do
        pairing = start_pairing!("full-box-#{index}")
        assert {:ok, machine} = Machines.approve_pairing(user, pairing.code)
        machine
      end

    ninth = start_pairing!("full-box-9")
    {:ok, view, _html} = live(as_user(conn, user), ~p"/computers")
    submit_code(view, ninth.code)

    assert has_element?(view, "#pairing-error", "Computer limit reached")
    assert Enum.all?(machines, &has_element?(view, "#computer-#{&1.id}"))
    assert length(Machines.list_machines(user.id)) == 8
  end

  test "the submit fence and single-use code prevent duplicate records", %{conn: conn} do
    user = github_user("computers-duplicate-submit")
    pairing = start_pairing!("only-once-box")
    {:ok, view, _html} = live(as_user(conn, user), ~p"/computers")

    assert has_element?(view, "#approve-pairing[phx-disable-with='Pairing…']")
    submit_code(view, pairing.code)
    submit_code(view, pairing.code)

    assert has_element?(view, "#pairing-error", "That pairing code was already used")
    assert [%{name: "only-once-box"}] = Machines.list_machines(user.id)
    assert has_element?(view, "#computers-list .computer-card")
    refute has_element?(view, "#computers-list .computer-card + .computer-card")
  end

  defp as_user(conn, user), do: Plug.Test.init_test_session(conn, %{"user_id" => user.id})

  defp submit_code(view, code) do
    view
    |> form("#pairing-form", pairing: %{code: code})
    |> render_submit()
  end

  defp start_pairing!(name) do
    assert {:ok, pairing} =
             Machines.start_pairing(%{
               "name" => name,
               "tier" => "curated",
               "platform" => "linux-x64",
               "agent_version" => "0.4.0",
               "roots" => ["/home/test/work"]
             })

    pairing
  end
end