+
+func TestTransitivelyDetectedGroups(t *testing.T) {
+ tests := []struct {
+ name string
+ groups map[string][]string
+ exp map[string]bool
+ }{
+
+ {
+ "no detected",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "group-b",
+ },
+ "group-a:remove": {
+ "d",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ map[string]bool{},
+ },
+
+ {
+ "detected as direct member",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "detected_foo",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ },
+ },
+
+ {
+ "detected as direct :remove member",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "group-b",
+ },
+ "group-a:remove": {
+ "d",
+ "detected_foo",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ },
+ },
+
+ {
+ "detected as transitive member",
+ map[string][]string{
+ "group-a": {
+ "group-b",
+ },
+ "group-b": {
+ "group-c",
+ },
+ "group-c": {
+ "group-d",
+ "detected_bar",
+ },
+ "group-d": {
+ "group-e",
+ },
+ "group-e": {
+ "detected_foo",
+ },
+ "group-f": {
+ "a",
+ "b",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ "group-b": true,
+ "group-c": true,
+ "group-d": true,
+ "group-e": true,
+ },
+ },
+
+ {
+ "detected as transitive :remove member",
+ map[string][]string{
+ "group-a": {
+ "group-b",
+ },
+ "group-b": {
+ "group-c",
+ },
+ "group-c": {
+ "group-d",
+ },
+ "group-d": {
+ "group-e",
+ },
+ "group-e": {
+ "all",
+ },
+ "group-e:remove": {
+ "detected_foo",
+ },
+ "group-f": {
+ "a",
+ "b",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ "group-b": true,
+ "group-c": true,
+ "group-d": true,
+ "group-e": true,
+ },
+ },
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ res := TransitivelyDetectedGroups(tc.groups)
+ testutil.AssertEqual(t, "res", res, tc.exp)
+ })
+ }
+}