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)
}
}