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(), &regionalTenant).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(), &regionalTenant).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(), &regionalTenant).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  }