github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/tenantfetchersvc/subscriber_test.go (about) 1 package tenantfetchersvc_test 2 3 import ( 4 "context" 5 "errors" 6 "testing" 7 8 "github.com/kyma-incubator/compass/components/director/internal/tenantfetchersvc" 9 10 "github.com/kyma-incubator/compass/components/director/internal/tenantfetchersvc/automock" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/mock" 13 ) 14 15 const ( 16 tenantExtID = "tenant-external-id" 17 tenantRegion = "myregion" 18 19 regionalTenantSubdomain = "myregionaltenant" 20 subaccountTenantExtID = "subaccount-tenant-external-id" 21 subscriptionProviderID = "123" 22 providerSubaccountID = "123-456" 23 consumerTenantID = "3ba66f44-dc27-11ec-9d64-0242ac120002" 24 subscriptionProviderAppName = "subscription-provider-test-app-name" 25 26 tenantProviderTenantIDProperty = "tenantId" 27 tenantProviderCustomerIDProperty = "customerId" 28 tenantProviderSubdomainProperty = "subdomain" 29 tenantProviderSubaccountTenantIDProperty = "subaccountTenantId" 30 subscriptionProviderIDProperty = "subscriptionProviderId" 31 providerSubaccountIDProperty = "providerSubaccountId" 32 consumerTenantIDProperty = "consumerTenantID" 33 subscriptionProviderAppNameProperty = "subscriptionProviderAppName" 34 35 compassURL = "https://github.com/kyma-incubator/compass" 36 ) 37 38 var ( 39 testError = errors.New("test error") 40 ) 41 42 func TestSubscribeRegionalTenant(t *testing.T) { 43 // GIVEN 44 regionalTenant := tenantfetchersvc.TenantSubscriptionRequest{ 45 SubaccountTenantID: subaccountTenantExtID, 46 AccountTenantID: tenantExtID, 47 Subdomain: regionalTenantSubdomain, 48 Region: tenantRegion, 49 SubscriptionProviderID: subscriptionProviderID, 50 ProviderSubaccountID: providerSubaccountID, 51 ConsumerTenantID: consumerTenantID, 52 SubscriptionProviderAppName: subscriptionProviderAppName, 53 } 54 55 // Subscribe flow 56 testCases := []struct { 57 Name string 58 TenantProvisionerFn func() *automock.TenantProvisioner 59 DirectorClient func() *automock.DirectorGraphQLClient 60 TenantSubscriptionRequest tenantfetchersvc.TenantSubscriptionRequest 61 ExpectedErrorOutput string 62 }{ 63 { 64 Name: "Succeeds", 65 TenantProvisionerFn: func() *automock.TenantProvisioner { 66 provisioner := &automock.TenantProvisioner{} 67 provisioner.On("ProvisionTenants", context.TODO(), ®ionalTenant).Return(nil).Once() 68 return provisioner 69 }, 70 DirectorClient: func() *automock.DirectorGraphQLClient { 71 directorClient := &automock.DirectorGraphQLClient{} 72 directorClient.On("SubscribeTenant", context.TODO(), regionalTenant.SubscriptionProviderID, regionalTenant.SubaccountTenantID, regionalTenant.ProviderSubaccountID, regionalTenant.ConsumerTenantID, regionalTenant.Region, regionalTenant.SubscriptionProviderAppName, "").Return(nil).Once() 73 return directorClient 74 }, 75 TenantSubscriptionRequest: regionalTenant, 76 }, 77 { 78 Name: "Returns error when tenant creation fails", 79 TenantProvisionerFn: func() *automock.TenantProvisioner { 80 provisioner := &automock.TenantProvisioner{} 81 provisioner.On("ProvisionTenants", context.TODO(), ®ionalTenant).Return(testError).Once() 82 return provisioner 83 }, 84 DirectorClient: func() *automock.DirectorGraphQLClient { 85 return &automock.DirectorGraphQLClient{} 86 }, 87 TenantSubscriptionRequest: regionalTenant, 88 ExpectedErrorOutput: testError.Error(), 89 }, 90 { 91 Name: "Returns error when cannot subscribe tenant", 92 TenantProvisionerFn: func() *automock.TenantProvisioner { 93 provisioner := &automock.TenantProvisioner{} 94 provisioner.On("ProvisionTenants", context.TODO(), ®ionalTenant).Return(nil).Once() 95 return provisioner 96 }, 97 DirectorClient: func() *automock.DirectorGraphQLClient { 98 directorClient := &automock.DirectorGraphQLClient{} 99 directorClient.On("SubscribeTenant", context.TODO(), regionalTenant.SubscriptionProviderID, regionalTenant.SubaccountTenantID, regionalTenant.ProviderSubaccountID, regionalTenant.ConsumerTenantID, regionalTenant.Region, regionalTenant.SubscriptionProviderAppName, "").Return(testError).Once() 100 return directorClient 101 }, 102 TenantSubscriptionRequest: regionalTenant, 103 ExpectedErrorOutput: testError.Error(), 104 }, 105 } 106 107 for _, testCase := range testCases { 108 t.Run(testCase.Name, func(t *testing.T) { 109 provisioner := testCase.TenantProvisionerFn() 110 directorClient := testCase.DirectorClient() 111 defer mock.AssertExpectationsForObjects(t, provisioner, directorClient) 112 113 subscriber := tenantfetchersvc.NewSubscriber(directorClient, provisioner) 114 115 // WHEN 116 err := subscriber.Subscribe(context.TODO(), &testCase.TenantSubscriptionRequest) 117 118 // THEN 119 if len(testCase.ExpectedErrorOutput) > 0 { 120 assert.Error(t, err) 121 assert.Contains(t, err.Error(), testCase.ExpectedErrorOutput) 122 } else { 123 assert.NoError(t, err) 124 } 125 }) 126 } 127 } 128 129 func TestUnSubscribeRegionalTenant(t *testing.T) { 130 // GIVEN 131 132 regionalTenant := tenantfetchersvc.TenantSubscriptionRequest{ 133 SubaccountTenantID: subaccountTenantExtID, 134 AccountTenantID: tenantExtID, 135 Subdomain: regionalTenantSubdomain, 136 Region: tenantRegion, 137 SubscriptionProviderID: subscriptionProviderID, 138 ProviderSubaccountID: providerSubaccountID, 139 ConsumerTenantID: consumerTenantID, 140 SubscriptionProviderAppName: subscriptionProviderAppName, 141 } 142 143 testCases := []struct { 144 Name string 145 TenantProvisionerFn func() *automock.TenantProvisioner 146 DirectorClient func() *automock.DirectorGraphQLClient 147 TenantSubscriptionRequest tenantfetchersvc.TenantSubscriptionRequest 148 ExpectedErrorOutput string 149 }{ 150 { 151 Name: "Succeeds", 152 TenantProvisionerFn: func() *automock.TenantProvisioner { 153 return &automock.TenantProvisioner{} 154 }, 155 DirectorClient: func() *automock.DirectorGraphQLClient { 156 directorClient := &automock.DirectorGraphQLClient{} 157 directorClient.On("UnsubscribeTenant", context.TODO(), regionalTenant.SubscriptionProviderID, regionalTenant.SubaccountTenantID, regionalTenant.ProviderSubaccountID, regionalTenant.ConsumerTenantID, regionalTenant.Region).Return(nil).Once() 158 return directorClient 159 }, 160 TenantSubscriptionRequest: regionalTenant, 161 }, 162 { 163 Name: "Returns error when cannot unsubscribe tenant", 164 TenantProvisionerFn: func() *automock.TenantProvisioner { 165 return &automock.TenantProvisioner{} 166 }, 167 DirectorClient: func() *automock.DirectorGraphQLClient { 168 directorClient := &automock.DirectorGraphQLClient{} 169 directorClient.On("UnsubscribeTenant", context.TODO(), regionalTenant.SubscriptionProviderID, regionalTenant.SubaccountTenantID, regionalTenant.ProviderSubaccountID, regionalTenant.ConsumerTenantID, regionalTenant.Region).Return(testError).Once() 170 return directorClient 171 }, 172 TenantSubscriptionRequest: regionalTenant, 173 ExpectedErrorOutput: testError.Error(), 174 }, 175 } 176 177 for _, testCase := range testCases { 178 t.Run(testCase.Name, func(t *testing.T) { 179 provisioner := testCase.TenantProvisionerFn() 180 directorClient := testCase.DirectorClient() 181 defer mock.AssertExpectationsForObjects(t, provisioner, directorClient) 182 183 subscriber := tenantfetchersvc.NewSubscriber(directorClient, provisioner) 184 // WHEN 185 err := subscriber.Unsubscribe(context.TODO(), &testCase.TenantSubscriptionRequest) 186 187 // THEN 188 if len(testCase.ExpectedErrorOutput) > 0 { 189 assert.Error(t, err) 190 assert.Contains(t, err.Error(), testCase.ExpectedErrorOutput) 191 } else { 192 assert.NoError(t, err) 193 } 194 }) 195 } 196 }