defmodule GitGud.LabelsTest do
use GitGud.DataCase, async: true
alias GitGud.Labels
import GitGud.ForgeFixtures
setup do
{_user, repo} = repository_fixture()
{:ok, repo: repo}
end
test "creates a label", %{repo: repo} do
assert {:ok, label} = Labels.create_label(repo, %{"name" => "bug", "color" => "#ef4444"})
assert label.repository_id == repo.id
assert label.name == "bug"
end
test "rejects invalid color", %{repo: repo} do
assert {:error, cs} = Labels.create_label(repo, %{"name" => "bug", "color" => "red"})
assert "must be a #RRGGBB hex color" in errors_on(cs).color
end
test "name is unique per repo", %{repo: repo} do
{:ok, _} = Labels.create_label(repo, %{"name" => "dup", "color" => "#111111"})
assert {:error, cs} = Labels.create_label(repo, %{"name" => "dup", "color" => "#222222"})
assert "has already been taken" in errors_on(cs).name
end
test "attach/detach is idempotent", %{repo: repo} do
label = label_fixture(repo)
target = {"issue", 42}
assert :ok = Labels.attach(label, target)
assert :ok = Labels.attach(label, target)
assert [%{id: id}] = Labels.labels_for(target)
assert id == label.id
assert :ok = Labels.detach(label, target)
assert [] = Labels.labels_for(target)
end
test "labels_for_many groups by target id", %{repo: repo} do
l1 = label_fixture(repo)
l2 = label_fixture(repo)
:ok = Labels.attach(l1, {"issue", 1})
:ok = Labels.attach(l2, {"issue", 1})
:ok = Labels.attach(l1, {"issue", 2})
grouped = Labels.labels_for_many("issue", [1, 2])
assert Map.get(grouped, 1) |> Enum.map(& &1.id) |> Enum.sort() ==
Enum.sort([l1.id, l2.id])
assert Map.get(grouped, 2) |> Enum.map(& &1.id) == [l1.id]
end
end
1.7 KiB · text
5af55d9