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 }