3.6 KiB · text 5af55d9
defmodule GitGud.OrgMembersTest do
use GitGud.DataCase, async: false
alias GitGud.Organizations
import GitGud.AccountsFixtures
describe "list_members/1" do
test "returns admins first, then ordered by handle" do
admin = user_fixture(%{email: "founder@example"})
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "mem-list"})
a = user_fixture(%{email: "alpha@example"})
z = user_fixture(%{email: "zulu@example"})
_ = Organizations.add_member(org, a, "member")
_ = Organizations.add_member(org, z, "admin")
[first, second, third] = Organizations.list_members(org)
assert first.role == "admin"
assert second.role == "admin"
# Admins are sorted by user handle; both founder + z are admins.
# Third is the remaining member.
assert third.role == "member"
assert third.user.id == a.id
end
end
describe "set_member_role/3" do
test "promotes and demotes" do
admin = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "set-role"})
other = user_fixture()
_ = Organizations.add_member(org, other, "member")
assert {:ok, %{role: "admin"}} = Organizations.set_member_role(org, other, "admin")
# Now safe to demote the original admin.
assert {:ok, %{role: "member"}} = Organizations.set_member_role(org, admin, "member")
end
test "refuses to demote the last admin" do
admin = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "last-admin"})
assert {:error, :last_admin} = Organizations.set_member_role(org, admin, "member")
end
test "no-op when role already matches" do
admin = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "noop"})
assert {:ok, %{role: "admin"}} = Organizations.set_member_role(org, admin, "admin")
end
test "returns :not_a_member for non-members" do
admin = user_fixture()
outsider = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "notmem"})
assert {:error, :not_a_member} = Organizations.set_member_role(org, outsider, "member")
end
end
describe "remove_member_guarded/2" do
test "removes regular members" do
admin = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "rm-mem"})
other = user_fixture()
_ = Organizations.add_member(org, other, "member")
assert :ok = Organizations.remove_member_guarded(org, other)
refute Organizations.member?(org, other)
end
test "refuses to remove the last admin" do
admin = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "rm-last"})
assert {:error, :last_admin} = Organizations.remove_member_guarded(org, admin)
assert Organizations.member?(org, admin)
end
test "removes one admin when another remains" do
admin1 = user_fixture()
{:ok, org} = Organizations.create_organization(admin1, %{"handle" => "rm-coadmin"})
admin2 = user_fixture()
_ = Organizations.add_member(org, admin2, "admin")
assert :ok = Organizations.remove_member_guarded(org, admin1)
refute Organizations.member?(org, admin1)
assert Organizations.org_admin?(org, admin2)
end
test "non-members return :not_a_member" do
admin = user_fixture()
outsider = user_fixture()
{:ok, org} = Organizations.create_organization(admin, %{"handle" => "rm-nope"})
assert {:error, :not_a_member} = Organizations.remove_member_guarded(org, outsider)
end
end
end