pkg/connector/connector_test.go
109 linesgo
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)
			}
		})
	}
}