github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/systemssync/repository_test.go (about)

     1  package systemssync_test
     2  
     3  import (
     4  	"context"
     5  	"regexp"
     6  	"testing"
     7  
     8  	"github.com/DATA-DOG/go-sqlmock"
     9  	"github.com/kyma-incubator/compass/components/director/internal/domain/systemssync"
    10  	"github.com/kyma-incubator/compass/components/director/internal/domain/systemssync/automock"
    11  	"github.com/kyma-incubator/compass/components/director/internal/repo/testdb"
    12  	"github.com/kyma-incubator/compass/components/director/pkg/persistence"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestRepository_List(t *testing.T) {
    18  	systemsSyncEntity := fixSystemsSyncEntity(syncID, syncTenantID, syncProductID, lastSyncTime)
    19  	systemsSyncModel := fixSystemsSyncModel(syncID, syncTenantID, syncProductID, lastSyncTime)
    20  
    21  	suite := testdb.RepoListTestSuite{
    22  		Name: "List all systems synchronization timestamps",
    23  		SQLQueryDetails: []testdb.SQLQueryDetails{
    24  			{
    25  				Query:    regexp.QuoteMeta(`SELECT id, tenant_id, product_id, last_sync_timestamp FROM public.systems_sync_timestamps`),
    26  				IsSelect: true,
    27  				ValidRowsProvider: func() []*sqlmock.Rows {
    28  					return []*sqlmock.Rows{
    29  						sqlmock.NewRows(fixSystemsSyncTimestampsColumns()).AddRow(systemsSyncEntity.ID, systemsSyncEntity.TenantID, systemsSyncEntity.ProductID, systemsSyncEntity.LastSyncTimestamp),
    30  					}
    31  				},
    32  				InvalidRowsProvider: func() []*sqlmock.Rows {
    33  					return []*sqlmock.Rows{sqlmock.NewRows(fixSystemsSyncTimestampsColumns())}
    34  				},
    35  			},
    36  		},
    37  		ConverterMockProvider: func() testdb.Mock {
    38  			return &automock.EntityConverter{}
    39  		},
    40  		RepoConstructorFunc:       systemssync.NewRepository,
    41  		ExpectedDBEntities:        []interface{}{systemsSyncEntity},
    42  		ExpectedModelEntities:     []interface{}{systemsSyncModel},
    43  		MethodName:                "List",
    44  		DisableConverterErrorTest: true,
    45  	}
    46  
    47  	suite.Run(t)
    48  }
    49  
    50  func TestRepository_Upsert(t *testing.T) {
    51  	t.Run("Success", func(t *testing.T) {
    52  		// GIVEN
    53  		systemsSyncEntity := fixSystemsSyncEntity(syncID, syncTenantID, syncProductID, lastSyncTime)
    54  		systemsSyncModel := fixSystemsSyncModel(syncID, syncTenantID, syncProductID, lastSyncTime)
    55  
    56  		mockConverter := &automock.EntityConverter{}
    57  		defer mockConverter.AssertExpectations(t)
    58  
    59  		mockConverter.On("ToEntity", systemsSyncModel).Return(systemsSyncEntity).Once()
    60  
    61  		db, dbMock := testdb.MockDatabase(t)
    62  		defer dbMock.AssertExpectations(t)
    63  
    64  		dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.systems_sync_timestamps ( id, tenant_id, product_id, last_sync_timestamp ) VALUES ( ?, ?, ?, ? ) ON CONFLICT ( id ) DO UPDATE SET tenant_id=EXCLUDED.tenant_id, product_id=EXCLUDED.product_id, last_sync_timestamp=EXCLUDED.last_sync_timestamp`)).
    65  			WithArgs(fixSystemsSyncCreateArgs(*systemsSyncEntity)...).
    66  			WillReturnResult(sqlmock.NewResult(1, 1))
    67  
    68  		ctx := persistence.SaveToContext(context.TODO(), db)
    69  		systemsSyncRepo := systemssync.NewRepository(mockConverter)
    70  
    71  		// WHEN
    72  		err := systemsSyncRepo.Upsert(ctx, systemsSyncModel)
    73  
    74  		// THEN
    75  		require.NoError(t, err)
    76  	})
    77  
    78  	t.Run("Error when upserting system sync timestamp", func(t *testing.T) {
    79  		// GIVEN
    80  		systemsSyncEntity := fixSystemsSyncEntity(syncID, syncTenantID, syncProductID, lastSyncTime)
    81  		systemsSyncModel := fixSystemsSyncModel(syncID, syncTenantID, syncProductID, lastSyncTime)
    82  
    83  		mockConverter := &automock.EntityConverter{}
    84  		defer mockConverter.AssertExpectations(t)
    85  
    86  		mockConverter.On("ToEntity", systemsSyncModel).Return(systemsSyncEntity).Once()
    87  
    88  		db, dbMock := testdb.MockDatabase(t)
    89  		defer dbMock.AssertExpectations(t)
    90  
    91  		dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.systems_sync_timestamps ( id, tenant_id, product_id, last_sync_timestamp ) VALUES ( ?, ?, ?, ? ) ON CONFLICT ( id ) DO UPDATE SET tenant_id=EXCLUDED.tenant_id, product_id=EXCLUDED.product_id, last_sync_timestamp=EXCLUDED.last_sync_timestamp`)).
    92  			WithArgs(fixSystemsSyncCreateArgs(*systemsSyncEntity)...).
    93  			WillReturnError(testError)
    94  
    95  		ctx := persistence.SaveToContext(context.TODO(), db)
    96  		systemsSyncRepo := systemssync.NewRepository(mockConverter)
    97  
    98  		// WHEN
    99  		err := systemsSyncRepo.Upsert(ctx, systemsSyncModel)
   100  
   101  		// THEN
   102  		require.Error(t, err)
   103  		assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   104  	})
   105  }