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  }