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  }