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

     1  package scenarioassignment_test
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment"
     9  	"github.com/kyma-incubator/compass/components/director/internal/domain/scenarioassignment/automock"
    10  	"github.com/kyma-incubator/compass/components/director/internal/domain/tenant"
    11  	"github.com/kyma-incubator/compass/components/director/internal/model"
    12  	"github.com/pkg/errors"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/mock"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  const validPageSize = 2
    19  
    20  func TestService_GetByScenarioName(t *testing.T) {
    21  	t.Run("happy path", func(t *testing.T) {
    22  		// GIVEN
    23  		mockRepo := &automock.Repository{}
    24  		defer mockRepo.AssertExpectations(t)
    25  		mockRepo.On("GetForScenarioName", fixCtxWithTenant(), mock.Anything, scenarioName).Return(fixModel(), nil).Once()
    26  		sut := scenarioassignment.NewService(mockRepo, nil)
    27  
    28  		// WHEN
    29  		actual, err := sut.GetForScenarioName(fixCtxWithTenant(), scenarioName)
    30  
    31  		// THEN
    32  		require.NoError(t, err)
    33  		assert.Equal(t, fixModel(), actual)
    34  	})
    35  
    36  	t.Run("error on missing tenant in context", func(t *testing.T) {
    37  		// GIVEN
    38  		mockRepo := &automock.Repository{}
    39  		defer mockRepo.AssertExpectations(t)
    40  		sut := scenarioassignment.NewService(mockRepo, nil)
    41  
    42  		// WHEN
    43  		_, err := sut.GetForScenarioName(context.TODO(), scenarioName)
    44  
    45  		// THEN
    46  		assert.EqualError(t, err, "cannot read tenant from context")
    47  	})
    48  
    49  	t.Run("returns error on error from repository", func(t *testing.T) {
    50  		// GIVEN
    51  		mockRepo := &automock.Repository{}
    52  		defer mockRepo.AssertExpectations(t)
    53  		mockRepo.On("GetForScenarioName", fixCtxWithTenant(), mock.Anything, scenarioName).Return(model.AutomaticScenarioAssignment{}, fixError()).Once()
    54  		sut := scenarioassignment.NewService(mockRepo, nil)
    55  
    56  		// WHEN
    57  		_, err := sut.GetForScenarioName(fixCtxWithTenant(), scenarioName)
    58  
    59  		// THEN
    60  		require.EqualError(t, err, fmt.Sprintf("while getting Assignment: %s", errMsg))
    61  	})
    62  }
    63  
    64  func TestService_ListForTargetTenant(t *testing.T) {
    65  	t.Run("happy path", func(t *testing.T) {
    66  		// GIVEN
    67  		assignment := fixModel()
    68  		result := []*model.AutomaticScenarioAssignment{&assignment}
    69  		mockRepo := &automock.Repository{}
    70  		defer mockRepo.AssertExpectations(t)
    71  		mockRepo.On("ListForTargetTenant", mock.Anything, tenantID, targetTenantID).Return(result, nil).Once()
    72  		sut := scenarioassignment.NewService(mockRepo, nil)
    73  
    74  		// WHEN
    75  		actual, err := sut.ListForTargetTenant(fixCtxWithTenant(), targetTenantID)
    76  
    77  		// THEN
    78  		require.NoError(t, err)
    79  		assert.Equal(t, result, actual)
    80  	})
    81  
    82  	t.Run("returns error on error from repository", func(t *testing.T) {
    83  		// GIVEN
    84  		mockRepo := &automock.Repository{}
    85  		defer mockRepo.AssertExpectations(t)
    86  		mockRepo.On("ListForTargetTenant", mock.Anything, tenantID, targetTenantID).Return(nil, fixError()).Once()
    87  		sut := scenarioassignment.NewService(mockRepo, nil)
    88  
    89  		// WHEN
    90  		actual, err := sut.ListForTargetTenant(fixCtxWithTenant(), targetTenantID)
    91  
    92  		// THEN
    93  		require.EqualError(t, err, "while getting the assignments: some error")
    94  		require.Nil(t, actual)
    95  	})
    96  
    97  	t.Run("returns error when no tenant in context", func(t *testing.T) {
    98  		sut := scenarioassignment.NewService(nil, nil)
    99  		_, err := sut.ListForTargetTenant(context.TODO(), targetTenantID)
   100  
   101  		require.EqualError(t, err, "cannot read tenant from context")
   102  	})
   103  }
   104  
   105  func TestService_List(t *testing.T) {
   106  	// GIVEN
   107  	testErr := errors.New("Test error")
   108  
   109  	mod1 := fixModelWithScenarioName("foo")
   110  	mod2 := fixModelWithScenarioName("bar")
   111  	modItems := []*model.AutomaticScenarioAssignment{
   112  		&mod1, &mod2,
   113  	}
   114  
   115  	modelPage := fixModelPageWithItems(modItems)
   116  
   117  	after := "test"
   118  
   119  	ctx := context.TODO()
   120  	ctx = tenant.SaveToContext(ctx, tenantID, externalTenantID)
   121  
   122  	testCases := []struct {
   123  		Name               string
   124  		PageSize           int
   125  		RepositoryFn       func() *automock.Repository
   126  		ExpectedResult     *model.AutomaticScenarioAssignmentPage
   127  		ExpectedErrMessage string
   128  	}{
   129  		{
   130  			Name: "Success",
   131  			RepositoryFn: func() *automock.Repository {
   132  				repo := &automock.Repository{}
   133  				repo.On("List", ctx, tenantID, validPageSize, after).Return(&modelPage, nil).Once()
   134  				return repo
   135  			},
   136  			PageSize:           validPageSize,
   137  			ExpectedResult:     &modelPage,
   138  			ExpectedErrMessage: "",
   139  		},
   140  		{
   141  			Name: "Return error when page size is less than 1",
   142  			RepositoryFn: func() *automock.Repository {
   143  				repo := &automock.Repository{}
   144  				return repo
   145  			},
   146  			PageSize:           0,
   147  			ExpectedResult:     &modelPage,
   148  			ExpectedErrMessage: "page size must be between 1 and 200",
   149  		},
   150  		{
   151  			Name: "Return error when page size is bigger than 200",
   152  			RepositoryFn: func() *automock.Repository {
   153  				repo := &automock.Repository{}
   154  				return repo
   155  			},
   156  			PageSize:           201,
   157  			ExpectedResult:     &modelPage,
   158  			ExpectedErrMessage: "page size must be between 1 and 200",
   159  		},
   160  		{
   161  			Name: "Returns error when Assignments listing failed",
   162  			RepositoryFn: func() *automock.Repository {
   163  				repo := &automock.Repository{}
   164  				repo.On("List", ctx, tenantID, 2, after).Return(nil, testErr).Once()
   165  				return repo
   166  			},
   167  			PageSize:           2,
   168  			ExpectedResult:     nil,
   169  			ExpectedErrMessage: testErr.Error(),
   170  		},
   171  	}
   172  
   173  	for _, testCase := range testCases {
   174  		t.Run(testCase.Name, func(t *testing.T) {
   175  			repo := testCase.RepositoryFn()
   176  
   177  			svc := scenarioassignment.NewService(repo, nil)
   178  
   179  			// WHEN
   180  			items, err := svc.List(ctx, testCase.PageSize, after)
   181  
   182  			// THEN
   183  			if testCase.ExpectedErrMessage == "" {
   184  				require.NoError(t, err)
   185  				assert.Equal(t, testCase.ExpectedResult, items)
   186  			} else {
   187  				require.Error(t, err)
   188  				assert.Contains(t, err.Error(), testCase.ExpectedErrMessage)
   189  			}
   190  
   191  			repo.AssertExpectations(t)
   192  		})
   193  	}
   194  	t.Run("Error when tenant not in context", func(t *testing.T) {
   195  		svc := scenarioassignment.NewService(nil, nil)
   196  		// WHEN
   197  		_, err := svc.List(context.TODO(), 5, "")
   198  		// THEN
   199  		require.Error(t, err)
   200  		assert.Contains(t, err.Error(), "cannot read tenant from context")
   201  	})
   202  }