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