defmodule GitGud.RepositoriesTest do
use GitGud.DataCase, async: false
alias GitGud.Repositories
import GitGud.AccountsFixtures
@moduletag :git_required
setup do
if System.find_executable("git") == nil do
{:skip, "git not on PATH"}
else
:ok
end
end
test "create_repository initializes a bare repo on disk + installs post-receive hook" do
user = user_fixture()
assert {:ok, repo} =
Repositories.create_repository(user, %{
"name" => "first-#{System.unique_integer([:positive])}"
})
assert File.dir?(repo.disk_path)
assert File.exists?(Path.join(repo.disk_path, "HEAD"))
assert File.exists?(Path.join([repo.disk_path, "hooks", "post-receive"]))
end
test "rejects duplicate (owner, name)" do
user = user_fixture()
name = "dup-#{System.unique_integer([:positive])}"
assert {:ok, _} = Repositories.create_repository(user, %{"name" => name})
assert {:error, %Ecto.Changeset{} = cs} =
Repositories.create_repository(user, %{"name" => name})
assert "has already been taken" in errors_on(cs).name
end
test "rejects bad names" do
user = user_fixture()
assert {:error, %Ecto.Changeset{} = cs} =
Repositories.create_repository(user, %{"name" => "../etc/passwd"})
assert Map.has_key?(errors_on(cs), :name)
end
test "org admin can create an org-owned repo; non-admin cannot" do
alias GitGud.Organizations
admin = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "ownz"})
name = "orgrepo-#{System.unique_integer([:positive])}"
assert {:ok, repo} =
Repositories.create_repository_for_org(org, admin, %{"name" => name})
assert repo.organization_id == org.id
assert repo.owner_id == admin.id
assert String.contains?(repo.disk_path, "/ownz/")
found = Repositories.get_repository_by_path!("ownz", name)
assert found.id == repo.id
outsider = user_fixture()
assert {:error, :forbidden} =
Repositories.create_repository_for_org(org, outsider, %{"name" => "nope"})
end
test "user-owned and org-owned repos don't collide on name" do
alias GitGud.Organizations
user = user_fixture()
{:ok, org} = Organizations.create_organization(user, %{"handle" => "dup"})
name = "shared-#{System.unique_integer([:positive])}"
assert {:ok, _u_repo} = Repositories.create_repository(user, %{"name" => name})
assert {:ok, _o_repo} = Repositories.create_repository_for_org(org, user, %{"name" => name})
end
end
2.5 KiB · text
5af55d9