2.3 KiB · text History b868907
defmodule GitGudWeb.JobTokenLiveTest do
  @moduledoc "The job-token access settings page."
  use GitGudWeb.ConnCase, async: false

  import GitGud.AccountsFixtures
  import GitGud.ForgeFixtures
  import Phoenix.LiveViewTest

  alias GitGud.Repositories.Storage
  alias GitGud.Workflows.JobTokenGrants

  @moduletag :git_required

  setup do
    if System.find_executable("git") == nil, do: {:skip, "git not on PATH"}, else: :ok
  end

  defp path_of(repo) do
    repo = GitGud.Repo.preload(repo, [:owner, :organization], force: true)
    Storage.repo_handle(repo) <> "/" <> repo.name
  end

  test "the owner grants and removes another repository's access", %{conn: conn} do
    {owner, repo} = repository_fixture()
    {_, source} = repository_fixture()

    {:ok, view, _html} =
      conn |> log_in_user(owner) |> live("/r/#{path_of(repo)}/settings/job-tokens")

    html =
      view
      |> form("form[phx-submit=create_grant]", %{
        "source" => path_of(source),
        "read" => "true",
        "dispatch" => "true"
      })
      |> render_submit()

    assert html =~ path_of(source)
    assert html =~ "read images &amp; packages, dispatch workflows"
    assert [grant] = JobTokenGrants.list(repo)
    assert JobTokenGrants.allows?(repo, source.id, :dispatch)

    view |> element("button[phx-value-id='#{grant.id}']") |> render_click()
    assert JobTokenGrants.list(repo) == []
  end

  test "an unknown source is reported, not granted", %{conn: conn} do
    {owner, repo} = repository_fixture()

    {:ok, view, _html} =
      conn |> log_in_user(owner) |> live("/r/#{path_of(repo)}/settings/job-tokens")

    html =
      view
      |> form("form[phx-submit=create_grant]", %{"source" => "nobody/nothing", "read" => "true"})
      |> render_submit()

    assert html =~ "No repository or organization called nobody/nothing"
    assert JobTokenGrants.list(repo) == []
  end

  test "someone who can't administer the repository doesn't see the grants", %{conn: conn} do
    {_owner, repo} = repository_fixture(%{visibility: "public"})
    {_, source} = repository_fixture()
    {:ok, _} = JobTokenGrants.create(repo, path_of(source), %{read: true})

    assert {:error, {:redirect, %{to: to}}} =
             conn
             |> log_in_user(user_fixture())
             |> live("/r/#{path_of(repo)}/settings/job-tokens")

    assert to == "/r/#{path_of(repo)}"
  end
end