defmodule GitGud.Workflows.ScopedRunnersTest do
@moduledoc """
Per-scope runner registration + job claim matching.
"""
use GitGud.DataCase, async: false
alias GitGud.Workflows.Runner
alias GitGud.Workflows.Runners
import GitGud.ForgeFixtures
setup do
{_user, repo} = repository_fixture()
{:ok, repo: repo}
end
describe "mint_registration_token/1 + consume_registration_token/1" do
test "round-trips for a repo", %{repo: repo} do
{:ok, token} = Runners.mint_registration_token(repo)
assert {:ok, scope_repo} = Runners.consume_registration_token(token)
assert scope_repo.id == repo.id
end
test "regenerating invalidates the prior token", %{repo: repo} do
{:ok, t1} = Runners.mint_registration_token(repo)
{:ok, t2} = Runners.mint_registration_token(repo)
refute t1 == t2
assert :error = Runners.consume_registration_token(t1)
assert {:ok, _} = Runners.consume_registration_token(t2)
end
test "an unknown token is rejected" do
assert :error = Runners.consume_registration_token("definitely-not-a-token")
end
end
describe "register/2 with scope" do
test "scopes the runner to the repository", %{repo: repo} do
{:ok, token} = Runners.mint_registration_token(repo)
{:ok, scope} = Runners.consume_registration_token(token)
assert {:ok, runner, bearer} = Runners.register(%{name: "rep-runner"}, scope)
assert runner.repository_id == repo.id
assert is_nil(runner.organization_id)
assert is_binary(bearer)
assert Runner.scope_label(runner) == "repo"
end
test "global token produces a global runner" do
Application.put_env(:git_gud, Runners, registration_token: "global-token-123")
on_exit(fn -> Application.delete_env(:git_gud, Runners) end)
{:ok, scope} = Runners.consume_registration_token("global-token-123")
assert scope == :global
{:ok, runner, _} = Runners.register(%{name: "global"}, scope)
assert is_nil(runner.repository_id)
assert is_nil(runner.organization_id)
end
end
describe "list_for_scope/1" do
test "a repo without an org sees its own + global runners", %{repo: repo} do
Application.put_env(:git_gud, Runners, registration_token: "gtok")
on_exit(fn -> Application.delete_env(:git_gud, Runners) end)
{:ok, scope} = Runners.consume_registration_token("gtok")
{:ok, global_runner, _} = Runners.register(%{name: "global"}, scope)
{:ok, tok} = Runners.mint_registration_token(repo)
{:ok, scope_repo} = Runners.consume_registration_token(tok)
{:ok, repo_runner, _} = Runners.register(%{name: "repo"}, scope_repo)
visible = Runners.list_for_scope(repo) |> Enum.map(& &1.id) |> Enum.sort()
assert visible == Enum.sort([repo_runner.id, global_runner.id])
end
end
end
2.8 KiB · text
5af55d9