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

     1  package bundleinstanceauth_test
     2  
     3  import (
     4  	"context"
     5  	"database/sql/driver"
     6  	"fmt"
     7  	"regexp"
     8  	"testing"
     9  
    10  	"github.com/DATA-DOG/go-sqlmock"
    11  	"github.com/kyma-incubator/compass/components/director/internal/domain/bundleinstanceauth"
    12  	"github.com/kyma-incubator/compass/components/director/internal/domain/bundleinstanceauth/automock"
    13  	"github.com/kyma-incubator/compass/components/director/internal/model"
    14  	"github.com/kyma-incubator/compass/components/director/internal/repo/testdb"
    15  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
    16  	"github.com/kyma-incubator/compass/components/director/pkg/persistence"
    17  	"github.com/stretchr/testify/assert"
    18  	"github.com/stretchr/testify/require"
    19  )
    20  
    21  func TestRepository_Create(t *testing.T) {
    22  	t.Run("Success", func(t *testing.T) {
    23  		// GIVEN
    24  		biaModel := fixModelBundleInstanceAuth(testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
    25  		biaEntity := fixEntityBundleInstanceAuth(t, testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
    26  
    27  		mockConverter := &automock.EntityConverter{}
    28  		mockConverter.On("ToEntity", biaModel).Return(biaEntity, nil).Once()
    29  		defer mockConverter.AssertExpectations(t)
    30  
    31  		db, dbMock := testdb.MockDatabase(t)
    32  		defer dbMock.AssertExpectations(t)
    33  
    34  		dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.bundle_instance_auths ( id, owner_id, bundle_id, context, input_params, auth_value, status_condition, status_timestamp, status_message, status_reason, runtime_id, runtime_context_id ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )`)).
    35  			WithArgs(fixCreateArgs(*biaEntity)...).
    36  			WillReturnResult(sqlmock.NewResult(-1, 1))
    37  
    38  		ctx := persistence.SaveToContext(context.TODO(), db)
    39  		repo := bundleinstanceauth.NewRepository(mockConverter)
    40  
    41  		// WHEN
    42  		err := repo.Create(ctx, biaModel)
    43  
    44  		// THEN
    45  		assert.NoError(t, err)
    46  	})
    47  
    48  	t.Run("Error when item is nil", func(t *testing.T) {
    49  		// GIVEN
    50  
    51  		repo := bundleinstanceauth.NewRepository(nil)
    52  
    53  		// WHEN
    54  		err := repo.Create(context.TODO(), nil)
    55  
    56  		// THEN
    57  		require.EqualError(t, err, apperrors.NewInternalError("item cannot be nil").Error())
    58  	})
    59  
    60  	t.Run("DB Error", func(t *testing.T) {
    61  		// GIVEN
    62  		biaModel := fixModelBundleInstanceAuth(testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
    63  		biaEntity := fixEntityBundleInstanceAuth(t, testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
    64  
    65  		mockConverter := &automock.EntityConverter{}
    66  		mockConverter.On("ToEntity", biaModel).Return(biaEntity, nil).Once()
    67  		defer mockConverter.AssertExpectations(t)
    68  
    69  		db, dbMock := testdb.MockDatabase(t)
    70  		defer dbMock.AssertExpectations(t)
    71  
    72  		dbMock.ExpectExec("INSERT INTO .*").WillReturnError(testError)
    73  
    74  		ctx := persistence.SaveToContext(context.TODO(), db)
    75  		repo := bundleinstanceauth.NewRepository(mockConverter)
    76  
    77  		// WHEN
    78  		err := repo.Create(ctx, biaModel)
    79  
    80  		// THEN
    81  		expectedError := fmt.Sprintf("while saving entity with id %s to db: Internal Server Error: Unexpected error while executing SQL query", testID)
    82  		require.EqualError(t, err, expectedError)
    83  	})
    84  
    85  	t.Run("Converter Error", func(t *testing.T) {
    86  		// GIVEN
    87  		biaModel := fixModelBundleInstanceAuth(testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
    88  		mockConverter := &automock.EntityConverter{}
    89  		mockConverter.On("ToEntity", biaModel).Return(&bundleinstanceauth.Entity{}, testError)
    90  		defer mockConverter.AssertExpectations(t)
    91  
    92  		repo := bundleinstanceauth.NewRepository(mockConverter)
    93  
    94  		// WHEN
    95  		err := repo.Create(context.TODO(), biaModel)
    96  
    97  		// THEN
    98  		require.EqualError(t, err, "while converting BundleInstanceAuth model to entity: test")
    99  	})
   100  }
   101  
   102  func TestRepository_GetByID(t *testing.T) {
   103  	biaModel := fixModelBundleInstanceAuth(testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
   104  	biaEntity := fixEntityBundleInstanceAuth(t, testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
   105  
   106  	suite := testdb.RepoGetTestSuite{
   107  		Name: "Get BIA",
   108  		SQLQueryDetails: []testdb.SQLQueryDetails{
   109  			{
   110  				Query:    regexp.QuoteMeta(`SELECT id, owner_id, bundle_id, context, input_params, auth_value, status_condition, status_timestamp, status_message, status_reason, runtime_id, runtime_context_id FROM public.bundle_instance_auths WHERE id = $1 AND (id IN (SELECT id FROM bundle_instance_auths_tenants WHERE tenant_id = $2) OR owner_id = $3)`),
   111  				Args:     []driver.Value{testID, testTenant, testTenant},
   112  				IsSelect: true,
   113  				ValidRowsProvider: func() []*sqlmock.Rows {
   114  					return []*sqlmock.Rows{
   115  						fixSQLRows([]sqlRow{fixSQLRowFromEntity(*biaEntity)}),
   116  					}
   117  				},
   118  				InvalidRowsProvider: func() []*sqlmock.Rows {
   119  					return []*sqlmock.Rows{
   120  						fixSQLRows([]sqlRow{}),
   121  					}
   122  				},
   123  			},
   124  		},
   125  		ConverterMockProvider: func() testdb.Mock {
   126  			return &automock.EntityConverter{}
   127  		},
   128  		RepoConstructorFunc: bundleinstanceauth.NewRepository,
   129  		ExpectedModelEntity: biaModel,
   130  		ExpectedDBEntity:    biaEntity,
   131  		MethodArgs:          []interface{}{testTenant, testID},
   132  	}
   133  
   134  	suite.Run(t)
   135  }
   136  
   137  func TestRepository_GetForBundle(t *testing.T) {
   138  	biaModel := fixModelBundleInstanceAuth(testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
   139  	biaEntity := fixEntityBundleInstanceAuth(t, testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
   140  
   141  	suite := testdb.RepoGetTestSuite{
   142  		Name: "Get BIA For Bundle",
   143  		SQLQueryDetails: []testdb.SQLQueryDetails{
   144  			{
   145  				Query:    regexp.QuoteMeta(`SELECT id, owner_id, bundle_id, context, input_params, auth_value, status_condition, status_timestamp, status_message, status_reason, runtime_id, runtime_context_id FROM public.bundle_instance_auths WHERE id = $1 AND bundle_id = $2 AND (id IN (SELECT id FROM bundle_instance_auths_tenants WHERE tenant_id = $3) OR owner_id = $4)`),
   146  				Args:     []driver.Value{testID, testBundleID, testTenant, testTenant},
   147  				IsSelect: true,
   148  				ValidRowsProvider: func() []*sqlmock.Rows {
   149  					return []*sqlmock.Rows{
   150  						fixSQLRows([]sqlRow{fixSQLRowFromEntity(*biaEntity)}),
   151  					}
   152  				},
   153  				InvalidRowsProvider: func() []*sqlmock.Rows {
   154  					return []*sqlmock.Rows{
   155  						fixSQLRows([]sqlRow{}),
   156  					}
   157  				},
   158  			},
   159  		},
   160  		ConverterMockProvider: func() testdb.Mock {
   161  			return &automock.EntityConverter{}
   162  		},
   163  		RepoConstructorFunc: bundleinstanceauth.NewRepository,
   164  		ExpectedModelEntity: biaModel,
   165  		ExpectedDBEntity:    biaEntity,
   166  		MethodArgs:          []interface{}{testTenant, testID, testBundleID},
   167  		MethodName:          "GetForBundle",
   168  	}
   169  
   170  	suite.Run(t)
   171  }
   172  
   173  func TestRepository_ListByBundleID(t *testing.T) {
   174  	suite := testdb.RepoListTestSuite{
   175  		Name: "List BIA by BundleID",
   176  		SQLQueryDetails: []testdb.SQLQueryDetails{
   177  			{
   178  				Query:    regexp.QuoteMeta(`SELECT id, owner_id, bundle_id, context, input_params, auth_value, status_condition, status_timestamp, status_message, status_reason, runtime_id, runtime_context_id FROM public.bundle_instance_auths WHERE bundle_id = $1 AND (id IN (SELECT id FROM bundle_instance_auths_tenants WHERE tenant_id = $2) OR owner_id = $3)`),
   179  				Args:     []driver.Value{testBundleID, testTenant, testTenant},
   180  				IsSelect: true,
   181  				ValidRowsProvider: func() []*sqlmock.Rows {
   182  					return []*sqlmock.Rows{fixSQLRows([]sqlRow{
   183  						fixSQLRowFromEntity(*fixEntityBundleInstanceAuth(t, "foo", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)),
   184  						fixSQLRowFromEntity(*fixEntityBundleInstanceAuth(t, "bar", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)),
   185  					})}
   186  				},
   187  				InvalidRowsProvider: func() []*sqlmock.Rows {
   188  					return []*sqlmock.Rows{sqlmock.NewRows(testTableColumns)}
   189  				},
   190  			},
   191  		},
   192  		ConverterMockProvider: func() testdb.Mock {
   193  			return &automock.EntityConverter{}
   194  		},
   195  		RepoConstructorFunc:   bundleinstanceauth.NewRepository,
   196  		ExpectedModelEntities: []interface{}{fixModelBundleInstanceAuth("foo", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil), fixModelBundleInstanceAuth("bar", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)},
   197  		ExpectedDBEntities:    []interface{}{fixEntityBundleInstanceAuth(t, "foo", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil), fixEntityBundleInstanceAuth(t, "bar", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)},
   198  		MethodArgs:            []interface{}{testTenant, testBundleID},
   199  		MethodName:            "ListByBundleID",
   200  	}
   201  
   202  	suite.Run(t)
   203  }
   204  
   205  func TestRepository_ListByRuntimeID(t *testing.T) {
   206  	suite := testdb.RepoListTestSuite{
   207  		Name: "List BIA by RuntimeID",
   208  		SQLQueryDetails: []testdb.SQLQueryDetails{
   209  			{
   210  				Query:    regexp.QuoteMeta(`SELECT id, owner_id, bundle_id, context, input_params, auth_value, status_condition, status_timestamp, status_message, status_reason, runtime_id, runtime_context_id FROM public.bundle_instance_auths WHERE runtime_id = $1 AND (id IN (SELECT id FROM bundle_instance_auths_tenants WHERE tenant_id = $2) OR owner_id = $3)`),
   211  				Args:     []driver.Value{testRuntimeID, testTenant, testTenant},
   212  				IsSelect: true,
   213  				ValidRowsProvider: func() []*sqlmock.Rows {
   214  					return []*sqlmock.Rows{fixSQLRows([]sqlRow{
   215  						fixSQLRowFromEntity(*fixEntityBundleInstanceAuth(t, "foo", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)),
   216  						fixSQLRowFromEntity(*fixEntityBundleInstanceAuth(t, "bar", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)),
   217  					})}
   218  				},
   219  				InvalidRowsProvider: func() []*sqlmock.Rows {
   220  					return []*sqlmock.Rows{sqlmock.NewRows(testTableColumns)}
   221  				},
   222  			},
   223  		},
   224  		ConverterMockProvider: func() testdb.Mock {
   225  			return &automock.EntityConverter{}
   226  		},
   227  		RepoConstructorFunc:   bundleinstanceauth.NewRepository,
   228  		ExpectedModelEntities: []interface{}{fixModelBundleInstanceAuth("foo", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil), fixModelBundleInstanceAuth("bar", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)},
   229  		ExpectedDBEntities:    []interface{}{fixEntityBundleInstanceAuth(t, "foo", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil), fixEntityBundleInstanceAuth(t, "bar", testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)},
   230  		MethodArgs:            []interface{}{testTenant, testRuntimeID},
   231  		MethodName:            "ListByRuntimeID",
   232  	}
   233  
   234  	suite.Run(t)
   235  }
   236  
   237  func TestRepository_Update(t *testing.T) {
   238  	updateStmt := regexp.QuoteMeta(`UPDATE public.bundle_instance_auths SET context = ?, input_params = ?, auth_value = ?, status_condition = ?, status_timestamp = ?, status_message = ?, status_reason = ? WHERE id = ? AND (id IN (SELECT id FROM bundle_instance_auths_tenants WHERE tenant_id = ? AND owner = true) OR owner_id = ?)`)
   239  
   240  	var nilBiaModel *model.BundleInstanceAuth
   241  	biaModel := fixModelBundleInstanceAuth(testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
   242  	biaEntity := fixEntityBundleInstanceAuth(t, testID, testBundleID, testTenant, fixModelAuth(), fixModelStatusSucceeded(), nil)
   243  
   244  	suite := testdb.RepoUpdateTestSuite{
   245  		Name: "Update BIA",
   246  		SQLQueryDetails: []testdb.SQLQueryDetails{
   247  			{
   248  				Query:         updateStmt,
   249  				Args:          []driver.Value{biaEntity.Context, biaEntity.InputParams, biaEntity.AuthValue, biaEntity.StatusCondition, biaEntity.StatusTimestamp, biaEntity.StatusMessage, biaEntity.StatusReason, testID, testTenant, testTenant},
   250  				ValidResult:   sqlmock.NewResult(-1, 1),
   251  				InvalidResult: sqlmock.NewResult(-1, 0),
   252  			},
   253  		},
   254  		ConverterMockProvider: func() testdb.Mock {
   255  			return &automock.EntityConverter{}
   256  		},
   257  		RepoConstructorFunc: bundleinstanceauth.NewRepository,
   258  		ModelEntity:         biaModel,
   259  		DBEntity:            biaEntity,
   260  		NilModelEntity:      nilBiaModel,
   261  		TenantID:            testTenant,
   262  	}
   263  
   264  	suite.Run(t)
   265  }
   266  
   267  func TestRepository_Delete(t *testing.T) {
   268  	suite := testdb.RepoDeleteTestSuite{
   269  		Name: "Delete BIA",
   270  		SQLQueryDetails: []testdb.SQLQueryDetails{
   271  			{
   272  				Query:         regexp.QuoteMeta(`DELETE FROM public.bundle_instance_auths WHERE id = $1 AND (id IN (SELECT id FROM bundle_instance_auths_tenants WHERE tenant_id = $2 AND owner = true) OR owner_id = $3)`),
   273  				Args:          []driver.Value{testID, testTenant, testTenant},
   274  				ValidResult:   sqlmock.NewResult(-1, 1),
   275  				InvalidResult: sqlmock.NewResult(-1, 2),
   276  			},
   277  		},
   278  		ConverterMockProvider: func() testdb.Mock {
   279  			return &automock.EntityConverter{}
   280  		},
   281  		RepoConstructorFunc: bundleinstanceauth.NewRepository,
   282  		MethodArgs:          []interface{}{testTenant, testID},
   283  	}
   284  
   285  	suite.Run(t)
   286  }