pkg/connector/groups_test.go
123 linesgo
package connector

import (
	"context"
	"fmt"
	"testing"

	v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
	"github.com/conductorone/baton-sdk/pkg/types/entitlement"
	"github.com/conductorone/baton-sdk/pkg/types/grant"
	"github.com/conductorone/baton-sdk/pkg/types/resource"
)

func TestBuildGroupResource(t *testing.T) {
	tests := []struct {
		name        string
		id          string
		groupName   string
		description string
	}{
		{"regional pass", "g1", "Regional Pass", "Monthly pass for standard daily travel"},
		{"express pass", "g2", "Express Pass", "Monthly pass for express routes"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			r, err := resource.NewGroupResource(
				tt.groupName,
				groupResourceType,
				tt.id,
				[]resource.GroupTraitOption{
					resource.WithGroupProfile(map[string]interface{}{
						"description": tt.description,
					}),
				},
				resource.WithAnnotation(&v2.RawId{Id: tt.id}),
			)
			if err != nil {
				t.Fatalf("unexpected error: %v", err)
			}
			if r.DisplayName != tt.groupName {
				t.Errorf("DisplayName = %q, want %q", r.DisplayName, tt.groupName)
			}
			if r.Id.Resource != tt.id {
				t.Errorf("Resource ID = %q, want %q", r.Id.Resource, tt.id)
			}
			if r.Id.ResourceType != groupResourceType.Id {
				t.Errorf("ResourceType = %q, want %q", r.Id.ResourceType, groupResourceType.Id)
			}
		})
	}
}

func TestGroupEntitlementCreation(t *testing.T) {
	groupRes, err := resource.NewGroupResource(
		"Regional Pass",
		groupResourceType,
		"g1",
		[]resource.GroupTraitOption{},
		resource.WithAnnotation(&v2.RawId{Id: "g1"}),
	)
	if err != nil {
		t.Fatalf("unexpected error building group resource: %v", err)
	}

	e := entitlement.NewAssignmentEntitlement(
		groupRes,
		memberEntitlement,
		entitlement.WithGrantableTo(userResourceType),
		entitlement.WithDisplayName(fmt.Sprintf("%s Member", groupRes.DisplayName)),
		entitlement.WithDescription(fmt.Sprintf("Member of the %s group", groupRes.DisplayName)),
	)

	if e == nil {
		t.Fatal("expected non-nil entitlement")
	}
	if e.DisplayName != "Regional Pass Member" {
		t.Errorf("DisplayName = %q, want %q", e.DisplayName, "Regional Pass Member")
	}
	if e.Description != "Member of the Regional Pass group" {
		t.Errorf("Description = %q, want %q", e.Description, "Member of the Regional Pass group")
	}
}

func TestGroupGrantCreation(t *testing.T) {
	groupRes, err := resource.NewGroupResource(
		"Regional Pass",
		groupResourceType,
		"g1",
		[]resource.GroupTraitOption{},
	)
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	}

	g := grant.NewGrant(
		groupRes,
		memberEntitlement,
		&v2.ResourceId{
			ResourceType: userResourceType.Id,
			Resource:     "u1",
		},
	)

	if g == nil {
		t.Fatal("expected non-nil grant")
	}
	if g.Principal.Id.Resource != "u1" {
		t.Errorf("principal resource = %q, want %q", g.Principal.Id.Resource, "u1")
	}
	if g.Principal.Id.ResourceType != userResourceType.Id {
		t.Errorf("principal type = %q, want %q", g.Principal.Id.ResourceType, userResourceType.Id)
	}
}

func TestGroupBuilderResourceType(t *testing.T) {
	b := newGroupBuilder(nil)
	rt := b.ResourceType(context.TODO())
	if rt != groupResourceType {
		t.Errorf("expected groupResourceType, got %v", rt)
	}
}