package store import ( "testing" "apiserver/models" ) // bug-1934: user-group membership as the cluster config defines it // (members may be users, other groups or "all"; ex_members are removed). func TestUserGroups_Membership(t *testing.T) { orig := UserGroupsSnapshot() t.Cleanup(func() { SetUserGroups(orig) }) SetUserGroups([]models.UserGroupInfo{ {Name: "team", Members: []string{"alice", "bob"}}, {Name: "dept", Members: []string{"team", "carol"}, ExMembers: []string{"bob"}}, {Name: "everyone", Members: []string{"all"}, ExMembers: []string{"mallory"}}, {Name: "loop1", Members: []string{"loop2", "x"}}, {Name: "loop2", Members: []string{"loop1"}}, }) cases := []struct { a, b string want bool }{ {"alice", "bob", true}, // team {"alice", "carol", true}, // dept (via nested team) {"bob", "carol", true}, // everyone {"alice", "mallory", false}, // mallory is excluded from everyone {"mallory", "mallory", true}, {"alice", "zed", true}, // everyone {"x", "alice", true}, // everyone } for _, c := range cases { if got := UsersShareGroup(c.a, c.b); got != c.want { t.Errorf("UsersShareGroup(%q, %q) = %v, want %v", c.a, c.b, got, c.want) } } SetUserGroups([]models.UserGroupInfo{ {Name: "team", Members: []string{"alice", "bob"}}, {Name: "dept", Members: []string{"team", "carol"}, ExMembers: []string{"bob"}}, }) if UsersShareGroup("bob", "carol") { t.Error("bob is excluded from dept and shares no group with carol") } peers := UserGroupPeers("alice") if peers.All || !peers.Has("bob") || !peers.Has("carol") || !peers.Has("alice") || peers.Has("zed") { t.Errorf("UserGroupPeers(alice) = %+v, want alice, bob, carol", peers) } if p := UserGroupPeers("zed"); p.All || !p.Has("zed") || p.Has("alice") { t.Errorf("UserGroupPeers(zed) = %+v, want zed only", p) } }