github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/integrationsystem/repository_test.go (about) 1 package integrationsystem_test 2 3 import ( 4 "context" 5 "regexp" 6 "testing" 7 8 "github.com/kyma-incubator/compass/components/director/internal/domain/integrationsystem" 9 "github.com/kyma-incubator/compass/components/director/internal/domain/integrationsystem/automock" 10 "github.com/kyma-incubator/compass/components/director/internal/model" 11 "github.com/kyma-incubator/compass/components/director/internal/repo/testdb" 12 "github.com/kyma-incubator/compass/components/director/pkg/persistence" 13 14 "github.com/DATA-DOG/go-sqlmock" 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestPgRepository_Create(t *testing.T) { 20 t.Run("Success", func(t *testing.T) { 21 // GIVEN 22 intSysModel := fixModelIntegrationSystem(testID, testName) 23 intSysEntity := fixEntityIntegrationSystem(testID, testName) 24 25 mockConverter := &automock.Converter{} 26 defer mockConverter.AssertExpectations(t) 27 mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once() 28 db, dbMock := testdb.MockDatabase(t) 29 defer dbMock.AssertExpectations(t) 30 dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.integration_systems ( id, name, description ) VALUES ( ?, ?, ? )`)). 31 WithArgs(fixIntegrationSystemCreateArgs(*intSysEntity)...). 32 WillReturnResult(sqlmock.NewResult(-1, 1)) 33 34 ctx := persistence.SaveToContext(context.TODO(), db) 35 intSysRepo := integrationsystem.NewRepository(mockConverter) 36 37 // WHEN 38 err := intSysRepo.Create(ctx, *intSysModel) 39 40 // THEN 41 require.NoError(t, err) 42 }) 43 44 t.Run("Error when creating", func(t *testing.T) { 45 // GIVEN 46 intSysModel := fixModelIntegrationSystem(testID, testName) 47 intSysEntity := fixEntityIntegrationSystem(testID, testName) 48 49 mockConverter := &automock.Converter{} 50 defer mockConverter.AssertExpectations(t) 51 mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once() 52 db, dbMock := testdb.MockDatabase(t) 53 defer dbMock.AssertExpectations(t) 54 dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.integration_systems ( id, name, description ) VALUES ( ?, ?, ? )`)). 55 WithArgs(fixIntegrationSystemCreateArgs(*intSysEntity)...). 56 WillReturnError(testError) 57 58 ctx := persistence.SaveToContext(context.TODO(), db) 59 intSysRepo := integrationsystem.NewRepository(mockConverter) 60 61 // WHEN 62 err := intSysRepo.Create(ctx, *intSysModel) 63 64 // THEN 65 require.Error(t, err) 66 assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 67 }) 68 } 69 70 func TestPgRepository_Get(t *testing.T) { 71 t.Run("Success", func(t *testing.T) { 72 // GIVEN 73 intSysModel := fixModelIntegrationSystem(testID, testName) 74 intSysEntity := fixEntityIntegrationSystem(testID, testName) 75 76 mockConverter := &automock.Converter{} 77 defer mockConverter.AssertExpectations(t) 78 mockConverter.On("FromEntity", intSysEntity).Return(intSysModel).Once() 79 db, dbMock := testdb.MockDatabase(t) 80 defer dbMock.AssertExpectations(t) 81 rowsToReturn := fixSQLRows([]sqlRow{ 82 {id: testID, name: testName, description: &testDescription}, 83 }) 84 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems WHERE id = $1`)). 85 WithArgs(testID). 86 WillReturnRows(rowsToReturn) 87 88 ctx := persistence.SaveToContext(context.TODO(), db) 89 intSysRepo := integrationsystem.NewRepository(mockConverter) 90 91 // WHEN 92 result, err := intSysRepo.Get(ctx, testID) 93 94 // THEN 95 require.NoError(t, err) 96 require.NotNil(t, result) 97 assert.Equal(t, intSysModel, result) 98 }) 99 100 t.Run("Error when getting", func(t *testing.T) { 101 // GIVEN 102 mockConverter := &automock.Converter{} 103 defer mockConverter.AssertExpectations(t) 104 db, dbMock := testdb.MockDatabase(t) 105 defer dbMock.AssertExpectations(t) 106 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems WHERE id = $1`)). 107 WithArgs(testID). 108 WillReturnError(testError) 109 110 ctx := persistence.SaveToContext(context.TODO(), db) 111 intSysRepo := integrationsystem.NewRepository(mockConverter) 112 113 // WHEN 114 result, err := intSysRepo.Get(ctx, testID) 115 116 // THEN 117 require.Error(t, err) 118 assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 119 require.Nil(t, result) 120 }) 121 } 122 123 func TestPgRepository_Exists(t *testing.T) { 124 t.Run("Success", func(t *testing.T) { 125 // GIVEN 126 db, dbMock := testdb.MockDatabase(t) 127 defer dbMock.AssertExpectations(t) 128 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.integration_systems WHERE id = $1`)). 129 WithArgs(testID). 130 WillReturnRows(testdb.RowWhenObjectExist()) 131 132 ctx := persistence.SaveToContext(context.TODO(), db) 133 intSysRepo := integrationsystem.NewRepository(nil) 134 135 // WHEN 136 result, err := intSysRepo.Exists(ctx, testID) 137 138 // THEN 139 require.NoError(t, err) 140 require.NotNil(t, result) 141 assert.True(t, result) 142 }) 143 144 t.Run("Error when checking existence", func(t *testing.T) { 145 // GIVEN 146 db, dbMock := testdb.MockDatabase(t) 147 defer dbMock.AssertExpectations(t) 148 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.integration_systems WHERE id = $1`)). 149 WithArgs(testID). 150 WillReturnError(testError) 151 152 ctx := persistence.SaveToContext(context.TODO(), db) 153 intSysRepo := integrationsystem.NewRepository(nil) 154 155 // WHEN 156 result, err := intSysRepo.Exists(ctx, testID) 157 158 // THEN 159 require.Error(t, err) 160 assert.Contains(t, err.Error(), "Internal Server Error: Unexpected error while executing SQL query") 161 assert.False(t, result) 162 }) 163 } 164 165 func TestPgRepository_List(t *testing.T) { 166 t.Run("Success", func(t *testing.T) { 167 // GIVEN 168 intSysModels := []*model.IntegrationSystem{ 169 fixModelIntegrationSystem("id1", "name1"), 170 fixModelIntegrationSystem("id2", "name2"), 171 fixModelIntegrationSystem("id3", "name3"), 172 } 173 174 intSysEntities := []*integrationsystem.Entity{ 175 fixEntityIntegrationSystem("id1", "name1"), 176 fixEntityIntegrationSystem("id2", "name2"), 177 fixEntityIntegrationSystem("id3", "name3"), 178 } 179 180 mockConverter := &automock.Converter{} 181 defer mockConverter.AssertExpectations(t) 182 mockConverter.On("FromEntity", intSysEntities[0]).Return(intSysModels[0]).Once() 183 mockConverter.On("FromEntity", intSysEntities[1]).Return(intSysModels[1]).Once() 184 mockConverter.On("FromEntity", intSysEntities[2]).Return(intSysModels[2]).Once() 185 db, dbMock := testdb.MockDatabase(t) 186 defer dbMock.AssertExpectations(t) 187 rowsToReturn := fixSQLRows([]sqlRow{ 188 {id: "id1", name: "name1", description: &testDescription}, 189 {id: "id2", name: "name2", description: &testDescription}, 190 {id: "id3", name: "name3", description: &testDescription}, 191 }) 192 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems ORDER BY id LIMIT 3 OFFSET 0`)). 193 WillReturnRows(rowsToReturn) 194 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT COUNT(*) FROM public.integration_systems`)). 195 WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(3)) 196 197 ctx := persistence.SaveToContext(context.TODO(), db) 198 intSysRepo := integrationsystem.NewRepository(mockConverter) 199 200 // WHEN 201 result, err := intSysRepo.List(ctx, testPageSize, testCursor) 202 203 // THEN 204 require.NoError(t, err) 205 require.NotNil(t, result) 206 assert.Equal(t, intSysModels, result.Data) 207 }) 208 209 t.Run("Error when listing", func(t *testing.T) { 210 // GIVEN 211 mockConverter := &automock.Converter{} 212 defer mockConverter.AssertExpectations(t) 213 db, dbMock := testdb.MockDatabase(t) 214 defer dbMock.AssertExpectations(t) 215 dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems ORDER BY id LIMIT 3 OFFSET 0`)). 216 WillReturnError(testError) 217 218 ctx := persistence.SaveToContext(context.TODO(), db) 219 intSysRepo := integrationsystem.NewRepository(mockConverter) 220 221 // WHEN 222 result, err := intSysRepo.List(ctx, testPageSize, testCursor) 223 224 // THEN 225 require.Nil(t, result.Data) 226 require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 227 }) 228 } 229 230 func TestPgRepository_Update(t *testing.T) { 231 t.Run("Success", func(t *testing.T) { 232 // GIVEN 233 intSysModel := fixModelIntegrationSystem(testID, testName) 234 intSysEntity := fixEntityIntegrationSystem(testID, testName) 235 236 mockConverter := &automock.Converter{} 237 defer mockConverter.AssertExpectations(t) 238 mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once() 239 db, dbMock := testdb.MockDatabase(t) 240 defer dbMock.AssertExpectations(t) 241 dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.integration_systems SET name = ?, description = ? WHERE id = ?`)). 242 WithArgs(testName, testDescription, testID). 243 WillReturnResult(sqlmock.NewResult(-1, 1)) 244 245 ctx := persistence.SaveToContext(context.TODO(), db) 246 intSysRepo := integrationsystem.NewRepository(mockConverter) 247 248 // WHEN 249 err := intSysRepo.Update(ctx, *intSysModel) 250 251 // THEN 252 require.NoError(t, err) 253 }) 254 255 t.Run("Error when updating", func(t *testing.T) { 256 // GIVEN 257 intSysModel := fixModelIntegrationSystem(testID, testName) 258 intSysEntity := fixEntityIntegrationSystem(testID, testName) 259 260 mockConverter := &automock.Converter{} 261 defer mockConverter.AssertExpectations(t) 262 mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once() 263 db, dbMock := testdb.MockDatabase(t) 264 defer dbMock.AssertExpectations(t) 265 dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.integration_systems SET name = ?, description = ? WHERE id = ?`)). 266 WithArgs(testName, testDescription, testID). 267 WillReturnError(testError) 268 269 ctx := persistence.SaveToContext(context.TODO(), db) 270 intSysRepo := integrationsystem.NewRepository(mockConverter) 271 272 // WHEN 273 err := intSysRepo.Update(ctx, *intSysModel) 274 275 // THEN 276 require.Error(t, err) 277 assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 278 }) 279 } 280 281 func TestPgRepository_Delete(t *testing.T) { 282 t.Run("Success", func(t *testing.T) { 283 // GIVEN 284 db, dbMock := testdb.MockDatabase(t) 285 defer dbMock.AssertExpectations(t) 286 dbMock.ExpectExec(regexp.QuoteMeta(`DELETE FROM public.integration_systems WHERE id = $1`)). 287 WithArgs(testID). 288 WillReturnResult(sqlmock.NewResult(-1, 1)) 289 290 ctx := persistence.SaveToContext(context.TODO(), db) 291 intSysRepo := integrationsystem.NewRepository(nil) 292 293 // WHEN 294 err := intSysRepo.Delete(ctx, testID) 295 296 // THEN 297 require.NoError(t, err) 298 }) 299 300 t.Run("Error when deleting", func(t *testing.T) { 301 // GIVEN 302 db, dbMock := testdb.MockDatabase(t) 303 defer dbMock.AssertExpectations(t) 304 dbMock.ExpectExec(regexp.QuoteMeta(`DELETE FROM public.integration_systems WHERE id = $1`)). 305 WithArgs(testID). 306 WillReturnError(testError) 307 308 ctx := persistence.SaveToContext(context.TODO(), db) 309 intSysRepo := integrationsystem.NewRepository(nil) 310 311 // WHEN 312 err := intSysRepo.Delete(ctx, testID) 313 314 // THEN 315 require.Error(t, err) 316 assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query") 317 }) 318 }