test/openagents/pull_requests_test.exs

58e6347eeb72 · 2 KB

defmodule OpenAgents.PullRequestsTest do
  use OpenAgents.DataCase

  alias OpenAgents.PullRequests
  alias OpenAgents.PullRequests.PullRequest
  alias OpenAgents.Repo
  alias OpenAgents.Repositories

  import OpenAgents.AccountsFixtures
  import OpenAgents.IssuesFixtures

  test "new repositories allow pull requests by default" do
    assert repository_fixture().pull_requests_enabled
  end

  test "the canonical repository has pull requests disabled" do
    repository = Repositories.get_by_path!("OpenAgentsInc", "openagents.com")
    refute repository.pull_requests_enabled
  end

  test "a disabled repository refuses a new pull request before creating its issue" do
    user = repository_user_fixture("pull-request-author")
    repository = repository_fixture(%{pull_requests_enabled: false})

    assert {:error, :pull_requests_disabled} = PullRequests.create(repository, %{}, user)
  end

  test "only an owner can update the repository pull request setting" do
    owner = repository_user_fixture("pull-request-owner")
    maintainer = repository_user_fixture("pull-request-maintainer")
    repository = repository_with_member_fixture(owner)
    {:ok, _membership} = Repositories.add_member(repository, maintainer, "maintainer")

    assert {:ok, updated} =
             Repositories.update_pull_request_setting(
               repository.owner,
               repository.name,
               owner,
               false
             )

    refute updated.pull_requests_enabled

    assert {:error, :forbidden} =
             Repositories.update_pull_request_setting(
               repository.owner,
               repository.name,
               maintainer,
               true
             )
  end

  test "an open head and base pair can have only one pull request" do
    target = repository_fixture()
    source = repository_fixture()
    first_issue = issue_fixture(target, %{title: "First pull request"})
    second_issue = issue_fixture(target, %{title: "Second pull request"})

    attrs = %{
      repository_id: target.id,
      head_repository_id: source.id,
      head_ref: "feature",
      head_sha: String.duplicate("a", 40),
      base_ref: "main",
      base_sha: String.duplicate("b", 40),
      state: "open"
    }

    assert {:ok, _pull_request} =
             %PullRequest{}
             |> PullRequest.changeset(Map.put(attrs, :issue_id, first_issue.id))
             |> Repo.insert()

    assert {:error, changeset} =
             %PullRequest{}
             |> PullRequest.changeset(Map.put(attrs, :issue_id, second_issue.id))
             |> Repo.insert()

    assert "has already been taken" in errors_on(changeset).repository_id
  end
end