1.8 KiB · text 5af55d9
defmodule GitGud.ForgeFixtures do
@moduledoc """
Fixtures for the forge surface (repositories, issues, PRs, labels, …).
Pulls in `GitGud.AccountsFixtures` for user generation.
"""
import GitGud.AccountsFixtures
alias GitGud.Issues
alias GitGud.Labels
alias GitGud.PullRequests
alias GitGud.Repositories
def unique_repo_name, do: "repo#{System.unique_integer([:positive])}"
@doc """
Creates a repository owned by the given (or a fresh) user. Skips
the underlying git init when `git` isn't on PATH so non-CI machines
can still run the rest of the test suite.
"""
def repository_fixture(attrs \\ %{}) do
user = Map.get(attrs, :owner) || user_fixture()
name = Map.get(attrs, :name, unique_repo_name())
visibility = Map.get(attrs, :visibility, "private")
{:ok, repo} =
Repositories.create_repository(user, %{"name" => name, "visibility" => visibility})
{user, repo}
end
def label_fixture(repo, attrs \\ %{}) do
base = %{"name" => "bug-#{System.unique_integer([:positive])}", "color" => "#ef4444"}
{:ok, label} = Labels.create_label(repo, Map.merge(base, Map.new(attrs)))
label
end
def issue_fixture(repo, user, attrs \\ %{}) do
base = %{"title" => "Issue #{System.unique_integer([:positive])}"}
{:ok, issue} = Issues.create_issue(repo, user, Map.merge(base, Map.new(attrs)))
issue
end
def pr_attrs(source, target, attrs \\ %{}) do
Map.merge(
%{
"title" => "PR #{System.unique_integer([:positive])}",
"source_ref" => source,
"target_ref" => target
},
Map.new(attrs)
)
end
def pull_request_fixture(repo, user, source, target, attrs \\ %{}) do
{:ok, pr} = PullRequests.create_pull_request(repo, user, pr_attrs(source, target, attrs))
pr
end
end