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

     1  package integrationsystem_test
     2  
     3  import (
     4  	"context"
     5  	"regexp"
     6  	"testing"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/internal/domain/integrationsystem"
     9  	"github.com/kyma-incubator/compass/components/director/internal/domain/integrationsystem/automock"
    10  	"github.com/kyma-incubator/compass/components/director/internal/model"
    11  	"github.com/kyma-incubator/compass/components/director/internal/repo/testdb"
    12  	"github.com/kyma-incubator/compass/components/director/pkg/persistence"
    13  
    14  	"github.com/DATA-DOG/go-sqlmock"
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func TestPgRepository_Create(t *testing.T) {
    20  	t.Run("Success", func(t *testing.T) {
    21  		// GIVEN
    22  		intSysModel := fixModelIntegrationSystem(testID, testName)
    23  		intSysEntity := fixEntityIntegrationSystem(testID, testName)
    24  
    25  		mockConverter := &automock.Converter{}
    26  		defer mockConverter.AssertExpectations(t)
    27  		mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once()
    28  		db, dbMock := testdb.MockDatabase(t)
    29  		defer dbMock.AssertExpectations(t)
    30  		dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.integration_systems ( id, name, description ) VALUES ( ?, ?, ? )`)).
    31  			WithArgs(fixIntegrationSystemCreateArgs(*intSysEntity)...).
    32  			WillReturnResult(sqlmock.NewResult(-1, 1))
    33  
    34  		ctx := persistence.SaveToContext(context.TODO(), db)
    35  		intSysRepo := integrationsystem.NewRepository(mockConverter)
    36  
    37  		// WHEN
    38  		err := intSysRepo.Create(ctx, *intSysModel)
    39  
    40  		// THEN
    41  		require.NoError(t, err)
    42  	})
    43  
    44  	t.Run("Error when creating", func(t *testing.T) {
    45  		// GIVEN
    46  		intSysModel := fixModelIntegrationSystem(testID, testName)
    47  		intSysEntity := fixEntityIntegrationSystem(testID, testName)
    48  
    49  		mockConverter := &automock.Converter{}
    50  		defer mockConverter.AssertExpectations(t)
    51  		mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once()
    52  		db, dbMock := testdb.MockDatabase(t)
    53  		defer dbMock.AssertExpectations(t)
    54  		dbMock.ExpectExec(regexp.QuoteMeta(`INSERT INTO public.integration_systems ( id, name, description ) VALUES ( ?, ?, ? )`)).
    55  			WithArgs(fixIntegrationSystemCreateArgs(*intSysEntity)...).
    56  			WillReturnError(testError)
    57  
    58  		ctx := persistence.SaveToContext(context.TODO(), db)
    59  		intSysRepo := integrationsystem.NewRepository(mockConverter)
    60  
    61  		// WHEN
    62  		err := intSysRepo.Create(ctx, *intSysModel)
    63  
    64  		// THEN
    65  		require.Error(t, err)
    66  		assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
    67  	})
    68  }
    69  
    70  func TestPgRepository_Get(t *testing.T) {
    71  	t.Run("Success", func(t *testing.T) {
    72  		// GIVEN
    73  		intSysModel := fixModelIntegrationSystem(testID, testName)
    74  		intSysEntity := fixEntityIntegrationSystem(testID, testName)
    75  
    76  		mockConverter := &automock.Converter{}
    77  		defer mockConverter.AssertExpectations(t)
    78  		mockConverter.On("FromEntity", intSysEntity).Return(intSysModel).Once()
    79  		db, dbMock := testdb.MockDatabase(t)
    80  		defer dbMock.AssertExpectations(t)
    81  		rowsToReturn := fixSQLRows([]sqlRow{
    82  			{id: testID, name: testName, description: &testDescription},
    83  		})
    84  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems WHERE id = $1`)).
    85  			WithArgs(testID).
    86  			WillReturnRows(rowsToReturn)
    87  
    88  		ctx := persistence.SaveToContext(context.TODO(), db)
    89  		intSysRepo := integrationsystem.NewRepository(mockConverter)
    90  
    91  		// WHEN
    92  		result, err := intSysRepo.Get(ctx, testID)
    93  
    94  		// THEN
    95  		require.NoError(t, err)
    96  		require.NotNil(t, result)
    97  		assert.Equal(t, intSysModel, result)
    98  	})
    99  
   100  	t.Run("Error when getting", func(t *testing.T) {
   101  		// GIVEN
   102  		mockConverter := &automock.Converter{}
   103  		defer mockConverter.AssertExpectations(t)
   104  		db, dbMock := testdb.MockDatabase(t)
   105  		defer dbMock.AssertExpectations(t)
   106  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems WHERE id = $1`)).
   107  			WithArgs(testID).
   108  			WillReturnError(testError)
   109  
   110  		ctx := persistence.SaveToContext(context.TODO(), db)
   111  		intSysRepo := integrationsystem.NewRepository(mockConverter)
   112  
   113  		// WHEN
   114  		result, err := intSysRepo.Get(ctx, testID)
   115  
   116  		// THEN
   117  		require.Error(t, err)
   118  		assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   119  		require.Nil(t, result)
   120  	})
   121  }
   122  
   123  func TestPgRepository_Exists(t *testing.T) {
   124  	t.Run("Success", func(t *testing.T) {
   125  		// GIVEN
   126  		db, dbMock := testdb.MockDatabase(t)
   127  		defer dbMock.AssertExpectations(t)
   128  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.integration_systems WHERE id = $1`)).
   129  			WithArgs(testID).
   130  			WillReturnRows(testdb.RowWhenObjectExist())
   131  
   132  		ctx := persistence.SaveToContext(context.TODO(), db)
   133  		intSysRepo := integrationsystem.NewRepository(nil)
   134  
   135  		// WHEN
   136  		result, err := intSysRepo.Exists(ctx, testID)
   137  
   138  		// THEN
   139  		require.NoError(t, err)
   140  		require.NotNil(t, result)
   141  		assert.True(t, result)
   142  	})
   143  
   144  	t.Run("Error when checking existence", func(t *testing.T) {
   145  		// GIVEN
   146  		db, dbMock := testdb.MockDatabase(t)
   147  		defer dbMock.AssertExpectations(t)
   148  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT 1 FROM public.integration_systems WHERE id = $1`)).
   149  			WithArgs(testID).
   150  			WillReturnError(testError)
   151  
   152  		ctx := persistence.SaveToContext(context.TODO(), db)
   153  		intSysRepo := integrationsystem.NewRepository(nil)
   154  
   155  		// WHEN
   156  		result, err := intSysRepo.Exists(ctx, testID)
   157  
   158  		// THEN
   159  		require.Error(t, err)
   160  		assert.Contains(t, err.Error(), "Internal Server Error: Unexpected error while executing SQL query")
   161  		assert.False(t, result)
   162  	})
   163  }
   164  
   165  func TestPgRepository_List(t *testing.T) {
   166  	t.Run("Success", func(t *testing.T) {
   167  		// GIVEN
   168  		intSysModels := []*model.IntegrationSystem{
   169  			fixModelIntegrationSystem("id1", "name1"),
   170  			fixModelIntegrationSystem("id2", "name2"),
   171  			fixModelIntegrationSystem("id3", "name3"),
   172  		}
   173  
   174  		intSysEntities := []*integrationsystem.Entity{
   175  			fixEntityIntegrationSystem("id1", "name1"),
   176  			fixEntityIntegrationSystem("id2", "name2"),
   177  			fixEntityIntegrationSystem("id3", "name3"),
   178  		}
   179  
   180  		mockConverter := &automock.Converter{}
   181  		defer mockConverter.AssertExpectations(t)
   182  		mockConverter.On("FromEntity", intSysEntities[0]).Return(intSysModels[0]).Once()
   183  		mockConverter.On("FromEntity", intSysEntities[1]).Return(intSysModels[1]).Once()
   184  		mockConverter.On("FromEntity", intSysEntities[2]).Return(intSysModels[2]).Once()
   185  		db, dbMock := testdb.MockDatabase(t)
   186  		defer dbMock.AssertExpectations(t)
   187  		rowsToReturn := fixSQLRows([]sqlRow{
   188  			{id: "id1", name: "name1", description: &testDescription},
   189  			{id: "id2", name: "name2", description: &testDescription},
   190  			{id: "id3", name: "name3", description: &testDescription},
   191  		})
   192  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems ORDER BY id LIMIT 3 OFFSET 0`)).
   193  			WillReturnRows(rowsToReturn)
   194  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT COUNT(*) FROM public.integration_systems`)).
   195  			WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(3))
   196  
   197  		ctx := persistence.SaveToContext(context.TODO(), db)
   198  		intSysRepo := integrationsystem.NewRepository(mockConverter)
   199  
   200  		// WHEN
   201  		result, err := intSysRepo.List(ctx, testPageSize, testCursor)
   202  
   203  		// THEN
   204  		require.NoError(t, err)
   205  		require.NotNil(t, result)
   206  		assert.Equal(t, intSysModels, result.Data)
   207  	})
   208  
   209  	t.Run("Error when listing", func(t *testing.T) {
   210  		// GIVEN
   211  		mockConverter := &automock.Converter{}
   212  		defer mockConverter.AssertExpectations(t)
   213  		db, dbMock := testdb.MockDatabase(t)
   214  		defer dbMock.AssertExpectations(t)
   215  		dbMock.ExpectQuery(regexp.QuoteMeta(`SELECT id, name, description FROM public.integration_systems ORDER BY id LIMIT 3 OFFSET 0`)).
   216  			WillReturnError(testError)
   217  
   218  		ctx := persistence.SaveToContext(context.TODO(), db)
   219  		intSysRepo := integrationsystem.NewRepository(mockConverter)
   220  
   221  		// WHEN
   222  		result, err := intSysRepo.List(ctx, testPageSize, testCursor)
   223  
   224  		// THEN
   225  		require.Nil(t, result.Data)
   226  		require.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   227  	})
   228  }
   229  
   230  func TestPgRepository_Update(t *testing.T) {
   231  	t.Run("Success", func(t *testing.T) {
   232  		// GIVEN
   233  		intSysModel := fixModelIntegrationSystem(testID, testName)
   234  		intSysEntity := fixEntityIntegrationSystem(testID, testName)
   235  
   236  		mockConverter := &automock.Converter{}
   237  		defer mockConverter.AssertExpectations(t)
   238  		mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once()
   239  		db, dbMock := testdb.MockDatabase(t)
   240  		defer dbMock.AssertExpectations(t)
   241  		dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.integration_systems SET name = ?, description = ? WHERE id = ?`)).
   242  			WithArgs(testName, testDescription, testID).
   243  			WillReturnResult(sqlmock.NewResult(-1, 1))
   244  
   245  		ctx := persistence.SaveToContext(context.TODO(), db)
   246  		intSysRepo := integrationsystem.NewRepository(mockConverter)
   247  
   248  		// WHEN
   249  		err := intSysRepo.Update(ctx, *intSysModel)
   250  
   251  		// THEN
   252  		require.NoError(t, err)
   253  	})
   254  
   255  	t.Run("Error when updating", func(t *testing.T) {
   256  		// GIVEN
   257  		intSysModel := fixModelIntegrationSystem(testID, testName)
   258  		intSysEntity := fixEntityIntegrationSystem(testID, testName)
   259  
   260  		mockConverter := &automock.Converter{}
   261  		defer mockConverter.AssertExpectations(t)
   262  		mockConverter.On("ToEntity", intSysModel).Return(intSysEntity).Once()
   263  		db, dbMock := testdb.MockDatabase(t)
   264  		defer dbMock.AssertExpectations(t)
   265  		dbMock.ExpectExec(regexp.QuoteMeta(`UPDATE public.integration_systems SET name = ?, description = ? WHERE id = ?`)).
   266  			WithArgs(testName, testDescription, testID).
   267  			WillReturnError(testError)
   268  
   269  		ctx := persistence.SaveToContext(context.TODO(), db)
   270  		intSysRepo := integrationsystem.NewRepository(mockConverter)
   271  
   272  		// WHEN
   273  		err := intSysRepo.Update(ctx, *intSysModel)
   274  
   275  		// THEN
   276  		require.Error(t, err)
   277  		assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   278  	})
   279  }
   280  
   281  func TestPgRepository_Delete(t *testing.T) {
   282  	t.Run("Success", func(t *testing.T) {
   283  		// GIVEN
   284  		db, dbMock := testdb.MockDatabase(t)
   285  		defer dbMock.AssertExpectations(t)
   286  		dbMock.ExpectExec(regexp.QuoteMeta(`DELETE FROM public.integration_systems WHERE id = $1`)).
   287  			WithArgs(testID).
   288  			WillReturnResult(sqlmock.NewResult(-1, 1))
   289  
   290  		ctx := persistence.SaveToContext(context.TODO(), db)
   291  		intSysRepo := integrationsystem.NewRepository(nil)
   292  
   293  		// WHEN
   294  		err := intSysRepo.Delete(ctx, testID)
   295  
   296  		// THEN
   297  		require.NoError(t, err)
   298  	})
   299  
   300  	t.Run("Error when deleting", func(t *testing.T) {
   301  		// GIVEN
   302  		db, dbMock := testdb.MockDatabase(t)
   303  		defer dbMock.AssertExpectations(t)
   304  		dbMock.ExpectExec(regexp.QuoteMeta(`DELETE FROM public.integration_systems WHERE id = $1`)).
   305  			WithArgs(testID).
   306  			WillReturnError(testError)
   307  
   308  		ctx := persistence.SaveToContext(context.TODO(), db)
   309  		intSysRepo := integrationsystem.NewRepository(nil)
   310  
   311  		// WHEN
   312  		err := intSysRepo.Delete(ctx, testID)
   313  
   314  		// THEN
   315  		require.Error(t, err)
   316  		assert.EqualError(t, err, "Internal Server Error: Unexpected error while executing SQL query")
   317  	})
   318  }