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 }