github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/tenantfetchersvc/provisioner_test.go (about)

     1  package tenantfetchersvc_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/mock"
     8  
     9  	"github.com/kyma-incubator/compass/components/director/pkg/graphql"
    10  
    11  	"github.com/kyma-incubator/compass/components/director/internal/domain/tenant"
    12  
    13  	"github.com/kyma-incubator/compass/components/director/internal/model"
    14  	"github.com/kyma-incubator/compass/components/director/internal/tenantfetchersvc"
    15  	"github.com/kyma-incubator/compass/components/director/internal/tenantfetchersvc/automock"
    16  	tenantEntity "github.com/kyma-incubator/compass/components/director/pkg/tenant"
    17  	"github.com/stretchr/testify/assert"
    18  )
    19  
    20  const (
    21  	autogeneratedProviderName = "autogenerated"
    22  	testProviderName          = "test-provider"
    23  	parentTenantExtID         = "parent-tenant-external-id"
    24  )
    25  
    26  var (
    27  	testLicenseType = "LICENSETYPE"
    28  	customerTenant  = model.BusinessTenantMappingInput{
    29  		Name:           parentTenantExtID,
    30  		ExternalTenant: parentTenantExtID,
    31  		Parent:         "",
    32  		Type:           tenantEntity.TypeToStr(tenantEntity.Customer),
    33  		Provider:       autogeneratedProviderName,
    34  		LicenseType:    &testLicenseType,
    35  	}
    36  	parentAccountTenant = model.BusinessTenantMappingInput{
    37  		Name:           tenantExtID,
    38  		ExternalTenant: tenantExtID,
    39  		Parent:         parentTenantExtID,
    40  		Type:           tenantEntity.TypeToStr(tenantEntity.Account),
    41  		Provider:       testProviderName,
    42  		Subdomain:      "",
    43  		Region:         "",
    44  		LicenseType:    &testLicenseType,
    45  	}
    46  	subaccountTenant = model.BusinessTenantMappingInput{
    47  		Name:           subaccountTenantExtID,
    48  		ExternalTenant: subaccountTenantExtID,
    49  		Parent:         tenantExtID,
    50  		Type:           tenantEntity.TypeToStr(tenantEntity.Subaccount),
    51  		Provider:       testProviderName,
    52  		Subdomain:      regionalTenantSubdomain,
    53  		Region:         tenantRegion,
    54  		LicenseType:    &testLicenseType,
    55  	}
    56  
    57  	requestWithSubaccountTenant = &tenantfetchersvc.TenantSubscriptionRequest{
    58  		SubaccountTenantID:     subaccountTenantExtID,
    59  		AccountTenantID:        tenantExtID,
    60  		CustomerTenantID:       parentTenantExtID,
    61  		Subdomain:              regionalTenantSubdomain,
    62  		Region:                 tenantRegion,
    63  		SubscriptionLcenseType: testLicenseType,
    64  	}
    65  )
    66  
    67  func TestProvisioner_CreateRegionalTenant(t *testing.T) {
    68  	// GIVEN
    69  	ctx := context.TODO()
    70  
    71  	testCases := []struct {
    72  		Name                string
    73  		DirectorClient      func() *automock.DirectorGraphQLClient
    74  		TenantConverter     func() *automock.TenantConverter
    75  		Request             *tenantfetchersvc.TenantSubscriptionRequest
    76  		ExpectedErrorOutput string
    77  	}{
    78  		{
    79  			Name: "Succeeds when parent account tenant already exists",
    80  			TenantConverter: func() *automock.TenantConverter {
    81  				tenantSvc := &automock.TenantConverter{}
    82  				expectedTenants := []model.BusinessTenantMappingInput{customerTenant, parentAccountTenant, subaccountTenant}
    83  				expectedTenantsConverted := convertTenantsToGQLInput(expectedTenants)
    84  				tenantSvc.On("MultipleInputToGraphQLInput", expectedTenants).Return(expectedTenantsConverted).Once()
    85  				return tenantSvc
    86  			},
    87  			DirectorClient: func() *automock.DirectorGraphQLClient {
    88  				expectedTenants := []model.BusinessTenantMappingInput{customerTenant, parentAccountTenant, subaccountTenant}
    89  				expectedTenantsConverted := convertTenantsToGQLInput(expectedTenants)
    90  				tenantSvc := &automock.DirectorGraphQLClient{}
    91  				tenantSvc.On("WriteTenants", ctx, expectedTenantsConverted).Return(nil).Once()
    92  				return tenantSvc
    93  			},
    94  			Request: requestWithSubaccountTenant,
    95  		},
    96  		{
    97  			Name: "Returns error when tenant creation fails",
    98  			TenantConverter: func() *automock.TenantConverter {
    99  				tenantSvc := &automock.TenantConverter{}
   100  				expectedTenants := []model.BusinessTenantMappingInput{customerTenant, parentAccountTenant, subaccountTenant}
   101  				expectedTenantsConverted := convertTenantsToGQLInput(expectedTenants)
   102  				tenantSvc.On("MultipleInputToGraphQLInput", expectedTenants).Return(expectedTenantsConverted).Once()
   103  				return tenantSvc
   104  			},
   105  			DirectorClient: func() *automock.DirectorGraphQLClient {
   106  				expectedTenants := []model.BusinessTenantMappingInput{customerTenant, parentAccountTenant, subaccountTenant}
   107  				expectedTenantsConverted := convertTenantsToGQLInput(expectedTenants)
   108  				tenantSvc := &automock.DirectorGraphQLClient{}
   109  				tenantSvc.On("WriteTenants", ctx, expectedTenantsConverted).Return(testError).Once()
   110  				return tenantSvc
   111  			},
   112  			Request:             requestWithSubaccountTenant,
   113  			ExpectedErrorOutput: testError.Error(),
   114  		},
   115  	}
   116  
   117  	for _, testCase := range testCases {
   118  		t.Run(testCase.Name, func(t *testing.T) {
   119  			tenantConverter := testCase.TenantConverter()
   120  			directorClient := testCase.DirectorClient()
   121  			defer mock.AssertExpectationsForObjects(t, tenantConverter, directorClient)
   122  
   123  			provisioner := tenantfetchersvc.NewTenantProvisioner(directorClient, tenantConverter, testProviderName)
   124  
   125  			// WHEN
   126  			err := provisioner.ProvisionTenants(ctx, testCase.Request)
   127  
   128  			// THEN
   129  			if len(testCase.ExpectedErrorOutput) > 0 {
   130  				assert.Error(t, err)
   131  				assert.Contains(t, err.Error(), testCase.ExpectedErrorOutput)
   132  			} else {
   133  				assert.NoError(t, err)
   134  			}
   135  		})
   136  	}
   137  }
   138  
   139  func convertTenantsToGQLInput(tenants []model.BusinessTenantMappingInput) []graphql.BusinessTenantMappingInput {
   140  	return tenant.NewConverter().MultipleInputToGraphQLInput(tenants)
   141  }