github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/tombstone/repository_test.go (about) 1 package tombstone_test 2 3 import ( 4 "database/sql/driver" 5 "regexp" 6 "testing" 7 8 "github.com/kyma-incubator/compass/components/director/pkg/resource" 9 10 "github.com/kyma-incubator/compass/components/director/internal/domain/tombstone" 11 12 "github.com/DATA-DOG/go-sqlmock" 13 "github.com/kyma-incubator/compass/components/director/internal/domain/tombstone/automock" 14 "github.com/kyma-incubator/compass/components/director/internal/model" 15 "github.com/kyma-incubator/compass/components/director/internal/repo/testdb" 16 ) 17 18 func TestPgRepository_Create(t *testing.T) { 19 // GIVEN 20 var nilTSModel *model.Tombstone 21 tombstoneModel := fixTombstoneModelForApp() 22 tombstoneEntity := fixEntityTombstoneForApp() 23 suite := testdb.RepoCreateTestSuite{ 24 Name: "Create Tombstone", 25 SQLQueryDetails: []testdb.SQLQueryDetails{ 26 { 27 Query: regexp.QuoteMeta("SELECT 1 FROM tenant_applications WHERE tenant_id = $1 AND id = $2 AND owner = $3"), 28 Args: []driver.Value{tenantID, appID, true}, 29 IsSelect: true, 30 ValidRowsProvider: func() []*sqlmock.Rows { 31 return []*sqlmock.Rows{testdb.RowWhenObjectExist()} 32 }, 33 InvalidRowsProvider: func() []*sqlmock.Rows { 34 return []*sqlmock.Rows{testdb.RowWhenObjectDoesNotExist()} 35 }, 36 }, 37 { 38 Query: `^INSERT INTO public.tombstones \(.+\) VALUES \(.+\)$`, 39 Args: fixTombstoneRowForApp(), 40 ValidResult: sqlmock.NewResult(-1, 1), 41 }, 42 }, 43 ConverterMockProvider: func() testdb.Mock { 44 return &automock.EntityConverter{} 45 }, 46 RepoConstructorFunc: tombstone.NewRepository, 47 ModelEntity: tombstoneModel, 48 DBEntity: tombstoneEntity, 49 NilModelEntity: nilTSModel, 50 TenantID: tenantID, 51 DisableConverterErrorTest: true, 52 } 53 54 suite.Run(t) 55 } 56 57 func TestPgRepository_CreateGlobal(t *testing.T) { 58 // GIVEN 59 var nilTSModel *model.Tombstone 60 tombstoneModel := fixTombstoneModelForAppTemplateVersion() 61 tombstoneEntity := fixEntityTombstoneForAppTemplateVersion() 62 suite := testdb.RepoCreateTestSuite{ 63 Name: "Create Tombstone Global", 64 SQLQueryDetails: []testdb.SQLQueryDetails{ 65 { 66 Query: `^INSERT INTO public.tombstones \(.+\) VALUES \(.+\)$`, 67 Args: fixTombstoneRowForAppTemplateVersion(), 68 ValidResult: sqlmock.NewResult(-1, 1), 69 }, 70 }, 71 ConverterMockProvider: func() testdb.Mock { 72 return &automock.EntityConverter{} 73 }, 74 RepoConstructorFunc: tombstone.NewRepository, 75 ModelEntity: tombstoneModel, 76 DBEntity: tombstoneEntity, 77 NilModelEntity: nilTSModel, 78 DisableConverterErrorTest: true, 79 IsGlobal: true, 80 MethodName: "CreateGlobal", 81 } 82 83 suite.Run(t) 84 } 85 86 func TestPgRepository_Update(t *testing.T) { 87 var nilTSModel *model.Tombstone 88 entity := fixEntityTombstoneForApp() 89 90 suite := testdb.RepoUpdateTestSuite{ 91 Name: "Update Tombstone", 92 SQLQueryDetails: []testdb.SQLQueryDetails{ 93 { 94 Query: regexp.QuoteMeta(`UPDATE public.tombstones SET removal_date = ? WHERE id = ? AND (id IN (SELECT id FROM tombstones_tenants WHERE tenant_id = ? AND owner = true))`), 95 Args: append(fixTombstoneUpdateArgs(), entity.ID, tenantID), 96 ValidResult: sqlmock.NewResult(-1, 1), 97 InvalidResult: sqlmock.NewResult(-1, 0), 98 }, 99 }, 100 ConverterMockProvider: func() testdb.Mock { 101 return &automock.EntityConverter{} 102 }, 103 RepoConstructorFunc: tombstone.NewRepository, 104 ModelEntity: fixTombstoneModelForApp(), 105 DBEntity: entity, 106 NilModelEntity: nilTSModel, 107 TenantID: tenantID, 108 DisableConverterErrorTest: true, 109 } 110 111 suite.Run(t) 112 } 113 114 func TestPgRepository_UpdateGlobal(t *testing.T) { 115 var nilTSModel *model.Tombstone 116 entity := fixEntityTombstoneForAppTemplateVersion() 117 118 suite := testdb.RepoUpdateTestSuite{ 119 Name: "Update Tombstone Global", 120 SQLQueryDetails: []testdb.SQLQueryDetails{ 121 { 122 Query: regexp.QuoteMeta(`UPDATE public.tombstones SET removal_date = ? WHERE id = ?`), 123 Args: append(fixTombstoneUpdateArgs(), entity.ID), 124 ValidResult: sqlmock.NewResult(-1, 1), 125 InvalidResult: sqlmock.NewResult(-1, 0), 126 }, 127 }, 128 ConverterMockProvider: func() testdb.Mock { 129 return &automock.EntityConverter{} 130 }, 131 RepoConstructorFunc: tombstone.NewRepository, 132 ModelEntity: fixTombstoneModelForAppTemplateVersion(), 133 DBEntity: entity, 134 NilModelEntity: nilTSModel, 135 DisableConverterErrorTest: true, 136 IsGlobal: true, 137 UpdateMethodName: "UpdateGlobal", 138 } 139 140 suite.Run(t) 141 } 142 143 func TestPgRepository_Delete(t *testing.T) { 144 suite := testdb.RepoDeleteTestSuite{ 145 Name: "Tombstone Delete", 146 SQLQueryDetails: []testdb.SQLQueryDetails{ 147 { 148 Query: regexp.QuoteMeta(`DELETE FROM public.tombstones WHERE id = $1 AND (id IN (SELECT id FROM tombstones_tenants WHERE tenant_id = $2 AND owner = true))`), 149 Args: []driver.Value{tombstoneID, tenantID}, 150 ValidResult: sqlmock.NewResult(-1, 1), 151 InvalidResult: sqlmock.NewResult(-1, 2), 152 }, 153 }, 154 ConverterMockProvider: func() testdb.Mock { 155 return &automock.EntityConverter{} 156 }, 157 RepoConstructorFunc: tombstone.NewRepository, 158 MethodArgs: []interface{}{tenantID, tombstoneID}, 159 } 160 161 suite.Run(t) 162 } 163 164 func TestPgRepository_Exists(t *testing.T) { 165 suite := testdb.RepoExistTestSuite{ 166 Name: "Tombstone Exists", 167 SQLQueryDetails: []testdb.SQLQueryDetails{ 168 { 169 Query: regexp.QuoteMeta(`SELECT 1 FROM public.tombstones WHERE id = $1 AND (id IN (SELECT id FROM tombstones_tenants WHERE tenant_id = $2))`), 170 Args: []driver.Value{tombstoneID, tenantID}, 171 IsSelect: true, 172 ValidRowsProvider: func() []*sqlmock.Rows { 173 return []*sqlmock.Rows{testdb.RowWhenObjectExist()} 174 }, 175 InvalidRowsProvider: func() []*sqlmock.Rows { 176 return []*sqlmock.Rows{testdb.RowWhenObjectDoesNotExist()} 177 }, 178 }, 179 }, 180 ConverterMockProvider: func() testdb.Mock { 181 return &automock.EntityConverter{} 182 }, 183 RepoConstructorFunc: tombstone.NewRepository, 184 TargetID: tombstoneID, 185 TenantID: tenantID, 186 MethodName: "Exists", 187 MethodArgs: []interface{}{tenantID, tombstoneID}, 188 } 189 190 suite.Run(t) 191 } 192 193 func TestPgRepository_GetByID(t *testing.T) { 194 suite := testdb.RepoGetTestSuite{ 195 Name: "Get Tombstone", 196 SQLQueryDetails: []testdb.SQLQueryDetails{ 197 { 198 Query: regexp.QuoteMeta(`SELECT ord_id, app_id, app_template_version_id, removal_date, id FROM public.tombstones WHERE id = $1 AND (id IN (SELECT id FROM tombstones_tenants WHERE tenant_id = $2))`), 199 Args: []driver.Value{tombstoneID, tenantID}, 200 IsSelect: true, 201 ValidRowsProvider: func() []*sqlmock.Rows { 202 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns()).AddRow(fixTombstoneRowForApp()...)} 203 }, 204 InvalidRowsProvider: func() []*sqlmock.Rows { 205 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns())} 206 }, 207 }, 208 }, 209 ConverterMockProvider: func() testdb.Mock { 210 return &automock.EntityConverter{} 211 }, 212 RepoConstructorFunc: tombstone.NewRepository, 213 ExpectedModelEntity: fixTombstoneModelForApp(), 214 ExpectedDBEntity: fixEntityTombstoneForApp(), 215 MethodArgs: []interface{}{tenantID, tombstoneID}, 216 } 217 218 suite.Run(t) 219 } 220 221 func TestPgRepository_GetByIDGlobal(t *testing.T) { 222 suite := testdb.RepoGetTestSuite{ 223 Name: "Get Tombstone Global", 224 SQLQueryDetails: []testdb.SQLQueryDetails{ 225 { 226 Query: regexp.QuoteMeta(`SELECT ord_id, app_id, app_template_version_id, removal_date, id FROM public.tombstones WHERE id = $1`), 227 Args: []driver.Value{tombstoneID}, 228 IsSelect: true, 229 ValidRowsProvider: func() []*sqlmock.Rows { 230 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns()).AddRow(fixTombstoneRowForAppTemplateVersion()...)} 231 }, 232 InvalidRowsProvider: func() []*sqlmock.Rows { 233 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns())} 234 }, 235 }, 236 }, 237 ConverterMockProvider: func() testdb.Mock { 238 return &automock.EntityConverter{} 239 }, 240 RepoConstructorFunc: tombstone.NewRepository, 241 ExpectedModelEntity: fixTombstoneModelForAppTemplateVersion(), 242 ExpectedDBEntity: fixEntityTombstoneForAppTemplateVersion(), 243 MethodArgs: []interface{}{tombstoneID}, 244 MethodName: "GetByIDGlobal", 245 } 246 247 suite.Run(t) 248 } 249 250 func TestPgRepository_ListByResourceID(t *testing.T) { 251 suiteForApp := testdb.RepoListTestSuite{ 252 Name: "List Tombstones for Application", 253 SQLQueryDetails: []testdb.SQLQueryDetails{ 254 { 255 Query: regexp.QuoteMeta(`SELECT ord_id, app_id, app_template_version_id, removal_date, id FROM public.tombstones WHERE app_id = $1 AND (id IN (SELECT id FROM tombstones_tenants WHERE tenant_id = $2)) FOR UPDATE`), 256 Args: []driver.Value{appID, tenantID}, 257 IsSelect: true, 258 ValidRowsProvider: func() []*sqlmock.Rows { 259 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns()).AddRow(fixTombstoneRowWithIDForApp("id1")...).AddRow(fixTombstoneRowWithIDForApp("id2")...)} 260 }, 261 InvalidRowsProvider: func() []*sqlmock.Rows { 262 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns())} 263 }, 264 }, 265 }, 266 ConverterMockProvider: func() testdb.Mock { 267 return &automock.EntityConverter{} 268 }, 269 RepoConstructorFunc: tombstone.NewRepository, 270 ExpectedModelEntities: []interface{}{fixTombstoneModelWithIDForApp("id1"), fixTombstoneModelWithIDForApp("id2")}, 271 ExpectedDBEntities: []interface{}{fixEntityTombstoneWithIDForApp("id1"), fixEntityTombstoneWithIDForApp("id2")}, 272 MethodArgs: []interface{}{tenantID, appID, resource.Application}, 273 MethodName: "ListByResourceID", 274 } 275 276 suiteForAppTemplateVersion := testdb.RepoListTestSuite{ 277 Name: "List Tombstones for Application Template Version", 278 SQLQueryDetails: []testdb.SQLQueryDetails{ 279 { 280 Query: regexp.QuoteMeta(`SELECT ord_id, app_id, app_template_version_id, removal_date, id FROM public.tombstones WHERE app_template_version_id = $1 FOR UPDATE`), 281 Args: []driver.Value{appTemplateVersionID}, 282 IsSelect: true, 283 ValidRowsProvider: func() []*sqlmock.Rows { 284 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns()).AddRow(fixTombstoneRowWithIDForAppTemplateVersion("id1")...).AddRow(fixTombstoneRowWithIDForAppTemplateVersion("id2")...)} 285 }, 286 InvalidRowsProvider: func() []*sqlmock.Rows { 287 return []*sqlmock.Rows{sqlmock.NewRows(fixTombstoneColumns())} 288 }, 289 }, 290 }, 291 ConverterMockProvider: func() testdb.Mock { 292 return &automock.EntityConverter{} 293 }, 294 RepoConstructorFunc: tombstone.NewRepository, 295 ExpectedModelEntities: []interface{}{fixTombstoneModelWithIDForAppTemplateVersion("id1"), fixTombstoneModelWithIDForAppTemplateVersion("id2")}, 296 ExpectedDBEntities: []interface{}{fixEntityTombstoneWithIDForAppTemplateVersion("id1"), fixEntityTombstoneWithIDForAppTemplateVersion("id2")}, 297 MethodArgs: []interface{}{tenantID, appTemplateVersionID, resource.ApplicationTemplateVersion}, 298 MethodName: "ListByResourceID", 299 } 300 301 suiteForApp.Run(t) 302 suiteForAppTemplateVersion.Run(t) 303 }