package connector
import (
"errors"
"testing"
v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func TestResourceTypeDefinitions(t *testing.T) {
tests := []struct {
name string
rt *v2.ResourceType
wantID string
wantName string
trait v2.ResourceType_Trait
}{
{"user resource type", userResourceType, "user", "User", v2.ResourceType_TRAIT_USER},
{"group resource type", groupResourceType, "group", "Group", v2.ResourceType_TRAIT_GROUP},
{"role resource type", roleResourceType, "role", "Role", v2.ResourceType_TRAIT_ROLE},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.rt.Id != tt.wantID {
t.Errorf("expected ID %s, got %s", tt.wantID, tt.rt.Id)
}
if tt.rt.DisplayName != tt.wantName {
t.Errorf("expected DisplayName %s, got %s", tt.wantName, tt.rt.DisplayName)
}
if len(tt.rt.Traits) != 1 || tt.rt.Traits[0] != tt.trait {
t.Errorf("expected trait %v, got %v", tt.trait, tt.rt.Traits)
}
})
}
}
func TestMapUserStatus(t *testing.T) {
tests := []struct {
input string
want v2.UserTrait_Status_Status
}{
{"active", v2.UserTrait_Status_STATUS_ENABLED},
{"disabled", v2.UserTrait_Status_STATUS_DISABLED},
{"suspended", v2.UserTrait_Status_STATUS_DISABLED},
{"deleted", v2.UserTrait_Status_STATUS_DELETED},
{"unknown", v2.UserTrait_Status_STATUS_UNSPECIFIED},
{"", v2.UserTrait_Status_STATUS_UNSPECIFIED},
}
for _, tt := range tests {
t.Run(tt.input, func(t *testing.T) {
got := mapUserStatus(tt.input)
if got != tt.want {
t.Errorf("mapUserStatus(%q) = %v, want %v", tt.input, got, tt.want)
}
})
}
}
func TestDisplayName(t *testing.T) {
tests := []struct {
name string
firstName string
lastName string
email string
id string
want string
}{
{"full name", "Alice", "Smith", "alice@test.com", "u1", "Alice Smith"},
{"first only", "Alice", "", "alice@test.com", "u1", "Alice"},
{"email fallback", "", "", "alice@test.com", "u1", "alice@test.com"},
{"id fallback", "", "", "", "u1", "u1"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := displayName(tt.firstName, tt.lastName, tt.email, tt.id)
if got != tt.want {
t.Errorf("displayName() = %q, want %q", got, tt.want)
}
})
}
}
func TestIsNotFound(t *testing.T) {
tests := []struct {
name string
err error
want bool
}{
{"grpc NotFound", status.Error(codes.NotFound, "not found"), true},
{"grpc PermissionDenied", status.Error(codes.PermissionDenied, "denied"), false},
{"plain error", errors.New("some error"), false},
{"nil error", nil, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isNotFound(tt.err)
if got != tt.want {
t.Errorf("isNotFound() = %v, want %v", got, tt.want)
}
})
}
}